Странное поведение при использовании Serial.println
- Войдите на сайт для отправки комментариев
Добрый день! Сразу оговорюсь, что это мой первый проект на ардуино и я уже перерыл кучу тем и не нашел нужного мне ответа.
Делаю обработку логики для бесключевого доступа в авто. Ручки (с датчиками) подключены напрямую в аналоговые входы А0, А1 и тд. Сами пины в состоянии OUTPUT / HIGH. Логика датчиков в самой ручке такая - при подаче питания происходит калибровка (значения с пинов схожи с показаниями открыти/закрытие), далее начинают работать в обычном режиме. Я пошел по пути просто мониторить просадку напряжения на пинах.
Собственно с самой логикой я разобрался, но вот есть странность при фильтровании этой "калибровки". Алгоритм у меня такой: датчик в ручке выдает определенный сигнал (просадку при analogRead) и вот если убрать Serial.println то код сразу прыгает в условие, где делает calibration = false, при этом если вернуть Serial.println, то код начинает отрабатывать корректно. CALIBRATION_VAL это сумма значений с пина, получается всегда одинаковым, то есть я на него и ориентируюсь.
У меня пока такая мысль, что без использования Serial.println код либо быстрее отрабатывает либо раньше (до включения ручки) отсюда и завышенное значение. Но возможно я написал бред) Помогите пожалуйста.
Вот кусок скетча
const byte DOORS[] = {A0,A1,A2,A3};
const byte OPERATING[] = {4,5};
const int unsigned CHECK = 20;
const int unsigned SLEEP_PIN = 3;
const int unsigned TRIGGER_VALUE = 1000;
const unsigned long CALIBRATION_VAL = 258000;
void setup() {
for (byte i = 0; i < sizeof(DOORS); i++) {
pinMode(DOORS[i], OUTPUT);
digitalWrite(DOORS[i], HIGH);
}
for (byte i = 0; i < sizeof(OPERATING); i++) {
pinMode(OPERATING[i], OUTPUT);
digitalWrite(OPERATING[i], LOW);
}
Serial.begin(9600);
}
bool calibration = true;
void loop() {
volatile unsigned long cVal = 0;
while (calibration) { // calibration handle
cVal = cVal + analogRead(DOORS[0]);
// Serial.println(cVal);
if (cVal > CALIBRATION_VAL) {
calibration = false;
cVal = 0;
}
}
for (byte i = 0; i < sizeof(DOORS); i++) { // handle doors
int unsigned val = analogRead(DOORS[i]);
if (val < TRIGGER_VALUE) handle(DOORS[i]);
}
}
К слову если использовать Serial.println до цикла, то тоже отрабатывает корректно
Естественно быстрее. Ты думал, println - эльфийская магия и времени не занимает?
Паузу поставьте на место Serial.println(cVal); 50 миллисекунд и все заработает.
Слишком шустро опрашиваете ИМХО.
Да с паузой работает, но дольше. Тогда надо новый алгоритм придумать. Потому с delay играться или Serial юзать не идеально получается. В любом случае спасибо что ткнули носом, пойду думать.
Если нужна скорость и нормальный АЦП - используйте другой контроллер. Например STM32 - с ардуинкой это предел.
Я пока оставил вариант с delay. Завтра пойду это все в машину ставить, если не случится ничего непредвиденного, в принципе можно и так оставлять, на столе нормально работает. В любом случае совет принял, спасибо!
Я пока оставил вариант с delay. Завтра пойду это все в машину ставить, если не случится ничего непредвиденного, в принципе можно и так оставлять, на столе нормально работает. В любом случае совет принял, спасибо!
задержку можете понизить раз в десять, как минимум. 50мс это перебор. Ардуина междленная, но не настолько :)
Я 5мс поставил, все довольно прогнозируемо)