Кто-нибудь может помочь мне понять, почему мое меню застревает?
Когда я пытаюсь запустить свой код с помощью кнопок меню и выбора, кажется, что он работает, за исключением того, что главное меню не будет перемещаться мимо "Главного сада" к "Смородине". Существует также проблема с подменю, где после первого предупреждения о поливе нажатие кнопки выбора заставляет его просто вернуться в главное меню, не зажигая светодиод на выводе LEDPower и не выполняя эту трассу полива в течение всего интервала полива.
Единственное предположение, которое я до сих пор не пробовал, заключается в том, что, может быть, мне следует изменить void MainMenu() на структуру Switch Case вместо If-Else?
.
правка:
.
@NJGardenGuy, 👍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 секунд, которые вы хотите поливать.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Большое вам спасибо!! Я добавил MainOld = MenuState; чтобы menubuttoncheck() увеличить MainOld с помощью прессов, сделал void Water1, как вы сказали, и это работает!, @NJGardenGuy