Доброго времени суток ! Имею вот такой код (собрал с просторов интернета, адаптировал). На данный момент программа меня устраивает, но хочется "идеала". Подскажите где капнуть для решения пары вопросов: Как сделать повторение пары этапов в программе (указаны в коде: этапы 3 и 4 ?; Как вырубить Ардуинку после выполнения полного цикла программы ?; Почему то после вывода END включается реле и не отключается (стр. 135) ?!; Оптимизировать код... Спойлер: скетч проги Код (C++): #include <Wire.h> #include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal_I2C.h> #define ONE_WIRE_BUS 12 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensor(&oneWire); LiquidCrystal_I2C lcd(0x27, 20, 4); const int Fan = 4 ; const int Hat = 10 ; unsigned long p0 = 0; //Настройка работы int c1 = 0; // этап 1 - ожидание 1 мин unsigned long p1 = 5000; // время byte f1 = 0; int c2 = 0; // этап 2 - включаем вентилятор, через 2 часа unsigned long p2 = 10000; // время byte f2 = 0; // этап 3 и 4 повторить 3 раза ---------------------------------------------------------- int c3 = 30; // этап 3 - температура, включаем нагреватель на 4 часа unsigned long p3 = 10000; // время byte f3 = 0; int c4 = 0; // этап 4 - выключаем нагреватель на 2 часа unsigned long p4 = 10000; // время byte f4 = 0; //--------------------------------------------------------------------------------------- int c5 = 0; // этап 5 - проветриваем 4 часа unsigned long p5 = 5000; // время byte f5 = 0; //Конец настройки работы void setup(void) { Serial.begin(9600); pinMode(Fan, OUTPUT); pinMode(Hat, OUTPUT); digitalWrite(Fan, LOW); digitalWrite(Hat, LOW); Wire.begin(); lcd.init(); lcd.backlight(); sensor.begin(); sensor.setResolution(12); } //отсчет обратного времени void Timer(unsigned long p) { lcd.setCursor(0, 0); //lcd.setCursor(0, 1); if (p != 0) { unsigned long time = (p - millis()) / 1000; if (time / 60 / 60 < 10) {lcd.print("0");} lcd.print(time / 60 / 60); lcd.print(":"); if (time / 60 % 60 < 10) {lcd.print("0");} lcd.print((time / 60) % 60); lcd.print(":"); if (time % 60 < 10) {lcd.print("0");} lcd.print(time % 60); } else {lcd.print("00:00:00"); } } void loop(void) { float temp; sensor.requestTemperatures(); temp = sensor.getTempCByIndex(0); delay(500); //включение таймера if (f1 == 0) { f1 = 1; p0 = p1 + millis(); } if (f2 == 0 and f1 == 2) { digitalWrite(Fan, HIGH); f2 = 1; p0 = p2 + millis(); } if (f3 == 0 and f2 == 2) { digitalWrite(Hat, HIGH); f3 = 1; p0 = p3 + millis(); } if (f4 == 0 and f3 == 2) { digitalWrite(Hat, LOW); f4 = 1; p0 = p4 + millis(); } if (f5 == 0 and f4 == 2) { f5 = 1; p0 = p5 + millis(); } // поддержка тем-ры if (temp < c1 and f1 == 1 and digitalRead(Hat) == HIGH || temp < c2 and f2 == 1 and digitalRead(Hat) == HIGH || temp < c3 and f3 == 1 and digitalRead(Hat) == HIGH || temp < c4 and f4 == 1 and digitalRead(Hat) == HIGH || temp < c5 and f5 == 1 and digitalRead(Hat) == HIGH) { digitalWrite(Hat, LOW); } if (temp > c1 and f1 == 1 and digitalRead(Hat) == LOW || temp > c2 and f2 == 1 and digitalRead(Hat) == LOW || temp > c3 and f3 == 1 and digitalRead(Hat) == LOW || temp > c4 and f4 == 1 and digitalRead(Hat) == LOW || temp > c5 and f5 == 1 and digitalRead(Hat) == LOW) { digitalWrite(Hat, HIGH); } //обнуление таймера if (p0 < millis() and f1 == 1) { f1 = 2; p0 = 0; if (p2 == 0) { f2==2; } } if (p0 < millis() and f2 == 1) { f2 = 2; p0 = 0; if (p3 == 0) { f3==2; } } if (p0 < millis() and f3 == 1) { f3 = 2; p0 = 0; if (p4 == 0) { f4==2; } } if (p0 < millis() and f4 == 1) { f4 = 2; p0 = 0; if (p5 == 0) { f5==2; digitalWrite(Hat, LOW); } } if (p0 < millis() and f5 == 1) { f5 = 2; p0 = 0; digitalWrite(Hat, LOW); digitalWrite(Fan, LOW); lcd.setCursor(0, 3); lcd.print("END"); // почему то включает нагреватель ?!?! как остановить вырубить ардуинку после "END" ?!?! } //вывод на экран Timer(p0); lcd.setCursor(0, 1); lcd.print("T="+String(temp)+" C"); lcd.setCursor(11, 0); if (f1==1) {lcd.print("1");} if (f2==1) {lcd.print("2");} if (f3==1) {lcd.print("3");} if (f4==1) {lcd.print("4");} if (f5==1) {lcd.print("5");} lcd.setCursor(15, 0); lcd.print("V-"); lcd.setCursor(17, 0); if (digitalRead(Fan) == HIGH) { lcd.print("ON "); } else { lcd.print("OFF"); } lcd.setCursor(15, 1); lcd.print("H-"); lcd.setCursor(17, 1); if (digitalRead(Hat) == LOW) { lcd.print("ON "); } else { lcd.print("OFF"); } }
Сейчас больше всего интересуют 2 и 3 вопросы... При загрузке или перезагрузки ардуинки, реле пару раз включаются... Связано ли это с их уровнями (LOW и HIGH), хотя ставил и такие и такие, ничего не меняется ?!
в момент загрузки МК все его выводы находятся третьем состоянии. При переводе пина в режим выхода, он сразу выдаст 0. При грамотном программировании это всё не вызывает проблем. Проблема в том, что дурина - очень медленная, поэтому и все процессы медленные.
нужно добавить физическую подтяжку на выводы, управляющие реле - чтобы при выключении или перезагрузке на выводах было стабильное состояние