Контроллер для Гроубокса
- Войдите на сайт для отправки комментариев
Втр, 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
Честно говоря не помогло.
#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 = 1; // 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; // шаг измениения температуры //Переменные управления освещением 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,10,00,05,11,19,2); 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(); float airT = sensor.tem; //переменная температуры воздуха float airH = sensor.hum; //переменная влажности воздуха //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 ); } }Даже не знаю, что ещё сделать...
выведите на дисплей или в сериал порт значение 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 метод есть слона по кусочку. Надеюсь как минимум в своем агрономическом научились учится или просто отсидели за партой.
Слышали про Бельгийский Королевский Аграрный Университет??? Не сомневаюсь в Ваших познаниях ардуино, но Ваш сарказм к моей просьбе и проблеме не относится. Спасибо за ссылку
Слышали про Бельгийский Королевский Аграрный Университет??? Не сомневаюсь в Ваших познаниях ардуино, но Ваш сарказм к моей просьбе и проблеме не относится. Спасибо за ссылку
//-----блок 1------------------- void blok1_init() {} void blok1_run() {} //-----блок 2------------------- void blok2_init() {} void blok2_run() {} //-----блок 3------------------- void blok3_init() {} void blok3_run() {} void setup() { blok1_init(); blok2_init(); blok3_init(); } void loop() { blok1_run(); blok2_run(); blok3_run(); }Именно для этого люди и общаются) и помогают друг другу
спасибо
Ну и так далее
/**/ //-----блок 1------------------- #define Relay_Lamp 9 // пин реле включения освещения const bool Lamp_ON = 0; const bool Lamp_OFF = 1; bool state_Lamp; void stand_Lamp(bool s) { state_Lamp = s; if (state_Lamp == Lamp_ON) digitalWrite(Relay_Lamp, LOW); //включаем реле else digitalWrite(Relay_Lamp, HIGH); //выключаем реле } void blok1_init() { pinMode(Relay_Lamp, OUTPUT); stand_Lamp(Lamp_OFF); } void blok1_run() { if (state_Lamp == Lamp_ON&&/*условие*/1)stand_Lamp(Lamp_OFF); if (state_Lamp == Lamp_OFF&&/*условие*/1)stand_Lamp(Lamp_ON); } //-----блок 2------------------- #define Relay_Heat 10 // пин реле включения подогрева #define Relay_Fan 12 // пин реле включения кулера (с обогревателем) bool state_Heat; void blok2_init() {} void blok2_run() {} //-----блок 3------------------- #define Relay_Vent 11 // пин реле включения вентиляции bool state_Vent; void blok3_init() {} void blok3_run() {} void setup() { blok1_init(); blok2_init(); blok3_init(); } void loop() { blok1_run(); blok2_run(); blok3_run(); }Большое спасибо, что не оставили в беде)))
Всем доброго вечера. Спасибо всем, кто вчера указал на ошибки. Заработало. Хочу учится дальше. Если можно, ткните снова в ошибку. Освещение работает, вентиляция работает. А вот подогрев работает только в режиме дня, не смотря на то, что параметры обогрева ночью тоже установлены. Вот скетч и со второй вкладки функция назначения режима день-ночь. Ошибок скетч не выдает, поэтому не могу понять в чем дело.
#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 = 22.0; // необходимая температура ночью - eeprom= 5 float delta_Temp = 0.4; // отклонение температуры до включения (гистерезис) - eeprom= 9 float step_Temp = 0.2; // шаг измениения температуры //Переменные управления освещением 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 = 1 ; // продолжительность досветки (часы) - 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 //Переменные влажности воздуха float Hum_Box = 60; //необходимая влажность в боксе - eeprom= 33 //byte Hum_Vent_ON = 65.0; //порог включения вентиляции по датчику влажности воздуха - eeprom= 42 byte delta_Hum_Vent = 5; // отклонение влажности до отключения (гистерезис)- eeprom= 43 String Temp , TempD, TempN; void setup() { Serial.begin(9600); sensor.begin(); //запуск датчика АМ2320 time.begin(); //запуск модуля RTC3231 time.settime(0,19,18,05,11,19,2); 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); // продолжительность досветки (минуты) Hum_Box = EEPROM.read(33);// влажность воздуха в боксе //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_Vent_ON = EEPROM.read(42); // порог включения увлажнителя воздуха delta_Hum_Vent = EEPROM.read(43); // отклонение влажности до отключения (гистерезис) } myGLCD.InitLCD(PORTRAIT); myGLCD.clrScr(); myGLCD.fillScr(VGA_BLACK); } void loop() { sensor.read(); float airT = sensor.tem; //переменная температуры воздуха float airH = sensor.hum; //переменная влажности воздуха Serial.println(ventilation); void 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", 167, 268); } 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", 167, 268); } 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", 167, 268); } else if (DAY == 0 && airT > (Temp_Box_Night)) { // если ночь и подогрели digitalWrite(Relay_Heat, HIGH); //выключаем реле подогрева digitalWrite(Relay_Fan, HIGH); //выключаем кулер myGLCD.print("HEAT", 162, 130); myGLCD.print("FAN", 167, 268); } } else { digitalWrite(Relay_Heat, HIGH); //выключаем реле подогрева digitalWrite(Relay_Fan, HIGH); //выключаем кулер myGLCD.print("HEAT", 162, 130); myGLCD.print("FAN", 167, 268); } // Управление вентиляцией if (ventilation == 1) {//если активно if ( airH > Hum_Box) { // если влажность воздуха выше 60 digitalWrite(Relay_Vent, LOW); // включаем реле вент. myGLCD.setColor(VGA_RED); myGLCD.print("VENT", 162, 197); } else if (airH <= (Hum_Box - delta_Hum_Vent)) { // если влажность понизилась digitalWrite(Relay_Vent, HIGH); // выключаем реле вент. myGLCD.setColor(VGA_BLACK); myGLCD.print("VENT", 162, 197); //Serial.println((String) Temp_Vent_ON + "-" + delta_Temp_Vent ); } } } // обновление данных в энергонезависимой памяти void update_EEPROM(int cod) { switch(cod) { case 0: EEPROM.write(31, heating); EEPROM.writeFloat(1, Temp_Box_Day); EEPROM.writeFloat(5, Temp_Box_Night); EEPROM.writeFloat(9, delta_Temp); EEPROM.write(32, lighting); EEPROM.write(13, start_day_h); EEPROM.write(14, start_day_m); EEPROM.write(15, duretion_day_h); EEPROM.write(16, duretion_day_m); //3.2 EEPROM.write(33, Hum_Box); EEPROM.write(34, ventilation); //EEPROM.write(35, Temp_Vent_ON); //EEPROM.write(39, delta_Temp_Vent); EEPROM.write(43, delta_Hum_Vent); //3.3 break; case 1: EEPROM.updateFloat(cod, Temp_Box_Day); break; case 5: EEPROM.updateFloat(cod, Temp_Box_Night); break; case 9: EEPROM.updateFloat(cod, delta_Temp); break; case 13: EEPROM.updateByte(cod, start_day_h); break; case 14: EEPROM.updateByte(cod, start_day_m); break; case 15: EEPROM.updateByte(cod, duretion_day_h); break; case 16: EEPROM.updateByte(cod, duretion_day_m); break; case 31: EEPROM.updateByte(cod, heating); break; case 32: EEPROM.updateByte(cod, lighting); break; case 33: EEPROM.updateByte(cod, Hum_Box); break; case 34: EEPROM.updateByte(cod, ventilation); break; //3.2 case 43: EEPROM.updateByte(cod, delta_Hum_Vent); break; //case 35: EEPROM.updateByte(cod, Temp_Vent_ON); break; //3.2 //case 39: EEPROM.updateByte(cod, delta_Temp_Vent); break; //3.2 }//---- назначение день или ночь-------------------- } void day_night() { time.gettime(); // функ. считываем текущие значения с часов в глоб. перем. int cur_h = time.Hours; // текущее время - количество часов в 24 часовом формате int cur_min = time.minutes; //текущее время -количество минут offL_h = start_day_h + duretion_day_h; // время выключения (часы) if (offL_h >= 24)offL_h = offL_h - 24; //округляем offL_m = start_day_m + duretion_day_m; // время выключения (минуты) if (offL_m >= 60) { offL_m = offL_m - 60; //округляем offL_h = offL_h + 1; if (offL_h >= 24)offL_h = offL_h - 24; //округляем } DAY = 0; //сброс //-------------------------- if (start_day_h > offL_h && (cur_h >= start_day_h || cur_h < offL_h) ) { // если переход на след. день ,но часы попадают в интервал (на случай отключения после 00:00) //день if (cur_h == start_day_h) { // если час = начало if (cur_min >= start_day_m ) DAY = 1; } if (cur_h > start_day_h) DAY = 1; // если час > начало if (cur_h < start_day_h && cur_h <= offL_h) DAY = 1; //ночь if (cur_h == offL_h) { // если час = конец и в пределах одного часа if (cur_min >= offL_m ) DAY = 0; } if (cur_h > offL_h && cur_h < start_day_h) DAY = 0; } else if (start_day_h <= offL_h && cur_h >= start_day_h && cur_h <= offL_h) { // если НЕТ перехода на след. день. но часы попадают в интервал (на случай отключения после 00:00) //включение if (cur_h == start_day_h) { // если час = начало if (cur_min >= start_day_m ) DAY = 1; } if (cur_h > start_day_h) DAY = 1; // если час > начало //выключение if (cur_h == offL_h) { // если час = конец и в пределах одного часа if (cur_min >= offL_m ) DAY = 0; } if (cur_h > offL_h) DAY = 0; // если час > начало } } //---- КОНЕЦ- назначение день или ночь--------------------Ну если хотите учиться - то учитесь отлаживать вашу программу.
Один из способов = в проблемные куски кода и рядом вставсляем Serial.print() c выводм переменных задействованных в принятии решений.
Сделал так:
Сделал так:
http://arduino.ru/Reference/Serial/Print