2020-06-18 23:43:06 +02:00
|
|
|
|
#include "Global.h"
|
2020-06-20 14:27:58 +03:00
|
|
|
|
|
|
|
|
|
|
OneWire *oneWire;
|
|
|
|
|
|
GMedian<10, int> medianFilter;
|
|
|
|
|
|
DHTesp dht;
|
|
|
|
|
|
|
|
|
|
|
|
Adafruit_BMP280 bmp;
|
|
|
|
|
|
Adafruit_Sensor *bmp_temp;
|
|
|
|
|
|
Adafruit_Sensor *bmp_pressure;
|
|
|
|
|
|
|
|
|
|
|
|
Adafruit_BME280 bme;
|
|
|
|
|
|
Adafruit_Sensor *bme_temp;
|
|
|
|
|
|
Adafruit_Sensor *bme_pressure;
|
|
|
|
|
|
Adafruit_Sensor *bme_humidity;
|
2020-06-17 23:30:48 +03:00
|
|
|
|
|
2020-06-19 02:31:56 +02:00
|
|
|
|
String perception(byte value);
|
|
|
|
|
|
void bmp280T_reading();
|
|
|
|
|
|
String get_comfort_status(ComfortState cf);
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void sensors_init() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
ts.add(
|
2020-06-19 02:31:56 +02:00
|
|
|
|
SENSORS, 1000, [&](void *) {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
static int counter;
|
|
|
|
|
|
counter++;
|
|
|
|
|
|
|
2020-06-21 03:43:15 +03:00
|
|
|
|
#ifdef LEVEL_ENABLED
|
2020-06-19 02:31:56 +02:00
|
|
|
|
if (sensors_reading_map[0] == 1)
|
2020-06-19 15:22:22 +02:00
|
|
|
|
ultrasonic_reading();
|
2020-06-17 23:30:48 +03:00
|
|
|
|
#endif
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (counter > 10) {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
counter = 0;
|
|
|
|
|
|
|
2020-06-21 03:43:15 +03:00
|
|
|
|
#ifdef ANALOG_ENABLED
|
2020-06-19 02:31:56 +02:00
|
|
|
|
if (sensors_reading_map[1] == 1)
|
|
|
|
|
|
analog_reading1();
|
|
|
|
|
|
if (sensors_reading_map[2] == 1)
|
|
|
|
|
|
analog_reading2();
|
2020-06-17 23:30:48 +03:00
|
|
|
|
#endif
|
|
|
|
|
|
|
2020-06-21 03:43:15 +03:00
|
|
|
|
#ifdef DALLAS_ENABLED
|
2020-06-19 02:31:56 +02:00
|
|
|
|
if (sensors_reading_map[3] == 1)
|
|
|
|
|
|
dallas_reading();
|
2020-06-17 23:30:48 +03:00
|
|
|
|
#endif
|
|
|
|
|
|
|
2020-06-21 03:43:15 +03:00
|
|
|
|
#ifdef DHT_ENABLED
|
2020-06-19 02:31:56 +02:00
|
|
|
|
if (sensors_reading_map[4] == 1)
|
|
|
|
|
|
dhtT_reading();
|
|
|
|
|
|
if (sensors_reading_map[5] == 1)
|
|
|
|
|
|
dhtH_reading();
|
|
|
|
|
|
if (sensors_reading_map[6] == 1)
|
|
|
|
|
|
dhtP_reading();
|
|
|
|
|
|
if (sensors_reading_map[7] == 1)
|
|
|
|
|
|
dhtC_reading();
|
|
|
|
|
|
if (sensors_reading_map[8] == 1)
|
|
|
|
|
|
dhtD_reading();
|
2020-06-17 23:30:48 +03:00
|
|
|
|
#endif
|
|
|
|
|
|
|
2020-06-21 03:43:15 +03:00
|
|
|
|
#ifdef BMP_ENABLED
|
2020-06-19 02:31:56 +02:00
|
|
|
|
if (sensors_reading_map[9] == 1)
|
|
|
|
|
|
bmp280T_reading();
|
|
|
|
|
|
if (sensors_reading_map[10] == 1)
|
|
|
|
|
|
bmp280P_reading();
|
2020-06-17 23:30:48 +03:00
|
|
|
|
#endif
|
|
|
|
|
|
|
2020-06-21 03:43:15 +03:00
|
|
|
|
#ifdef BME_ENABLED
|
2020-06-19 02:31:56 +02:00
|
|
|
|
if (sensors_reading_map[11] == 1)
|
|
|
|
|
|
bme280T_reading();
|
|
|
|
|
|
if (sensors_reading_map[12] == 1)
|
|
|
|
|
|
bme280P_reading();
|
|
|
|
|
|
if (sensors_reading_map[13] == 1)
|
|
|
|
|
|
bme280H_reading();
|
|
|
|
|
|
if (sensors_reading_map[14] == 1)
|
|
|
|
|
|
bme280A_reading();
|
2020-06-17 23:30:48 +03:00
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
nullptr, true);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//=========================================================================================================================================
|
|
|
|
|
|
//=========================================Модуль измерения уровня в баке==================================================================
|
2020-06-21 03:43:15 +03:00
|
|
|
|
#ifdef LEVEL_ENABLED
|
2020-06-19 14:50:34 +02:00
|
|
|
|
//levelPr p 14 12 Вода#в#баке,#% Датчики fill-gauge 125 20 1
|
|
|
|
|
|
void levelPr() {
|
2020-06-20 14:27:58 +03:00
|
|
|
|
String value_name = sCmd.next();
|
|
|
|
|
|
String trig = sCmd.next();
|
|
|
|
|
|
String echo = sCmd.next();
|
|
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String type = sCmd.next();
|
|
|
|
|
|
String empty_level = sCmd.next();
|
|
|
|
|
|
String full_level = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
levelPr_value_name = value_name;
|
|
|
|
|
|
jsonWriteStr(configOptionJson, "e_lev", empty_level);
|
|
|
|
|
|
jsonWriteStr(configOptionJson, "f_lev", full_level);
|
|
|
|
|
|
jsonWriteStr(configOptionJson, "trig", trig);
|
|
|
|
|
|
jsonWriteStr(configOptionJson, "echo", echo);
|
|
|
|
|
|
pinMode(trig.toInt(), OUTPUT);
|
|
|
|
|
|
pinMode(echo.toInt(), INPUT);
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
|
|
|
|
|
sensors_reading_map[0] = 1;
|
2020-06-19 14:50:34 +02:00
|
|
|
|
}
|
|
|
|
|
|
//ultrasonicCm cm 14 12 Дистанция,#см Датчики fill-gauge 1
|
|
|
|
|
|
void ultrasonicCm() {
|
2020-06-20 14:27:58 +03:00
|
|
|
|
String value_name = sCmd.next();
|
|
|
|
|
|
String trig = sCmd.next();
|
|
|
|
|
|
String echo = sCmd.next();
|
|
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String type = sCmd.next();
|
|
|
|
|
|
String empty_level = sCmd.next();
|
|
|
|
|
|
String full_level = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
ultrasonicCm_value_name = value_name;
|
|
|
|
|
|
jsonWriteStr(configOptionJson, "trig", trig);
|
|
|
|
|
|
jsonWriteStr(configOptionJson, "echo", echo);
|
|
|
|
|
|
pinMode(trig.toInt(), OUTPUT);
|
|
|
|
|
|
pinMode(echo.toInt(), INPUT);
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
|
|
|
|
|
sensors_reading_map[0] = 1;
|
2020-06-19 14:50:34 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void ultrasonic_reading() {
|
2020-06-20 14:27:58 +03:00
|
|
|
|
long duration_;
|
|
|
|
|
|
int distance_cm;
|
|
|
|
|
|
int level;
|
|
|
|
|
|
static int counter;
|
|
|
|
|
|
int trig = jsonReadInt(configOptionJson, "trig");
|
|
|
|
|
|
int echo = jsonReadInt(configOptionJson, "echo");
|
|
|
|
|
|
digitalWrite(trig, LOW);
|
|
|
|
|
|
delayMicroseconds(2);
|
|
|
|
|
|
digitalWrite(trig, HIGH);
|
|
|
|
|
|
delayMicroseconds(10);
|
|
|
|
|
|
digitalWrite(trig, LOW);
|
|
|
|
|
|
duration_ = pulseIn(echo, HIGH, 30000); // 3000 µs = 50cm // 30000 µs = 5 m
|
|
|
|
|
|
distance_cm = duration_ / 29 / 2;
|
|
|
|
|
|
distance_cm = medianFilter.filtered(distance_cm); //отсечение промахов медианным фильтром
|
|
|
|
|
|
counter++;
|
2020-06-21 03:43:15 +03:00
|
|
|
|
if (counter > TANK_LEVEL_SAMPLES) {
|
2020-06-20 14:27:58 +03:00
|
|
|
|
counter = 0;
|
|
|
|
|
|
level = map(distance_cm,
|
|
|
|
|
|
jsonReadInt(configOptionJson, "e_lev"),
|
|
|
|
|
|
jsonReadInt(configOptionJson, "f_lev"), 0, 100);
|
|
|
|
|
|
|
|
|
|
|
|
jsonWriteInt(configLiveJson, levelPr_value_name, level);
|
|
|
|
|
|
eventGen(levelPr_value_name, "");
|
|
|
|
|
|
sendSTATUS(levelPr_value_name, String(level));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor '" + levelPr_value_name + "' data: " + String(level));
|
2020-06-20 14:27:58 +03:00
|
|
|
|
|
|
|
|
|
|
jsonWriteInt(configLiveJson, ultrasonicCm_value_name, distance_cm);
|
|
|
|
|
|
eventGen(ultrasonicCm_value_name, "");
|
|
|
|
|
|
sendSTATUS(ultrasonicCm_value_name, String(distance_cm));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor '" + ultrasonicCm_value_name + "' data: " + String(distance_cm));
|
2020-06-20 14:27:58 +03:00
|
|
|
|
}
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
//=========================================================================================================================================
|
|
|
|
|
|
//=========================================Модуль аналогового сенсора======================================================================
|
2020-06-21 03:43:15 +03:00
|
|
|
|
#ifdef ANALOG_ENABLED
|
2020-06-17 23:30:48 +03:00
|
|
|
|
//analog adc 0 Аналоговый#вход,#% Датчики any-data 1 1023 1 100 1
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void analog() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String value_name = sCmd.next();
|
|
|
|
|
|
String pin = sCmd.next();
|
|
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String type = sCmd.next();
|
|
|
|
|
|
String analog_start = sCmd.next();
|
|
|
|
|
|
String analog_end = sCmd.next();
|
|
|
|
|
|
String analog_start_out = sCmd.next();
|
|
|
|
|
|
String analog_end_out = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
analog_value_names_list += value_name + ",";
|
|
|
|
|
|
enter_to_analog_counter++;
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonWriteStr(configOptionJson, value_name + "_st", analog_start);
|
|
|
|
|
|
jsonWriteStr(configOptionJson, value_name + "_end", analog_end);
|
|
|
|
|
|
jsonWriteStr(configOptionJson, value_name + "_st_out", analog_start_out);
|
|
|
|
|
|
jsonWriteStr(configOptionJson, value_name + "_end_out", analog_end_out);
|
2020-06-17 23:30:48 +03:00
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (enter_to_analog_counter == 1) {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
sensors_reading_map[1] = 1;
|
|
|
|
|
|
}
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (enter_to_analog_counter == 2) {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
sensors_reading_map[2] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void analog_reading1() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String value_name = selectFromMarkerToMarker(analog_value_names_list, ",", 0);
|
|
|
|
|
|
#ifdef ESP32
|
|
|
|
|
|
int analog_in = analogRead(34);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef ESP8266
|
|
|
|
|
|
int analog_in = analogRead(A0);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
int analog = map(analog_in,
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonReadInt(configOptionJson, value_name + "_st"),
|
|
|
|
|
|
jsonReadInt(configOptionJson, value_name + "_end"),
|
|
|
|
|
|
jsonReadInt(configOptionJson, value_name + "_st_out"),
|
|
|
|
|
|
jsonReadInt(configOptionJson, value_name + "_end_out"));
|
|
|
|
|
|
jsonWriteInt(configLiveJson, value_name, analog);
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen(value_name, "");
|
|
|
|
|
|
sendSTATUS(value_name, String(analog));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor '" + value_name + "' data: " + String(analog));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void analog_reading2() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String value_name = selectFromMarkerToMarker(analog_value_names_list, ",", 1);
|
|
|
|
|
|
#ifdef ESP32
|
|
|
|
|
|
int analog_in = analogRead(35);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef ESP8266
|
|
|
|
|
|
int analog_in = analogRead(A0);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
int analog = map(analog_in,
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonReadInt(configOptionJson, value_name + "_st"),
|
|
|
|
|
|
jsonReadInt(configOptionJson, value_name + "_end"),
|
|
|
|
|
|
jsonReadInt(configOptionJson, value_name + "_st_out"),
|
|
|
|
|
|
jsonReadInt(configOptionJson, value_name + "_end_out"));
|
|
|
|
|
|
jsonWriteInt(configLiveJson, value_name, analog);
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen(value_name, "");
|
|
|
|
|
|
sendSTATUS(value_name, String(analog));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor '" + value_name + "' data: " + String(analog));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
//=========================================================================================================================================
|
|
|
|
|
|
//=========================================Модуль температурного сенсора ds18b20===========================================================
|
2020-06-21 03:43:15 +03:00
|
|
|
|
#ifdef DALLAS_ENABLED
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void dallas() {
|
2020-06-20 01:06:39 +02:00
|
|
|
|
//String value_name = sCmd.next();
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String pin = sCmd.next();
|
2020-06-20 01:06:39 +02:00
|
|
|
|
//String address = sCmd.next();
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String type = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
oneWire = new OneWire((uint8_t)pin.toInt());
|
|
|
|
|
|
sensors.setOneWire(oneWire);
|
|
|
|
|
|
sensors.begin();
|
|
|
|
|
|
sensors.setResolution(12);
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, type, "dallas");
|
|
|
|
|
|
sensors_reading_map[3] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void dallas_reading() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
float temp = 0;
|
|
|
|
|
|
sensors.requestTemperatures();
|
|
|
|
|
|
temp = sensors.getTempCByIndex(0);
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonWriteStr(configLiveJson, "dallas", String(temp));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen("dallas", "");
|
|
|
|
|
|
sendSTATUS("dallas", String(temp));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor 'dallas' send date " + String(temp));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
//=========================================================================================================================================
|
|
|
|
|
|
//=========================================Модуль сенсоров DHT=============================================================================
|
2020-06-21 03:43:15 +03:00
|
|
|
|
#ifdef DHT_ENABLED
|
2020-06-17 23:30:48 +03:00
|
|
|
|
//dhtT t 2 dht11 Температура#DHT,#t°C Датчики any-data 1
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void dhtT() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String value_name = sCmd.next();
|
|
|
|
|
|
String pin = sCmd.next();
|
|
|
|
|
|
String sensor_type = sCmd.next();
|
|
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String type = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
dhtT_value_name = value_name;
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (sensor_type == "dht11") {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
dht.setup(pin.toInt(), DHTesp::DHT11);
|
|
|
|
|
|
}
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (sensor_type == "dht22") {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
dht.setup(pin.toInt(), DHTesp::DHT22);
|
|
|
|
|
|
}
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
|
|
|
|
|
sensors_reading_map[4] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void dhtT_reading() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
float value = 0;
|
|
|
|
|
|
static int counter;
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (dht.getStatus() != 0 && counter < 5) {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
sendSTATUS(dhtT_value_name, String(dht.getStatusString()));
|
|
|
|
|
|
counter++;
|
2020-06-19 03:49:56 +03:00
|
|
|
|
} else {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
counter = 0;
|
|
|
|
|
|
value = dht.getTemperature();
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (String(value) != "nan") {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen(dhtT_value_name, "");
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonWriteStr(configLiveJson, dhtT_value_name, String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
sendSTATUS(dhtT_value_name, String(value));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor '" + dhtT_value_name + "' data: " + String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//dhtH h 2 dht11 Влажность#DHT,#t°C Датчики any-data 1
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void dhtH() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String value_name = sCmd.next();
|
|
|
|
|
|
String pin = sCmd.next();
|
|
|
|
|
|
String sensor_type = sCmd.next();
|
|
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String type = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
dhtH_value_name = value_name;
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (sensor_type == "dht11") {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
dht.setup(pin.toInt(), DHTesp::DHT11);
|
|
|
|
|
|
}
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (sensor_type == "dht22") {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
dht.setup(pin.toInt(), DHTesp::DHT22);
|
|
|
|
|
|
}
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
|
|
|
|
|
sensors_reading_map[5] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void dhtH_reading() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
float value = 0;
|
|
|
|
|
|
static int counter;
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (dht.getStatus() != 0 && counter < 5) {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
sendSTATUS(dhtH_value_name, String(dht.getStatusString()));
|
|
|
|
|
|
counter++;
|
2020-06-19 03:49:56 +03:00
|
|
|
|
} else {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
counter = 0;
|
|
|
|
|
|
value = dht.getHumidity();
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (String(value) != "nan") {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen(dhtH_value_name, "");
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonWriteStr(configLiveJson, dhtH_value_name, String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
sendSTATUS(dhtH_value_name, String(value));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor '" + dhtH_value_name + "' data: " + String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//dhtPerception Восприятие: Датчики 4
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void dhtP() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, "any-data", "dhtPerception");
|
|
|
|
|
|
sensors_reading_map[6] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void dhtP_reading() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
byte value;
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (dht.getStatus() != 0) {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
sendSTATUS("dhtPerception", String(dht.getStatusString()));
|
2020-06-19 03:49:56 +03:00
|
|
|
|
} else {
|
2020-06-19 14:50:34 +02:00
|
|
|
|
value = dht.computePerception(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String final_line = perception(value);
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonWriteStr(configLiveJson, "dhtPerception", final_line);
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen("dhtPerception", "");
|
|
|
|
|
|
sendSTATUS("dhtPerception", final_line);
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (client_mqtt.connected()) {
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor 'dhtPerception' data: " + final_line);
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
String perception(byte value) {
|
2020-06-19 02:31:56 +02:00
|
|
|
|
String res;
|
2020-06-19 03:49:56 +03:00
|
|
|
|
switch (value) {
|
|
|
|
|
|
case 0:
|
|
|
|
|
|
res = F("Сухой воздух");
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 1:
|
|
|
|
|
|
res = F("Комфортно");
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
|
|
|
res = F("Уютно");
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
|
|
|
res = F("Хорошо");
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 4:
|
|
|
|
|
|
res = F("Неудобно");
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 5:
|
|
|
|
|
|
res = F("Довольно неудобно");
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 6:
|
|
|
|
|
|
res = F("Очень неудобно");
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 7:
|
|
|
|
|
|
res = F("Сильно неудобно, полный звиздец");
|
|
|
|
|
|
default:
|
|
|
|
|
|
res = F("Unknown");
|
|
|
|
|
|
break;
|
2020-06-19 02:31:56 +02:00
|
|
|
|
}
|
|
|
|
|
|
return res;
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//dhtComfort Степень#комфорта: Датчики 3
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void dhtC() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, "any-data", "dhtComfort");
|
|
|
|
|
|
sensors_reading_map[7] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-20 14:27:58 +03:00
|
|
|
|
void dhtC_reading() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
ComfortState cf;
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (dht.getStatus() != 0) {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
sendSTATUS("dhtComfort", String(dht.getStatusString()));
|
2020-06-19 03:49:56 +03:00
|
|
|
|
} else {
|
2020-06-20 02:00:56 +02:00
|
|
|
|
dht.getComfortRatio(cf, jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String final_line = get_comfort_status(cf);
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonWriteStr(configLiveJson, "dhtComfort", final_line);
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen("dhtComfort", "");
|
|
|
|
|
|
sendSTATUS("dhtComfort", final_line);
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor 'dhtComfort' send date " + final_line);
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
String get_comfort_status(ComfortState cf) {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String comfortStatus;
|
2020-06-19 03:49:56 +03:00
|
|
|
|
switch (cf) {
|
|
|
|
|
|
case Comfort_OK:
|
|
|
|
|
|
comfortStatus = "Отлично";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Comfort_TooHot:
|
|
|
|
|
|
comfortStatus = "Очень жарко";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Comfort_TooCold:
|
|
|
|
|
|
comfortStatus = "Очень холодно";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Comfort_TooDry:
|
|
|
|
|
|
comfortStatus = "Очень сухо";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Comfort_TooHumid:
|
|
|
|
|
|
comfortStatus = "Очень влажно";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Comfort_HotAndHumid:
|
|
|
|
|
|
comfortStatus = "Жарко и влажно";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Comfort_HotAndDry:
|
|
|
|
|
|
comfortStatus = "Жарко и сухо";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Comfort_ColdAndHumid:
|
|
|
|
|
|
comfortStatus = "Холодно и влажно";
|
|
|
|
|
|
break;
|
|
|
|
|
|
case Comfort_ColdAndDry:
|
|
|
|
|
|
comfortStatus = "Холодно и сухо";
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
comfortStatus = "Неизвестно";
|
|
|
|
|
|
break;
|
2020-06-17 23:30:48 +03:00
|
|
|
|
};
|
|
|
|
|
|
return comfortStatus;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//dhtDewpoint Точка#росы: Датчики 5
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void dhtD() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, "any-data", "dhtDewpoint");
|
|
|
|
|
|
sensors_reading_map[8] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void dhtD_reading() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
float value;
|
2020-06-19 03:49:56 +03:00
|
|
|
|
if (dht.getStatus() != 0) {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
sendSTATUS("dhtDewpoint", String(dht.getStatusString()));
|
2020-06-19 03:49:56 +03:00
|
|
|
|
} else {
|
2020-06-19 14:50:34 +02:00
|
|
|
|
value = dht.computeDewPoint(jsonReadStr(configLiveJson, dhtT_value_name).toFloat(), jsonReadStr(configLiveJson, dhtH_value_name).toFloat(), false);
|
|
|
|
|
|
jsonWriteInt(configLiveJson, "dhtDewpoint", value);
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen("dhtDewpoint", "");
|
|
|
|
|
|
sendSTATUS("dhtDewpoint", String(value));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor 'dhtDewpoint' data: " + String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
//=========================================i2c bus esp8266 scl-4 sda-5 ====================================================================
|
|
|
|
|
|
//=========================================================================================================================================
|
|
|
|
|
|
//=========================================Модуль сенсоров bmp280==========================================================================
|
2020-06-19 02:31:56 +02:00
|
|
|
|
|
2020-06-17 23:30:48 +03:00
|
|
|
|
//bmp280T temp1 0x76 Температура#bmp280 Датчики any-data 1
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void bmp280T() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String value_name = sCmd.next();
|
|
|
|
|
|
String address = sCmd.next();
|
|
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String type = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
bmp280T_value_name = value_name;
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
|
|
|
|
|
bmp.begin(hexStringToUint8(address));
|
|
|
|
|
|
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
|
|
|
|
|
|
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
|
|
|
|
|
|
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
|
|
|
|
|
|
Adafruit_BMP280::FILTER_X16, /* Filtering. */
|
|
|
|
|
|
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
|
|
|
|
|
|
//bmp_temp->printSensorDetails();
|
|
|
|
|
|
sensors_reading_map[9] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void bmp280T_reading() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
float value = 0;
|
2020-06-20 02:00:56 +02:00
|
|
|
|
sensors_event_t temp_event;
|
2020-06-17 23:30:48 +03:00
|
|
|
|
bmp_temp->getEvent(&temp_event);
|
|
|
|
|
|
value = temp_event.temperature;
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonWriteStr(configLiveJson, bmp280T_value_name, String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen(bmp280T_value_name, "");
|
|
|
|
|
|
sendSTATUS(bmp280T_value_name, String(value));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor '" + bmp280T_value_name + "' data: " + String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//bmp280P press1 0x76 Давление#bmp280 Датчики any-data 2
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void bmp280P() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String value_name = sCmd.next();
|
|
|
|
|
|
String address = sCmd.next();
|
|
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String type = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
bmp280P_value_name = value_name;
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
|
|
|
|
|
bmp.begin(hexStringToUint8(address));
|
|
|
|
|
|
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */
|
|
|
|
|
|
Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */
|
|
|
|
|
|
Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */
|
|
|
|
|
|
Adafruit_BMP280::FILTER_X16, /* Filtering. */
|
|
|
|
|
|
Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
|
|
|
|
|
|
//bmp_temp->printSensorDetails();
|
|
|
|
|
|
sensors_reading_map[10] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void bmp280P_reading() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
float value = 0;
|
2020-06-20 02:00:56 +02:00
|
|
|
|
sensors_event_t pressure_event;
|
2020-06-17 23:30:48 +03:00
|
|
|
|
bmp_pressure->getEvent(&pressure_event);
|
|
|
|
|
|
value = pressure_event.pressure;
|
|
|
|
|
|
value = value / 1.333224;
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonWriteStr(configLiveJson, bmp280P_value_name, String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen(bmp280P_value_name, "");
|
|
|
|
|
|
sendSTATUS(bmp280P_value_name, String(value));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor '" + bmp280P_value_name + "' data: " + String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
2020-06-19 02:31:56 +02:00
|
|
|
|
|
2020-06-17 23:30:48 +03:00
|
|
|
|
//=========================================================================================================================================
|
|
|
|
|
|
//=============================================Модуль сенсоров bme280======================================================================
|
|
|
|
|
|
//bme280T temp1 0x76 Температура#bmp280 Датчики any-data 1
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void bme280T() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String value_name = sCmd.next();
|
|
|
|
|
|
String address = sCmd.next();
|
|
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String type = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
bme280T_value_name = value_name;
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
|
|
|
|
|
bme.begin(hexStringToUint8(address));
|
|
|
|
|
|
sensors_reading_map[11] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void bme280T_reading() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
float value = 0;
|
|
|
|
|
|
value = bme.readTemperature();
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonWriteStr(configLiveJson, bme280T_value_name, String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen(bme280T_value_name, "");
|
|
|
|
|
|
sendSTATUS(bme280T_value_name, String(value));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor '" + bme280T_value_name + "' data: " + String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//bme280P pres1 0x76 Давление#bmp280 Датчики any-data 1
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void bme280P() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String value_name = sCmd.next();
|
|
|
|
|
|
String address = sCmd.next();
|
|
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String type = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
bme280P_value_name = value_name;
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
|
|
|
|
|
bme.begin(hexStringToUint8(address));
|
|
|
|
|
|
sensors_reading_map[12] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void bme280P_reading() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
float value = 0;
|
|
|
|
|
|
value = bme.readPressure();
|
|
|
|
|
|
value = value / 1.333224;
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonWriteStr(configLiveJson, bme280P_value_name, String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen(bme280P_value_name, "");
|
|
|
|
|
|
sendSTATUS(bme280P_value_name, String(value));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor '" + bme280P_value_name + "' data: " + String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//bme280H hum1 0x76 Влажность#bmp280 Датчики any-data 1
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void bme280H() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String value_name = sCmd.next();
|
|
|
|
|
|
String address = sCmd.next();
|
|
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String type = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
bme280H_value_name = value_name;
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
|
|
|
|
|
bme.begin(hexStringToUint8(address));
|
|
|
|
|
|
sensors_reading_map[13] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void bme280H_reading() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
float value = 0;
|
|
|
|
|
|
value = bme.readHumidity();
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonWriteStr(configLiveJson, bme280H_value_name, String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen(bme280H_value_name, "");
|
|
|
|
|
|
sendSTATUS(bme280H_value_name, String(value));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor '" + bme280H_value_name + "' data: " + String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//bme280A altit1 0x76 Высота#bmp280 Датчики any-data 1
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void bme280A() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
String value_name = sCmd.next();
|
|
|
|
|
|
String address = sCmd.next();
|
|
|
|
|
|
String widget_name = sCmd.next();
|
|
|
|
|
|
String page_name = sCmd.next();
|
|
|
|
|
|
String type = sCmd.next();
|
|
|
|
|
|
String page_number = sCmd.next();
|
|
|
|
|
|
bme280A_value_name = value_name;
|
|
|
|
|
|
choose_widget_and_create(widget_name, page_name, page_number, type, value_name);
|
|
|
|
|
|
bme.begin(hexStringToUint8(address));
|
|
|
|
|
|
sensors_reading_map[14] = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-06-19 03:49:56 +03:00
|
|
|
|
void bme280A_reading() {
|
2020-06-17 23:30:48 +03:00
|
|
|
|
float value = 0;
|
|
|
|
|
|
value = bme.readAltitude(1013.25);
|
2020-06-19 14:50:34 +02:00
|
|
|
|
jsonWriteStr(configLiveJson, bme280A_value_name, String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
eventGen(bme280A_value_name, "");
|
|
|
|
|
|
sendSTATUS(bme280A_value_name, String(value));
|
2020-06-20 22:51:14 +03:00
|
|
|
|
Serial.println("[I] sensor '" + bme280A_value_name + "' data: " + String(value));
|
2020-06-17 23:30:48 +03:00
|
|
|
|
}
|