From c473f616b63830e10413f40c1497795b07290c57 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Fri, 28 Aug 2020 02:49:26 +0300 Subject: [PATCH] add analog sensor --- data/items/analog-adc.txt | 1 + data/set.device.json | 3 +- doc/orders.xlsm | Bin 34607 -> 34601 bytes include/Class/Sensor.h | 26 ---- include/Class/SensorAnalog.h | 35 +++++ include/Cmd.h | 51 ++++++- include/Global.h | 46 +----- include/Sensors.h | 3 + src/Class/SensorAnalog.cpp | 2 + src/Cmd.cpp | 23 ++- src/Global.cpp | 7 + src/Init.cpp | 21 ++- src/Sensors.cpp | 278 +++++++++++++++++++---------------- src/main.cpp | 2 +- 14 files changed, 286 insertions(+), 212 deletions(-) create mode 100644 data/items/analog-adc.txt delete mode 100644 include/Class/Sensor.h create mode 100644 include/Class/SensorAnalog.h create mode 100644 include/Sensors.h create mode 100644 src/Class/SensorAnalog.cpp diff --git a/data/items/analog-adc.txt b/data/items/analog-adc.txt new file mode 100644 index 00000000..3a7d70c6 --- /dev/null +++ b/data/items/analog-adc.txt @@ -0,0 +1 @@ +analog-adc;id;anydata;Сенсоры;Аналоговый;order;pin[0];map[1,100,1,100];c[0] \ No newline at end of file diff --git a/data/set.device.json b/data/set.device.json index 533ff559..c8ad7722 100644 --- a/data/set.device.json +++ b/data/set.device.json @@ -61,7 +61,8 @@ "/set?addItem=button-in": "4.Физическая кнопка", "/set?addItem=input-digit": "5.Окно ввода цифровых значений", "/set?addItem=input-time": "6.Окно ввода времени", - "/set?addItem=output-text": "7.Окно вывода любого текста, предупреждения, цифры" + "/set?addItem=output-text": "7.Окно вывода любого текста, предупреждения, цифры", + "/set?addItem=analog-adc": "8.Аналоговый сенсор" } }, { diff --git a/doc/orders.xlsm b/doc/orders.xlsm index 6589c1f8405fde99da4054aab1225ca2e6369854..d86f040e6bfb2575aad032207dc44582d1bbabd0 100644 GIT binary patch delta 22009 zcmc$^1yo&ImNiV!1OkNM?oMz?g4`g%9Rk6F1q&WL;XrVgOK=InJ-EBOySux~h3~?9 zRqws3>i+xtyQ{x34zSL?d#^dy+;gvU7~>WM!)67;{(6oC2v{E-K8AyVfkA?SL5Kcv z{KVp5X=A2mX=%pnX#Oenorc^rE0$|g$=$QdS}Kcb&$sZ(k7pSk<+L%gh<*BX+|}v(lxS*CsFcxfZ!9nEuVsj8d*s!0NCN29QX`%{L(TP7~->3oy(Av zXUj(98`|v)=HkQh#k_kq6^3ccfC08;;Sw=k@GT*#M@fx};^R5c�UgelD)Tm_RM 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

DUi3a;J^%`4 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 delta 21993 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 Ig8%>k00-TIAOHXW diff --git a/include/Class/Sensor.h b/include/Class/Sensor.h deleted file mode 100644 index 4ef408e1..00000000 --- a/include/Class/Sensor.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include -#include "Class/LineParsing.h" -#include "Global.h" - -class Sensor : public LineParsing { - public: - Sensor() : LineParsing(){}; - - void SensorInit() { - if (_pin != "") { - pinMode(_pin.toInt(), INPUT); - } - } - - void SensorRead(String key, String pin, String state) { - int pinInt = pin.toInt(); - analogWrite(pinInt, state.toInt()); - eventGen(key, ""); - jsonWriteInt(configLiveJson, key, state.toInt()); - MqttClient::publishStatus(key, state); - } -}; - -//extern Sensor* mySensor; \ No newline at end of file diff --git a/include/Class/SensorAnalog.h b/include/Class/SensorAnalog.h new file mode 100644 index 00000000..6e94a978 --- /dev/null +++ b/include/Class/SensorAnalog.h @@ -0,0 +1,35 @@ +#pragma once + +#include + +#include "Class/LineParsing.h" +#include "Global.h" + +class SensorAnalog : public LineParsing { + public: + SensorAnalog() : LineParsing(){}; + + void SensorAnalogInit() { + //if (_pin != "") { + // pinMode(_pin.toInt(), INPUT); + //} + } + + int SensorAnalogRead(String key, String pin) { + int pinInt = pin.toInt(); + int value; +#ifdef ESP32 + value = analogRead(pinInt); +#endif +#ifdef ESP8266 + pinInt = pinInt; + value = analogRead(A0); +#endif + + eventGen(key, ""); + jsonWriteInt(configLiveJson, key, value); + MqttClient::publishStatus(key, String(value)); + return value; + } +}; +extern SensorAnalog* mySensorAnalog; \ No newline at end of file diff --git a/include/Cmd.h b/include/Cmd.h index 9ef6054d..70883c34 100644 --- a/include/Cmd.h +++ b/include/Cmd.h @@ -1,5 +1,4 @@ #pragma once - #include extern void cmd_init(); @@ -22,6 +21,56 @@ extern void inputTimeSet(); extern void textOut(); extern void textOutSet(); +extern void analogAdc(); +extern void analogReading(); + + + + + + + + + +extern void sensorsInit(); + +extern void levelPr(); +extern void ultrasonicCm(); +extern void ultrasonic_reading(); + + +extern void analog_reading1(); +extern void analog_reading2(); +extern void dallas_reading(); +extern void dhtT_reading(); + +extern void dallas(); + +extern void bmp280T(); +extern void bmp280P(); +extern void bmp280T_reading(); +extern void bmp280P_reading(); + +extern void bme280T(); +extern void bme280P(); +extern void bme280H(); +extern void bme280A(); + +extern void bme280T_reading(); +extern void bme280P_reading(); +extern void bme280H_reading(); +extern void bme280A_reading(); + +extern void dhtT(); +extern void dhtH(); +extern void dhtP(); +extern void dhtC(); +extern void dhtD(); +extern void dhtH_reading(); +extern void dhtP_reading(); +extern void dhtC_reading(); +extern void dhtD_reading(); + extern void handle_time_init(); extern void stepper(); extern void stepperSet(); diff --git a/include/Global.h b/include/Global.h index e0317b4e..41fa5dc9 100644 --- a/include/Global.h +++ b/include/Global.h @@ -71,10 +71,12 @@ extern Bounce* buttons; extern boolean just_load; +// Json extern String configSetupJson; //все настройки extern String configLiveJson; //все данные с датчиков (связан с mqtt) extern String configOptionJson; //для трансфера +// Mqtt extern String chipId; extern String prex; extern String all_widgets; @@ -84,6 +86,12 @@ extern String order_loop; extern String itemsFile; extern String itemsLine; +// Sensors +extern String sensorReadingMap; + + + + extern String analog_value_names_list; extern int enter_to_analog_counter; @@ -165,45 +173,7 @@ extern void setLedStatus(LedStatus_t); extern void eventGen(String event_name, String number); extern String add_set(String param_name); -//Sensors -extern void sensors_init(); -extern void levelPr(); -extern void ultrasonicCm(); -extern void ultrasonic_reading(); - -extern void analog(); -extern void analog_reading1(); -extern void analog_reading2(); -extern void dallas_reading(); -extern void dhtT_reading(); - -extern void dallas(); - -extern void bmp280T(); -extern void bmp280P(); -extern void bmp280T_reading(); -extern void bmp280P_reading(); - -extern void bme280T(); -extern void bme280P(); -extern void bme280H(); -extern void bme280A(); - -extern void bme280T_reading(); -extern void bme280P_reading(); -extern void bme280H_reading(); -extern void bme280A_reading(); - -extern void dhtT(); -extern void dhtH(); -extern void dhtP(); -extern void dhtC(); -extern void dhtD(); -extern void dhtH_reading(); -extern void dhtP_reading(); -extern void dhtC_reading(); -extern void dhtD_reading(); //Timers extern void Timer_countdown_init(); diff --git a/include/Sensors.h b/include/Sensors.h new file mode 100644 index 00000000..45dcbb04 --- /dev/null +++ b/include/Sensors.h @@ -0,0 +1,3 @@ +#pragma once + + diff --git a/src/Class/SensorAnalog.cpp b/src/Class/SensorAnalog.cpp new file mode 100644 index 00000000..e1963f5a --- /dev/null +++ b/src/Class/SensorAnalog.cpp @@ -0,0 +1,2 @@ +#include "Class/SensorAnalog.h" +SensorAnalog* mySensorAnalog; \ No newline at end of file diff --git a/src/Cmd.cpp b/src/Cmd.cpp index 2e14c994..528403ac 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -3,9 +3,9 @@ #include "Class/Button.h" #include "Class/Input.h" #include "Class/LineParsing.h" +#include "Class/OutputModule.h" #include "Class/Pwm.h" #include "Class/Switch.h" -#include "Class/OutputModule.h" //----------------------------- #include "Class/NotAsinc.h" #include "Global.h" @@ -36,7 +36,12 @@ void cmd_init() { sCmd.addCommand("input-time", inputTime); sCmd.addCommand("output-text", textOut); - +#ifdef ANALOG_ENABLED + sCmd.addCommand("analog-adc", analogAdc); +#endif + + + @@ -45,11 +50,6 @@ void cmd_init() { sCmd.addCommand("timerStart", timerStart_); sCmd.addCommand("timerStop", timerStop_); - - -#ifdef ANALOG_ENABLED - sCmd.addCommand("analog", analog); -#endif #ifdef LEVEL_ENABLED sCmd.addCommand("levelPr", levelPr); sCmd.addCommand("ultrasonicCm", ultrasonicCm); @@ -253,7 +253,6 @@ void textOutSet() { myText->OutputModuleChange(key, state); } - //void text() { // String number = sCmd.next(); // String widget_name = sCmd.next(); @@ -490,8 +489,8 @@ void fileExecute(const String &filename) { csvExecute(cmdStr); } -void csvExecute(String &cmdStr) { - cmdStr.replace(";"," "); +void csvExecute(String &cmdStr) { + cmdStr.replace(";", " "); cmdStr += "\r\n"; cmdStr.replace("\r\n", "\n"); cmdStr.replace("\r", "\n"); @@ -499,12 +498,12 @@ void csvExecute(String &cmdStr) { while (cmdStr.length()) { String buf = selectToMarker(cmdStr, "\n"); count++; - if (count > 1)sCmd.readStr(buf); + if (count > 1) sCmd.readStr(buf); cmdStr = deleteBeforeDelimiter(cmdStr, "\n"); } } -void spaceExecute(String &cmdStr) { +void spaceExecute(String &cmdStr) { cmdStr += "\r\n"; cmdStr.replace("\r\n", "\n"); cmdStr.replace("\r", "\n"); diff --git a/src/Global.cpp b/src/Global.cpp index 04a4041f..aa11740f 100644 --- a/src/Global.cpp +++ b/src/Global.cpp @@ -43,6 +43,13 @@ String itemsFile = ""; String itemsLine = ""; // Sensors +String sensorReadingMap; + + + + + + String analog_value_names_list; int enter_to_analog_counter; diff --git a/src/Init.cpp b/src/Init.cpp index 99c1d98b..bbaa6f60 100644 --- a/src/Init.cpp +++ b/src/Init.cpp @@ -23,31 +23,36 @@ void all_init() { } void Device_init() { - logging_value_names_list = ""; - enter_to_logging_counter = LOG1 - 1; + sensorReadingMap = ""; + + + + + + logging_value_names_list = ""; + + + + + + enter_to_logging_counter = LOG1 - 1; analog_value_names_list = ""; enter_to_analog_counter = 0; - dallas_value_name = ""; enter_to_dallas_counter = 0; - levelPr_value_name = ""; ultrasonicCm_value_name = ""; - dhtT_value_name = ""; dhtH_value_name = ""; - bmp280T_value_name = ""; bmp280P_value_name = ""; - bme280T_value_name = ""; bme280P_value_name = ""; bme280H_value_name = ""; bme280A_value_name = ""; int array_sz = sizeof(sensors_reading_map) / sizeof(sensors_reading_map[0]); - for (int i = 0; i < array_sz; i++) { sensors_reading_map[i] = 0; } diff --git a/src/Sensors.cpp b/src/Sensors.cpp index a23b5d3e..e617d608 100644 --- a/src/Sensors.cpp +++ b/src/Sensors.cpp @@ -1,3 +1,5 @@ +#include "Class/SensorAnalog.h" +#include "Cmd.h" #include "Global.h" GMedian<10, int> medianFilter; @@ -17,67 +19,161 @@ const String comfortStr(ComfortState value); void bmp280T_reading(); -void sensors_init() { +void sensorsInit() { ts.add( - SENSORS, 1000, [&](void *) { - 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 + SENSORS, 10000, [&](void *) { + String buf = sensorReadingMap; + while (buf.length()) { + String tmp = selectToMarker(buf, ","); + sCmd.readStr(tmp); + buf = deleteBeforeDelimiter(buf, ","); } }, 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 +void analogAdc() { + mySensorAnalog = new SensorAnalog(); + mySensorAnalog->update(); + String key = mySensorAnalog->gkey(); + String pin = mySensorAnalog->gpin(); + sCmd.addCommand(key.c_str(), analogReading); + sensorReadingMap += key + ","; + jsonWriteStr(configOptionJson, key + "_pin", pin); + mySensorAnalog->clear(); +} + +void analogReading() { + String key = sCmd.order(); + String pin = jsonReadStr(configOptionJson, key + "_pin"); + mySensorAnalog->SensorAnalogRead(key, pin); +} + +//analog adc 0 Аналоговый#вход,#% Датчики any-data 1 1023 1 100 1 +//void analog() { +// 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++; +// 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); +// 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; +// } +//} +// +//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 @@ -161,74 +257,6 @@ void ultrasonic_reading() { } #endif //========================================================================================================================================= -//=========================================Модуль аналогового сенсора====================================================================== -#ifdef ANALOG_ENABLED -//analog adc 0 Аналоговый#вход,#% Датчики any-data 1 1023 1 100 1 -void analog() { - 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++; - 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); - 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; - } -} - -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 -//========================================================================================================================================= //=========================================Модуль температурного сенсора ds18b20=========================================================== #ifdef DALLAS_ENABLED //dallas temp1 2 1 Температура Датчики anydata 1 @@ -242,7 +270,7 @@ void dallas() { String page_name = sCmd.next(); String type = sCmd.next(); String page_number = sCmd.next(); - oneWire = new OneWire((uint8_t) pin.toInt()); + oneWire = new OneWire((uint8_t)pin.toInt()); sensors.setOneWire(oneWire); sensors.begin(); sensors.setResolution(12); @@ -256,7 +284,7 @@ void dallas_reading() { byte num = sensors.getDS18Count(); String dallas_value_name_tmp_buf = dallas_value_name; sensors.requestTemperatures(); - for (byte i = 0; i < num; i++) { + for (byte i = 0; i < num; i++) { temp = sensors.getTempCByIndex(i); String buf = selectToMarker(dallas_value_name_tmp_buf, ";"); dallas_value_name_tmp_buf = deleteBeforeDelimiter(dallas_value_name_tmp_buf, ";"); diff --git a/src/main.cpp b/src/main.cpp index be59f86e..c77ad247 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -42,7 +42,7 @@ void setup() { cmd_init(); pm.info("Sensors"); - sensors_init(); + sensorsInit(); pm.info("Init"); all_init();