diff --git a/CH341SER_WIN_3.5.ZIP b/CH341SER_WIN_3.5.ZIP new file mode 100644 index 00000000..0850ee30 Binary files /dev/null and b/CH341SER_WIN_3.5.ZIP differ diff --git a/Cmd.ino b/Cmd.ino index 431b031f..04f78cb3 100644 --- a/Cmd.ino +++ b/Cmd.ino @@ -18,9 +18,15 @@ void CMD_init() { sCmd.addCommand("dhtT", dhtT); sCmd.addCommand("dhtH", dhtH); - sCmd.addCommand("dhtPerception", dhtPerception); - sCmd.addCommand("dhtComfort", dhtComfort); - sCmd.addCommand("dhtDewpoint", dhtDewpoint); + sCmd.addCommand("dhtPerception", dhtP); + sCmd.addCommand("dhtComfort", dhtC); + sCmd.addCommand("dhtDewpoint", dhtD); + + sCmd.addCommand("bmp280T", bmp280T); + sCmd.addCommand("bmp280P", bmp280P); + + sCmd.addCommand("bme280T", bme280T); + //sCmd.addCommand("bme280P", bme280P); sCmd.addCommand("stepper", stepper); sCmd.addCommand("stepperSet", stepperSet); @@ -65,7 +71,7 @@ void button() { String page_number = sCmd.next(); jsonWriteStr(optionJson, "button_param" + button_number, button_param); - jsonWriteStr(configJson, "buttonSet" + button_number, start_state); + jsonWriteStr(configJson, "button" + button_number, start_state); if (isDigitStr (button_param)) { pinMode(button_param.toInt(), OUTPUT); @@ -91,7 +97,7 @@ void button() { str = deleteBeforeDelimiter(str, ","); } } - createWidget (widget_name, page_name, page_number, "widgets/widget.toggle.json", "buttonSet" + button_number); + createWidget (widget_name, page_name, page_number, "widgets/widget.toggle.json", "button" + button_number); } void buttonSet() { @@ -124,23 +130,23 @@ void buttonSet() { } } - eventGen ("buttonSet", button_number); + eventGen ("button", button_number); - jsonWriteStr(configJson, "buttonSet" + button_number, button_state); - sendSTATUS("buttonSet" + button_number, button_state); + jsonWriteStr(configJson, "button" + button_number, button_state); + sendSTATUS("button" + button_number, button_state); } void buttonChange() { String button_number = sCmd.next(); - String current_state = jsonRead(configJson, "buttonSet" + button_number); + String current_state = jsonRead(configJson, "button" + button_number); if (current_state == "1") { current_state = "0"; } else if (current_state == "0") { current_state = "1"; } order_loop += "buttonSet " + button_number + " " + current_state + ","; - jsonWriteStr(configJson, "buttonSet" + button_number, current_state); - sendSTATUS("buttonSet" + button_number, current_state); + jsonWriteStr(configJson, "button" + button_number, current_state); + sendSTATUS("button" + button_number, current_state); } void pinSet() { @@ -174,9 +180,9 @@ void pwm() { pinMode(pwm_pin_int, INPUT); analogWrite(pwm_pin_int, start_state.toInt()); //analogWriteFreq(32000); - jsonWriteStr(configJson, "pwmSet" + pwm_number, start_state); + jsonWriteStr(configJson, "pwm" + pwm_number, start_state); - createWidget (widget_name, page_name, page_number, "widgets/widget.range.json", "pwmSet" + pwm_number); + createWidget (widget_name, page_name, page_number, "widgets/widget.range.json", "pwm" + pwm_number); } void pwmSet() { @@ -188,10 +194,10 @@ void pwmSet() { int pin = jsonReadtoInt(optionJson, "pwm_pin" + pwm_number); analogWrite(pin, pwm_state_int); - eventGen ("pwmSet", pwm_number); + eventGen ("pwm", pwm_number); - jsonWriteStr(configJson, "pwmSet" + pwm_number, pwm_state); - sendSTATUS("pwmSet" + pwm_number, pwm_state); + jsonWriteStr(configJson, "pwm" + pwm_number, pwm_state); + sendSTATUS("pwm" + pwm_number, pwm_state); } //================================================================================================================== //==========================================Модуль физической кнопки================================================ @@ -214,15 +220,15 @@ void handleButton() { buttons[switch_number].update(); if (buttons[switch_number].fell()) { - eventGen ("switchSet", String(switch_number)); + eventGen ("switch", String(switch_number)); - jsonWriteStr(configJson, "switchSet" + String(switch_number), "1"); + jsonWriteStr(configJson, "switch" + String(switch_number), "1"); } if (buttons[switch_number].rose()) { - eventGen ("switchSet", String(switch_number)); + eventGen ("switch", String(switch_number)); - jsonWriteStr(configJson, "switchSet" + String(switch_number), "0"); + jsonWriteStr(configJson, "switch" + String(switch_number), "0"); } } switch_number++; @@ -240,14 +246,14 @@ void inputDigit() { page_name.replace("#", " "); String start_state = sCmd.next(); String page_number = sCmd.next(); - jsonWriteStr(configJson, "digitSet" + number, start_state); - createWidget (widget_name, page_name, page_number, "widgets/widget.inputNum.json", "digitSet" + number); + jsonWriteStr(configJson, "digit" + number, start_state); + createWidget (widget_name, page_name, page_number, "widgets/widget.inputNum.json", "digit" + number); } void digitSet() { String number = sCmd.next(); String value = sCmd.next(); - jsonWriteStr(configJson, "digitSet" + number, value); - sendSTATUS("digitSet" + number, value); + jsonWriteStr(configJson, "digit" + number, value); + sendSTATUS("digit" + number, value); } //===================================================================================================================================== //=========================================Добавление окна ввода времени=============================================================== @@ -260,14 +266,14 @@ void inputTime() { page_name.replace("#", " "); String start_state = sCmd.next(); String page_number = sCmd.next(); - jsonWriteStr(configJson, "timeSet" + number, start_state); - createWidget (widget_name, page_name, page_number, "widgets/widget.inputTime.json", "timeSet" + number); + jsonWriteStr(configJson, "time" + number, start_state); + createWidget (widget_name, page_name, page_number, "widgets/widget.inputTime.json", "time" + number); } void timeSet() { String number = sCmd.next(); String value = sCmd.next(); - jsonWriteStr(configJson, "timeSet" + number, value); - sendSTATUS("timeSet" + number, value); + jsonWriteStr(configJson, "time" + number, value); + sendSTATUS("time" + number, value); } void handle_time_init() { @@ -276,8 +282,8 @@ void handle_time_init() { String tmp = GetTime(); jsonWriteStr(configJson, "time", tmp); tmp.replace(":", "-"); - jsonWriteStr(configJson, "timenowSet", tmp); - eventGen ("timenowSet", ""); + jsonWriteStr(configJson, "timenow", tmp); + eventGen ("timenow", ""); }, nullptr, true); } @@ -291,7 +297,7 @@ void text() { String page_name = sCmd.next(); String page_number = sCmd.next(); - createWidget (widget_name, page_name, page_number, "widgets/widget.anyData.json", "textSet" + number); + createWidget (widget_name, page_name, page_number, "widgets/widget.anyData.json", "text" + number); } @@ -309,8 +315,8 @@ void textSet() { text = text + " " + GetDataDigital() + " " + time; } - jsonWriteStr(configJson, "textSet" + number, text); - sendSTATUS("textSet" + number, text); + jsonWriteStr(configJson, "text" + number, text); + sendSTATUS("text" + number, text); } //===================================================================================================================================== @@ -418,9 +424,9 @@ void servo_() { jsonWriteStr(optionJson, "s_min_deg" + servo_number, min_deg); jsonWriteStr(optionJson, "s_max_deg" + servo_number, max_deg); - jsonWriteStr(configJson, "servoSet" + servo_number, start_state); + jsonWriteStr(configJson, "servo" + servo_number, start_state); - createWidgetParam (widget_name, page_name, page_number, "widgets/widget.range.json", "servoSet" + servo_number, "min", min_value, "max", max_value, "k", "1"); + createWidgetParam (widget_name, page_name, page_number, "widgets/widget.range.json", "servo" + servo_number, "min", min_value, "max", max_value, "k", "1"); } void servoSet() { @@ -456,10 +462,10 @@ void servoSet() { //Serial.println(servo_state_int); - eventGen ("servoSet", servo_number); + eventGen ("servo", servo_number); - jsonWriteStr(configJson, "servoSet" + servo_number, servo_state); - sendSTATUS("servoSet" + servo_number, servo_state); + jsonWriteStr(configJson, "servo" + servo_number, servo_state); + sendSTATUS("servo" + servo_number, servo_state); } //==================================================================================================================================================== /* @@ -471,14 +477,14 @@ void servoSet() { page_name.replace("#", " "); String start_state = sCmd.next(); String page_number = sCmd.next(); - jsonWriteStr(configJson, "inputTextSet" + number, start_state); - createWidget (widget_name, page_name, page_number, "widgets/widget.inputText.json", "inputTextSet" + number); + jsonWriteStr(configJson, "inputText" + number, start_state); + createWidget (widget_name, page_name, page_number, "widgets/widget.inputText.json", "inputText" + number); } void inputTextSet() { String number = sCmd.next(); String value = sCmd.next(); - jsonWriteStr(configJson, "inputTextSet" + number, value); - sendSTATUS("inputTextSet" + number, value); + jsonWriteStr(configJson, "inputText" + number, value); + sendSTATUS("inputText" + number, value); } void inputTime() { @@ -489,16 +495,16 @@ void servoSet() { page_name.replace("#", " "); String start_state = sCmd.next(); String page_number = sCmd.next(); - jsonWriteStr(configJson, "inputTimeSet" + number, start_state); - createWidget (widget_name, page_name, page_number, "widgets/widget.inputTime.json", "inputTimeSet" + number); + jsonWriteStr(configJson, "inputTime" + number, start_state); + createWidget (widget_name, page_name, page_number, "widgets/widget.inputTime.json", "inputTime" + number); } void inputTimeSet() { String number = sCmd.next(); String value = sCmd.next(); value.replace(":", "."); - jsonWriteStr(configJson, "inputTimeSet" + number, value); + jsonWriteStr(configJson, "inputTime" + number, value); value.replace(".", ":"); - sendSTATUS("inputTimeSet" + number, value); + sendSTATUS("inputTime" + number, value); } @@ -510,14 +516,14 @@ void servoSet() { page_name.replace("#", " "); String start_state = sCmd.next(); String page_number = sCmd.next(); - jsonWriteStr(configJson, "inputDateSet" + number, start_state); - createWidget (widget_name, page_name, page_number, "widgets/widget.inputDate.json", "inputDateSet" + number); + jsonWriteStr(configJson, "inputDate" + number, start_state); + createWidget (widget_name, page_name, page_number, "widgets/widget.inputDate.json", "inputDate" + number); } void inputDateSet() { String number = sCmd.next(); String value = sCmd.next(); - jsonWriteStr(configJson, "inputDateSet" + number, value); - sendSTATUS("inputDateSet" + number, value); + jsonWriteStr(configJson, "inputDate" + number, value); + sendSTATUS("inputDate" + number, value); } */ //=================================================Глобальные команды удаленного управления=========================================================== @@ -531,7 +537,7 @@ void mqttOrderSend() { //Serial.print(all_line); //Serial.print("->"); //Serial.println(order); - int send_status = client.publish (all_line.c_str(), order.c_str(), false); + int send_status = client_mqtt.publish (all_line.c_str(), order.c_str(), false); } void httpOrderSend() { @@ -587,6 +593,7 @@ void stringExecution(String str) { String tmp = selectToMarker (str, "\n"); sCmd.readStr(tmp); + str = deleteBeforeDelimiter(str, "\n"); } } diff --git a/Init.ino b/Init.ino index 40a35399..57823e2d 100644 --- a/Init.ino +++ b/Init.ino @@ -5,26 +5,34 @@ void All_init() { if (request->hasArg("arg")) { value = request->getParam("arg")->value(); } - if (value == "0") { + if (value == "0") { //выкл сценариев jsonWriteStr(configSetup, "scenario", value); saveConfig(); Scenario_init(); + request->send(200, "text/text", "OK"); } - if (value == "1") { + if (value == "1") { //вкл сценариев jsonWriteStr(configSetup, "scenario", value); saveConfig(); Scenario_init(); + request->send(200, "text/text", "OK"); } - if (value == "2") { + if (value == "2") { //инициализация Device_init(); + request->send(200, "text/text", "OK"); } if (value == "3") { clean_log_date(); + request->send(200, "text/text", "OK"); } if (value == "4") { Scenario_init(); + request->send(200, "text/text", "OK"); + } + if (value == "5") { + i2c_scanning = true; + request->redirect("/?utilities"); } - request->send(200, "text/text", "OK"); // отправляем ответ о выполнении }); prsets_init(); @@ -35,16 +43,33 @@ void All_init() { void Device_init() { - ts.remove(ANALOG_); - ts.remove(LEVEL); - ts.remove(DALLAS); - ts.remove(DHTT); - ts.remove(DHTH); - ts.remove(DHTC); - ts.remove(DHTP); - ts.remove(DHTD); - ts.remove(STEPPER1); - ts.remove(STEPPER2); + logging_value_names_list = ""; + enter_to_logging_counter = LOG1 - 1; + + analog_value_names_list = ""; + enter_to_analog_counter = 0; //ANALOG1 - 1; + + level_value_name = ""; + + dhtT_value_name = ""; + dhtH_value_name = ""; + + bmp280T_value_name = ""; + bmp280P_value_name = ""; + + bme280T_value_name = ""; + + for (int i = 0; i <= sensors_count; i++) { + sensors_reading_map[i] = 0; + } + + for (int i = LOG1; i <= LOG5; i++) { + ts.remove(i); + } + +// for (int i = LEVEL; i <= STEPPER2; i++) { +// ts.remove(i); +// } #ifdef layout_in_ram all_widgets = ""; @@ -137,7 +162,7 @@ void prsets_init() { writeFile("firmware.c.txt", readFile("configs/stepper.c.txt", 2048)); writeFile("firmware.s.txt", readFile("configs/stepper.s.txt", 2048)); } - if (value == "18") { + if (value == "18") { writeFile("firmware.c.txt", readFile("configs/servo.c.txt", 2048)); writeFile("firmware.s.txt", readFile("configs/servo.s.txt", 2048)); } @@ -203,7 +228,7 @@ void statistics() { //----------------------------------------------------------------- #ifdef ESP8266 urls += ESP.getResetReason(); - Serial.println(ESP.getResetReason()); + //Serial.println(ESP.getResetReason()); #endif #ifdef ESP32 urls += "Power on"; diff --git a/Logging.ino b/Logging.ino index 20952b76..292c47a7 100644 --- a/Logging.ino +++ b/Logging.ino @@ -1,72 +1,51 @@ //===============================================Логирование============================================================ +//logging temp1 1 10 fast Температура Датчики 2 void logging() { - - static boolean flag = true; - - String sensor_name = sCmd.next(); + String value_name = sCmd.next(); String period_min = sCmd.next(); String maxCount = sCmd.next(); - - String optimization = sCmd.next(); - String widget_name = sCmd.next(); widget_name.replace("#", " "); String page_name = sCmd.next(); String page_number = sCmd.next(); - - if (optimization == "fast") chart_data_in_solid_array = true; - if (optimization == "slow") chart_data_in_solid_array = false; - - if (sensor_name == "analog") jsonWriteStr(optionJson, "analog_logging_count", maxCount); - if (sensor_name == "level") jsonWriteStr(optionJson, "level_logging_count", maxCount); - if (sensor_name == "dallas") jsonWriteStr(optionJson, "dallas_logging_count", maxCount); - if (sensor_name == "dhtT") jsonWriteStr(optionJson, "dhtT_logging_count", maxCount); - if (sensor_name == "dhtH") jsonWriteStr(optionJson, "dhtH_logging_count", maxCount); - - if (sensor_name == "analog") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "loganalog", maxCount); - if (sensor_name == "level") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "loglevel", maxCount); - if (sensor_name == "dallas") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "logdallas", maxCount); - if (sensor_name == "dhtT") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "logdhtT", maxCount); - if (sensor_name == "dhtH") createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", "logdhtH", maxCount); - - if (sensor_name == "analog") { - flagLoggingAnalog = true; - ts.remove(ANALOG_LOG); - ts.add(ANALOG_LOG, period_min.toInt() * 1000 * 60, [&](void*) { - deleteOldDate("log.analog.txt", jsonReadtoInt(optionJson, "analog_logging_count"), jsonRead(configJson, "analog")); - }, nullptr, true); + logging_value_names_list += value_name + ","; + enter_to_logging_counter++; //считаем количество входов в эту функцию + jsonWriteStr(optionJson, value_name + "_c", maxCount); //создаем в файловой системе переменную количества точек на графике с отметкой _c что значит count + createChart (widget_name, page_name, page_number, "widgets/widget.chart.json", value_name + "_ch", maxCount); //создаем график в приложении с топиком _ch /prefix/3234045-1589487/value_name_ch + if (enter_to_logging_counter == LOG1) { + ts.add(LOG1, period_min.toInt() * 1000 * 60, [&](void*) { + String tmp_buf_1 = selectFromMarkerToMarker(logging_value_names_list, ",", 0); + deleteOldDate("log." + tmp_buf_1 + ".txt", jsonReadtoInt(optionJson, tmp_buf_1 + "_c"), jsonRead(configJson, tmp_buf_1)); + Serial.println("[i] LOGGING for sensor '" + tmp_buf_1 + "' done"); + }, nullptr, false); } - - if (sensor_name == "level") { - flagLoggingLevel = true; - ts.remove(LEVEL_LOG); - ts.add(LEVEL_LOG, period_min.toInt() * 1000 * 60, [&](void*) { - deleteOldDate("log.level.txt", jsonReadtoInt(optionJson, "level_logging_count"), jsonRead(configJson, "level")); - }, nullptr, true); + if (enter_to_logging_counter == LOG2) { + ts.add(LOG2, period_min.toInt() * 1000 * 60, [&](void*) { + String tmp_buf_2 = selectFromMarkerToMarker(logging_value_names_list, ",", 1); + deleteOldDate("log." + tmp_buf_2 + ".txt", jsonReadtoInt(optionJson, tmp_buf_2 + "_c"), jsonRead(configJson, tmp_buf_2)); + Serial.println("[i] LOGGING for sensor '" + tmp_buf_2 + "' done"); + }, nullptr, false); } - - if (sensor_name == "dallas") { - flagLoggingDallas = true; - ts.remove(DALLAS_LOG); - ts.add(DALLAS_LOG, period_min.toInt() * 1000 * 60, [&](void*) { - deleteOldDate("log.dallas.txt", jsonReadtoInt(optionJson, "dallas_logging_count"), jsonRead(configJson, "dallas")); - }, nullptr, true); + if (enter_to_logging_counter == LOG3) { + ts.add(LOG3, period_min.toInt() * 1000 * 60, [&](void*) { + String tmp_buf_3 = selectFromMarkerToMarker(logging_value_names_list, ",", 2); + deleteOldDate("log." + tmp_buf_3 + ".txt", jsonReadtoInt(optionJson, tmp_buf_3 + "_c"), jsonRead(configJson, tmp_buf_3)); + Serial.println("[i] LOGGING for sensor '" + tmp_buf_3 + "' done"); + }, nullptr, false); } - - if (sensor_name == "dhtT") { - flagLoggingdhtT = true; - ts.remove(dhtT_LOG); - ts.add(dhtT_LOG, period_min.toInt() * 1000 * 60, [&](void*) { - deleteOldDate("log.dhtT.txt", jsonReadtoInt(optionJson, "dhtT_logging_count"), jsonRead(configJson, "dhtT")); - }, nullptr, true); + if (enter_to_logging_counter == LOG4) { + ts.add(LOG4, period_min.toInt() * 1000 * 60, [&](void*) { + String tmp_buf_4 = selectFromMarkerToMarker(logging_value_names_list, ",", 3); + deleteOldDate("log." + tmp_buf_4 + ".txt", jsonReadtoInt(optionJson, tmp_buf_4 + "_c"), jsonRead(configJson, tmp_buf_4)); + Serial.println("[i] LOGGING for sensor '" + tmp_buf_4 + "' done"); + }, nullptr, false); } - - if (sensor_name == "dhtH") { - flagLoggingdhtH = true; - ts.remove(dhtH_LOG); - ts.add(dhtH_LOG, period_min.toInt() * 1000 * 60, [&](void*) { - deleteOldDate("log.dhtH.txt", jsonReadtoInt(optionJson, "dhtH_logging_count"), jsonRead(configJson, "dhtH")); - }, nullptr, true); + if (enter_to_logging_counter == LOG5) { + ts.add(LOG5, period_min.toInt() * 1000 * 60, [&](void*) { + String tmp_buf_5 = selectFromMarkerToMarker(logging_value_names_list, ",", 4); + deleteOldDate("log." + tmp_buf_5 + ".txt", jsonReadtoInt(optionJson, tmp_buf_5 + "_c"), jsonRead(configJson, tmp_buf_5)); + Serial.println("[i] LOGGING for sensor '" + tmp_buf_5 + "' done"); + }, nullptr, false); } } @@ -100,52 +79,51 @@ void deleteOldDate(String file, int seted_number_of_lines, String date_to_add) { //=========================================Выбор какие данные отправлять================================================================== void choose_log_date_and_send() { - - if (flagLoggingAnalog) sendLogData("log.analog.txt", "loganalog", chart_data_in_solid_array); - if (flagLoggingLevel) sendLogData("log.level.txt", "loglevel", chart_data_in_solid_array); - if (flagLoggingDallas) sendLogData("log.dallas.txt", "logdallas", chart_data_in_solid_array); - if (flagLoggingdhtT) sendLogData("log.dhtT.txt", "logdhtT", chart_data_in_solid_array); - if (flagLoggingdhtH) sendLogData("log.dhtH.txt", "logdhtH", chart_data_in_solid_array); + String all_line = logging_value_names_list; + while (all_line.length() != 0) { + String tmp = selectToMarker (all_line, ","); + sendLogData("log." + tmp + ".txt", tmp + "_ch"); + all_line = deleteBeforeDelimiter(all_line, ","); + } + all_line = ""; +} +//=========================================Отправка данных=================================================================================== +void sendLogData(String file, String topic) { + String log_date = readFile(file, 5000); + if (log_date != "Failed") { + log_date.replace("\r\n", "\n"); + log_date.replace("\r", "\n"); + String buf = "{}"; + String json_array; + String unix_time; + String value; + while (log_date.length() != 0) { + String tmp = selectToMarker (log_date, "\n"); + log_date = deleteBeforeDelimiter(log_date, "\n"); + unix_time = selectToMarker (tmp, " "); + jsonWriteInt(buf, "x", unix_time.toInt()); + value = deleteBeforeDelimiter(tmp, " "); + jsonWriteFloat(buf, "y1", value.toFloat()); + if (log_date.length() < 3) { + json_array += buf; + } else { + json_array += buf + ","; + } + buf = "{}"; + } + unix_time = ""; + value = ""; + log_date = ""; + json_array = "{\"status\":[" + json_array + "]}"; + Serial.println(json_array); + sendCHART(topic, json_array); + json_array = ""; + getMemoryLoad("[i] after send log date"); + } } -//=========================================Отправка данных=================================================================================== -void sendLogData(String file, String topic, boolean type) { - if (type) { - //---------------------------------------------- - String log_date = readFile(file, 5000); - if (log_date != "Failed") { - log_date.replace("\r\n", "\n"); - log_date.replace("\r", "\n"); - String buf = "{}"; - String json_array; - String unix_time; - String value; - while (log_date.length() != 0) { - String tmp = selectToMarker (log_date, "\n"); - log_date = deleteBeforeDelimiter(log_date, "\n"); - unix_time = selectToMarker (tmp, " "); - jsonWriteInt(buf, "x", unix_time.toInt()); - value = deleteBeforeDelimiter(tmp, " "); - jsonWriteFloat(buf, "y1", value.toFloat()); - if (log_date.length() < 3) { - json_array += buf; - } else { - json_array += buf + ","; - } - buf = "{}"; - } - unix_time = ""; - value = ""; - log_date = ""; - json_array = "{\"status\":[" + json_array + "]}"; - Serial.println(json_array); - sendCHART(topic, json_array); - json_array = ""; - getMemoryLoad("[i] after send log date"); - } - //---------------------------------------------- - } else { - //---------------------------------------------- +/* + //---------------------------------------------- File configFile = SPIFFS.open("/" + file, "r"); if (!configFile) { return; @@ -160,14 +138,14 @@ void sendLogData(String file, String topic, boolean type) { sendCHART(topic, final_line); } getMemoryLoad("[i] after send log date"); - } - //---------------------------------------------- -} +*/ //=========================================Очистка данных=================================================================================== void clean_log_date() { - SPIFFS.remove("/log.analog.txt"); - SPIFFS.remove("/log.level.txt"); - SPIFFS.remove("/log.dallas.txt"); - SPIFFS.remove("/log.dhtT.txt"); - SPIFFS.remove("/log.dhtH.txt"); + String all_line = logging_value_names_list; + while (all_line.length() != 0) { + String tmp = selectToMarker (all_line, ","); + SPIFFS.remove("/log." + tmp + ".txt"); + all_line = deleteBeforeDelimiter(all_line, ","); + } + all_line = ""; } diff --git a/Scenario.ino b/Scenario.ino index 67b422f4..d9cb8755 100644 --- a/Scenario.ino +++ b/Scenario.ino @@ -17,10 +17,6 @@ void handleScenario() { //Serial.println(i); String condition = selectToMarker (tmp, "\n"); //выделяем первую строку самого сценария button1 = 1 (условие) String param_name = selectFromMarkerToMarker(condition, " " , 0); - param_name = add_set(param_name); //из первой страки берем имя параметра button1 и вставляем в него Set и получаем buttonSet1 - if (param_name.indexOf("timenow") != -1){ - param_name = param_name + "Set"; - } String order = jsonRead(optionJson, "scenario_status"); //читаем весь файл событий String param = selectToMarker (order, ","); //читаем первое событие из файла событий if (param_name == param) { //если поступившее событие равно событию заданному buttonSet1 в файле начинаем его обработку @@ -28,11 +24,11 @@ void handleScenario() { String sign = selectFromMarkerToMarker(condition, " " , 1); //читаем знак (=) String value = selectFromMarkerToMarker(condition, " " , 2); //читаем значение (1) if (value.indexOf("digit") != -1) { - value = add_set(value); + // value = add_set(value); value = jsonRead(configJson, value); } if (value.indexOf("time") != -1) { - value = add_set(value); + // value = add_set(value); value = jsonRead(configJson, value); } boolean flag = false; //если одно из значений совпало то только тогда начинаем выполнять комнады diff --git a/Sensors.ino b/Sensors.ino index 8e50a288..4519501f 100644 --- a/Sensors.ino +++ b/Sensors.ino @@ -1,6 +1,90 @@ -//=============================================================================================================================== -//=========================================Модуль аналогового сенсора============================================================ +void sensors_init() { + ts.add(SENSORS, 1000, [&](void*) { + static int counter; + counter++; + + if (sensors_reading_map[0] == 1) level_reading(); + + if (counter > 10) { + counter = 0; + + if (sensors_reading_map[1] == 1) analog_reading1(); + if (sensors_reading_map[2] == 1) analog_reading2(); + + if (sensors_reading_map[3] == 1) dallas_reading(); + + 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(); + + if (sensors_reading_map[9] == 1) bmp280T_rading(); + if (sensors_reading_map[10] == 1) bmp280P_reading(); + + if (sensors_reading_map[11] == 1) bme280T_reading(); + } + }, nullptr, true); +} + +//========================================================================================================================================= +//=========================================Модуль измерения уровня в баке================================================================== + +//level L 14 12 Вода#в#баке,#% Датчики fill-gauge 125 20 1 +void level() { + 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(); + level_value_name = value_name; + jsonWriteStr(optionJson, "e_lev", empty_level); + jsonWriteStr(optionJson, "f_lev", full_level); + jsonWriteStr(optionJson, "trig", trig); + jsonWriteStr(optionJson, "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; +} + +void level_reading() { + long duration_; + int distance_cm; + int level; + static int counter; + int trig = jsonReadtoInt(optionJson, "trig"); + int echo = jsonReadtoInt(optionJson, "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_times_to_send) { + counter = 0; + level = map(distance_cm, + jsonReadtoInt(optionJson, "e_lev"), + jsonReadtoInt(optionJson, "f_lev"), 0, 100); + jsonWriteInt(configJson, level_value_name, level); + eventGen (level_value_name, ""); + sendSTATUS(level_value_name, String(level)); + Serial.println("[i] sensor '" + level_value_name + "' data: " + String(level)); + } +} + +//========================================================================================================================================= +//=========================================Модуль аналогового сенсора====================================================================== +//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(); @@ -10,90 +94,65 @@ void analog() { String analog_start_out = sCmd.next(); String analog_end_out = sCmd.next(); String page_number = sCmd.next(); - jsonWriteStr(optionJson, "analog_start", analog_start); - jsonWriteStr(optionJson, "analog_end", analog_end); - jsonWriteStr(optionJson, "analog_start_out", analog_start_out); - jsonWriteStr(optionJson, "analog_end_out", analog_end_out); - choose_widget_and_create(widget_name, page_name, page_number, type, "analog"); - ts.add(ANALOG_, analog_update_int, [&](void*) { - static int analog_old; + analog_value_names_list += value_name + ","; + enter_to_analog_counter++; + jsonWriteStr(optionJson, value_name + "_st", analog_start); + jsonWriteStr(optionJson, value_name + "_end", analog_end); + jsonWriteStr(optionJson, value_name + "_st_out", analog_start_out); + jsonWriteStr(optionJson, value_name + "_end_out", analog_end_out); + choose_widget_and_create(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 pin_int = pin.toInt(); - int analog_in = analogRead(34); + int analog_in = analogRead(34); #endif #ifdef ESP8266 - int analog_in = analogRead(A0); + int analog_in = analogRead(A0); #endif - jsonWriteInt(configJson, "analog_in", analog_in); - int analog = map(analog_in, - jsonReadtoInt(optionJson, "analog_start") , - jsonReadtoInt(optionJson, "analog_end"), - jsonReadtoInt(optionJson, "analog_start_out"), - jsonReadtoInt(optionJson, "analog_end_out")); - jsonWriteInt(configJson, "analog", analog); - // if (analog_old != analog) { - eventGen ("analog", ""); - sendSTATUS("analog", String(analog)); - if (client.connected()) { - Serial.println("[i] sensor 'analog' send date " + String(analog)); - } - // } - analog_old = analog; - }, nullptr, true); + int analog = map(analog_in, + jsonReadtoInt(optionJson, value_name + "_st") , + jsonReadtoInt(optionJson, value_name + "_end"), + jsonReadtoInt(optionJson, value_name + "_st_out"), + jsonReadtoInt(optionJson, value_name + "_end_out")); + jsonWriteInt(configJson, value_name, analog); + eventGen (value_name, ""); + sendSTATUS(value_name, String(analog)); + Serial.println("[i] sensor '" + value_name + "' data: " + String(analog)); } -//=================================================================================================================================== -//=========================================Модуль измерения уровня в баке============================================================ -void level() { - 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(); - jsonWriteStr(optionJson, "empty_level", empty_level); - jsonWriteStr(optionJson, "full_level", full_level); - pinMode(14, OUTPUT); - pinMode(12, INPUT); - choose_widget_and_create(widget_name, page_name, page_number, type, "level"); - ts.add(LEVEL, tank_level_shooting_interval, [&](void*) { - long duration_; - int distance_cm; - int level; - static int level_old; //переменная static сохраняет свое значение между вызовами функции - static int counter; - digitalWrite(14, LOW); - delayMicroseconds(2); - digitalWrite(14, HIGH); - delayMicroseconds(10); - digitalWrite(14, LOW); - duration_ = pulseIn(12, 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_times_to_send) { - counter = 0; - jsonWriteInt(configJson, "level_in", distance_cm); - level = map(distance_cm, - jsonReadtoInt(optionJson, "empty_level"), - jsonReadtoInt(optionJson, "full_level"), 0, 100); - jsonWriteInt(configJson, "level", level); - //if (level_old != level) { - eventGen ("level", ""); - sendSTATUS("level", String(level)); - if (client.connected()) { - Serial.println("[i] sensor tank 'level' send date " + String(level)); - } - //} - level_old = level; - } - }, nullptr, true); +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, + jsonReadtoInt(optionJson, value_name + "_st") , + jsonReadtoInt(optionJson, value_name + "_end"), + jsonReadtoInt(optionJson, value_name + "_st_out"), + jsonReadtoInt(optionJson, value_name + "_end_out")); + jsonWriteInt(configJson, value_name, analog); + eventGen (value_name, ""); + sendSTATUS(value_name, String(analog)); + Serial.println("[i] sensor '" + value_name + "' data: " + String(analog)); } -//========================================================================================================================================== -//=========================================Модуль температурного сенсора ds18b20============================================================ +//========================================================================================================================================= +//=========================================Модуль температурного сенсора ds18b20=========================================================== void dallas() { + String value_name = sCmd.next(); String pin = sCmd.next(); + String address = sCmd.next(); String widget_name = sCmd.next(); String page_name = sCmd.next(); String type = sCmd.next(); @@ -103,125 +162,120 @@ void dallas() { sensors.begin(); sensors.setResolution(12); choose_widget_and_create(widget_name, page_name, page_number, type, "dallas"); - ts.add(DALLAS, temp_update_int, [&](void*) { - float temp = 0; - static float temp_old; - sensors.requestTemperatures(); - temp = sensors.getTempCByIndex(0); - jsonWriteStr(configJson, "dallas", String(temp)); - //if (temp_old != temp) { - eventGen ("dallas", ""); - sendSTATUS("dallas", String(temp)); - if (client.connected()) { - Serial.println("[i] sensor 'dallas' send date " + String(temp)); - } - //} - temp_old = temp; - }, nullptr, true); + sensors_reading_map[3] = 1; } +void dallas_reading() { + float temp = 0; + sensors.requestTemperatures(); + temp = sensors.getTempCByIndex(0); + jsonWriteStr(configJson, "dallas", String(temp)); + eventGen ("dallas", ""); + sendSTATUS("dallas", String(temp)); + Serial.println("[i] sensor 'dallas' send date " + String(temp)); +} -//====================================================================================================================== -//=========================================Модуль сенсоров DHT========================================================== +//========================================================================================================================================= +//=========================================Модуль сенсоров DHT============================================================================= +//dhtT t 2 dht11 Температура#DHT,#t°C Датчики any-data 1 void dhtT() { - String sensor_type = sCmd.next(); + 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(); - if (sensor_type == "DHT11") { + dhtT_value_name = value_name; + if (sensor_type == "dht11") { dht.setup(pin.toInt(), DHTesp::DHT11); } - if (sensor_type == "DHT22") { + if (sensor_type == "dht22") { dht.setup(pin.toInt(), DHTesp::DHT22); } - choose_widget_and_create(widget_name, page_name, page_number, type, "dhtT"); - ts.add(DHTT, dhtT_update_int, [&](void*) { //dht.getMinimumSamplingPeriod() - float value = 0; - static float value_old; - static int counter; - if (dht.getStatus() != 0 && counter < 5) { - sendSTATUS("dhtT", String(dht.getStatusString())); - counter++; - } else { - counter = 0; - value = dht.getTemperature(); - //if (value_old != value) { - if (String(value) != "nan") { - eventGen ("dhtT", ""); - jsonWriteStr(configJson, "dhtT", String(value)); - sendSTATUS("dhtT", String(value)); - if (client.connected()) { - Serial.println("[i] sensor 'dhtT' send date " + String(value)); - } - //} - } - value_old = value; - } - }, nullptr, true); + choose_widget_and_create(widget_name, page_name, page_number, type, value_name); + sensors_reading_map[4] = 1; } +void dhtT_reading() { + float value = 0; + static int counter; + if (dht.getStatus() != 0 && counter < 5) { + sendSTATUS(dhtT_value_name, String(dht.getStatusString())); + counter++; + } else { + counter = 0; + value = dht.getTemperature(); + if (String(value) != "nan") { + eventGen (dhtT_value_name, ""); + jsonWriteStr(configJson, dhtT_value_name, String(value)); + sendSTATUS(dhtT_value_name, String(value)); + Serial.println("[i] sensor '" + dhtT_value_name + "' data: " + String(value)); + } + } +} +//dhtH h 2 dht11 Влажность#DHT,#t°C Датчики any-data 1 void dhtH() { - String sensor_type = sCmd.next(); + 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(); - if (sensor_type == "DHT11") { + dhtH_value_name = value_name; + if (sensor_type == "dht11") { dht.setup(pin.toInt(), DHTesp::DHT11); } - if (sensor_type == "DHT22") { + if (sensor_type == "dht22") { dht.setup(pin.toInt(), DHTesp::DHT22); } - choose_widget_and_create(widget_name, page_name, page_number, type, "dhtH"); - ts.add(DHTH, dhtH_update_int , [&](void*) { //dht.getMinimumSamplingPeriod() - int value = 0; - static int value_old; - static int counter; - if (dht.getStatus() != 0 && counter < 5) { - sendSTATUS("dhtH", String(dht.getStatusString())); - counter++; - } else { - counter = 0; - value = dht.getHumidity(); - if (String(value) != "nan" || value <= 100 || value >= 0) { - //if (value_old != value) { - eventGen ("dhtH", ""); - jsonWriteStr(configJson, "dhtH", String(value)); - sendSTATUS("dhtH", String(value)); - if (client.connected()) { - Serial.println("[i] sensor 'dhtH' send date " + String(value)); - } - //} - } - value_old = value; - } - }, nullptr, true); + choose_widget_and_create(widget_name, page_name, page_number, type, value_name); + sensors_reading_map[5] = 1; } -void dhtPerception() { +void dhtH_reading() { + float value = 0; + static int counter; + if (dht.getStatus() != 0 && counter < 5) { + sendSTATUS(dhtH_value_name, String(dht.getStatusString())); + counter++; + } else { + counter = 0; + value = dht.getHumidity(); + if (String(value) != "nan") { + eventGen (dhtH_value_name, ""); + jsonWriteStr(configJson, dhtH_value_name, String(value)); + sendSTATUS(dhtH_value_name, String(value)); + Serial.println("[i] sensor '" + dhtH_value_name + "' data: " + String(value)); + } + } +} + +//dhtPerception Восприятие: Датчики 4 +void dhtP() { 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"); - ts.add(DHTP, dht_calculation_update_int, [&](void*) { - byte value; - if (dht.getStatus() != 0) { - sendSTATUS("dhtPerception", String(dht.getStatusString())); - } else { - value = dht.computePerception(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false); - String final_line = perception(value); - jsonWriteStr(configJson, "dhtPerception", final_line); - eventGen ("dhtPerception", ""); - sendSTATUS("dhtPerception", final_line); - if (client.connected()) { - Serial.println("[i] sensor 'dhtPerception' send date " + final_line); - } + sensors_reading_map[6] = 1; +} + +void dhtP_reading() { + byte value; + if (dht.getStatus() != 0) { + sendSTATUS("dhtPerception", String(dht.getStatusString())); + } else { + value = dht.computePerception(jsonRead(configJson, dhtT_value_name).toFloat(), jsonRead(configJson, dhtH_value_name).toFloat(), false); + String final_line = perception(value); + jsonWriteStr(configJson, "dhtPerception", final_line); + eventGen ("dhtPerception", ""); + sendSTATUS("dhtPerception", final_line); + if (client_mqtt.connected()) { + Serial.println("[i] sensor 'dhtPerception' data: " + final_line); } - }, nullptr, true); + } } String perception(byte value) { @@ -235,89 +289,183 @@ String perception(byte value) { if (value == 7) return "Сильно неудобно, полный звиздец"; } -void dhtComfort() { +//dhtComfort Степень#комфорта: Датчики 3 +void dhtC() { 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"); - ts.add(DHTC, dht_calculation_update_int, [&](void*) { - float value; - ComfortState cf; - if (dht.getStatus() != 0) { - sendSTATUS("dhtComfort", String(dht.getStatusString())); - } else { - value = dht.getComfortRatio(cf, jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false); - String comfortStatus; - 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; - }; - String final_line = comfortStatus; - jsonWriteStr(configJson, "dhtComfort", final_line); - eventGen ("dhtComfort", ""); - sendSTATUS("dhtComfort", final_line); - if (client.connected()) { - Serial.println("[i] sensor 'dhtComfort' send date " + final_line); - } - } - }, nullptr, true); + sensors_reading_map[7] = 1; } -void dhtDewpoint() { +void dhtC_reading() { + float value; + ComfortState cf; + if (dht.getStatus() != 0) { + sendSTATUS("dhtComfort", String(dht.getStatusString())); + } else { + value = dht.getComfortRatio(cf, jsonRead(configJson, dhtT_value_name).toFloat(), jsonRead(configJson, dhtH_value_name).toFloat(), false); + String final_line = get_comfort_status(cf); + jsonWriteStr(configJson, "dhtComfort", final_line); + eventGen ("dhtComfort", ""); + sendSTATUS("dhtComfort", final_line); + Serial.println("[i] sensor 'dhtComfort' send date " + final_line); + } +} + +String get_comfort_status(ComfortState cf) { + String comfortStatus; + 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; + }; + return comfortStatus; +} + + +//dhtDewpoint Точка#росы: Датчики 5 +void dhtD() { 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"); - ts.add(DHTD, dht_calculation_update_int, [&](void*) { - float value; - if (dht.getStatus() != 0) { - sendSTATUS("dhtDewpoint", String(dht.getStatusString())); - } else { - value = dht.computeDewPoint(jsonRead(configJson, "dhtT").toFloat(), jsonRead(configJson, "dhtH").toFloat(), false); - jsonWriteInt(configJson, "dhtDewpoint", value); - eventGen ("dhtDewpoint", ""); - sendSTATUS("dhtDewpoint", String(value)); - if (client.connected()) { - Serial.println("[i] sensor 'dhtDewpoint' send date " + String(value)); - } - } - }, nullptr, true); + sensors_reading_map[8] = 1; } - -void choose_widget_and_create(String widget_name, String page_name, String page_number, String type, String topik) { - - if (type == "any-data") createWidget (widget_name, page_name, page_number, "widgets/widget.anyData.json", topik); - if (type == "progress-line") createWidget (widget_name, page_name, page_number, "widgets/widget.progLine.json", topik); - if (type == "progress-round") createWidget (widget_name, page_name, page_number, "widgets/widget.progRound.json", topik); - if (type == "fill-gauge") createWidget (widget_name, page_name, page_number, "widgets/widget.fillGauge.json", topik); - +void dhtD_reading() { + float value; + if (dht.getStatus() != 0) { + sendSTATUS("dhtDewpoint", String(dht.getStatusString())); + } else { + value = dht.computeDewPoint(jsonRead(configJson, dhtT_value_name).toFloat(), jsonRead(configJson, dhtH_value_name).toFloat(), false); + jsonWriteInt(configJson, "dhtDewpoint", value); + eventGen ("dhtDewpoint", ""); + sendSTATUS("dhtDewpoint", String(value)); + Serial.println("[i] sensor 'dhtDewpoint' data: " + String(value)); + } } + +//========================================================================================================================================= +//=========================================Модуль сенсоров bmp280========================================================================== +//bmp280T temp1 0x76 Температура#bmp280 Датчики any-data 1 +void bmp280T() { + 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; +} + +void bmp280T_rading() { + float value = 0; + sensors_event_t temp_event, pressure_event; + bmp_temp->getEvent(&temp_event); + value = temp_event.temperature; + jsonWriteStr(configJson, bmp280T_value_name, String(value)); + eventGen(bmp280T_value_name, ""); + sendSTATUS(bmp280T_value_name, String(value)); + Serial.println("[i] sensor '" + bmp280T_value_name + "' data: " + String(value)); +} + +//bmp280P press1 0x76 Давление#bmp280 Датчики any-data 2 +void bmp280P() { + 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; +} + +void bmp280P_reading() { + float value = 0; + sensors_event_t temp_event, pressure_event; + bmp_pressure->getEvent(&pressure_event); + value = pressure_event.pressure; + value = value / 1.333224; + jsonWriteStr(configJson, bmp280P_value_name, String(value)); + eventGen(bmp280P_value_name, ""); + sendSTATUS(bmp280P_value_name, String(value)); + Serial.println("[i] sensor '" + bmp280P_value_name + "' data: " + String(value)); +} + +//========================================================================================================================================= +//=============================================Модуль сенсоров bme280====================================================================== +//bme280T temp1 0x76 Температура#bmp280 Датчики any-data 1 +void bme280T() { + 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; +} + +void bme280T_reading() { + float value = 0; + value = bme.readTemperature(); + jsonWriteStr(configJson, bme280T_value_name, String(value)); + eventGen(bme280T_value_name, ""); + sendSTATUS(bme280T_value_name, String(value)); + Serial.println("[i] sensor '" + bme280T_value_name + "' data: " + String(value)); +} + +//bme.readPressure() / 100.0F + +//#define SEALEVELPRESSURE_HPA (1013.25) +//bme.readAltitude(SEALEVELPRESSURE_HPA) + +//bme.readHumidity() diff --git a/Time.ino b/Time.ino index 75e23c88..2eab1b07 100644 --- a/Time.ino +++ b/Time.ino @@ -1,24 +1,33 @@ void Time_Init() { - server.on("/timeZone", HTTP_GET, [](AsyncWebServerRequest * request) { + server.on("/time", HTTP_GET, [](AsyncWebServerRequest * request) { if (request->hasArg("timezone")) { jsonWriteStr(configSetup, "timezone", request->getParam("timezone")->value()); } + if (request->hasArg("ntp")) { + jsonWriteStr(configSetup, "ntp", request->getParam("ntp")->value()); + } saveConfig(); reconfigTime(); request->send(200, "text/text", "OK"); // отправляем ответ о выполнении }); + ts.add(TIME_SYNC, 30000, [&](void*) { - if (GetTimeUnix() == "failed") { - Serial.println("[i] Time is not synchronized, start synchronization"); - reconfigTime(); - } + time_check(); }, nullptr, true); } +void time_check() { + if (GetTimeUnix() == "failed") { + Serial.println("[i] Time is not synchronized, start synchronization"); + reconfigTime(); + } +} + void reconfigTime() { if (WiFi.status() == WL_CONNECTED) { - configTime(0, 0, ntpServer); + String ntp = jsonRead(configSetup, "ntp"); + configTime(0, 0, ntp.c_str()); int i = 0; Serial.println("[i] Awaiting for time "); #ifdef ESP32 @@ -126,7 +135,7 @@ String GetDataDigital() { return out; } -int timeToMin(String Time) { +int timeToMin(String Time) { //"00:00:00" время в секунды long min = selectToMarker(Time, ":").toInt() * 60; //общее количество секунд в полных часах Time = deleteBeforeDelimiter (Time, ":"); // Теперь здесь минуты секунды diff --git a/Timers.ino b/Timers.ino index ea86117c..70f8ff21 100644 --- a/Timers.ino +++ b/Timers.ino @@ -1,80 +1,58 @@ //================================================================================================================ -//=========================================Таймера================================================================= +//=========================================Таймеры================================================================= void Timer_countdown_init() { - + ts.add(TIMER_COUNTDOWN, 1000, [&](void*) { - + String old_line = jsonRead(optionJson, "timers"); - - if (old_line != "") { - //Serial.println(old_line); - int i = 0; - do { - String timer = selectFromMarkerToMarker(old_line, "," , i); - // Serial.print("timer no " + String (i) + ": "); - // Serial.println(timer); + Serial.print("timer no " + String (i) + ": "); + Serial.println(timer); if (timer == "not found" || timer == "") return; int number = selectToMarker (timer, ":").toInt(); int time = readTimer(number); if (time == 0) { - delTimer (String (number)); - - jsonWriteStr(configJson, "timerSet" + String(number), "0"); - - eventGen ("timerSet", String(number)); - + jsonWriteStr(configJson, "timer" + String(number), "0"); + eventGen ("timer", String(number)); } else { time--; addTimer(String (number), String (time)); } i++; } while (i <= 9); - } }, nullptr, true); } - - void timerStart() { - String number = sCmd.next(); String period_of_time = sCmd.next(); String type = sCmd.next(); - if (period_of_time.indexOf("digit") != -1) { - period_of_time = add_set(period_of_time); + //period_of_time = add_set(period_of_time); period_of_time = jsonRead(configJson, period_of_time); } - if (type == "sec") period_of_time = period_of_time; if (type == "min") period_of_time = String(period_of_time.toInt() * 60); if (type == "hours") period_of_time = String(period_of_time.toInt() * 60 * 60); - addTimer(number, period_of_time); - jsonWriteStr(configJson, "timerSet" + number, "1"); + jsonWriteStr(configJson, "timer" + number, "1"); } void addTimer(String number, String time) { - String tmp = jsonRead(optionJson, "timers"); //1:60,2:120, String new_timer = number + ":" + time; int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо заменить - if (psn1 != -1) { //если он есть - int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой - String timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо заменить ///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке) tmp.replace(timer + ",", ""); tmp += new_timer + ","; - } else { //если его нет tmp += new_timer + ","; } @@ -82,18 +60,14 @@ void addTimer(String number, String time) { //Serial.println("ura"); } - void timerStop() { - String number = sCmd.next(); delTimer(number); - } -void delTimer (String number) { +void delTimer (String number) { String tmp = jsonRead(optionJson, "timers"); //1:60,2:120, int psn1 = tmp.indexOf(number + ":"); //0 ищем позицию таймера который надо удалить - if (psn1 != -1) { //если он есть int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой String timer = tmp.substring(psn1, psn2) + ","; //1:60, выделяем таймер который надо удалить @@ -103,13 +77,9 @@ void delTimer (String number) { } int readTimer(int number) { - String tmp = jsonRead(optionJson, "timers"); //1:60,2:120, - int psn1 = tmp.indexOf(String(number) + ":"); //0 ищем позицию таймера который надо прочитать - String timer; - if (psn1 != -1) { //если он есть int psn2 = tmp.indexOf(",", psn1); //4 от этой позиции находим позицию запятой timer = tmp.substring(psn1, psn2); //1:60 выделяем таймер который надо прочитать @@ -117,72 +87,3 @@ int readTimer(int number) { } return timer.toInt(); } - -/*void timer() { - - String seted_time = sCmd.next(); - String order = sCmd.next(); - order.replace("_", " "); - if (seted_time == current_time) { - - order_loop += order + ","; - - } -}*/ - -//------------------------------таймеры------------------------------------------------------ - -/* -void time() { - - String time_number = sCmd.next(); - String time = sCmd.next(); - - String time_to_add = time_number + "-" + time; - - String replace_line = jsonRead(optionJson, "times") ; - int psn1 = replace_line.indexOf(time_number + "-") ; //ищем позицию времени которое надо заменить - - if (psn1 != -1) { //если оно есть - - int psn2 = replace_line.indexOf(",", psn1); //от этой позиции находим позицию запятой - - String timer = replace_line.substring(psn1, psn2); //выделяем таймер который надо заменить - ///tmp.replace(timer, new_timer); //заменяем таймер на новый (во всей стороке) - replace_line.replace(timer + ",", ""); - replace_line += time_to_add + ","; - - } else { //если его нет - replace_line += time_to_add + ","; - } - - - jsonWriteStr(optionJson, "times", replace_line); - - jsonWriteStr(configJson, "timeSet" + time_number, "1"); - - ts.add(TIMERS, 1000, [&](void*) { - - current_time = GetTime(); - Serial.println(current_time); - - String seted_times = jsonRead(optionJson, "times"); - - while (seted_times.length() != 0) { - String tmp = selectToMarker (seted_times, ","); - - String time_number = selectToMarker(tmp, "-"); - String seted_time = deleteBeforeDelimiter(tmp, "-"); - - Serial.println(seted_time); - - if (current_time == seted_time) { - jsonWriteStr(configJson, "timeSet" + time_number, "0"); - eventGen ("timeSet", time_number); - } - - seted_times = deleteBeforeDelimiter(seted_times, ","); - } - }, nullptr, true); -} -*/ diff --git a/WiFi.ino b/WiFi.ino index 622f748c..b1aa2de8 100644 --- a/WiFi.ino +++ b/WiFi.ino @@ -117,8 +117,9 @@ bool StartAPMode() { Serial.println("->try find router"); if (RouterFind(jsonRead(configSetup, "ssid"))) { ts.remove(ROUTER_SEARCHING); + WiFi.scanDelete(); ROUTER_Connecting(); - MQTT_Connecting(); + MQTT_init(); } }, nullptr, true); } diff --git a/Widgets.ino b/Widgets.ino index 303b7fb1..63320300 100644 --- a/Widgets.ino +++ b/Widgets.ino @@ -77,3 +77,12 @@ void createChart (String widget_name, String page_name, String page_number, Str #endif widget = ""; } + +void choose_widget_and_create(String widget_name, String page_name, String page_number, String type, String topik) { + + if (type == "any-data") createWidget (widget_name, page_name, page_number, "widgets/widget.anyData.json", topik); + if (type == "progress-line") createWidget (widget_name, page_name, page_number, "widgets/widget.progLine.json", topik); + if (type == "progress-round") createWidget (widget_name, page_name, page_number, "widgets/widget.progRound.json", topik); + if (type == "fill-gauge") createWidget (widget_name, page_name, page_number, "widgets/widget.fillGauge.json", topik); + +} diff --git a/bus.ino b/bus.ino new file mode 100644 index 00000000..17486aab --- /dev/null +++ b/bus.ino @@ -0,0 +1,33 @@ +void do_i2c_scanning() { + if (i2c_scanning) { + i2c_scanning = false; + String tmp = i2c_scan(); + if (tmp == "error") { + tmp = i2c_scan(); + Serial.println(tmp); + jsonWriteStr(configJson, "i2c", tmp); + } else { + Serial.println(tmp); + jsonWriteStr(configJson, "i2c", tmp); + } + } +} + +String i2c_scan() { + String out; + byte count = 0; + Wire.begin(); + for (byte i = 8; i < 120; i++) { + Wire.beginTransmission(i); + if (Wire.endTransmission() == 0) { + count++; + out += String(count) + ". 0x" + String(i, HEX) + "; "; + delay(1); + } + } + if (count == 0) { + return "error"; + } else { + return out; + } +} diff --git a/data/config.json b/data/config.json index 671fcda7..180bdcd3 100644 --- a/data/config.json +++ b/data/config.json @@ -1,11 +1,12 @@ { "name": "IoTmanager", "chipID": "", - "ssidAP": "WiFi", + "ssidAP": "WiFi2", "passwordAP": "", "ssid": "rise", "password": "hostel3333", "timezone": 2, + "ntp": "pool.ntp.org", "mqttServer": "91.204.228.124", "mqttPort": 1883, "mqttPrefix": "/rise", diff --git a/data/configs/analog.c.txt b/data/configs/analog.c.txt index e6f7b16f..429ccada 100644 --- a/data/configs/analog.c.txt +++ b/data/configs/analog.c.txt @@ -1,5 +1,5 @@ -analog 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1 -logging analog 5 100 fast Аналоговый#вход Датчики 2 +analog adc 0 Аналоговый#вход,#% Датчики progress-round 310 620 1 100 1 +logging adc 5 100 Аналоговый#вход Датчики 2 //если датчик углекислого газа выдает напряжение от 1 вольта до 2 вольт, то значит //значение чтения аналогового входа будут примерно равным diff --git a/data/configs/dht11.c.txt b/data/configs/dht11.c.txt index 7efec51b..ce8ec1a8 100644 --- a/data/configs/dht11.c.txt +++ b/data/configs/dht11.c.txt @@ -1,10 +1,7 @@ -dhtT DHT11 2 Температура#DHT,#t°C Датчики any-data 1 -dhtH DHT11 2 Влажность#DHT,#% Датчики any-data 2 +dhtT t 2 dht11 Температура#DHT,#t°C Датчики any-data 1 +dhtH h 2 dht11 Влажность#DHT,#t°C Датчики any-data 2 dhtComfort Степень#комфорта: Датчики 3 dhtPerception Восприятие: Датчики 4 dhtDewpoint Точка#росы: Датчики 5 -logging dhtT 5 50 fast Температура Датчики 6 -logging dhtH 5 50 fast Влажность Датчики 7 - -//2 - номер пина датчика -//варианты отображения: any-data, progress-round, progress-line, fill-gauge \ No newline at end of file +logging t 1 50 Температура Датчики 6 +logging h 1 50 Влажность Датчики 7 \ No newline at end of file diff --git a/data/configs/dht22.c.txt b/data/configs/dht22.c.txt index d38fa8cc..a0124e41 100644 --- a/data/configs/dht22.c.txt +++ b/data/configs/dht22.c.txt @@ -1,10 +1,7 @@ -dhtT DHT22 2 Температура#DHT,#t°C Датчики any-data 1 -dhtH DHT22 2 Влажность#DHT,#% Датчики any-data 2 +dhtT t 2 dht22 Температура#DHT,#t°C Датчики any-data 1 +dhtH h 2 dht22 Влажность#DHT,#t°C Датчики any-data 2 dhtComfort Степень#комфорта: Датчики 3 dhtPerception Восприятие: Датчики 4 dhtDewpoint Точка#росы: Датчики 5 -logging dhtT 5 50 fast Температура Датчики 6 -logging dhtH 5 50 fast Влажность Датчики 7 - -//2 - номер пина датчика -//варианты отображения: any-data, progress-round, progress-line, fill-gauge \ No newline at end of file +logging t 1 50 Температура Датчики 6 +logging h 1 50 Влажность Датчики 7 \ No newline at end of file diff --git a/data/configs/firmware.c.txt b/data/configs/firmware.c.txt index ba13d5b1..99beb0be 100644 --- a/data/configs/firmware.c.txt +++ b/data/configs/firmware.c.txt @@ -3,12 +3,10 @@ button 2 13 Прихожая Реле 0 2 button 3 14 Кухня Реле 0 3 pwm 1 3 Яркость#коредор: Реле 1023 4 pwm 2 4 Яркость#ванная: Реле 510 5 -analog 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6 -logging analog 1 100 fast Аналоговый#вход Датчики 7 +analog adc 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6 +logging adc 1 100 Аналоговый#вход Датчики 7 //Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев //Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2 //Так же продемонстрированна система логгирования данных строкой logging -//1 - это интервал между точками в минутах, 100 это количество точек -//slow или fast это два варианта выгрузки графика, slow более экономичный режим -//больше подходит для esp8266 \ No newline at end of file +//1 - это интервал между точками в минутах, 100 это количество точек \ No newline at end of file diff --git a/data/configs/firmware.s.txt b/data/configs/firmware.s.txt index ba8317ca..4927ac1e 100644 --- a/data/configs/firmware.s.txt +++ b/data/configs/firmware.s.txt @@ -7,4 +7,7 @@ button1 = 0 buttonSet 2 0 buttonSet 3 0 pwmSet 2 0 +end +adc > 50 +buttonSet 2 1 end \ No newline at end of file diff --git a/data/configs/level.c.txt b/data/configs/level.c.txt index 6669d8ab..619af218 100644 --- a/data/configs/level.c.txt +++ b/data/configs/level.c.txt @@ -1,9 +1,9 @@ -level Вода#в#баке,#% Датчики fill-gauge 125 20 1 +level lev 14 12 Вода#в#баке,#% Датчики fill-gauge 125 20 1 inputDigit digit1 При#скольки#выключить? Датчики 95 2 inputDigit digit2 При#скольки#включить? Датчики 10 3 button 1 5 Насос Датчики 0 4 button 2 line1,line2, Автоматический#режим Датчики 1 5 -logging level 1 100 fast Вода#в#баке Датчики 6 +logging lev 1 100 Вода#в#баке Датчики 6 //125 - это расстояние от датчика до дна бака в сантиметрах //20 - это расстояние от датчика до поверхности воды когда бак полный в сантиметрах diff --git a/data/configs/level.s.txt b/data/configs/level.s.txt index 5950baaa..12f881be 100644 --- a/data/configs/level.s.txt +++ b/data/configs/level.s.txt @@ -1,6 +1,6 @@ -level > digit1 +lev > digit1 buttonSet 1 0 end -level < digit2 +lev < digit2 buttonSet 1 1 end \ No newline at end of file diff --git a/data/configuration.json b/data/configuration.json index a9bae768..fb4381dd 100644 --- a/data/configuration.json +++ b/data/configuration.json @@ -23,6 +23,10 @@ "type": "h4", "title": "Uptime: {{uptime}}" }, + { + "type": "h4", + "title": "Time: {{time}}" + }, { "type": "hr" }, diff --git a/data/firmware.c.txt b/data/firmware.c.txt index ba13d5b1..99beb0be 100644 --- a/data/firmware.c.txt +++ b/data/firmware.c.txt @@ -3,12 +3,10 @@ button 2 13 Прихожая Реле 0 2 button 3 14 Кухня Реле 0 3 pwm 1 3 Яркость#коредор: Реле 1023 4 pwm 2 4 Яркость#ванная: Реле 510 5 -analog 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6 -logging analog 1 100 fast Аналоговый#вход Датчики 7 +analog adc 0 Аналоговый#вход Датчики fill-gauge 1 1023 1 1023 6 +logging adc 1 100 Аналоговый#вход Датчики 7 //Это демо конфигурация. В ней показано как связать кнопки c помощью сценариев //Кнопка номер 1 связана с кнопкой 2, 3 и с pwm 2 //Так же продемонстрированна система логгирования данных строкой logging -//1 - это интервал между точками в минутах, 100 это количество точек -//slow или fast это два варианта выгрузки графика, slow более экономичный режим -//больше подходит для esp8266 \ No newline at end of file +//1 - это интервал между точками в минутах, 100 это количество точек \ No newline at end of file diff --git a/data/firmware.s.txt b/data/firmware.s.txt index ba8317ca..4927ac1e 100644 --- a/data/firmware.s.txt +++ b/data/firmware.s.txt @@ -7,4 +7,7 @@ button1 = 0 buttonSet 2 0 buttonSet 3 0 pwmSet 2 0 +end +adc > 50 +buttonSet 2 1 end \ No newline at end of file diff --git a/data/index.json b/data/index.json index 7891f487..26adcc1a 100644 --- a/data/index.json +++ b/data/index.json @@ -71,6 +71,12 @@ "action": "/?pushingbox", "class": "btn btn-block btn-success" }, + { + "type": "link", + "title": "Утилиты", + "action": "/?utilities", + "class": "btn btn-block btn-success" + }, { "type": "h3", "name": "my-block", diff --git a/data/mqtt.json b/data/mqtt.json index e2fd713a..0bd4acc5 100644 --- a/data/mqtt.json +++ b/data/mqtt.json @@ -12,7 +12,7 @@ { "type": "text", "class": "alert alert-warning", - "title": "Обратите внимание что поле prefix может состоять только из одного слова и одного разделителя: /your_prefix, вариант вида: /your_prefix1/your_prefix2 работать не будет. После изменения поля prefix необходимо перезагрузить устройство" + "title": "Обратите внимание что поле prefix может состоять только из одного слова и одного разделителя: /prefix, вариант вида: /prefix1/prefix2 работать не будет. После изменения поля prefix необходимо перезагрузить устройство" }, { "type": "h4", diff --git a/data/setup.json b/data/setup.json index 50f0260b..18ebf108 100644 --- a/data/setup.json +++ b/data/setup.json @@ -1,148 +1,162 @@ { - "configs": [ - "/config.setup.json" - ], - "title": "Конфигурация", - "class":"col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6", - "content": [ - { - "type": "h5", - "title": "{{name}}", - "class":"alert-warning" - }, - { - "type": "link", - "title": "Главная", - "action": "/", - "class": "btn btn-block btn-danger" - }, - { - "type": "hr" - }, - { - "type": "h2", - "title": "Имя устройства" - }, - { - "type": "input", - "title": "Имя устройства", - "name":"dev_name", - "state": "{{name}}", - "pattern": "[A-Za-z0-9]{6,12}" - }, - { - "type": "button", - "title": "Сохранить", - "action": "name?arg=[[dev_name]]", - "class": "btn btn-block btn-success" - }, - { - "type": "hr" - }, - { - "type": "h2", - "title": "Подключение к Wi-Fi роутеру" - }, - { - "type": "input", - "title":"Сеть", - "name":"ssid", - "state": "{{ssid}}" - }, - { - "type": "password", - "title": "Введите пароль", - "name":"ssidPass", - "state": "{{password}}" - }, - { - "type": "button", - "title": "Сохранить", - "class": "btn btn-block btn-success", - "action": "ssid?ssid=[[ssid]]&password=[[ssidPass]]" - }, - { - "type": "hr" - }, - { - "type": "h2", - "title": "Точка доступа" - }, - { - "type": "input", - "title": "Имя WI-FI сети", - "name":"ssidap", - "state": "{{ssidAP}}", - "pattern": ".{1,20}" - }, - { - "type": "password", - "title": "Пароль", - "name":"ssidApPass", - "state": "{{passwordAP}}", - "pattern": ".{8,20}" - }, - { - "type": "button", - "title": "Сохранить", - "action": "ssidap?ssidAP=[[ssidap]]&passwordAP=[[ssidApPass]]", - "class": "btn btn-block btn-success" - }, -{ - "type": "hr" - }, - { - "type": "h2", - "title": "Логин и пароль web interface" - }, - { - "type": "input", - "title": "Логин", - "name":"web-login", - "state": "{{web_login}}", - "pattern": ".{1,20}" - }, - { - "type": "password", - "title": "Пароль", - "name":"web-pass", - "state": "{{web_pass}}", - "pattern": ".{1,20}" - }, - { - "type": "button", - "title": "Сохранить", - "action": "web?web_login=[[web-login]]&web_pass=[[web-pass]]", - "class": "btn btn-block btn-success" - }, -{ - "type": "hr" - }, -{ - "type": "h2", - "title": "Временная зона" - }, - { - "type": "input", - "title": "Логин", - "name":"time-zone", - "state": "{{timezone}}", - "pattern": ".{1,20}" - }, - { - "type": "button", - "title": "Сохранить", - "action": "timeZone?timezone=[[time-zone]]", - "class": "btn btn-block btn-success" - }, -{ - "type": "hr" - }, - { - "type": "link", - "title": "Перезагрузить устройство", - "action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}", - "class": "btn btn-block btn-warning" - } - ] -} + "configs": [ + "/config.setup.json" + ], + "title": "Конфигурация", + "class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6", + "content": [ + { + "type": "h5", + "title": "{{name}}", + "class": "alert-warning" + }, + { + "type": "link", + "title": "Главная", + "action": "/", + "class": "btn btn-block btn-danger" + }, + { + "type": "hr" + }, + { + "type": "h2", + "title": "Имя устройства" + }, + { + "type": "input", + "title": "Имя устройства", + "name": "dev_name", + "state": "{{name}}", + "pattern": "[A-Za-z0-9]{6,12}" + }, + { + "type": "button", + "title": "Сохранить", + "action": "name?arg=[[dev_name]]", + "class": "btn btn-block btn-success" + }, + { + "type": "hr" + }, + { + "type": "h2", + "title": "Подключение к Wi-Fi роутеру" + }, + { + "type": "input", + "title": "Сеть", + "name": "ssid", + "state": "{{ssid}}" + }, + { + "type": "password", + "title": "Введите пароль", + "name": "ssidPass", + "state": "{{password}}" + }, + { + "type": "button", + "title": "Сохранить", + "class": "btn btn-block btn-success", + "action": "ssid?ssid=[[ssid]]&password=[[ssidPass]]" + }, + { + "type": "hr" + }, + { + "type": "h2", + "title": "Точка доступа" + }, + { + "type": "input", + "title": "Имя WI-FI сети", + "name": "ssidap", + "state": "{{ssidAP}}", + "pattern": ".{1,20}" + }, + { + "type": "password", + "title": "Пароль", + "name": "ssidApPass", + "state": "{{passwordAP}}", + "pattern": ".{8,20}" + }, + { + "type": "button", + "title": "Сохранить", + "action": "ssidap?ssidAP=[[ssidap]]&passwordAP=[[ssidApPass]]", + "class": "btn btn-block btn-success" + }, + { + "type": "hr" + }, + { + "type": "h2", + "title": "Логин и пароль web interface" + }, + { + "type": "input", + "title": "Логин", + "name": "web-login", + "state": "{{web_login}}", + "pattern": ".{1,20}" + }, + { + "type": "password", + "title": "Пароль", + "name": "web-pass", + "state": "{{web_pass}}", + "pattern": ".{1,20}" + }, + { + "type": "button", + "title": "Сохранить", + "action": "web?web_login=[[web-login]]&web_pass=[[web-pass]]", + "class": "btn btn-block btn-success" + }, + { + "type": "hr" + }, + { + "type": "h2", + "title": "Временная зона" + }, + { + "type": "input", + "title": "Временная зона", + "name": "1", + "state": "{{timezone}}", + "pattern": ".{1,20}" + }, + { + "type": "input", + "title": "Название ntp сервера", + "name": "2", + "state": "{{ntp}}" + }, + { + "type": "button", + "title": "Сохранить", + "action": "time?timezone=[[1]]&ntp=[[2]]", + "class": "btn btn-block btn-success" + }, + { + "type": "hr" + }, + { + "type": "text", + "class": "alert alert-warning", + "title": "После изменения поля 'NTP сервер' необходимо перезагрузить устройство" + }, + { + "type": "hr" + }, + { + "type": "link", + "title": "Перезагрузить устройство", + "action": "javascript:if(confirm(renameBlock(jsonResponse,'Перезагрузить?'))){send_request(this,'/restart?device=ok');}", + "class": "btn btn-block btn-warning" + } + ] +} \ No newline at end of file diff --git a/data/utilities.json b/data/utilities.json new file mode 100644 index 00000000..ee82a0c0 --- /dev/null +++ b/data/utilities.json @@ -0,0 +1,41 @@ +{ + "configs": [ + "/config.live.json", + "/config.setup.json" + ], + "title": "Главная", + "class": "col-sm-offset-1 col-sm-10 col-md-offset-2 col-md-8 col-lg-offset-3 col-lg-6", + "content": [ + { + "type": "h5", + "title": "{{name}}", + "class": "alert-warning" + }, + { + "type": "hr" + }, + { + "type": "h3", + "title": "Сканирование адресов шины i2c" + }, + { + "type": "h4", + "title": "{{i2c}}" + }, + { + "type": "link", + "title": "Сканировать", + "action": "/init?arg=5", + "class": "btn btn-block btn-success" + }, + { + "type": "hr" + }, + { + "type": "link", + "title": "Главная", + "action": "/", + "class": "btn btn-block btn-danger" + } + ] +} \ No newline at end of file diff --git a/data_excess/config-all.json b/data_excess/config-all.json index 0f09cde1..4b62c9cd 100644 --- a/data_excess/config-all.json +++ b/data_excess/config-all.json @@ -6,6 +6,7 @@ "ssid": "your_ssid", "password": "your_password", "timezone": 3, + "ntp": "pool.ntp.org", "mqttServer": "", "mqttPort": 0, "mqttPrefix": "/IoTmanager", @@ -14,5 +15,6 @@ "scenario": "1", "pushingbox_id": "", "web_login": "admin", - "web_pass": "admin" + "web_pass": "admin", + "udponoff": "1" } \ No newline at end of file diff --git a/esp32-esp8266_iot-manager_modules_firmware.ino b/esp32-esp8266_iot-manager_modules_firmware.ino index 6aed0d87..41cc4abd 100644 --- a/esp32-esp8266_iot-manager_modules_firmware.ino +++ b/esp32-esp8266_iot-manager_modules_firmware.ino @@ -8,6 +8,9 @@ void setup() { CMD_init(); Serial.println("[V] CMD_init"); //-------------------------------------------------------------- + sensors_init(); + Serial.println("[V] sensors_init"); + //-------------------------------------------------------------- All_init(); Serial.println("[V] All_init"); //-------------------------------------------------------------- @@ -41,9 +44,6 @@ void setup() { ts.add(TEST, 10000, [&](void*) { getMemoryLoad("[i] periodic check of"); - - //String json = "{}"; - //jsonWriteStr(json, "test6", GetTime()); //ws.textAll(json); }, nullptr, true); @@ -80,4 +80,5 @@ void not_async_actions() { do_upgrade(); do_udp_data_parse(); do_mqtt_send_settings_to_udp(); + do_i2c_scanning(); } diff --git a/main.ino b/main.ino index 7f78e64c..3f9f9677 100644 --- a/main.ino +++ b/main.ino @@ -322,9 +322,23 @@ void sendCONFIG(String topik, String widgetConfig, String key, String date) { inner = inner + "}}"; String t = outer + inner; //Serial.println(t); - //client.publish(MQTT::Publish(topik, t).set_qos(1)); + //client_mqtt.publish(MQTT::Publish(topik, t).set_qos(1)); yield(); } + +uint8_t hexStringToUint8(String hex) { + uint8_t tmp = strtol(hex.c_str(), NULL, 0); + if (tmp >= 0x00 && tmp <= 0xFF) { + return tmp; + } +} + +uint16_t hexStringToUint16(String hex) { + uint16_t tmp = strtol(hex.c_str(), NULL, 0); + if (tmp >= 0x0000 && tmp <= 0xFFFF) { + return tmp; + } +} //============================================================================================================= #ifdef led_status void led_blink(int pin, int fq, String blink_satus) { diff --git a/mqtt.ino b/mqtt.ino index 0d902d11..8cd0c0c7 100644 --- a/mqtt.ino +++ b/mqtt.ino @@ -4,9 +4,9 @@ void MQTT_init() { ts.add(WIFI_MQTT_CONNECTION_CHECK, wifi_mqtt_reconnecting, [&](void*) { up_time(); if (WiFi.status() == WL_CONNECTED) { - Serial.println("[V] WiFi-ok"); - if (client.connected()) { - Serial.println("[V] MQTT-ok"); + Serial.println("[VV] WiFi-ok"); + if (client_mqtt.connected()) { + Serial.println("[VV] MQTT-ok"); } else { MQTT_Connecting(); if (!just_load) mqtt_lost_error++; @@ -50,7 +50,7 @@ void MQTT_init() { request->send(200, "text/text", tmp); }); - + } void do_mqtt_send_settings_to_udp() { @@ -63,7 +63,7 @@ void do_mqtt_send_settings_to_udp() { void do_mqtt_connection() { if (mqtt_connection) { mqtt_connection = false; - client.disconnect(); + client_mqtt.disconnect(); MQTT_Connecting(); } } @@ -72,8 +72,8 @@ void do_mqtt_connection() { void handleMQTT() { if (WiFi.status() == WL_CONNECTED) { - if (client.connected()) { - client.loop(); + if (client_mqtt.connected()) { + client_mqtt.loop(); } } } @@ -83,16 +83,16 @@ boolean MQTT_Connecting() { if ((mqtt_server != "")) { Serial.println("[E] Lost MQTT connection, start reconnecting"); //ssl//espClient.setCACert(local_root_ca1); - client.setServer(mqtt_server.c_str(), jsonReadtoInt(configSetup, "mqttPort")); + client_mqtt.setServer(mqtt_server.c_str(), jsonReadtoInt(configSetup, "mqttPort")); if (WiFi.status() == WL_CONNECTED) { - if (!client.connected()) { + if (!client_mqtt.connected()) { Serial.println("[V] Connecting to MQTT server commenced"); - if (client.connect(chipID.c_str(), jsonRead(configSetup, "mqttUser").c_str(), jsonRead(configSetup, "mqttPass").c_str())) { - Serial.println("[V] MQTT connected"); - client.setCallback(callback); - client.subscribe(jsonRead(configSetup, "mqttPrefix").c_str()); // Для приема получения HELLOW и подтверждения связи - client.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control - client.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/order").c_str()); // Подписываемся на топики order + if (client_mqtt.connect(chipID.c_str(), jsonRead(configSetup, "mqttUser").c_str(), jsonRead(configSetup, "mqttPass").c_str())) { + Serial.println("[VV] MQTT connected"); + client_mqtt.setCallback(callback); + client_mqtt.subscribe(jsonRead(configSetup, "mqttPrefix").c_str()); // Для приема получения HELLOW и подтверждения связи + client_mqtt.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/+/control").c_str()); // Подписываемся на топики control + client_mqtt.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/order").c_str()); // Подписываемся на топики order Serial.println("[V] Callback set, subscribe done"); return true; } else { @@ -119,18 +119,18 @@ void callback(char* topic, byte * payload, unsigned int length) { } Serial.println(" => " + str); - if (str == "HELLO") outcoming_date(); //превращает название топика в команду, а значение в параметр команды - - if (topic_str.indexOf("control") > 0) { //IoTmanager/800324-1458415/RelaySet1/control 1 - //Serial.println(topic_str); - String topic = selectFromMarkerToMarker(topic_str, "/", 3); //RelaySet1 - String number = selectToMarkerLast(topic, "Set"); //1 - topic.replace(number, ""); //RelaySet - String final_line = topic + " " + number + " " + str; //RelaySet 1 1 - //Serial.println(final_line); + if (str == "HELLO") outcoming_date(); + + //превращает название топика в команду, а значение в параметр команды + if (topic_str.indexOf("control") > 0) { //IoTmanager/800324-1458415/button1/control 1 //IoTmanager/800324-1458415/button99/control 1 + String topic = selectFromMarkerToMarker(topic_str, "/", 3); //button1 //button99 + topic = add_set(topic); //buttonSet1 //buttonSet99 + String number = selectToMarkerLast(topic, "Set"); //1 //99 + topic.replace(number, ""); //buttonSet //buttonSet + String final_line = topic + " " + number + " " + str; //buttonSet 1 1 //buttonSet 99 1 order_loop += final_line + ","; - } + if (topic_str.indexOf("order") > 0) { str.replace("_", " "); //Serial.println(str); @@ -152,21 +152,21 @@ void outcoming_date() { //======================================CONFIG================================================== boolean sendMQTT(String end_of_topik, String data) { String topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + end_of_topik; - boolean send_status = client.beginPublish(topik.c_str(), data.length(), false); - client.print(data); - client.endPublish(); + boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false); + client_mqtt.print(data); + client_mqtt.endPublish(); return send_status; } boolean sendCHART(String topik, String data) { topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; - boolean send_status = client.beginPublish(topik.c_str(), data.length(), false); - client.print(data); - client.endPublish(); + boolean send_status = client_mqtt.beginPublish(topik.c_str(), data.length(), false); + client_mqtt.print(data); + client_mqtt.endPublish(); return send_status; } boolean sendCHART_test(String topik, String data) { topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; - boolean send_status = client.publish (topik.c_str(), data.c_str(), false); + boolean send_status = client_mqtt.publish (topik.c_str(), data.c_str(), false); return send_status; } //======================================STATUS================================================== @@ -174,12 +174,12 @@ void sendSTATUS(String topik, String state) { topik = jsonRead(configSetup, "mqttPrefix") + "/" + chipID + "/" + topik + "/" + "status"; String json_ = "{}"; jsonWriteStr(json_, "status", state); - int send_status = client.publish (topik.c_str(), json_.c_str(), false); + int send_status = client_mqtt.publish (topik.c_str(), json_.c_str(), false); } //======================================CONTROL================================================== void sendCONTROL(String id, String topik, String state) { String all_line = jsonRead(configSetup, "mqttPrefix") + "/" + id + "/" + topik + "/control"; - int send_status = client.publish (all_line.c_str(), state.c_str(), false); + int send_status = client_mqtt.publish (all_line.c_str(), state.c_str(), false); } //=====================================================ОТПРАВЛЯЕМ ВИДЖЕТЫ======================================================== @@ -208,7 +208,7 @@ void sendAllWigets() { } #endif -//прямое выкидывание данных из файла в файловой системе в mqtt, без загрузки оперативной памяти +#ifndef layout_in_ram void sendAllWigets() { File configFile = SPIFFS.open("/layout.txt", "r"); if (!configFile) { @@ -221,6 +221,7 @@ void sendAllWigets() { sendMQTT("config", widget_to_send); } } +#endif //=====================================================ОТПРАВЛЯЕМ ДАННЫЕ В ВИДЖЕТЫ ПРИ ОБНОВЛЕНИИ СТРАНИЦЫ======================================================== void sendAllData() { //берет строку json и ключи превращает в топики а значения колючей в них посылает @@ -249,7 +250,7 @@ void sendAllData() { //берет строку json и ключи превра String stateMQTT() { - int state = client.state(); + int state = client_mqtt.state(); switch (state) { case -4: return "the server didn't respond within the keepalive time"; @@ -286,7 +287,7 @@ String stateMQTT() { String line_ = selectToMarker (all_text, "\n"); String id = selectFromMarkerToMarker(line_, " ", 4); if (id != "not found") { - client.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + id + "/+/status").c_str(), 0); + client_mqtt.subscribe((jsonRead(configSetup, "mqttPrefix") + "/" + id + "/+/status").c_str(), 0); Serial.println("subscribed to device, id: " + id); } all_text = deleteBeforeDelimiter(all_text, "\n"); @@ -306,7 +307,7 @@ String stateMQTT() { String id = selectFromMarkerToMarker(line_, " ", 4); if (id != "not found") { //Serial.println(); - Serial.println(client.publish ((jsonRead(configSetup, "mqttPrefix") + "/" + id).c_str(), "CHECK", true)); + Serial.println(client_mqtt.publish ((jsonRead(configSetup, "mqttPrefix") + "/" + id).c_str(), "CHECK", true)); } all_text = deleteBeforeDelimiter(all_text, "\n"); diff --git a/set.h b/set.h index 8f49ba85..0bb0e04f 100644 --- a/set.h +++ b/set.h @@ -5,16 +5,9 @@ boolean mb_4_of_memory = true; //#define MDNS_enable //#define WS_enable //#define layout_in_ram -#define wifi_mqtt_reconnecting 20000 -#define analog_update_int 5000 -#define temp_update_int 5000 +#define wifi_mqtt_reconnecting 30000 -#define tank_level_shooting_interval 500 //интервал выстрела датчика -#define tank_level_times_to_send 20 //после скольки выстрелов делать отправку данных - -#define dhtT_update_int 10000 -#define dhtH_update_int 10000 -#define dht_calculation_update_int 10000 +#define tank_level_times_to_send 10 //после скольки выстрелов делать отправку данных #define statistics_update 1000 * 60 * 60 * 2 //====================================================================== @@ -50,7 +43,7 @@ Servo myServo2; #include #include "AsyncUDP.h" AsyncUDP udp; -#include +#include Servo myServo1; Servo myServo2; @@ -82,13 +75,14 @@ AsyncEventSource events("/events"); #include #include -TickerScheduler ts(30); -enum {ROUTER_SEARCHING, WIFI_MQTT_CONNECTION_CHECK, LEVEL, ANALOG_, DALLAS, DHTT, DHTH, DHTC, DHTP, DHTD, STEPPER1, STEPPER2, ANALOG_LOG, LEVEL_LOG, DALLAS_LOG, dhtT_LOG, dhtH_LOG, CMD, TIMER_COUNTDOWN, TIMERS, TIME, TIME_SYNC, STATISTICS, UDP, UDP_DB, TEST}; +enum {ROUTER_SEARCHING, WIFI_MQTT_CONNECTION_CHECK, SENSORS, STEPPER1, STEPPER2, LOG1, LOG2, LOG3, LOG4, LOG5, TIMER_COUNTDOWN, TIME, TIME_SYNC, STATISTICS, UDP, UDP_DB, TEST }; +TickerScheduler ts(TEST + 1); + +//LEVEL, ANALOG1, ANALOG2, DALLAS, DHTT, DHTH, DHTC, DHTP, DHTD, BMP280T, BMP280P, #include WiFiClient espClient; - -PubSubClient client(espClient); +PubSubClient client_mqtt(espClient); #include StringCommand sCmd; @@ -110,12 +104,23 @@ DallasTemperature sensors; DHTesp dht; #include + +#include +Adafruit_BMP280 bmp; // use I2C interface +Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor(); +Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor(); + +#include +Adafruit_BME280 bme; // use I2C interface +Adafruit_Sensor *bme_temp = bme.getTemperatureSensor(); +Adafruit_Sensor *bme_pressure = bme.getPressureSensor(); +Adafruit_Sensor *bme_humidity = bme.getHumiditySensor(); //===============FIRMWARE VARS======================== boolean just_load = true; const char* hostName = "IoT Manager"; //JSON -String configSetup = "{}"; -String configJson = "{}"; +String configSetup = "{}"; +String configJson = "{}"; String optionJson = "{}"; //MQTT String chipID = ""; @@ -124,15 +129,21 @@ String all_widgets = ""; String scenario; String order_loop; //SENSORS -boolean flagLoggingAnalog = false; -boolean flagLoggingLevel = false; -boolean flagLoggingDallas = false; -boolean flagLoggingdhtT = false; -boolean flagLoggingdhtH = false; -//NTP -const char* ntpServer = "pool.ntp.org"; -const long gmtOffset_sec = 3600; -const int daylightOffset_sec = 3600; +String analog_value_names_list; +int enter_to_analog_counter; + +String level_value_name; +String dhtT_value_name; +String dhtH_value_name; +String bmp280T_value_name; +String bmp280P_value_name; +String bme280T_value_name; +int sensors_count = 11; +int sensors_reading_map [] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +//LOGGING +String logging_value_names_list; +int enter_to_logging_counter; +//NTP and TIME String current_time; //SCENARIO int scenario_line_status [] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; @@ -146,9 +157,9 @@ boolean upgrade = false; boolean mqtt_connection = false; boolean udp_data_parse = false; boolean mqtt_send_settings_to_udp = false; +boolean i2c_scanning = false; //UDP boolean udp_busy = false; -boolean chart_data_in_solid_array; unsigned int udp_port = 4210; #ifdef ESP8266 IPAddress udp_multicastIP (255, 255, 255, 255); @@ -159,3 +170,5 @@ IPAddress udp_multicastIP (239, 255, 255, 255); String received_ip; String received_udp_line; int udp_period; +//i2c +String i2c_list; diff --git a/udp.ino b/udp.ino index fe04541e..e2c12744 100644 --- a/udp.ino +++ b/udp.ino @@ -44,7 +44,7 @@ void UDP_init() { handleUdp_esp32(); randomSeed(micros()); - udp_period = random(20000, 40000); + udp_period = random(50000, 60000); ts.add(UDP, udp_period, [&](void*) { if (jsonRead(configSetup, "udponoff") == "1") {