Скетч для гроубокса

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

Всем доброго времени суток. Нужна помощь. Есть скетч для гроубокса (очень страшный, в плане корректности). Писал на половину сам, наполовину собирал из другого. Скетч работает, кроме одного момента. Не включается подогрев ночью(в режиме дня работает как и должен). Задача следующая. Привести скетч в порядок, заставить работать ночной подогрев и реализовать меню (его пока нет) с управлением энкодером. Знаний и времени не хватает добиться желаемого. Контроллер UNO и цветной дисплей 2,8 дюйма без сенсора.

#include <EEPROMex.h>
#include <EEPROMVar.h>
#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS3231);
int rtc[7];
#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, 56, 23, 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);
      //Serial.println((String)DAY, airT, Temp_Box_Night, delta_Temp);
    }

    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 );
    }
    else if (DAY == 1 && airT > (Temp_Box_Day)) { // если день и высокая температура
      digitalWrite(Relay_Vent, LOW); //включаем реле вентиляции
      myGLCD.setColor(VGA_RED);
      myGLCD.print("VENT", 162, 197);
    }
    else if (DAY == 0 && airT > (Temp_Box_Night)) { // если ночь и высокая температура
      digitalWrite(Relay_Vent, LOW); //включаем реле вентиляции
      myGLCD.setColor(VGA_RED);
      myGLCD.print("VENT", 162, 197);
    }
    else if (DAY == 1 && airT <= (Temp_Box_Day)) { // если день и остыли
      digitalWrite(Relay_Vent, HIGH); //включаем реле вентиляции
      myGLCD.setColor(VGA_BLACK);
      myGLCD.print("VENT", 162, 197);
    }
    else if (DAY == 0 && airT <= (Temp_Box_Night)) { // если ночь и остыли
      digitalWrite(Relay_Vent, HIGH); //включаем реле вентиляции
      myGLCD.setColor(VGA_BLACK);
      myGLCD.print("VENT", 162, 197);
    }
  }

}

// обновление данных в энергонезависимой памяти
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() {
  get_time(); // функ. считываем текущие значения с часов в глоб. перем.

  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; // если  час > начало
  }
} //---- КОНЕЦ- назначение день или ночь--------------------
//***********************************************************************
//set time and date routine / настройка часов
void set_time() {

uint8_t D, M, Y, h, m, s, W;
  //fill settings with current clock values read from clock
  time.gettime(); // получаем текущие значения с часов
  D = time.day;
  M = time.month;
  Y = time.year;
  h = time. Hours  = rtc[2];
  m = time.minutes    = rtc[1];
  s = time.seconds;
  W = time.weekday; 

 //ds1307.adjust(DateTime(set_yr, set_mnth, set_date, set_hr, set_min));// устанавливаем
}  
//***********************************************************************
void get_time() // считывание данных с модуля
{
  //get time
  time.gettime();
  
 }
//***********************************************************************

 

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

Интересует только корректный скетч, остальное (глюки исполнительной части) моя проблема.

С исполнением желательно не затягивать. По оплате Вы мне скажите и будем думать). Прием работы обсудим

rkit
Offline
Зарегистрирован: 23.11.2016

Проходили.

1. криворукий заказчик криво собрал

2. бежит к исполнителю с визгом "нифига не работает"

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

4. заказчик отказывается оплачивать потраченное время, составляющее тройную стоимость изначального проекта

За пределами элементарных схем с этим связываться нельзя, да и там надо проследить и написать, чтобы не пускали сигналы по силовому проводу срезанному со старого пылесоса.

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

Уважаемый. Я от Вас оскорблений не просил. Свои руки проверяйте. Требуется только нормально упорядоченный, рабочий скетч. Для тех кто в танке написал: Остальное мои проблемы. Не хотите что-то предложить? Не умничайте. Либо назовите свою цену за скетч.

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

Конечно не прошу Вас менять свои планы. Сам с людьми работаю. Исполнить желательно в пределах одной недели. Цену назовите мне сами пожалуйста.

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

Это не Вам)))

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

Для rkit

rkit
Offline
Зарегистрирован: 23.11.2016

plants34 пишет:

Уважаемый. Я от Вас оскорблений не просил. Свои руки проверяйте. Требуется только нормально упорядоченный, рабочий скетч. Для тех кто в танке написал: Остальное мои проблемы. Не хотите что-то предложить? Не умничайте. Либо назовите свою цену за скетч.

"Остальное мои проблемы." - то есть скетч перед оплатой проверять не будем? Может не надо придуриваться?

Я лишь описал реальную ситуацию, которая регулярно происходит, и которая должна объяснить, почему компетентный заказчик за такую работу не возьмется. Он не знает, что там за руки у исполнителя, но прекрасно понимает, что невелик шанс, что заказчик окажется компетентным монтажником. Это гораздо сложнее, чем может показаться непосвященному. Соответственно, работа исполнителя не стоит риска.

 

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

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

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

Во первых, как Вы выразились, "придуриваться" никто не собирался. Не вижу проблемы проверки выполненной работы, например после 50% предоплаты?! Все люди взрослые и ерундой нет времени заниматься. Во-вторых о компетентности заказчика как монтажника, не Вам судить. Ваших знаний и умений в области программирования здесь никто не унижает.

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

))) Обычно плачу за работу по конкретно названной цене. Давайте так: от 3000 до 5000 тысяч готов заплатить. При этом гарантирую отсутствие каких-либо претензий при как там товарищ выразился "криворуком" монтаже заказчика. Мне нужен только готовый скетч, упорядоченный и рабочий.

fridgetester
fridgetester аватар
Offline
Зарегистрирован: 09.02.2019

За 5к сделаю(разберусь в мешанине и переделаю). Предоплата 50%. fridgetester@mail.ru

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

Какая необходима информация по работе контроллера и используемому железу?

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

Тогда назовите свою чёткую цену. Я же сказал, что не ориентируюсь в стоимости таких работ

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

Спасибо, так гораздо больше ясности. Могу составить и отправить Вам тех. задание, если интересно. Только почту напишите

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

plants34, настоятельно не советую связываться с DitSemen.  Пользователь забанен здесь исключительно по мерзости характера.  Выбирай исполнителей, которые зарегистрированы больше года назад. 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Поправлю за 5000р
kakmycmail@gmail.com
Vk.com/kakmyc

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Кстати, ТС, если ты всё-же связался с данным персонажем, отпишись потом, думаю, нам интересно будет, ведь его здесь постоянно чистят(даже не я) и банят исключительно за компетентность, доброту и отзывчивость. 

Upd. Опять его почистили, и это НЕ я.  Себя почистил я, чтоб не висел диалог с пустотой. 

rst
Offline
Зарегистрирован: 25.06.2018

plants34 пишет:
))) Обычно плачу за работу по конкретно названной цене. Давайте так: от 3000 до 5000 тысяч готов заплатить.

Хех! Неплохо однако! За 5 лямов можно даже "криворукого заказчика" потерпеть.

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

За своими руками следи

b707
Offline
Зарегистрирован: 26.05.2017

plants34 пишет:

За своими руками следи

а вы следите за тем, что пишете. "3000 тысяч" - это 3 лимона.

b707
Offline
Зарегистрирован: 26.05.2017

На Uno что-то делать с ТФТ экраном и экранным меню - это мазохизм. За 6 тыр перенесу код на "blue pill" СТМ32 и допишу нужное :)

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

plants34 пишет:
Задача следующая. Привести скетч в порядок, заставить работать ночной подогрев и реализовать меню (его пока нет) с управлением энкодером.

Так давайте ТЗ по меню для начала. И вообще по всему устройству в целом.