From 31b9ba52fb184464f133e9b9af4381d63aa93717 Mon Sep 17 00:00:00 2001 From: Bill1389 Date: Thu, 28 Mar 2024 22:03:56 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B8=D0=BE=D0=B4=D1=8B,=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D1=88=D0=B5=D0=BB=20=D0=BD=D0=B0=20esp32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- platformio.ini | 16 +-- src/main.cpp | 311 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 279 insertions(+), 48 deletions(-) diff --git a/platformio.ini b/platformio.ini index ff3a35a..8e3a1f1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -8,12 +8,14 @@ ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html -[env:esp12e] -platform = espressif8266 -board = esp12e +;[env:esp12e] +;platform = espressif8266 +;board = esp12e +;framework = arduino + +[env:esp32dev] +platform = espressif32 +board = esp32dev framework = arduino -;[env:esp32dev] -;platform = espressif32 -;board = esp32dev -;framework = arduino \ No newline at end of file +board_build.partitions = no_ota.csv \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index d3c0bef..25a7daf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -15,10 +15,10 @@ GyverHub hub("MyDevices", "ESP", ""); WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "pool.ntp.org"); -const int ledPin = D4; // Указывайте пин, на котором подключен светодиод -const int fanRelay = D3; // Указывайте пин, на котором подключен светодиод +#define LED_PIN 2 // Указывайте пин, на котором подключен светодиод +#define FAN_RELAY 22 // Указывайте пин, на котором подключен светодиод -#define DHTPIN 4 // пин (D2) подключения контакта DATA +#define DHTPIN 23 // пин (D2) подключения контакта DATA #define DHTTYPE DHT22 // датчик DHT 22 #define INTERVAL_GET_DATA 2000 // интервала измерений, мс // создание экземпляра объекта DHT @@ -26,6 +26,75 @@ DHT dht(DHTPIN, DHTTYPE); // переменная для интервала измерений unsigned long millis_int1=0; +int switchLightState; +int switchLightStateOld; +int currentTimeSec; +int startTime; +int stopTime; +int startTimeOld; +int stopTimeOld; + +int setHumidity; +int setTemp; +int setHumidityOld; +int setTempOld; +int currentHumidity; +float currentTemp; + + bool lampRelayState = 0; // Реле освещения + bool fanCoolingRelayState = 0; // Реле вентилятора отопления + bool fanCirculationRelayState = 0; // Реле вентилятора циркуляции воздуха + bool fanOutdoorAirRelayState = 0; // Реле вентилятора вытяжки + bool waterPumpRelayState = 0; // Реле циркуляционного насоса + bool TENRelayState = 0; // Реле ТЭНа + bool fitoLampRelayState = 0; // Реле фитоламп + bool bit7 = 0; // резерв + +// для работы периодов +int statePeriodLamp; +int minutePeriodLamp; +int minuteOnPeriodLamp; + +int statePeriodFanCooling; +int minutePeriodFanCooling; +int minuteOnPeriodFanCooling; + +int statePeriodFanCirculation; +int minutePeriodFanCirculation; +int minuteOnPeriodFanCirculation; + +int statePeriodFanOutdoorAir; +int minutePeriodFanOutdoorAir; +int minuteOnPeriodFanOutdoorAir; + +int statePeriodWaterPump; +int minutePeriodWaterPump; +int minuteOnPeriodWaterPump; + + +int statePeriodTEN; +int minutePeriodTEN; +int minuteOnPeriodTEN; + + +int statePeriodFitoLamp; +int minutePeriodFitoLamp; +int minuteOnPeriodFitoLamp; + + +int statePeriod_Reserv; +int minutePeriod_Reserv; +int minuteOnPeriod_Reserv; + +bool statusTest = 0; + + +char currentTime[10]; // Выделение памяти под строку +gh::Log hlog; + + + + void writeIntToEEPROM(int address, int value) { @@ -44,22 +113,6 @@ int readIntFromEEPROM(int address) return value; } -int switchLightState; -int switchLightStateOld; -int currentTimeSec; -int startTime; -int stopTime; -int startTimeOld; -int stopTimeOld; - -int setHumidity; -int setTemp; -int setHumidityOld; -int setTempOld; -int currentHumidity; -float currentTemp; - -char currentTime[10]; // Выделение памяти под строку void checkLight() { @@ -97,25 +150,25 @@ void checkLight() switch (switchLightState) { case 0: - digitalWrite(ledPin, LOW); // Включаем светодиод + digitalWrite(LED_PIN, LOW); // Включаем светодиод break; case 1: - digitalWrite(ledPin, HIGH); // Выключаем светодиод + digitalWrite(LED_PIN, HIGH); // Выключаем светодиод break; case 2: //if (((currentHour >= startHours) and (currentMinute >= startMinutes)) and ((currentHour <= stopHours) and (currentMinute < stopMinutes))) if((startTime <= currentTimeSec) and ( currentTimeSec <= stopTime)) { - digitalWrite(ledPin, LOW); // Включаем светодиод + digitalWrite(LED_PIN, LOW); // Включаем светодиод } else { - digitalWrite(ledPin, HIGH); // Выключаем светодиод + digitalWrite(LED_PIN, HIGH); // Выключаем светодиод } break; default: - digitalWrite(ledPin, HIGH); // Выключаем светодиод + digitalWrite(LED_PIN, HIGH); // Выключаем светодиод break; } } @@ -129,6 +182,7 @@ float get_data_temperature() { float h = dht.readTemperature(); return h; } + void manageClimate() { currentHumidity = get_data_humidity(); @@ -149,28 +203,24 @@ void manageClimate() if(currentTemp < setTemp) { - digitalWrite(fanRelay, LOW); // Включаем светодиод + digitalWrite(FAN_RELAY, LOW); // Включаем светодиод } else { - digitalWrite(fanRelay, HIGH); // Выключаем светодиод + digitalWrite(FAN_RELAY, HIGH); // Выключаем светодиод } -} -// обработчик кнопки (см. ниже) -void btn_cb() -{ - Serial.println("click 4"); } -// обработчик кнопки с информацией о билде (см. ниже) -void btn_cb_b(gh::Build &b) -{ - Serial.print("click 5 from client ID: "); - Serial.println(b.client.id); -} -void build(gh::Builder &b) + + + + + + + +void build_main(gh::Builder &b) { b.Title_(F("title1")).value("Освещение"); @@ -206,6 +256,153 @@ void build(gh::Builder &b) } + +void build_period(gh::Builder &b) +{ + b.Title_(F("title3")).value("Освещение"); + if (b.beginRow()) + { + b.Switch(&statePeriodLamp).label("Активировать").size(1); + b.Input(&minutePeriodLamp).label("Каждые __ минут"); + b.Input(&minuteOnPeriodLamp).label("включить на __ минут"); + b.endRow(); + } + + b.Title_(F("title4")).value("Вентилятор отопления"); + if (b.beginRow()) + { + b.Switch(&statePeriodFanCooling).label("Активировать").size(1); + b.Input(&minutePeriodFanCooling).label("Каждые __ минут"); + b.Input(&minuteOnPeriodFanCooling).label("включить на __ минут"); + b.endRow(); + } + + b.Title_(F("title5")).value("Вентилятор циркуляции"); + if (b.beginRow()) + { + b.Switch(&statePeriodFanCirculation).label("Активировать").size(1); + b.Input(&minutePeriodFanCirculation).label("Каждые __ минут"); + b.Input(&minuteOnPeriodFanCirculation).label("включить на __ минут"); + b.endRow(); + } + + b.Title_(F("title6")).value("Вентиляция"); + if (b.beginRow()) + { + b.Switch(&statePeriodFanOutdoorAir).label("Активировать").size(1); + b.Input(&minutePeriodFanOutdoorAir).label("Каждые __ минут"); + b.Input(&minuteOnPeriodFanOutdoorAir).label("включить на __ минут"); + b.endRow(); + } + + b.Title_(F("title7")).value("Насос котла"); + if (b.beginRow()) + { + b.Switch(&statePeriodWaterPump).label("Активировать").size(1); + b.Input(&minutePeriodWaterPump).label("Каждые __ минут"); + b.Input(&minuteOnPeriodWaterPump).label("включить на __ минут"); + b.endRow(); + } + + b.Title_(F("title8")).value("ТЭН"); + if (b.beginRow()) + { + b.Switch(&statePeriodTEN).label("Активировать").size(1); + b.Input(&minutePeriodTEN).label("Каждые __ минут"); + b.Input(&minuteOnPeriodTEN).label("включить на __ минут"); + b.endRow(); + } + + b.Title_(F("title9")).value("Фитолампы"); + if (b.beginRow()) + { + b.Switch(&statePeriodFitoLamp).label("Активировать").size(1); + b.Input(&minutePeriodFitoLamp).label("Каждые __ минут"); + b.Input(&minuteOnPeriodFitoLamp).label("включить на __ минут"); + b.endRow(); + } + + if (b.Button().label("Сохранить изменения").size(3).click()){ + writeIntToEEPROM(5 * sizeof(int), statePeriodLamp); + writeIntToEEPROM(6 * sizeof(int), minutePeriodLamp); + writeIntToEEPROM(7 * sizeof(int), minuteOnPeriodLamp); + writeIntToEEPROM(8 * sizeof(int), statePeriodFanCooling); + writeIntToEEPROM(9 * sizeof(int), minutePeriodFanCooling); + writeIntToEEPROM(10 * sizeof(int), minuteOnPeriodFanCooling); + writeIntToEEPROM(11 * sizeof(int), statePeriodFanCirculation); + writeIntToEEPROM(12 * sizeof(int), minutePeriodFanCirculation); + writeIntToEEPROM(13 * sizeof(int), minuteOnPeriodFanCirculation); + writeIntToEEPROM(14 * sizeof(int), statePeriodFanOutdoorAir); + writeIntToEEPROM(15 * sizeof(int), minutePeriodFanOutdoorAir); + writeIntToEEPROM(16 * sizeof(int), minuteOnPeriodFanOutdoorAir); + writeIntToEEPROM(17 * sizeof(int), statePeriodWaterPump); + writeIntToEEPROM(18 * sizeof(int), minutePeriodWaterPump); + writeIntToEEPROM(19 * sizeof(int), minuteOnPeriodWaterPump); + writeIntToEEPROM(20 * sizeof(int), statePeriodTEN); + writeIntToEEPROM(21 * sizeof(int), minutePeriodTEN); + writeIntToEEPROM(22 * sizeof(int), minuteOnPeriodTEN); + writeIntToEEPROM(23 * sizeof(int), statePeriodFitoLamp); + writeIntToEEPROM(24 * sizeof(int), minutePeriodFitoLamp); + writeIntToEEPROM(25 * sizeof(int), minuteOnPeriodFitoLamp); + writeIntToEEPROM(26 * sizeof(int), statePeriod_Reserv); + writeIntToEEPROM(27 * sizeof(int), minutePeriod_Reserv); + writeIntToEEPROM(28 * sizeof(int), minuteOnPeriod_Reserv); + + } + + +} + + +void build(gh::Builder& b) { + if (b.build.isSet()) hlog.println(b.build.name); + b.Menu(F("Главная;Периоды")); + + switch (hub.menu) { + case 0: + build_main(b); + + break; + case 1: + build_period(b); + break; + + } +} + +void periodLight() { + //Serial.println(statePeriodLamp); +if(statePeriodLamp == 1){ + Serial.println(statePeriodLamp); + static gh::Timer tmrLampStart(minutePeriodLamp * 60000); // период минут + + if (tmrLampStart) + { + static gh::Timer tmrLampStop(minuteOnPeriodLamp * 60000); // период минут +statusTest = !statusTest; + + } + if(statusTest == 1){ + Serial.println("ON"); +} else { + Serial.println("OFF"); +} +} + +} + +void codingStateReley(){ + + // Кодируем 8 битов в одно число + uint8_t encodedNumber = (bit7 << 7) | (fitoLampRelayState << 6) | (TENRelayState << 5) | (waterPumpRelayState << 4) | + (fanOutdoorAirRelayState << 3) | (fanCirculationRelayState << 2) | (fanCoolingRelayState << 1) | lampRelayState; + +} + + + + + void setup() { Serial.begin(9600); @@ -218,6 +415,36 @@ void setup() setTemp = readIntFromEEPROM(3 * sizeof(int)); setHumidity = readIntFromEEPROM(4 * sizeof(int)); + // для работы периодов +statePeriodLamp = readIntFromEEPROM(5 * sizeof(int)); +minutePeriodLamp = readIntFromEEPROM(6 * sizeof(int)); +minuteOnPeriodLamp = readIntFromEEPROM(7 * sizeof(int)); +statePeriodFanCooling = readIntFromEEPROM(8 * sizeof(int)); +minutePeriodFanCooling = readIntFromEEPROM(9 * sizeof(int)); +minuteOnPeriodFanCooling = readIntFromEEPROM(10 * sizeof(int)); +statePeriodFanCirculation = readIntFromEEPROM(11 * sizeof(int)); +minutePeriodFanCirculation = readIntFromEEPROM(12 * sizeof(int)); +minuteOnPeriodFanCirculation = readIntFromEEPROM(13 * sizeof(int)); +statePeriodFanOutdoorAir = readIntFromEEPROM(14 * sizeof(int)); +minutePeriodFanOutdoorAir = readIntFromEEPROM(15 * sizeof(int)); +minuteOnPeriodFanOutdoorAir = readIntFromEEPROM(16 * sizeof(int)); +statePeriodWaterPump = readIntFromEEPROM(17 * sizeof(int)); +minutePeriodWaterPump = readIntFromEEPROM(18 * sizeof(int)); +minuteOnPeriodWaterPump = readIntFromEEPROM(19 * sizeof(int)); +statePeriodTEN = readIntFromEEPROM(20 * sizeof(int)); +minutePeriodTEN = readIntFromEEPROM(21 * sizeof(int)); +minuteOnPeriodTEN = readIntFromEEPROM(22 * sizeof(int)); +statePeriodFitoLamp = readIntFromEEPROM(23 * sizeof(int)); +minutePeriodFitoLamp = readIntFromEEPROM(24 * sizeof(int)); +minuteOnPeriodFitoLamp = readIntFromEEPROM(25 * sizeof(int)); +statePeriod_Reserv = readIntFromEEPROM(26 * sizeof(int)); +minutePeriod_Reserv = readIntFromEEPROM(27 * sizeof(int)); +minuteOnPeriod_Reserv = readIntFromEEPROM(28 * sizeof(int)); + + + + + // Подключение к WiFi WiFi.begin(ssid, password); @@ -229,8 +456,8 @@ void setup() Serial.println("Connected to WiFi"); // Инициализация светодиода - pinMode(ledPin, OUTPUT); - pinMode(fanRelay, OUTPUT); + pinMode(LED_PIN, OUTPUT); + pinMode(FAN_RELAY, OUTPUT); // Настройка NTP timeClient.begin(); @@ -251,6 +478,8 @@ void loop() hub.tick(); + + static gh::Timer tmr(1000); // период 1 секунда // каждую секунду будем обновлять заголовок if (tmr)