|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
#include <ESP8266WiFi.h>
|
|
|
|
|
#include <WiFi.h>
|
|
|
|
|
#include <NTPClient.h>
|
|
|
|
|
#include <WiFiUdp.h>
|
|
|
|
|
#include <EEPROM.h>
|
|
|
|
@ -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)
|
|
|
|
|