servo support added

This commit is contained in:
Dmitry Borisenko
2020-04-25 16:39:36 +02:00
parent 696c51b113
commit ac5b7e5775
14 changed files with 299 additions and 100 deletions

93
Cmd.ino
View File

@@ -25,6 +25,9 @@ void CMD_init() {
sCmd.addCommand("stepper", stepper); sCmd.addCommand("stepper", stepper);
sCmd.addCommand("stepperSet", stepperSet); sCmd.addCommand("stepperSet", stepperSet);
sCmd.addCommand("servo", servo_);
sCmd.addCommand("servoSet", servoSet);
sCmd.addCommand("logging", logging); sCmd.addCommand("logging", logging);
sCmd.addCommand("inputDigit", inputDigit); sCmd.addCommand("inputDigit", inputDigit);
@@ -271,6 +274,7 @@ void handle_time_init() {
ts.add(TIME, 1000, [&](void*) { ts.add(TIME, 1000, [&](void*) {
String tmp = GetTime(); String tmp = GetTime();
jsonWriteStr(configJson, "time", tmp);
tmp.replace(":", "-"); tmp.replace(":", "-");
jsonWriteStr(configJson, "timenowSet", tmp); jsonWriteStr(configJson, "timenowSet", tmp);
eventGen ("timenowSet", ""); 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() { void inputText() {

View File

@@ -137,7 +137,11 @@ void prsets_init() {
writeFile("firmware.c.txt", readFile("configs/stepper.c.txt", 2048)); writeFile("firmware.c.txt", readFile("configs/stepper.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/stepper.s.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.c.txt", readFile("configs/firmware.c.txt", 2048));
writeFile("firmware.s.txt", readFile("configs/firmware.s.txt", 2048)); writeFile("firmware.s.txt", readFile("configs/firmware.s.txt", 2048));
} }

View File

@@ -113,34 +113,36 @@ void sendLogData(String file, String topic, boolean type) {
if (type) { if (type) {
//---------------------------------------------- //----------------------------------------------
String log_date = readFile(file, 5000); String log_date = readFile(file, 5000);
log_date.replace("\r\n", "\n"); if (log_date != "Failed") {
log_date.replace("\r", "\n"); log_date.replace("\r\n", "\n");
String buf = "{}"; log_date.replace("\r", "\n");
String json_array; String buf = "{}";
String unix_time; String json_array;
String value; String unix_time;
while (log_date.length() != 0) { String value;
String tmp = selectToMarker (log_date, "\n"); while (log_date.length() != 0) {
log_date = deleteBeforeDelimiter(log_date, "\n"); String tmp = selectToMarker (log_date, "\n");
unix_time = selectToMarker (tmp, " "); log_date = deleteBeforeDelimiter(log_date, "\n");
jsonWriteInt(buf, "x", unix_time.toInt()); unix_time = selectToMarker (tmp, " ");
value = deleteBeforeDelimiter(tmp, " "); jsonWriteInt(buf, "x", unix_time.toInt());
jsonWriteFloat(buf, "y1", value.toFloat()); value = deleteBeforeDelimiter(tmp, " ");
if (log_date.length() < 3) { jsonWriteFloat(buf, "y1", value.toFloat());
json_array += buf; if (log_date.length() < 3) {
} else { json_array += buf;
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 { } else {
//---------------------------------------------- //----------------------------------------------

View File

@@ -15,11 +15,40 @@ void createWidget (String widget_name, String page_name, String page_number, St
jsonWriteStr(widget, "order", page_number); jsonWriteStr(widget, "order", page_number);
jsonWriteStr(widget, "descr", widget_name); jsonWriteStr(widget, "descr", widget_name);
jsonWriteStr(widget, "topic", prex + "/" + topic); jsonWriteStr(widget, "topic", prex + "/" + topic);
#ifdef layout_in_ram
#ifdef layout_in_ram
all_widgets += widget + "\r\n"; all_widgets += widget + "\r\n";
#else #else
addFile("layout.txt", widget); 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 = ""; widget = "";
} }
@@ -40,10 +69,11 @@ void createChart (String widget_name, String page_name, String page_number, Str
jsonWriteStr(widget, "series", widget_name); jsonWriteStr(widget, "series", widget_name);
jsonWriteStr(widget, "maxCount", maxCount); jsonWriteStr(widget, "maxCount", maxCount);
jsonWriteStr(widget, "topic", prex + "/" + topic); jsonWriteStr(widget, "topic", prex + "/" + topic);
#ifdef layout_in_ram
#ifdef layout_in_ram
all_widgets += widget + "\r\n"; all_widgets += widget + "\r\n";
#else #else
addFile("layout.txt", widget); addFile("layout.txt", widget);
#endif #endif
widget = ""; widget = "";
} }

View File

@@ -14,5 +14,6 @@
"scenario": "1", "scenario": "1",
"pushingbox_id": "v7C133E426B0C69E", "pushingbox_id": "v7C133E426B0C69E",
"web_login": "admin", "web_login": "admin",
"web_pass": "admin" "web_pass": "admin",
"udponoff": "1"
} }

17
data/configs/servo.c.txt Normal file
View File

@@ -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 градусов.

12
data/configs/servo.s.txt Normal file
View File

@@ -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

View File

@@ -50,7 +50,8 @@
"/preset?arg=15": "15.Датчик движения включающий свет", "/preset?arg=15": "15.Датчик движения включающий свет",
"/preset?arg=16": "16.Охранный датчик движения", "/preset?arg=16": "16.Охранный датчик движения",
"/preset?arg=17": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)", "/preset?arg=17": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
"/preset?arg=18": "Настройки по умолчанию" "/preset?arg=18": "18.Система управления сервоприводами",
"/preset?arg=19": "Настройки по умолчанию"
} }
}, },
{ {

View File

@@ -35,13 +35,13 @@
{ {
"type": "link", "type": "link",
"title": "Переформировать список устройств", "title": "Переформировать список устройств",
"action": "udp?arg=2", "action": "udp?arg=3",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-success"
}, },
{ {
"type": "link", "type": "link",
"title": "Обновить страницу", "title": "Обновить страницу",
"action": "udp?arg=3", "action": "udp?arg=4",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-success"
}, },
{ {
@@ -55,20 +55,30 @@
{ {
"type": "h3", "type": "h3",
"title": "Имя этого устройства:" "title": "Имя этого устройства:"
}, },
{ {
"type": "input", "type": "input",
"title": "Имя устройства", "title": "Имя устройства",
"name":"dev_name", "name": "dev_name",
"state": "{{name}}", "state": "{{name}}",
"pattern": "[A-Za-z0-9]{6,12}" "pattern": "[A-Za-z0-9]{6,12}"
}, },
{ {
"type": "button", "type": "button",
"title": "Сохранить", "title": "Сохранить",
"action": "name?arg=[[dev_name]]", "action": "name?arg=[[dev_name]]",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-success"
}, },
{
"type": "hr"
},
{
"type": "checkbox",
"name": "udponoff",
"title": "Включить обмен данными между устройствами",
"action": "/udp?arg=[[udponoff]]",
"state": "{{udponoff}}"
},
{ {
"type": "hr" "type": "hr"
}, },

View File

@@ -23,6 +23,10 @@
"type": "h4", "type": "h4",
"title": "Uptime: {{uptime}}" "title": "Uptime: {{uptime}}"
}, },
{
"type": "h4",
"title": "Time: {{time}}"
},
{ {
"type": "h4", "type": "h4",
"title": "Build version: {{firmware_version}}" "title": "Build version: {{firmware_version}}"

View File

@@ -84,7 +84,7 @@
{ {
"type": "button", "type": "button",
"title": "Отправить настройки MQTT с этого устройства на все остальные", "title": "Отправить настройки MQTT с этого устройства на все остальные",
"action": "udp?arg=1", "action": "udp?arg=2",
"class": "btn btn-block btn-success" "class": "btn btn-block btn-success"
}, },

View File

@@ -28,7 +28,9 @@ void pushControl() {
WiFiClient client_push; WiFiClient client_push;
Serial.println("- connecting to pushing server: " + String(logServer)); 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"); Serial.println("- succesfully connected");
String postStr = "devid="; String postStr = "devid=";

11
set.h
View File

@@ -31,6 +31,9 @@ boolean mb_4_of_memory = true;
ESP8266HTTPUpdateServer httpUpdater; ESP8266HTTPUpdateServer httpUpdater;
#include <WiFiUdp.h> #include <WiFiUdp.h>
WiFiUDP Udp; WiFiUDP Udp;
#include <Servo.h>
Servo myServo1;
Servo myServo2;
#ifdef MDNS_enable #ifdef MDNS_enable
#include <ESP8266mDNS.h> #include <ESP8266mDNS.h>
@@ -40,13 +43,16 @@ WiFiUDP Udp;
//===============библиотеки и объекты для ESP32=========================== //===============библиотеки и объекты для ESP32===========================
#ifdef ESP32 #ifdef ESP32
#include <WiFi.h> #include <WiFi.h>
#include <HTTPClient.h>
#include <HTTPUpdate.h>
#include <SPIFFS.h> #include <SPIFFS.h>
#include <AsyncTCP.h> #include <AsyncTCP.h>
#include <analogWrite.h> #include <analogWrite.h>
#include <HTTPUpdate.h>
#include <HTTPClient.h>
#include "AsyncUDP.h" #include "AsyncUDP.h"
AsyncUDP udp; AsyncUDP udp;
#include <ESP32_Servo.h>
Servo myServo1;
Servo myServo2;
#ifdef MDNS_enable #ifdef MDNS_enable
#include <ESPmDNS.h> #include <ESPmDNS.h>
@@ -103,6 +109,7 @@ DallasTemperature sensors;
#include <DHTesp.h> #include <DHTesp.h>
DHTesp dht; DHTesp dht;
#include <Wire.h>
//===============FIRMWARE VARS======================== //===============FIRMWARE VARS========================
boolean just_load = true; boolean just_load = true;
const char* hostName = "IoT Manager"; const char* hostName = "IoT Manager";

114
udp.ino
View File

@@ -4,16 +4,24 @@ void UDP_init() {
if (request->hasArg("arg")) { if (request->hasArg("arg")) {
value = request->getParam("arg")->value(); value = request->getParam("arg")->value();
} }
if (value == "0") {
jsonWriteStr(configSetup, "udponoff", value);
request->send(200, "text/text", "ok");
}
if (value == "1") { if (value == "1") {
mqtt_send_settings_to_udp = true; jsonWriteStr(configSetup, "udponoff", value);
request->send(200, "text/text", "ok"); request->send(200, "text/text", "ok");
} }
if (value == "2") { if (value == "2") {
mqtt_send_settings_to_udp = true;
request->send(200, "text/text", "ok");
}
if (value == "3") {
SPIFFS.remove("/dev.csv"); SPIFFS.remove("/dev.csv");
addFile("dev.csv", "device id;device name;ip address"); addFile("dev.csv", "device id;device name;ip address");
request->redirect("/?dev"); request->redirect("/?dev");
} }
if (value == "3") { if (value == "4") {
request->redirect("/?dev"); request->redirect("/?dev");
} }
}); });
@@ -39,18 +47,20 @@ void UDP_init() {
udp_period = random(20000, 40000); udp_period = random(20000, 40000);
ts.add(UDP, udp_period, [&](void*) { ts.add(UDP, udp_period, [&](void*) {
if (WiFi.status() == WL_CONNECTED) { if (jsonRead(configSetup, "udponoff") == "1") {
if (!udp_busy) { if (WiFi.status() == WL_CONNECTED) {
String line_to_send = "iotm;" + chipID + ";" + jsonRead(configSetup, "name"); if (!udp_busy) {
String line_to_send = "iotm;" + chipID + ";" + jsonRead(configSetup, "name");
#ifdef ESP8266 #ifdef ESP8266
Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP()); Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP());
Udp.write(line_to_send.c_str()); Udp.write(line_to_send.c_str());
Udp.endPacket(); Udp.endPacket();
#endif #endif
#ifdef ESP32 #ifdef ESP32
udp.broadcast(line_to_send.c_str()); udp.broadcast(line_to_send.c_str());
#endif #endif
Serial.println("[UDP<=] dev info send"); Serial.println("[UDP<=] dev info send");
}
} }
} }
}, nullptr, false); }, nullptr, false);
@@ -58,25 +68,27 @@ void UDP_init() {
void handleUdp() { void handleUdp() {
#ifdef ESP8266 #ifdef ESP8266
if (WiFi.status() == WL_CONNECTED) { if (jsonRead(configSetup, "udponoff") == "1") {
int packetSize = Udp.parsePacket(); if (WiFi.status() == WL_CONNECTED) {
if (packetSize) { int packetSize = Udp.parsePacket();
char udp_incomingPacket[255]; if (packetSize) {
Serial.printf("[UDP=>] Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort()); char udp_incomingPacket[255];
received_ip = Udp.remoteIP().toString(); Serial.printf("[UDP=>] Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
int len = Udp.read(udp_incomingPacket, 255); received_ip = Udp.remoteIP().toString();
if (len > 0) { int len = Udp.read(udp_incomingPacket, 255);
udp_incomingPacket[len] = 0; if (len > 0) {
} udp_incomingPacket[len] = 0;
received_udp_line = String(udp_incomingPacket); }
received_udp_line = String(udp_incomingPacket);
if (received_udp_line.indexOf("iotm;") >= 0) { if (received_udp_line.indexOf("iotm;") >= 0) {
udp_data_parse = true; udp_data_parse = true;
} }
if (received_udp_line.indexOf("mqttServer") >= 0) { if (received_udp_line.indexOf("mqttServer") >= 0) {
udp_data_parse = true; udp_data_parse = true;
} }
}
} }
} }
#endif #endif
@@ -88,14 +100,16 @@ void handleUdp_esp32() {
udp.onPacket([](AsyncUDPPacket packet) { udp.onPacket([](AsyncUDPPacket packet) {
received_udp_line = (char*)packet.data(); received_udp_line = (char*)packet.data();
received_ip = packet.remoteIP().toString(); received_ip = packet.remoteIP().toString();
if (jsonRead(configSetup, "udponoff") == "1") {
if (received_udp_line.indexOf("iotm;") >= 0) { if (received_udp_line.indexOf("iotm;") >= 0) {
udp_data_parse = true; udp_data_parse = true;
} }
if (received_udp_line.indexOf("mqttServer") >= 0) { if (received_udp_line.indexOf("mqttServer") >= 0) {
udp_data_parse = true; udp_data_parse = true;
} }
}
}); });
} }
#endif #endif
@@ -117,7 +131,7 @@ void do_udp_data_parse() {
Serial.println("[V] new mqtt setting received from udp and saved"); Serial.println("[V] new mqtt setting received from udp and saved");
mqtt_connection = true; 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); 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() { void send_mqtt_to_udp() {
if (WiFi.status() == WL_CONNECTED) { if (jsonRead(configSetup, "udponoff") == "1") {
udp_busy = true; if (WiFi.status() == WL_CONNECTED) {
String mqtt_data = "{}"; udp_busy = true;
jsonWriteStr(mqtt_data, "mqttServer", jsonRead(configSetup, "mqttServer")); String mqtt_data = "{}";
jsonWriteInt(mqtt_data, "mqttPort", jsonReadtoInt(configSetup, "mqttPort")); jsonWriteStr(mqtt_data, "mqttServer", jsonRead(configSetup, "mqttServer"));
jsonWriteStr(mqtt_data, "mqttPrefix", jsonRead(configSetup, "mqttPrefix")); jsonWriteInt(mqtt_data, "mqttPort", jsonReadtoInt(configSetup, "mqttPort"));
jsonWriteStr(mqtt_data, "mqttUser", jsonRead(configSetup, "mqttUser")); jsonWriteStr(mqtt_data, "mqttPrefix", jsonRead(configSetup, "mqttPrefix"));
jsonWriteStr(mqtt_data, "mqttPass", jsonRead(configSetup, "mqttPass")); jsonWriteStr(mqtt_data, "mqttUser", jsonRead(configSetup, "mqttUser"));
Serial.println(mqtt_data); jsonWriteStr(mqtt_data, "mqttPass", jsonRead(configSetup, "mqttPass"));
Serial.println(mqtt_data);
#ifdef ESP8266 #ifdef ESP8266
Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP()); Udp.beginPacketMulticast(udp_multicastIP, udp_port, WiFi.localIP());
Udp.write(mqtt_data.c_str()); Udp.write(mqtt_data.c_str());
Udp.endPacket(); Udp.endPacket();
#endif #endif
#ifdef ESP32 #ifdef ESP32
udp.broadcast(mqtt_data.c_str()); udp.broadcast(mqtt_data.c_str());
#endif #endif
Serial.println("[UDP<=] mqtt info send"); Serial.println("[UDP<=] mqtt info send");
udp_busy = false; udp_busy = false;
}
} }
} }