Кто-нибудь может помочь мне понять, почему мое меню застревает?

Когда я пытаюсь запустить свой код с помощью кнопок меню и выбора, кажется, что он работает, за исключением того, что главное меню не будет перемещаться мимо "Главного сада" к "Смородине". Существует также проблема с подменю, где после первого предупреждения о поливе нажатие кнопки выбора заставляет его просто вернуться в главное меню, не зажигая светодиод на выводе LEDPower и не выполняя эту трассу полива в течение всего интервала полива.

Единственное предположение, которое я до сих пор не пробовал, заключается в том, что, может быть, мне следует изменить void MainMenu() на структуру Switch Case вместо If-Else?

.

правка:

.

, 👍1


1 ответ


Лучший ответ:

1

Проблема первая (Меню не движется мимо Главного сада к Смородине):

MainOld используется для увеличения MenuState, но MainOld никогда не увеличивается, а это значит, что он никогда не будет иметь значения больше 0. Соответственно, MenuState никогда не может быть больше 0 + 1.

Проблема вторая (циклическое возвращение подменю к основному):

"Проверка" состояния LEDPower, как в Water1 (), - не лучший способ достичь того, чего вы хотите достичь. Это может работать, но технически неправильно, так как LEDPower-это состояние контакта, и вы никогда не читаете его.

Другая проблема в Water1 заключается в том, что previousWaterMillis не обновляется нигде в вашем коде, а это означает, что в любое время, когда Water1 вызывается более чем через 10 секунд после загрузки, ваш соленоид активируется, а затем немедленно деактивируется. Я бы рекомендовал цикл while внутри вашей функции Water1. ex.

void Water1(){
  digitalWrite(Relay1, HIGH);
  unsigned long currentMillis = millis();
  previousWaterMillis = millis();
  int LEDPowerState = digitalRead(LEDPower);

  while(currentMillis - previousWaterMillis <= WateringInterval){
    digitalWrite(LEDPower, HIGH);
    Serial.println("Watering Garden with LED Lit");
    currentMillis = millis();
  }
  
  digitalWrite(Relay1, LOW);
  digitalWrite(LEDPower, LOW);
  SubMenuState = 0;
  SubMenuOld = 0;
}

^^ Это зажжет ваш светодиод и активирует соленоид на 10 секунд, которые вы хотите поливать. 
,

Большое вам спасибо!! Я добавил MainOld = MenuState; чтобы menubuttoncheck() увеличить MainOld с помощью прессов, сделал void Water1, как вы сказали, и это работает!, @NJGardenGuy