Контроллер для Гроубокса

plants34
Offline
Зарегистрирован: 19.09.2019

Доброй ночи, уважаемые Гуру ардуиностроения.

Прошу у вас помощи. Написан скетч для управления Гроубоксом. Обозначены переменные и условия. Все действия по заданным условиям выполняются, кроме последнего пункта. Не включается реле вентиляции по температуре. Скетч ошибок не выдаёт. По этому прошу помочь разобраться. Буду рад любой подсказке. Спасибо.

#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 );
    }
 }

 

sadman41
Offline
Зарегистрирован: 19.10.2016

А все остальные условия с участием airT работают как полагается? 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Да и подогрев, то не должен работать. У вас airT с датчика нигде в loop не считывается.

plants34
Offline
Зарегистрирован: 19.09.2019

Кстати да. И подогрев не работает. Только освещение. Вы правы. Где я допустил ошибку? Ткните пожалуйста...

sadman41
Offline
Зарегистрирован: 19.10.2016

Строки #40 и #41 не на месте.

plants34
Offline
Зарегистрирован: 19.09.2019

Я так понимаю, должен эти строки перенести в цикл LOOP? всё верно?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

plants34 пишет:

Я так понимаю, должен эти строки перенести в цикл LOOP? всё верно?

Да, после sensor.read

plants34
Offline
Зарегистрирован: 19.09.2019

Честно говоря не помогло.

#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 );
    }
 }

 

plants34
Offline
Зарегистрирован: 19.09.2019

Даже не знаю, что ещё сделать...

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

выведите на дисплей или в сериал порт значение ventilation. Сдается мне оно 0 вот и не включается вентилятор.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, на экране-то температура меняется? Если нет, то сенсор не работает.

plants34
Offline
Зарегистрирован: 19.09.2019

Честно говоря не знаю как вывести конкретное значение в сериал. 

В Void Setup пишу: 

Serial.begin(9600);

А дальше как вывести именно Ventilation? Да и обогрев тоже не работает

Извините за не понимание)))

plants34
Offline
Зарегистрирован: 19.09.2019

Температура конечно меняется)

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Serial.println(ventilation);

 

Где вы скетч брали?

plants34
Offline
Зарегистрирован: 19.09.2019

Почти весь сам написал, что-то из сети

plants34
Offline
Зарегистрирован: 19.09.2019

Серийный порт пустой(((

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

plants34 пишет:

Серийный порт пустой(((

Берем любой скетч из встроенных в IDE примеров где есть Serial.print, например ReadAnalogVoltage и добиваемся, что бы сериный порт был не пустым. Иначе дальнейшее обсуждение лишено всякого смысла.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

очередной Франкинштейн. Лепит Чудовище, а потом спрашивает что не так. У любой программы должна быть архитектура.Это очень сильно помогает в отладке и совершествованию. А у Вас этого нет. Налеплено и порядок.

plants34
Offline
Зарегистрирован: 19.09.2019

Именно поэтому и прошу помощи. Наверное каждый имеет шанс научиться? вряд ли все с рождения умели пользоваться ардуиной))). 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

plants34 пишет:

Именно поэтому и прошу помощи. Наверное каждый имеет шанс научиться? вряд ли все с рождения умели пользоваться ардуиной))). 

В романе Виктор Франкенштейн хочет создать живое существо из неживой материи. В результате у него получается существо, вид которого самого Франкенштейна повергает в ужас

Мы с рождения учились слона есть по кусочку работать с ардуиной. Сначала научились писать архитектуру программы и так шаг за шагом.

plants34
Offline
Зарегистрирован: 19.09.2019

В серийном порте показывает 1

plants34
Offline
Зарегистрирован: 19.09.2019

В данном случае завидую Вам. А я с рождения учился быть агрономом. Каждый в чём-то своём специалист. Теперь появилась необходимость автоматизации процессов. И есть желание учиться и слушать.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

plants34 пишет:

В данном случае завидую Вам. А я с рождения учился быть агрономом. Каждый в чём-то своём специалист. Теперь появилась необходимость автоматизации процессов. И есть желание учиться и слушать.

ПС:https://prog-cpp.ru/c-functions/  https://www.youtube.com/watch?v=TX0-gdBrhW8   метод есть слона по кусочку.      Надеюсь как минимум в своем агрономическом научились учится или просто отсидели за партой.

plants34
Offline
Зарегистрирован: 19.09.2019

Слышали про Бельгийский Королевский Аграрный Университет???  Не сомневаюсь в Ваших познаниях ардуино, но Ваш сарказм к моей просьбе и проблеме не относится. Спасибо за ссылку

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

plants34 пишет:

Слышали про Бельгийский Королевский Аграрный Университет???  Не сомневаюсь в Ваших познаниях ардуино, но Ваш сарказм к моей просьбе и проблеме не относится. Спасибо за ссылку

вот почему специалисты в одних областях почему-то выключают свои мозги в хотя бы в смежных. Вы что на одном поле в перемешку садите зерно,картошку,капусту ,подсонечник ну и ладно кукурузу. Чего полю пустому стоять.  Вот так и в программировании надо уметь разделять на отдельные поля а не все кидать в кучу.

//-----блок 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();
}

 

plants34
Offline
Зарегистрирован: 19.09.2019

Именно для этого люди и общаются) и помогают друг другу

спасибо

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну и так далее 

/**/
//-----блок 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();
}

 

plants34
Offline
Зарегистрирован: 19.09.2019

Большое спасибо, что не оставили в беде)))

plants34
Offline
Зарегистрирован: 19.09.2019

Всем доброго вечера. Спасибо всем, кто вчера указал на ошибки. Заработало. Хочу учится дальше. Если можно, ткните снова в ошибку. Освещение работает, вентиляция работает. А вот подогрев работает только в режиме дня, не смотря на то, что параметры обогрева ночью тоже установлены. Вот скетч и со второй вкладки функция назначения режима день-ночь. Ошибок скетч не выдает, поэтому не могу понять в чем дело.

#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
    
  }

 

 

plants34
Offline
Зарегистрирован: 19.09.2019
//---- назначение день или ночь--------------------
}
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; // если  час > начало
  }
} //---- КОНЕЦ- назначение день или ночь--------------------

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Ну если хотите учиться - то учитесь отлаживать вашу программу.

Один из способов = в проблемные куски кода и рядом вставсляем Serial.print() c выводм переменных задействованных в принятии решений. 

 

plants34
Offline
Зарегистрирован: 19.09.2019

Сделал так:

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);
      Serial.println(DAY == 0, airT, Temp_Box_Night, delta_Temp);
 
В мониторе порта получаю 1
Или не правильно?
asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

plants34 пишет:

Сделал так:

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);
      Serial.println(DAY == 0, airT, Temp_Box_Night, delta_Temp);
 
В мониторе порта получаю 1
Или не правильно?

http://arduino.ru/Reference/Serial/Print