Проблема с переводом цифровых выходов в LOW - не могу понять.

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

Всем доброго вечера. Посмотрите кусочек кода. Задача - при сработке триггера 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;
  }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

По этому куску понять нельзя ничего. В какой это функции? Как она вызывается? После строки 13 у строк 31-32 есть шанс выполниться?

А вообще, проблема у Вас та же, что и вчера. Вы поназаводили флаги, но не менете их. Вчера Вы мне сказали. что Вам не надо. Ну, не надо - ловите глюки.

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

Это самое начало loop, цель - если есть ошибка по низкому уровню - ничего не давать делать, кроме как устранить причину ошибки (долить воды). Блин, первый return дальше не пускает? по почему тогда при размыкании пина строки 30-36 отрабатываются и дальше крутятся 02-13?

У меня дурной вопрос - цикл в строках 31-33 как обрадатывается - целиком в одном проходе loop или в каждом цикле loop по одному действию? (сорри за нубские вопросы - первый опыт программирования в жизни, мигание светодиодами не в счет)

sadman41
Offline
Зарегистрирован: 19.10.2016

Да, господи... натыкайте вы Serial.print-ов по всем местам, о которых вы желаете узнать, в качестве breakpoint и увидите, как МК исполняет ваш скетч. 

 

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

Блин, ну конечно же. Спасибо Евгению за то что ткнул меня носом в return. Перекроил - теперь работает как надо. Может кому пригодится, выкладываю.

void loop() {

  // опрос кнопки Power
  if (debouncer4.update()) { //если произошло событие
    if ((debouncer4.read() == 0) && StatusPower == 0) { //если кнопка Power нажата и перемення StatusPower равна 0 , то ...
      StatusPower = 1;
      StatePower = !StatePower; // запоминаем состояние питания
      beep();
    }
    if (digitalRead(ButtonPower) == HIGH && StatusPower == 1) { //если кнопка Power не нажата и переменная StatusPower равна - 1 ,то ...
      StatusPower = 0; //обнуляем переменную StatusPower 

    }
  }

  // обработка включения питания
   if (StatePower == false) {
     for (byte pin = 2; pin <= 12; ++pin) {
      digitalWrite(pin, LOW);
    }
    delay(50);
    tm1637.clearDisplay();
    
    if (LowLevel == false) {
    unsigned long currentMillis = millis();
    if (currentMillis - PowerLedPreviousMillis > PowerLedInterval) {
      PowerLedPreviousMillis = currentMillis;
      digitalWrite(LedPower, !digitalRead(LedPower));   // и переодически мигаем светодиодом
    }
    } else {
      digitalWrite(LedPower, LOW);
    }
    return;
  } else {
    digitalWrite(LedPower, HIGH);
  }

  // опрос датчика низкого уровня воды
  LowLevel = digitalRead(SensorLevel);
  if (LowLevel == false) {  // если датчик аварийного уровня сработал
  tone(Buzzer, 3000, 1000); // верещим
  StatePower = false;
  }