Проблема с переводом цифровых выходов в LOW - не могу понять.
- Войдите на сайт для отправки комментариев
Чт, 04/01/2018 - 18:09
Всем доброго вечера. Посмотрите кусочек кода. Задача - при сработке триггера LowLevel, должны отключаться все выхода и пропадать реакия на кнопки (кроме выхода LedPower, который будет мигать, пока LowLevel содержит сработку). Отключение должно происходить при замыкании пина на землю и соответственно ложном флаге StatePower, но... При замыкании пина LowLevel на землю, зуммер пищит, светодион начинает прерывисто мигать, а выхода в LOW уровень не переводятся.... пока пин не разомкну. Флаг StatePower генерится (проверял), но цикл с отключением выходов запускается только после того, как PIN от земли оторву. Если имеет значение LowLevel - A5. Где собака могла порыться?
Отключение
// опрос датчика низкого уровня воды LowLevel = digitalRead(SensorLevel); if (LowLevel == false) { // если датчик аварийного уровня сработал if (StatePower == true){ // если увлажнитель работает tone(Buzzer, 3000, 1000); // верещим } unsigned long currentMillis = millis(); if (currentMillis - PowerLedPreviousMillis > PowerLedInterval) { PowerLedPreviousMillis = currentMillis; digitalWrite(LedPower, !digitalRead(LedPower)); // и переодически мигаем светодиодом StatePower = false; // и даем сигнал на выключение питания - вот тут где то проблема... } return; } // опрос кнопки Power if (debouncer4.update()) { //если произошло событие if ((debouncer4.read() == 0) && StatusPower == 0) { //если кнопка Power нажата и перемення StatusOsc равна 0 , то ... digitalWrite(LedPower, !digitalRead(LedPower)); StatusPower = 1; StatePower = !StatePower; // запоминаем состояние питания beep(); } if (digitalRead(ButtonPower) == HIGH && StatusPower == 1) { //если кнопка Power не нажата и переменная StatusPower равна - 1 ,то ... StatusPower = 0; //обнуляем переменную StatusOsc } } // обработка включения питания if (StatePower == false) { for (byte pin = 2; pin <= 13; ++pin) { digitalWrite(pin, LOW); } delay(50); tm1637.clearDisplay(); return; }
По этому куску понять нельзя ничего. В какой это функции? Как она вызывается? После строки 13 у строк 31-32 есть шанс выполниться?
А вообще, проблема у Вас та же, что и вчера. Вы поназаводили флаги, но не менете их. Вчера Вы мне сказали. что Вам не надо. Ну, не надо - ловите глюки.
Это самое начало loop, цель - если есть ошибка по низкому уровню - ничего не давать делать, кроме как устранить причину ошибки (долить воды). Блин, первый return дальше не пускает? по почему тогда при размыкании пина строки 30-36 отрабатываются и дальше крутятся 02-13?
У меня дурной вопрос - цикл в строках 31-33 как обрадатывается - целиком в одном проходе loop или в каждом цикле loop по одному действию? (сорри за нубские вопросы - первый опыт программирования в жизни, мигание светодиодами не в счет)
Да, господи... натыкайте вы Serial.print-ов по всем местам, о которых вы желаете узнать, в качестве breakpoint и увидите, как МК исполняет ваш скетч.
Блин, ну конечно же. Спасибо Евгению за то что ткнул меня носом в return. Перекроил - теперь работает как надо. Может кому пригодится, выкладываю.