Доброго времени суток ув. форумчане! Необходима ваша помощь в исправлении моего очумелого кода Хочу, но никак не могу сделать что бы при достижении maxT (27гр.) включалась вытяжка и при minT(25гр.) она выключалась+помимо этого вытяжка включалась каждый час на несколько минут, ну а всё остальное время находилась в выкл. состоянии. Сейчас удалось добиться включения по времени+включение по достижении maxT, но дело в том, что она сразу же при снижении температуры ниже maxT и отключается, так и не достигнув значения minT. Также буду рад советам и рекомендациям по оптимизации кода. Опыт программирования практически отсутствует, но копи-пастить умею неплохо Код (C++): #include <Wire.h> #include <SPI.h> #include <LiquidCrystal_I2C.h> #include <DHT.h> #include <RTC.h> #include <dht11.h> #include <config.h> #include <ds3231.h> RTC time; #define DHT11_PIN1 2 // Внутр. датчик влажности/температуры 2 DHT dht(2, DHT11); LiquidCrystal_I2C lcd(0x27,16,2); // Задаем адрес и размерность дисплея /////////////////////////////////////////////////////////// int h; //Установленное время часы int m;//Установленное время минуты int s;//Установленное время секунды int tmp_h; int tmp_m; int tmp_s; int maxT=27; //Максимальная температура до ВКЛ. вытяжки int minT=25; //Температура ВЫКЛ. вытяжки int ventOnMin=0; //Время ВКЛ. вытяжки int ventOffMin=4; //Время ВЫКЛ. вытяжки int TimeOnHour=17; //Время ВКЛ. LED int TimeOffHour=9; //Время ВЫКЛ. LED int TimeOnMin=0; int TimeOffMin=0; /////////////////////////Пины реле////////////////////////////////// int FS = 6; //реле 1 int vent = 5; //реле 2 int led = 4; //реле 3 /////////////////////////////////////////////////////////// byte degree[8] = // Битовая маска символа градуса { B00111, B00101, B00111, B00000, B00000, B00000, B00000, }; //////////////////////////////////////////////////////////// void setup() { // Start the I2C interface Wire.begin(); Serial.begin(9600); // Start the serial interface while (!Serial) ; // wait for serial time.begin(RTC_DS3231); lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку lcd.createChar(1, degree); // Создаем символ под номером 1 // pinMode(FS, OUTPUT); // digitalWrite(FS, HIGH); pinMode(led, OUTPUT); digitalWrite(led, HIGH); pinMode(vent, OUTPUT); digitalWrite(vent, HIGH); //time.settime(35,18,42,3,5,16,1); // 0 сек, 8 мин, 21 час, 27, октября, 2015 года, вторник } void loop() { delay(1000); // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) // Read temperature as Celsius int t = dht.readTemperature(); int h = dht.readHumidity(); tmp_h=time.Hours; tmp_m=time.minutes; tmp_s=time.seconds; /////////////////////////// lcd.setCursor(0, 0); // Устанавливаем курсор в начало 2 строки lcd.print(time.gettime("H:i:s D")); lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки lcd.print("Temp= \1"); // Выводим текст, \1 - значок градуса lcd.setCursor(5, 1); lcd.print(t); lcd.setCursor(9, 1); lcd.print("Hum= %"); lcd.setCursor(13, 1); lcd.print(h); // lcd.clear(); // Очистка экрана //////////////////////////// Serial.println(t); Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время if ((tmp_h >= TimeOnHour && tmp_h <= 23)||(tmp_h >= 0 && tmp_h < TimeOffHour)) // {digitalWrite(FS, LOW);} {digitalWrite(led, LOW);} else // {digitalWrite(FS, HIGH);} {digitalWrite(led, HIGH);}; //В другом случае - всегда выключено if (t >= maxT) {digitalWrite(vent, LOW);} //Если Т>МаксТ включаем else if (t <= minT) {digitalWrite(vent, HIGH);} //Если Т<МинТ выключаем else if (tmp_m >= ventOnMin && tmp_m < ventOffMin) {digitalWrite(vent, LOW);} //Включаем по расписанию else {digitalWrite(vent, HIGH);}; delay(1); }
Код (C++): if (t >= maxT) {digitalWrite(vent, LOW);} //Если Т>МаксТ включаем else if (t <= minT) {digitalWrite(vent, HIGH);} //Если Т<МинТ выключаем else if (tmp_m >= ventOnMin && tmp_m < ventOffMin) {digitalWrite(vent, LOW);} //Включаем по расписанию else {digitalWrite(vent, HIGH);}; // <<<< ****** Собака зарыта здесь ****** delay(1); }
Спасибо за подсказку, но увы это я знаю) Не могу понять как правильно написать условие... работа по времени+если Т перевалила за предел то включение и выключение при минимальной Т, а во всех остальных случаях выключено... у меня выходит либо работа по времени только, либо же работа по времени и включение при максимальном пороге и сразу же выключение как только есть отклонение от максимума...
Видима как то так: Код (C++): if (t >= maxT or (tmp_m >= ventOnMin and tmp_m < ventOffMin)) {digitalWrite(vent, LOW);} else if (t <= minT and tmp_m >= ventOffMin)) {digitalWrite(vent, HIGH);}