Подскажите, как правильно делают калибровку перед началом работы. Код (C++): int sensorValue = 0; int sensorMin = 10268; int sensorMax = 0; void setup() { pinMode(13, OUTPUT); digitalWrite(13, HIGH); while (millis() < 25000) { sensorValue = analogRead(sensorPin); if (sensorValue > sensorMax) { sensorMax = sensorValue; } if (sensorValue < sensorMin) { sensorMin = sensorValue; } } digitalWrite(13, LOW);
А чем этот код не устраивает? У меня в методе loop каждые 3 секунды калибруется. Вообще, если все возможные варианты можно сразу сделать, то, я думаю, можно сделать так, как вы делали
не работает, фиксирует только максимальное значение. Думаю, проблем в остальном коде. Он в Фурье сигнал гоняет.
Странно, у меня такой код и всё ок: Код (C++): int minFoto = 500; int maxFoto = 0; int fotoRes = A1; void loop() { int tempFoto = analogRead(fotoRes); if((millis()/1000) % 3 == 0) fotoCalibr(tempFoto); } void fotoCalibr(int currentFoto) { if(currentFoto > maxFoto) maxFoto = currentFoto; if(currentFoto < minFoto) minFoto = currentFoto; } А если в Serial выводить значения, то какой минимум наблюдается? И есть ли что-то перед калибровкой или во время?
Должно быть у меня проблема в том, что я стыковал два кода. Код (C++): #include <Goertzel.h> int sensorPin = A0; int led = 13; float counter = 0; float counter2 = 0; float TARGET_FREQUENCY = 100; const int N = 200; const float THRESHOLD = 7950; const float SAMPLING_FREQUENCY = 8900; Goertzel goertzel = Goertzel(TARGET_FREQUENCY, N, SAMPLING_FREQUENCY); // переменные фильтра диапазона датчика int sensorValue = 0; // значение, полученное от сенсора int sensorMin = 0; // минимальное значение от сенсора int sensorMax = 0; // максимальное значение от сенсора void setup(){ pinMode(led, OUTPUT); Serial.begin(9600); // включаем светодиод, чтобы оповестить о начале калибровочного периода: digitalWrite(13, HIGH); // считываем данные в течение первых пяти секунд: while (millis() < 5000) { sensorValue = goertzel.detect(); // записываем максимальное значение, считанное от сенсора: if (sensorValue > sensorMax) { sensorMax = sensorValue; } // записываем минимальное значение, считанное от сенсора: if (sensorValue < sensorMin) { sensorMin = sensorValue; } } // выключаем светодиод, оповещая о конце калибровочного периода: digitalWrite(13, LOW); } void loop() { goertzel.sample(sensorPin); //Will take n samples float magnitude = goertzel.detect(); //check them for target_freq if (magnitude>THRESHOLD) { digitalWrite(led, HIGH); counter++; } else { digitalWrite(led, LOW); counter = counter; } if (counter >= 100) { counter = 0; } if (counter >= 99) { counter2 ++; } else { counter2 = counter2; } //Serial.println(magnitude); Serial.print("sensorMin = "); // выводим значение по x Serial.println(sensorMin); Serial.print("sensorMax = "); // выводим значение по x Serial.println(sensorMax); }
Не очень я понял, как пользоваться библиотекой Goertzel. Возможно нужно сделать так: и так: Ещё я не знаю, в каком диапазоне могут быть значения goertzel.detect();
Или я чего не понял, или одно из двух Почему не работает? Зачем не работает? Код (C++): #define MIN_SENSOR_VAL 0 #define MAX_SENSOR_VAL 1024 #define CALIBRATION_PASSES 20 int sensorMin = MAX_SENSOR_VAL; int sensorMax = MIN_SENSOR_VAL; void setup() { for(int i=0;i<CALIBRATION_PASSES;i++) { int sensorVal = analogRead(sensorPin); sensorMin = min(sensorMin,sensorVal); sensorMax = max(sensorMax,sensorVal); } } Не?
Этот код работать будет. Но тут значение не преобразованные будут. Я так понял нужны преобразованные данные. Что именно делает та библиотека, я к сожалению не знаю. Зачем вообще там весь loop нужен - не очень понятно. Есть ещё разница в том, что у вас считывается 20 раз, а там условно 20 секунд.
Ну я ж условно обрисовал, главное - принцип Встроенный макрос map никто не отменял После чтения с АЦП и получения мин и макс значений - кличем map, примерно так: Код (C++): sensorMin = map(sensorMin, 0, MAX_SENSOR_VAL, 0, какое-там у нас макс значение нужно). И всё
если в порт дать данные магнитуды, то видно наводку 50 Гц, значения я эти обрабатываю. Потому они высокие такие. И map, в данном случае, не нужно.