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

95
Cmd.ino
View File

@@ -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");

View File

@@ -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));
}

View File

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

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, "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 = "";
}

View File

@@ -14,5 +14,6 @@
"scenario": "1",
"pushingbox_id": "v7C133E426B0C69E",
"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=16": "16.Охранный датчик движения",
"/preset?arg=17": "17.Система управления шаговыми двигателями на основе драйвера A4988 (открытие закрытие штор)",
"/preset?arg=18": "Настройки по умолчанию"
"/preset?arg=18": "18.Система управления сервоприводами",
"/preset?arg=19": "Настройки по умолчанию"
}
},
{

View File

@@ -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"
},

View File

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

View File

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

View File

@@ -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=";

11
set.h
View File

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

122
udp.ino
View File

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