Контроллер для Гроубокса
- Войдите на сайт для отправки комментариев
Втр, 05/11/2019 - 00:03
Доброй ночи, уважаемые Гуру ардуиностроения.
Прошу у вас помощи. Написан скетч для управления Гроубоксом. Обозначены переменные и условия. Все действия по заданным условиям выполняются, кроме последнего пункта. Не включается реле вентиляции по температуре. Скетч ошибок не выдаёт. По этому прошу помочь разобраться. Буду рад любой подсказке. Спасибо.
#include <EEPROMex.h> #include <EEPROMVar.h> #include <iarduino_RTC.h> iarduino_RTC time(RTC_DS3231); #include <Wire.h> #include <iarduino_AM2320.h> #include <memorysaver.h> #include <UTFT.h> #define moisture_sensor A0 //пин подключения датчика влажности почвы int very_moist_value = 231;//переменная 100% увлажненния const uint8_t RS = 6; // const uint8_t WR = 5; // const uint8_t CS = 4; // const uint8_t RST = 3; // const uint8_t SER = 2; // UTFT myGLCD(TFT01_24SP, RS, WR, CS, RST, SER); // Создаём объект для работы с дисплеем // НАСТРОЙКИ ДИСПЛЕЯ extern uint8_t SmallFont[]; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFont[]; iarduino_AM2320 sensor; boolean DAY = 0; // 0-ночь, 1-день #define Relay_Lamp 9 // пин реле включения освещения #define Relay_Heat 10 // пин реле включения подогрева #define Relay_Vent 11 // пин реле включения вентиляции #define Relay_Fan 12 // пин реле включения кулера (с обогревателем) //Переменные настройки температуры boolean heating = 1; // режим обогрева on/off 1/0 - eeprom= 31 float Temp_Box_Day = 24.0; // необходимая температура днем - eeprom= 1 float Temp_Box_Night = 21.0; // необходимая температура ночью - eeprom= 5 float delta_Temp = 0.4; // отклонение температуры до включения (гистерезис) - eeprom= 9 float step_Temp = 0.2; // шаг измениения температуры float airT = sensor.tem; //переменная температуры воздуха float airH = sensor.hum; //переменная влажности воздуха //Переменные управления освещением boolean lighting = 1; // режим освещения on/off - eeprom= 32 byte start_day_h = 17; // время начала дня (часы) - eeprom= 13 byte start_day_m = 00; // время начала дня (минуты) - eeprom= 14 byte duretion_day_h = 16 ; // продолжительность досветки (часы) - eeprom= 15 byte duretion_day_m = 00; // продолжительность досветки (минуты) - eeprom= 16 byte offL_h; // время выключения света(часы) byte offL_m ; // время выключения света(минуты) //Переменные управления вентиляцией boolean ventilation = 1; // режим вентиляции on/off 1/0 - eeprom= 34 float Temp_Vent_ON = 27.0; // температура включения вентиляции - eeprom= 35 float delta_Temp_Vent = 2.0; // отклонение температуры до отключения (гистерезис)- eeprom= 39 String Temp , TempD, TempN; void setup() { sensor.begin(); //запуск датчика АМ2320 time.begin(); //запуск модуля RTC3231 time.settime(0,53,23,04,11,19,1); pinMode(Relay_Lamp, OUTPUT); pinMode(Relay_Heat, OUTPUT); pinMode(Relay_Vent, OUTPUT); pinMode(Relay_Fan, OUTPUT); digitalWrite(Relay_Lamp, HIGH); //выключаем реле digitalWrite(Relay_Heat, HIGH); digitalWrite(Relay_Vent, HIGH); digitalWrite(Relay_Fan, HIGH); //кулер совместно с подогревом //------EEPROM-------------------- //EEPROM.writeByte(100, 0); // пишем 0, чтобы обновилась память в соответствии с переменными (для тестирования) // в ячейке 100 должен быть записан флажок 1, если его нет - делаем (ПЕРВЫЙ ЗАПУСК) if (EEPROM.read(100) != 1) { EEPROM.writeByte(100, 1); // update_EEPROM(0); //записываем исходные данные в ячейки памяти } else { // записываем в переменные данные из памяти heating = EEPROM.read(31);// режим обогрева on/off Temp_Box_Day = EEPROM.readFloat(1); // необходимая температура при освещении Temp_Box_Night = EEPROM.readFloat(5); // необходимая температура БЕЗ освещении delta_Temp = EEPROM.readFloat(9); // отклонение температуры до включения lighting = EEPROM.read(32);// режим освещения on/off start_day_h = EEPROM.read(13); // время начала дня (часы) start_day_m = EEPROM.read(14); // время начала дня (минуты) duretion_day_h = EEPROM.read(15); // продолжительность досветки (часы) duretion_day_m = EEPROM.read(16); // продолжительность досветки (минуты) //watering = EEPROM.read(33);//режим полива on/off //start_wat_h = EEPROM.read(17);// время начала полива (часы) //start_wat_m = EEPROM.read(18); // время начала полива (минуты) //duretion_wat_h = EEPROM.read(19); // продолжительность полива (часы) //duretion_wat_m = EEPROM.read(20);// продолжительность полива (минуты) //3.2 ventilation = EEPROM.read(34); //режим вентиляции on/off Temp_Vent_ON = EEPROM.read(35); delta_Temp_Vent = EEPROM.read(39); //3.3 //sens_watering = EEPROM.read(40); //режим полива по датчику влаж. почвы on/off //humidification = EEPROM.read(41); // режим увлажнения воздуха on/off //Hum_ON = EEPROM.read(42); // порог включения увлажнителя воздуха //delta_Hum = EEPROM.read(43); // отклонение влажности до отключения (гистерезис) } myGLCD.InitLCD(PORTRAIT); myGLCD.clrScr(); myGLCD.fillScr(VGA_BLACK); } void loop() { sensor.read(); //day_night(); myGLCD.setFont(BigFont); myGLCD.setColor(VGA_GREEN); myGLCD.print("GROWCONTROL 1.0", CENTER, 10); myGLCD.setColor(VGA_RED); //Блок вывода с RTC DS_3231 myGLCD.print("TIME", 43, 43); myGLCD.setColor(VGA_WHITE); myGLCD.setFont(SmallFont); // Вывод времени на экран myGLCD.print(String(time.gettime("H:i:s, D")), 25, 70); //разлиновка дисплея myGLCD.drawLine(5,30,232,30); myGLCD.drawLine(5,98,232,98); myGLCD.drawLine(5,170,232,170); myGLCD.drawLine(5,240,232,240); myGLCD.drawLine(150,40,150,310);//вертикальная линия myGLCD.setFont(BigFont); //блок вывода температуры myGLCD.setColor(VGA_PURPLE); myGLCD.print("AirTemp.", 12, 110); myGLCD.setColor(VGA_WHITE); myGLCD.printNumF(sensor.tem,1,40,142); //блок вывода влажности myGLCD.setColor(VGA_BLUE); myGLCD.print("AirHum.", 20, 181); myGLCD.setColor(VGA_WHITE); myGLCD.printNumF(sensor.hum,1,40,212); delay(1000); myGLCD.setColor(VGA_TEAL); //блок вывода влажности почвы myGLCD.print("SoilHum.", 13, 252); int moisture_value = analogRead(moisture_sensor); //переменная влажности почвы int moisture_value_percent = map(moisture_value, very_moist_value, 1023, 100, 0); //myGLCD.print(String (moisture_value), 35, 275); myGLCD.setColor(VGA_WHITE); myGLCD.print(String (moisture_value_percent)+ '%', 50, 282); delay(1000); //Включаем реле освещения if (lighting == 1) {//если активно if (DAY == 1 ) { digitalWrite(Relay_Lamp, LOW); //включаем реле myGLCD.setColor(VGA_RED); myGLCD.print("LAMP", 162, 55); } else { digitalWrite(Relay_Lamp, HIGH); //отключаем реле myGLCD.setColor(VGA_BLACK); myGLCD.print("LAMP", 162, 55); } } else digitalWrite(Relay_Lamp, HIGH); //отключаем реле myGLCD.print("LAMP", 162, 55); // Включаем реле подогрева if (heating == 1) {//если активно if ( DAY == 1 && airT < (Temp_Box_Day - delta_Temp)) { // если день и похолодало digitalWrite(Relay_Heat, LOW); // включаем подогрев дня digitalWrite(Relay_Fan, LOW); //включаем кулер myGLCD.setColor(VGA_RED); myGLCD.print("HEAT", 162, 130); myGLCD.print("FAN", 162, 260); } else if ( DAY == 0 && airT < (Temp_Box_Night - delta_Temp)) { // если ночь похолодало digitalWrite(Relay_Heat, LOW); // включаем подогрев ночи digitalWrite(Relay_Fan, LOW); //включаем кулер myGLCD.print("HEAT", 162, 130); myGLCD.print("FAN", 162, 260); } else if (DAY == 1 && airT > (Temp_Box_Day)) { // если день и подогрели digitalWrite(Relay_Heat, HIGH); //выключаем реле подогрева digitalWrite(Relay_Fan, HIGH); //выключаем кулер myGLCD.setColor(VGA_BLACK); myGLCD.print("HEAT", 162, 130); myGLCD.print("FAN", 162, 260); } else if (DAY == 0 && airT > (Temp_Box_Night)) { // если ночь и подогрели digitalWrite(Relay_Heat, HIGH); //выключаем реле подогрева digitalWrite(Relay_Fan, HIGH); //выключаем кулер myGLCD.print("HEAT", 162, 130); myGLCD.print("FAN", 162, 260); } } else { digitalWrite(Relay_Heat, HIGH); //выключаем реле подогрева digitalWrite(Relay_Fan, HIGH); //выключаем кулер myGLCD.print("HEAT", 162, 130); myGLCD.print("FAN", 162, 260); } // Управление вентиляцией if (ventilation == 1) {//если активно if ( airT > Temp_Vent_ON) { // если жарко digitalWrite(Relay_Vent, LOW); // включаем реле вент. myGLCD.setColor(VGA_RED); myGLCD.print("VENT", 162, 190); } else if (airT <= (Temp_Vent_ON - delta_Temp_Vent)) { // если остыли digitalWrite(Relay_Vent, HIGH); // выключаем реле вент. myGLCD.setColor(VGA_BLACK); myGLCD.print("VENT", 162, 190); // Serial.println((String) Temp_Vent_ON + "-" + delta_Temp_Vent ); } }
А все остальные условия с участием airT работают как полагается?
Да и подогрев, то не должен работать. У вас airT с датчика нигде в loop не считывается.
Кстати да. И подогрев не работает. Только освещение. Вы правы. Где я допустил ошибку? Ткните пожалуйста...
Строки #40 и #41 не на месте.
Я так понимаю, должен эти строки перенести в цикл LOOP? всё верно?
Я так понимаю, должен эти строки перенести в цикл LOOP? всё верно?
Да, после sensor.read
Честно говоря не помогло.
Даже не знаю, что ещё сделать...
выведите на дисплей или в сериал порт значение ventilation. Сдается мне оно 0 вот и не включается вентилятор.
Ну, на экране-то температура меняется? Если нет, то сенсор не работает.
Честно говоря не знаю как вывести конкретное значение в сериал.
В Void Setup пишу:
Serial.begin(9600);
А дальше как вывести именно Ventilation? Да и обогрев тоже не работает
Извините за не понимание)))
Температура конечно меняется)
Serial.println(ventilation);
Где вы скетч брали?
Почти весь сам написал, что-то из сети
Серийный порт пустой(((
Серийный порт пустой(((
Берем любой скетч из встроенных в IDE примеров где есть Serial.print, например ReadAnalogVoltage и добиваемся, что бы сериный порт был не пустым. Иначе дальнейшее обсуждение лишено всякого смысла.
очередной Франкинштейн. Лепит Чудовище, а потом спрашивает что не так. У любой программы должна быть архитектура.Это очень сильно помогает в отладке и совершествованию. А у Вас этого нет. Налеплено и порядок.
Именно поэтому и прошу помощи. Наверное каждый имеет шанс научиться? вряд ли все с рождения умели пользоваться ардуиной))).
Именно поэтому и прошу помощи. Наверное каждый имеет шанс научиться? вряд ли все с рождения умели пользоваться ардуиной))).
Мы с рождения учились
слона есть по кусочкуработать с ардуиной. Сначала научились писать архитектуру программы и так шаг за шагом.В серийном порте показывает 1
В данном случае завидую Вам. А я с рождения учился быть агрономом. Каждый в чём-то своём специалист. Теперь появилась необходимость автоматизации процессов. И есть желание учиться и слушать.
В данном случае завидую Вам. А я с рождения учился быть агрономом. Каждый в чём-то своём специалист. Теперь появилась необходимость автоматизации процессов. И есть желание учиться и слушать.
ПС:https://prog-cpp.ru/c-functions/ https://www.youtube.com/watch?v=TX0-gdBrhW8 метод есть слона по кусочку. Надеюсь как минимум в своем агрономическом научились учится или просто отсидели за партой.
Слышали про Бельгийский Королевский Аграрный Университет??? Не сомневаюсь в Ваших познаниях ардуино, но Ваш сарказм к моей просьбе и проблеме не относится. Спасибо за ссылку
Слышали про Бельгийский Королевский Аграрный Университет??? Не сомневаюсь в Ваших познаниях ардуино, но Ваш сарказм к моей просьбе и проблеме не относится. Спасибо за ссылку
Именно для этого люди и общаются) и помогают друг другу
спасибо
Ну и так далее
Большое спасибо, что не оставили в беде)))
Всем доброго вечера. Спасибо всем, кто вчера указал на ошибки. Заработало. Хочу учится дальше. Если можно, ткните снова в ошибку. Освещение работает, вентиляция работает. А вот подогрев работает только в режиме дня, не смотря на то, что параметры обогрева ночью тоже установлены. Вот скетч и со второй вкладки функция назначения режима день-ночь. Ошибок скетч не выдает, поэтому не могу понять в чем дело.
Ну если хотите учиться - то учитесь отлаживать вашу программу.
Один из способов = в проблемные куски кода и рядом вставсляем Serial.print() c выводм переменных задействованных в принятии решений.
Сделал так:
Сделал так:
http://arduino.ru/Reference/Serial/Print