From ac5b7e577555b3f58fb1646785223a20c1013bfd Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <49808844+DmitryBorisenko33@users.noreply.github.com> Date: Sat, 25 Apr 2020 16:39:36 +0200 Subject: [PATCH] servo support added --- Cmd.ino | 95 +++++++++++++++++++++++++++++- Init.ino | 6 +- Logging.ino | 54 ++++++++--------- Widgets.ino | 42 ++++++++++++-- data/config.json | 3 +- data/configs/servo.c.txt | 17 ++++++ data/configs/servo.s.txt | 12 ++++ data/configuration.json | 3 +- data/dev.json | 24 +++++--- data/index.json | 4 ++ data/mqtt.json | 2 +- push_pushingbox.ino | 4 +- set.h | 11 +++- udp.ino | 122 ++++++++++++++++++++++----------------- 14 files changed, 299 insertions(+), 100 deletions(-) create mode 100644 data/configs/servo.c.txt create mode 100644 data/configs/servo.s.txt diff --git a/Cmd.ino b/Cmd.ino index 1589f292..431b031f 100644 --- a/Cmd.ino +++ b/Cmd.ino @@ -25,6 +25,9 @@ void CMD_init() { sCmd.addCommand("stepper", stepper); sCmd.addCommand("stepperSet", stepperSet); + sCmd.addCommand("servo", servo_); + sCmd.addCommand("servoSet", servoSet); + sCmd.addCommand("logging", logging); sCmd.addCommand("inputDigit", inputDigit); @@ -271,6 +274,7 @@ void handle_time_init() { ts.add(TIME, 1000, [&](void*) { String tmp = GetTime(); + jsonWriteStr(configJson, "time", tmp); tmp.replace(":", "-"); jsonWriteStr(configJson, "timenowSet", tmp); eventGen ("timenowSet", ""); @@ -367,7 +371,96 @@ void stepperSet() { } } +//servo 1 13 50 Мой#сервопривод Сервоприводы 0 100 0 180 2 +void servo_() { + String servo_number = sCmd.next(); + String servo_pin = sCmd.next(); + String start_state = sCmd.next(); + int start_state_int = start_state.toInt(); + String widget_name = sCmd.next(); + String page_name = sCmd.next(); + String min_value = sCmd.next(); + String max_value = sCmd.next(); + + String min_deg = sCmd.next(); + String max_deg = sCmd.next(); + + String page_number = sCmd.next(); + + jsonWriteStr(optionJson, "servo_pin" + servo_number, servo_pin); + start_state_int = map(start_state_int, min_value.toInt(), max_value.toInt(), min_deg.toInt(), max_deg.toInt()); + + if (servo_number == "1") { +#ifdef ESP8266 + myServo1.attach(servo_pin.toInt()); + myServo1.write(start_state_int); +#endif +#ifdef ESP32 + myServo1.attach(servo_pin.toInt(), 500, 2400); + myServo1.write(start_state_int); +#endif + } + + if (servo_number == "2") { +#ifdef ESP8266 + myServo2.attach(servo_pin.toInt()); + myServo2.write(start_state_int); +#endif +#ifdef ESP32 + myServo2.attach(servo_pin.toInt(), 500, 2400); + myServo2.write(start_state_int); +#endif + } + + jsonWriteStr(optionJson, "s_min_val" + servo_number, min_value); + jsonWriteStr(optionJson, "s_max_val" + servo_number, max_value); + 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); + + createWidgetParam (widget_name, page_name, page_number, "widgets/widget.range.json", "servoSet" + servo_number, "min", min_value, "max", max_value, "k", "1"); +} + +void servoSet() { + String servo_number = sCmd.next(); + String servo_state = sCmd.next(); + int servo_state_int = servo_state.toInt(); + + int pin = jsonReadtoInt(optionJson, "servo_pin" + servo_number); + + servo_state_int = map(servo_state_int, + jsonReadtoInt(optionJson, "s_min_val" + servo_number), + jsonReadtoInt(optionJson, "s_max_val" + servo_number), + jsonReadtoInt(optionJson, "s_min_deg" + servo_number), + jsonReadtoInt(optionJson, "s_max_deg" + servo_number)); + + if (servo_number == "1") { +#ifdef ESP8266 + myServo1.write(servo_state_int); +#endif +#ifdef ESP32 + myServo1.write(servo_state_int); +#endif + } + + if (servo_number == "2") { +#ifdef ESP8266 + myServo2.write(servo_state_int); +#endif +#ifdef ESP32 + myServo2.write(servo_state_int); +#endif + } + + //Serial.println(servo_state_int); + + eventGen ("servoSet", servo_number); + + jsonWriteStr(configJson, "servoSet" + servo_number, servo_state); + sendSTATUS("servoSet" + servo_number, servo_state); +} //==================================================================================================================================================== /* void inputText() { @@ -469,7 +562,7 @@ void handleCMD_loop() { //======================================================================================================================================= void txtExecution(String file) { - String command_all = readFile(file, 2048) + "\r\n"; + String command_all = readFile(file, 2048) + "\r\n"; command_all.replace("\r\n", "\n"); command_all.replace("\r", "\n"); diff --git a/Init.ino b/Init.ino index c0b1fd50..40a35399 100644 --- a/Init.ino +++ b/Init.ino @@ -137,7 +137,11 @@ 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)); + } + if (value == "19") { writeFile("firmware.c.txt", readFile("configs/firmware.c.txt", 2048)); writeFile("firmware.s.txt", readFile("configs/firmware.s.txt", 2048)); } diff --git a/Logging.ino b/Logging.ino index 777b8507..20952b76 100644 --- a/Logging.ino +++ b/Logging.ino @@ -113,34 +113,36 @@ void sendLogData(String file, String topic, boolean type) { if (type) { //---------------------------------------------- String log_date = readFile(file, 5000); - 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 + ","; + 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 = "{}"; } - 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"); } - 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 { //---------------------------------------------- diff --git a/Widgets.ino b/Widgets.ino index 1a675337..303b7fb1 100644 --- a/Widgets.ino +++ b/Widgets.ino @@ -15,11 +15,40 @@ void createWidget (String widget_name, String page_name, String page_number, St jsonWriteStr(widget, "order", page_number); jsonWriteStr(widget, "descr", widget_name); jsonWriteStr(widget, "topic", prex + "/" + topic); - #ifdef layout_in_ram + +#ifdef layout_in_ram all_widgets += widget + "\r\n"; - #else +#else addFile("layout.txt", widget); - #endif +#endif + widget = ""; +} + +void createWidgetParam (String widget_name, String page_name, String page_number, String file, String topic, String name1, String param1, String name2, String param2, String name3, String param3) { + + String widget; + widget = readFile(file, 1024); + + if (widget == "Failed") return; + if (widget == "Large") return; + + widget_name.replace("#", " "); + page_name.replace("#", " "); + + jsonWriteStr(widget, "page", page_name); + jsonWriteStr(widget, "order", page_number); + jsonWriteStr(widget, "descr", widget_name); + jsonWriteStr(widget, "topic", prex + "/" + topic); + + if (name1 != "") jsonWriteStr(widget, name1, param1); + if (name2 != "") jsonWriteStr(widget, name2, param2); + if (name3 != "") jsonWriteStr(widget, name3, param3); + +#ifdef layout_in_ram + all_widgets += widget + "\r\n"; +#else + addFile("layout.txt", widget); +#endif widget = ""; } @@ -40,10 +69,11 @@ void createChart (String widget_name, String page_name, String page_number, Str jsonWriteStr(widget, "series", widget_name); jsonWriteStr(widget, "maxCount", maxCount); jsonWriteStr(widget, "topic", prex + "/" + topic); - #ifdef layout_in_ram + +#ifdef layout_in_ram all_widgets += widget + "\r\n"; - #else +#else addFile("layout.txt", widget); - #endif +#endif widget = ""; } diff --git a/data/config.json b/data/config.json index b77d425e..671fcda7 100644 --- a/data/config.json +++ b/data/config.json @@ -14,5 +14,6 @@ "scenario": "1", "pushingbox_id": "v7C133E426B0C69E", "web_login": "admin", - "web_pass": "admin" + "web_pass": "admin", + "udponoff": "1" } \ No newline at end of file diff --git a/data/configs/servo.c.txt b/data/configs/servo.c.txt new file mode 100644 index 00000000..5d45aea0 --- /dev/null +++ b/data/configs/servo.c.txt @@ -0,0 +1,17 @@ +servo 1 12 50 Мой#сервопривод Сервоприводы 0 100 0 180 1 +servo 2 13 50 Мой#сервопривод Сервоприводы 0 100 0 180 2 +button 1 na Открыть1 Сервоприводы 0 3 +button 2 na Открыть2 Сервоприводы 0 4 + +//Можно создавать не более двух сервоприводов на одном устройстве. +//1 - номер привода +//12 - номер пина +//50 - начальное значение в процентах + +//0 - 100 диапазон ползунка +//0 - 180 диапазон угла + +//Представим ситуацию когда есть некая заслонка и при угле в 30 градусов она закрыта, +//а при угле в 90 градусов открыта. В этом случае необходимо написать +//0 100 30 90 и тогда поставив ползунок в 0 % серва встанет в положение 30 градусов, +//а если поставить ползунок в 100 % серва встанет в положение 90 градусов. \ No newline at end of file diff --git a/data/configs/servo.s.txt b/data/configs/servo.s.txt new file mode 100644 index 00000000..b4340463 --- /dev/null +++ b/data/configs/servo.s.txt @@ -0,0 +1,12 @@ +button1 = 1 +servoSet 1 100 +end +button1 = 0 +servoSet 1 0 +end +button2 = 1 +servoSet 2 100 +end +button2 = 0 +servoSet 2 0 +end \ No newline at end of file diff --git a/data/configuration.json b/data/configuration.json index d337b323..a9bae768 100644 --- a/data/configuration.json +++ b/data/configuration.json @@ -50,7 +50,8 @@ "/preset?arg=15": "15.Датчик движения включающий свет", "/preset?arg=16": "16.Охранный датчик движения", "/preset?arg=17": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)", - "/preset?arg=18": "Настройки по умолчанию" + "/preset?arg=18": "18.Система управления сервоприводами", + "/preset?arg=19": "Настройки по умолчанию" } }, { diff --git a/data/dev.json b/data/dev.json index 17e428cb..9b474644 100644 --- a/data/dev.json +++ b/data/dev.json @@ -35,13 +35,13 @@ { "type": "link", "title": "Переформировать список устройств", - "action": "udp?arg=2", + "action": "udp?arg=3", "class": "btn btn-block btn-success" }, { "type": "link", "title": "Обновить страницу", - "action": "udp?arg=3", + "action": "udp?arg=4", "class": "btn btn-block btn-success" }, { @@ -55,20 +55,30 @@ { "type": "h3", "title": "Имя этого устройства:" - }, + }, { "type": "input", "title": "Имя устройства", - "name":"dev_name", + "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": "checkbox", + "name": "udponoff", + "title": "Включить обмен данными между устройствами", + "action": "/udp?arg=[[udponoff]]", + "state": "{{udponoff}}" + }, { "type": "hr" }, diff --git a/data/index.json b/data/index.json index 64fd07ba..7891f487 100644 --- a/data/index.json +++ b/data/index.json @@ -23,6 +23,10 @@ "type": "h4", "title": "Uptime: {{uptime}}" }, + { + "type": "h4", + "title": "Time: {{time}}" + }, { "type": "h4", "title": "Build version: {{firmware_version}}" diff --git a/data/mqtt.json b/data/mqtt.json index 1941798b..e2fd713a 100644 --- a/data/mqtt.json +++ b/data/mqtt.json @@ -84,7 +84,7 @@ { "type": "button", "title": "Отправить настройки MQTT с этого устройства на все остальные", - "action": "udp?arg=1", + "action": "udp?arg=2", "class": "btn btn-block btn-success" }, diff --git a/push_pushingbox.ino b/push_pushingbox.ino index d517d5f1..0d33191e 100644 --- a/push_pushingbox.ino +++ b/push_pushingbox.ino @@ -28,7 +28,9 @@ void pushControl() { WiFiClient client_push; Serial.println("- connecting to pushing server: " + String(logServer)); - if (client_push.connect(logServer, 80)) { + if (!client_push.connect(logServer, 80)) { + Serial.println("- not connected"); + } else { Serial.println("- succesfully connected"); String postStr = "devid="; diff --git a/set.h b/set.h index 04c3de73..8f49ba85 100644 --- a/set.h +++ b/set.h @@ -31,6 +31,9 @@ boolean mb_4_of_memory = true; ESP8266HTTPUpdateServer httpUpdater; #include WiFiUDP Udp; +#include +Servo myServo1; +Servo myServo2; #ifdef MDNS_enable #include @@ -40,13 +43,16 @@ WiFiUDP Udp; //===============библиотеки и объекты для ESP32=========================== #ifdef ESP32 #include +#include +#include #include #include #include -#include -#include #include "AsyncUDP.h" AsyncUDP udp; +#include +Servo myServo1; +Servo myServo2; #ifdef MDNS_enable #include @@ -103,6 +109,7 @@ DallasTemperature sensors; #include DHTesp dht; +#include //===============FIRMWARE VARS======================== boolean just_load = true; const char* hostName = "IoT Manager"; diff --git a/udp.ino b/udp.ino index bab01d27..fe04541e 100644 --- a/udp.ino +++ b/udp.ino @@ -4,16 +4,24 @@ void UDP_init() { if (request->hasArg("arg")) { value = request->getParam("arg")->value(); } + if (value == "0") { + jsonWriteStr(configSetup, "udponoff", value); + request->send(200, "text/text", "ok"); + } if (value == "1") { - mqtt_send_settings_to_udp = true; + jsonWriteStr(configSetup, "udponoff", value); request->send(200, "text/text", "ok"); } if (value == "2") { + mqtt_send_settings_to_udp = true; + request->send(200, "text/text", "ok"); + } + if (value == "3") { SPIFFS.remove("/dev.csv"); addFile("dev.csv", "device id;device name;ip address"); request->redirect("/?dev"); } - if (value == "3") { + if (value == "4") { request->redirect("/?dev"); } }); @@ -34,23 +42,25 @@ void UDP_init() { #endif handleUdp_esp32(); - + randomSeed(micros()); udp_period = random(20000, 40000); - + ts.add(UDP, udp_period, [&](void*) { - if (WiFi.status() == WL_CONNECTED) { - if (!udp_busy) { - String line_to_send = "iotm;" + chipID + ";" + jsonRead(configSetup, "name"); + if (jsonRead(configSetup, "udponoff") == "1") { + if (WiFi.status() == WL_CONNECTED) { + if (!udp_busy) { + String line_to_send = "iotm;" + chipID + ";" + jsonRead(configSetup, "name"); #ifdef ESP8266 - Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP()); - Udp.write(line_to_send.c_str()); - Udp.endPacket(); + Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP()); + Udp.write(line_to_send.c_str()); + Udp.endPacket(); #endif #ifdef ESP32 - udp.broadcast(line_to_send.c_str()); + udp.broadcast(line_to_send.c_str()); #endif - Serial.println("[UDP<=] dev info send"); + Serial.println("[UDP<=] dev info send"); + } } } }, nullptr, false); @@ -58,25 +68,27 @@ void UDP_init() { void handleUdp() { #ifdef ESP8266 - if (WiFi.status() == WL_CONNECTED) { - int packetSize = Udp.parsePacket(); - if (packetSize) { - char udp_incomingPacket[255]; - Serial.printf("[UDP=>] Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort()); - received_ip = Udp.remoteIP().toString(); - int len = Udp.read(udp_incomingPacket, 255); - if (len > 0) { - udp_incomingPacket[len] = 0; + if (jsonRead(configSetup, "udponoff") == "1") { + if (WiFi.status() == WL_CONNECTED) { + int packetSize = Udp.parsePacket(); + if (packetSize) { + char udp_incomingPacket[255]; + Serial.printf("[UDP=>] Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort()); + received_ip = Udp.remoteIP().toString(); + int len = Udp.read(udp_incomingPacket, 255); + if (len > 0) { + udp_incomingPacket[len] = 0; + } + received_udp_line = String(udp_incomingPacket); + + if (received_udp_line.indexOf("iotm;") >= 0) { + udp_data_parse = true; + } + if (received_udp_line.indexOf("mqttServer") >= 0) { + udp_data_parse = true; + } + } - received_udp_line = String(udp_incomingPacket); - - if (received_udp_line.indexOf("iotm;") >= 0) { - udp_data_parse = true; - } - if (received_udp_line.indexOf("mqttServer") >= 0) { - udp_data_parse = true; - } - } } #endif @@ -88,14 +100,16 @@ void handleUdp_esp32() { udp.onPacket([](AsyncUDPPacket packet) { received_udp_line = (char*)packet.data(); received_ip = packet.remoteIP().toString(); - - if (received_udp_line.indexOf("iotm;") >= 0) { - udp_data_parse = true; + if (jsonRead(configSetup, "udponoff") == "1") { + + if (received_udp_line.indexOf("iotm;") >= 0) { + udp_data_parse = true; + } + if (received_udp_line.indexOf("mqttServer") >= 0) { + udp_data_parse = true; + } + } - if (received_udp_line.indexOf("mqttServer") >= 0) { - udp_data_parse = true; - } - }); } #endif @@ -117,7 +131,7 @@ void do_udp_data_parse() { Serial.println("[V] new mqtt setting received from udp and saved"); mqtt_connection = true; } - if (received_udp_line.indexOf("iotm;") >= 0) { + if (received_udp_line.indexOf("iotm;") >= 0) { add_dev_in_list("dev.csv", selectFromMarkerToMarker(received_udp_line, ";", 1), selectFromMarkerToMarker(received_udp_line, ";", 2), received_ip); } } @@ -131,24 +145,26 @@ void add_dev_in_list(String fileName, String id, String dev_name, String ip) { } void send_mqtt_to_udp() { - if (WiFi.status() == WL_CONNECTED) { - udp_busy = true; - String mqtt_data = "{}"; - jsonWriteStr(mqtt_data, "mqttServer", jsonRead(configSetup, "mqttServer")); - jsonWriteInt(mqtt_data, "mqttPort", jsonReadtoInt(configSetup, "mqttPort")); - jsonWriteStr(mqtt_data, "mqttPrefix", jsonRead(configSetup, "mqttPrefix")); - jsonWriteStr(mqtt_data, "mqttUser", jsonRead(configSetup, "mqttUser")); - jsonWriteStr(mqtt_data, "mqttPass", jsonRead(configSetup, "mqttPass")); - Serial.println(mqtt_data); + if (jsonRead(configSetup, "udponoff") == "1") { + if (WiFi.status() == WL_CONNECTED) { + udp_busy = true; + String mqtt_data = "{}"; + jsonWriteStr(mqtt_data, "mqttServer", jsonRead(configSetup, "mqttServer")); + jsonWriteInt(mqtt_data, "mqttPort", jsonReadtoInt(configSetup, "mqttPort")); + jsonWriteStr(mqtt_data, "mqttPrefix", jsonRead(configSetup, "mqttPrefix")); + jsonWriteStr(mqtt_data, "mqttUser", jsonRead(configSetup, "mqttUser")); + jsonWriteStr(mqtt_data, "mqttPass", jsonRead(configSetup, "mqttPass")); + Serial.println(mqtt_data); #ifdef ESP8266 - Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP()); - Udp.write(mqtt_data.c_str()); - Udp.endPacket(); + Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP()); + Udp.write(mqtt_data.c_str()); + Udp.endPacket(); #endif #ifdef ESP32 - udp.broadcast(mqtt_data.c_str()); + udp.broadcast(mqtt_data.c_str()); #endif - Serial.println("[UDP<=] mqtt info send"); - udp_busy = false; + Serial.println("[UDP<=] mqtt info send"); + udp_busy = false; + } } }