В общем все как обычно, замахнулся на контроллер и полив и все на свете. Решил, что ключевой задачей является "АлармСтоп" и начал его реализовывать, но вот беда, в case 2 Значение AlarmCounter уже явно больше 3 (3 и более на дисплей вывел) а перехода в case 6 никак не происходит... Код (C++): // Объявляем переменные и константы: uint8_t modState = 0; /* при старте */ uint8_t AlarmCounter; void setup() { void loop() { int i=0; //необходимо для цикла создать переменную int lefti=0; //необходимо для вычисления оставшегося времени switch(modState){ // Устройство дежурное состояние или только запущено case 0: AlarmCounter = 0; break; // Устройство в режиме ожидания (после полива) для пропитывания почвы водой case 1: i = 0; lefti = 0; lcd.clear(); lcd.setCursor(0, 0); lcd.print("Wait"); while (i<500){ lefti = (500-(i)); lcd.setCursor(0, 1); lcd.print(lefti); lcd.setCursor(0, 3); lcd.print(F("HUM1= %")); lcd.setCursor(5, 3); lcd.print(lastHum1); i++; } modState=2; break; // Устройство активно и опрашивает датчик влажности почвы case 2: AlarmCounter=AlarmCounter+1; i = 0; lefti = 0; digitalWrite(RELAYSENS,LOW); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Sensor Activate"); while (i<500){ // приблизительно lcd.setCursor(0, 1); lefti = (500-(i)); lcd.print(lefti); HUM1_result = analogRead(PIN_hum1); // опрашиваем датчик влажности почвы sensorHum1 = map(HUM1_result, 0, 1023, 100, 0); // задаем вывод только двоичного значения процентном соотношении lastHum1 = (sensorHum1); lcd.setCursor(0, 3); lcd.print(F("HUM1= %")); // Выводим последнее сохраненное значение влажности почвы lcd.setCursor(5, 3); lcd.print(lastHum1); lcd.setCursor(5, 2); lcd.print(AlarmCounter); i++; } if (AlarmCounter >= 3) {modState=6;} // на отрез не работает if (lastHum1 <= 10) {modState=3;} else {modState=0; lcd.clear();} break; // Устройство в режиме полива case 3: i = 0; lefti = 0; digitalWrite(RELAY3,LOW); //включаем полив lcd.clear(); lcd.setCursor(0, 0); lcd.print("watering"); LastTimeH = (time.Hours); LastTimeM = (time.minutes); lcd.setCursor(15, 3); lcd.print(LastTimeH); lcd.setCursor(17, 3); lcd.print(":"); lcd.setCursor(18, 3); lcd.print(LastTimeM); while (i<500){ lefti = (500-(i)); lcd.setCursor(0, 1); lcd.print(lefti); lcd.setCursor(0, 3); lcd.print(F("HUM1= %")); // Выводим последнее сохраненное значение влажности почвы lcd.setCursor(5, 3); lcd.print(lastHum1); i++; } modState=1; break; // Устройство в режиме установки пороговой влажности почвы case 4: break; // Устройство в режиме установки длительность полива case 5: break; // Устройство в режиме Аварийной остановки case 6: lcd.clear(); lcd.setCursor(0, 0); lcd.print(" * * A L A R M * *"); lcd.setCursor(0, 2); lcd.print("False Watering !"); lcd.setCursor(9, 3); lcd.print(AlarmCounter); break; } } Постарался обрезать код до минимума, если нужно выложу полную версию.
Беда не в этом. Основная беда в том что вы очень слабы в программировании, как языка Си, так и как правильнее программировать. Или за вас написать программу или же выкладывать по шагам что и как делать. В любом случае это очень много моего труда.
Код (C++): if (AlarmCounter >= 3) {modState=6;} // на отрез не работает if (lastHum1 <= 10) {modState=3;} else {modState=0; lcd.clear();} Когда первое условие выполняется, то "modState=6", а следом второе условие меняет значение modState на 3 или 0. По этому, в "case 2" переменная modState никогда не будет иметь значение 6. Если Вы хотите что бы вторая проверка выполнялось только когда AlarmCounter < 3, то попробуйте так: Код (C++): if (AlarmCounter >= 3) { modState=6; } else { if (lastHum1 <= 10) { modState=3; } else { modState=0; lcd.clear(); } } или так: Код (C++): if (AlarmCounter >= 3) { modState=6; break; } if (lastHum1 <= 10) { modState=3; } else { modState=0; lcd.clear(); } В "case 6" у Вас почему-то не изменяется значение modState, так и задумано?
Код (C++): /*Cl_controller.ino */ //---------------Cl_controller-------------------- enum en_stat { NOWATERING, // нет полива WATERING, // полив ALARM, // остановка по ошибке SETTLING // установка }; class Cl_controller { en_stat stat; uint32_t past; uint32_t time; // время полива const byte Relay_pin;// нога реле насосаполива public: Cl_controller(byte pin): Relay_pin(pin) {} void setup() { stat = NOWATERING; pinMode(Relay_pin, OUTPUT); digitalWrite(Relay_pin, LOW); // не поливать } void loop() { if (WATERING && millis() - past >= time) { stat = NOWATERING; digitalWrite(Relay_pin, LOW); // не поливать } } void watering(uint32_t _time) { // полить столько времени time = _time; stat = WATERING; past = millis(); digitalWrite(Relay_pin, 1); // начать полив } }; //---------------------компоновка-------------------------------------------- Cl_controller Controller(/*нога реле полива*/2); //----------------------main()------------------------------------------------ void setup() { Controller.setup(); } void loop() { Controller.loop(); }
Исполнение идеи я так понимаю на 5+, но ,не обижайтесь, делится знаниями не ваш конек ) (без коментариев код понятен только вам и другим специалистам...), не тратьте свое бесценное божественное время на всяких нубов, вы же родились таким...
А жаловаться зачем. (1)Комментариев в программе столько сколько надо. Избыток комментариев портит понимаемость программы. (2) Вы выложили код, ТЗ, описали что и как делается. Нет. Ах тогда чего обижаться, если вы и ваши близкие родились с телепатией и хрустальным шаром в руках, то извините я нет. (3) я показал направление как правильнее писать. А дальше гугл и учебники. Или вам здесь объянить что такое гугл или что такое учебники и как с помощью их учится. Я предпочитаю их читать, а не ложить под подушку на ночь.
Ну да. Код скорее эскизный, чем рабочий. Для рабочего нужно знать ТЗ, потом собрать на макетке и провести бета-тестирование. Так что код это просто направление,или вариант направления программы.
Ну вообщемто пилю я свою теплушку... пока вроде выходит понемногу, Хочу но пока не сделано: 1) кнопки 2) Наполнение емкости с водой 3) Включение досветки 4) вывод данных в сеть вышло пока так:
Ключевые задачи, которые пытаюсь решать по ходу событий: 1) интуитивно понятный интерфейс 2) минимизация расхода выводов (аналоговых и цифровых) 3) Гибкость в настройке без подключения к компьютеру
Все открыто. Но проект на ESP-8266 и без дисплея. Опыт показал что не на что там смотреть. В остальном все то же самое. Это вторая часть соответствующего проекта. В прошлом году на скорую руку, в этом уже понял основные моменты - что главное что второстепенное. Скоро выложу и разрисую все.