diff --git a/data/items/analog-adc.txt b/data/items/analog-adc.txt index bcbe6528..ad72b7f9 100644 --- a/data/items/analog-adc.txt +++ b/data/items/analog-adc.txt @@ -1 +1 @@ -analog-adc;id;anydata;Сенсоры;Аналоговый;order;pin-adc;map[1,100,1,100];c[0] \ No newline at end of file +analog-adc;id;anydata;Сенсоры;Аналоговый;order;pin-adc;map[1,1024,1,1024];c[1] \ No newline at end of file diff --git a/include/Class/SensorAnalog.h b/include/Class/SensorAnalog.h index b4e69761..918086f0 100644 --- a/include/Class/SensorAnalog.h +++ b/include/Class/SensorAnalog.h @@ -1,7 +1,5 @@ #pragma once - #include - #include "Class/LineParsing.h" #include "Class/SensorConverting.h" #include "Global.h" @@ -23,16 +21,14 @@ class SensorAnalog : public SensorConverting { pinInt = pinInt; value = analogRead(A0); #endif - //float valueFl = this->mapping(value); - // valueFl = this->correction(valueFl); - value = this->mapping(key, value); + float valueFl = this->correction(key, value); eventGen(key, ""); - jsonWriteFloat(configLiveJson, key, value); - MqttClient::publishStatus(key, String(value)); + jsonWriteStr(configLiveJson, key, String(valueFl)); + MqttClient::publishStatus(key, String(valueFl)); - Serial.println("[I] sensor '" + key + "' data: " + String(value)); + Serial.println("[I] sensor '" + key + "' data: " + String(valueFl)); return value; } }; diff --git a/include/Class/SensorConverting.h b/include/Class/SensorConverting.h index a324d281..d5d8d8ce 100644 --- a/include/Class/SensorConverting.h +++ b/include/Class/SensorConverting.h @@ -12,8 +12,6 @@ class SensorConverting : public LineParsing { int mapping(String key, int input) { String map_ = jsonReadStr(configOptionJson, key + "_map"); if (map_ != "") { - map_.replace("map[", ""); - map_.replace("]", ""); input = map(input, selectFromMarkerToMarker(map_, ",", 0).toInt(), selectFromMarkerToMarker(map_, ",", 1).toInt(), @@ -24,11 +22,11 @@ class SensorConverting : public LineParsing { } float correction(String key, float input) { - _c.replace("c[", ""); - _c.replace("]", ""); - float coef = _c.toFloat(); - input = input * coef; + String corr = jsonReadStr(configOptionJson, key + "_с"); + if (corr != "") { + float coef = corr.toFloat(); + input = input * coef; + } return input; } -}; -//extern SensorConverting* mySensorConverting; \ No newline at end of file +}; \ No newline at end of file diff --git a/include/Cmd.h b/include/Cmd.h index 70883c34..3c49565a 100644 --- a/include/Cmd.h +++ b/include/Cmd.h @@ -24,6 +24,9 @@ extern void textOutSet(); extern void analogAdc(); extern void analogReading(); +extern void ultrasonicCm(); +extern void ultrasonicReading(); + diff --git a/include/Global.h b/include/Global.h index 41fa5dc9..d93a5be9 100644 --- a/include/Global.h +++ b/include/Global.h @@ -38,6 +38,7 @@ #include #include + #ifdef WEBSOCKET_ENABLED extern AsyncWebSocket ws; //extern AsyncEventSource events; diff --git a/include/SSDP.h b/include/SSDP.h new file mode 100644 index 00000000..3174142a --- /dev/null +++ b/include/SSDP.h @@ -0,0 +1,5 @@ +#pragma once + +extern void SsdpInit(); +extern String xmlNode(String tags, String data); +extern String decToHex(uint32_t decValue, byte desiredStringLength); \ No newline at end of file diff --git a/src/SSDP.cpp b/src/SSDP.cpp new file mode 100644 index 00000000..26c67000 --- /dev/null +++ b/src/SSDP.cpp @@ -0,0 +1,50 @@ +#include +#include + +#include "Global.h" + +void SsdpInit() { + server.on("/description.xml", HTTP_GET, [](AsyncWebServerRequest* request) { + String ssdpSend = ""; + String ssdpHeder = xmlNode("major", "1"); + ssdpHeder += xmlNode("minor", "0"); + ssdpHeder = xmlNode("specVersion", ssdpHeder); + ssdpHeder += xmlNode("URLBase", "http://" + WiFi.localIP().toString()); + String ssdpDescription = xmlNode("deviceType", "upnp:rootdevice"); + ssdpDescription += xmlNode("friendlyName", jsonReadStr(configSetupJson, "name")); + ssdpDescription += xmlNode("presentationURL", "/"); + ssdpDescription += xmlNode("serialNumber", getChipId()); +#ifdef ESP8266 + ssdpDescription += xmlNode("modelName", "ESP8266"); +#endif +#ifdef ESP32 + ssdpDescription += xmlNode("modelName", "ESP32"); +#endif + ssdpDescription += xmlNode("modelNumber", getChipId()); + ssdpDescription += xmlNode("modelURL", "https://github.com/IoTManagerProject/IoTManager/wiki"); + ssdpDescription += xmlNode("manufacturer", "Borisenko Dmitry"); + ssdpDescription += xmlNode("manufacturerURL", "https://github.com/IoTManagerProject/IoTManager"); + ssdpDescription += xmlNode("UDN", "uuid:38323636-4558-4dda-9188-cda0e6" + decToHex(ESP.getChipId(), 6)); + ssdpDescription = xmlNode("device", ssdpDescription); + ssdpHeder += ssdpDescription; + ssdpSend += ssdpHeder; + ssdpSend += ""; + Serial.println("->!!!SSDP Get request received"); + request->send(200, "text/xml", ssdpSend); + }); + //Если версия 2.0.0 закаментируйте следующую строчку + SSDP.setDeviceType("upnp:rootdevice"); + SSDP.setSchemaURL("description.xml"); + SSDP.begin(); +} + +String xmlNode(String tags, String data) { + String temp = "<" + tags + ">" + data + ""; + return temp; +} + +String decToHex(uint32_t decValue, byte desiredStringLength) { + String hexString = String(decValue, HEX); + while (hexString.length() < desiredStringLength) hexString = "0" + hexString; + return hexString; +} \ No newline at end of file diff --git a/src/Sensors.cpp b/src/Sensors.cpp index 2dec60e1..d49c5f93 100644 --- a/src/Sensors.cpp +++ b/src/Sensors.cpp @@ -21,7 +21,7 @@ void bmp280T_reading(); void sensorsInit() { ts.add( - SENSORS, 10000, [&](void *) { + SENSORS, 15000, [&](void *) { String buf = sensorReadingMap; while (buf.length()) { String tmp = selectToMarker(buf, ","); @@ -32,65 +32,10 @@ void sensorsInit() { nullptr, true); } -// static int counter; -// counter++; -// -//#ifdef LEVEL_ENABLED -// if (sensors_reading_map[0] == 1) -// ultrasonic_reading(); -//#endif -// -// if (counter > 10) { -// counter = 0; -// -//#ifdef ANALOG_ENABLED -// if (sensors_reading_map[1] == 1) -// //analog_reading1(); -// if (sensors_reading_map[2] == 1) -// //analog_reading2(); -//#endif -// -//#ifdef DALLAS_ENABLED -// if (sensors_reading_map[3] == 1) -// dallas_reading(); -//#endif -// -//#ifdef DHT_ENABLED -// 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(); -//#endif -// -//#ifdef BMP_ENABLED -// if (sensors_reading_map[9] == 1) -// bmp280T_reading(); -// if (sensors_reading_map[10] == 1) -// bmp280P_reading(); -//#endif -// -//#ifdef BME_ENABLED -// 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(); -//#endif -// } - -//==============================================Модуль аналогового сенсора=========================================================================================== -//analog-adc;id;anydata;Сенсоры;Аналоговый;order;pin[0];map[1,100,1,100];c[0] -//=================================================================================================================================================================== #ifdef ANALOG_ENABLED +//==============================================Модуль аналогового сенсора=========================================================================================== +//analog-adc;id;anydata;Сенсоры;Аналоговый;order;pin-adc;map[1,1024,1,100];c[1] +//=================================================================================================================================================================== void analogAdc() { mySensorAnalog = new SensorAnalog(); mySensorAnalog->update(); @@ -100,162 +45,107 @@ void analogAdc() { sensorReadingMap += key + ","; jsonWriteStr(configOptionJson, key + "_pin", pin); jsonWriteStr(configOptionJson, key + "_map", mySensorAnalog->gmap()); + jsonWriteStr(configOptionJson, key + "_с", mySensorAnalog->gc()); mySensorAnalog->clear(); } void analogReading() { String key = sCmd.order(); String pin = jsonReadStr(configOptionJson, key + "_pin"); - mySensorAnalog->SensorAnalogRead(key, pin); } +#endif -//analog adc 0 Аналоговый#вход,#% Датчики any-data 1 1023 1 100 1 -//void analog() { +#ifdef LEVEL_ENABLED +//=========================================Модуль ультрозвукового дальномера================================================================== +//ultrasonic-cm;id;anydata;Сенсоры;Расстояние;order;pin;map[1,100,1,100];c[1] +//========================================================================================================================================= +void ultrasonicCm() { + + +} + +void ultrasonicReading() { + + +} + +void levelPr() { // String value_name = sCmd.next(); -// String pin = 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 analog_start = sCmd.next(); -// String analog_end = sCmd.next(); -// String analog_start_out = sCmd.next(); -// String analog_end_out = sCmd.next(); +// String empty_level = sCmd.next(); +// String full_level = sCmd.next(); // String page_number = sCmd.next(); -// analog_value_names_list += value_name + ","; -// enter_to_analog_counter++; -// 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); +// 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); // createWidgetByType(widget_name, page_name, page_number, type, value_name); -// if (enter_to_analog_counter == 1) { -// sensors_reading_map[1] = 1; -// } -// if (enter_to_analog_counter == 2) { -// sensors_reading_map[2] = 1; -// } +// sensors_reading_map[0] = 1; +} +////ultrasonicCm cm 14 12 Дистанция,#см Датчики fillgauge 1 +//void ultrasonicCm() { +// 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); +// createWidgetByType(widget_name, page_name, page_number, type, value_name); +// sensors_reading_map[0] = 1; //} // -//void analog_reading1() { -// 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, -// 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); -// eventGen(value_name, ""); -// MqttClient::publishStatus(value_name, String(analog)); -// Serial.println("[I] sensor '" + value_name + "' data: " + String(analog)); -//} -// -//void analog_reading2() { -// 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, -// 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); -// eventGen(value_name, ""); -// MqttClient::publishStatus(value_name, String(analog)); -// Serial.println("[I] sensor '" + value_name + "' data: " + String(analog)); -//} -#endif - -//========================================================================================================================================= -//=========================================Модуль измерения уровня в баке================================================================== -#ifdef LEVEL_ENABLED -//levelPr p 14 12 Вода#в#баке,#% Датчики fillgauge 125 20 1 -void levelPr() { - 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); - createWidgetByType(widget_name, page_name, page_number, type, value_name); - sensors_reading_map[0] = 1; -} -//ultrasonicCm cm 14 12 Дистанция,#см Датчики fillgauge 1 -void ultrasonicCm() { - 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); - createWidgetByType(widget_name, page_name, page_number, type, value_name); - sensors_reading_map[0] = 1; -} - void ultrasonic_reading() { - 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++; - if (counter > TANK_LEVEL_SAMPLES) { - 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, ""); - - MqttClient::publishStatus(levelPr_value_name, String(level)); - - Serial.println("[I] sensor '" + levelPr_value_name + "' data: " + String(level)); - - jsonWriteInt(configLiveJson, ultrasonicCm_value_name, distance_cm); - eventGen(ultrasonicCm_value_name, ""); - - MqttClient::publishStatus(ultrasonicCm_value_name, String(distance_cm)); - - Serial.println("[I] sensor '" + ultrasonicCm_value_name + "' data: " + String(distance_cm)); - } +// 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++; +// if (counter > TANK_LEVEL_SAMPLES) { +// 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, ""); +// +// MqttClient::publishStatus(levelPr_value_name, String(level)); +// +// Serial.println("[I] sensor '" + levelPr_value_name + "' data: " + String(level)); +// +// jsonWriteInt(configLiveJson, ultrasonicCm_value_name, distance_cm); +// eventGen(ultrasonicCm_value_name, ""); +// +// MqttClient::publishStatus(ultrasonicCm_value_name, String(distance_cm)); +// +// Serial.println("[I] sensor '" + ultrasonicCm_value_name + "' data: " + String(distance_cm)); +// } } #endif //========================================================================================================================================= diff --git a/src/main.cpp b/src/main.cpp index c77ad247..97f15ff5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,6 +8,7 @@ #include "Utils\WebUtils.h" #include "Init.h" #include "Utils/Timings.h" +#include void not_async_actions(); @@ -70,6 +71,9 @@ void setup() { udpInit(); #endif + pm.info("Ssdp Init"); + SsdpInit(); + ts.add( TEST, 1000 * 60, [&](void*) { pm.info(printMemoryStatus());