Доброго всем времени суток!
Пред-пред-история короткая: год-другой назад изобрёл сортирный автомат управления освещением и вентиляторами (изначально - на Атмеге328) но совершенству предела нет и захотелось управлять всем этим делом с Andrюхи (до iOгрызка ход пока не дошёл) и чтобы было визуально понятно что происходит в эфире была написана (в Delphi) программа поддержки для РС которая медленно, но верно трансформировалась в вышеозвученную ипостась... И худо-бедно автомат был отлажен и про всё забыто...
А пред-история чуть подлинней: выписал с Китая датчик температуры и влажности: ну разве не соблазн родить грамоШный будильник? И на той же Атмеге328 будильник был реализован, но размер символов на LCD1602 оставлял желать лучшего и под руку попался LCD12864В и... О! Да! И время - для ОсобоСлепых, и будильник, и ДД/ММ/ГГГГ, и t', и влажность, и... В общем: всё - оГуенчик, но... Как оказалось печать на ЛСД через библиотИку U8g2lib "весит" аж 29 Кб + сам будильник 7 = итого: в 32 кб Атмеги - не помещается: "Скетч слишком большой..." И, незамедлительно, было решено снять с дистанции устаревшую Атмегу и к финишу пришла НодеМЦУв3.0... И худо-бедно будильник был отлажен без всяких ТЦП/УДП, но гудение "главбуха": - "А ты выключил(включил) свет в аквариуме(ах)" заставило задуматься: валяются же ещё 2 ЕСПхи... И был будильник переписан, и управляет он теперь освещением аквариумов... Но и в этот раз не обошлось без Клиент_Сервера... С УДП как-то не срослось (хотя с сортирным автоматом всё было откатано вродь как донельзя лучше) и теперь будильник (как ТЦПсервер) указывает аквариуму(каждые 5 мин. запрос) включиться (6:15) и выключиться (21:00)... И решил я "допилить" Клиент_Сервера до безобразия, но упёрся в то же УДП - вот скетч:
Процедура SendMsg() вААщпе нИ работает никак...
А вот и Клиент_Сервер...
З.Ы. Изначально подумал: "Ну наконец-то форум где можно выложить файл (а не ссылку на какой-нить Я-диск)"... но файл не может превышать FDD3,5 поэтому пришлось 1.744 резать, а вам чтобы собрать ВинКомандёром надо удалить из имени файлов ".zip"
P.P.S. Предлагаю "всем миром" отладить Клиент_Сервера
Пред-пред-история короткая: год-другой назад изобрёл сортирный автомат управления освещением и вентиляторами (изначально - на Атмеге328) но совершенству предела нет и захотелось управлять всем этим делом с Andrюхи (до iOгрызка ход пока не дошёл) и чтобы было визуально понятно что происходит в эфире была написана (в Delphi) программа поддержки для РС которая медленно, но верно трансформировалась в вышеозвученную ипостась... И худо-бедно автомат был отлажен и про всё забыто...
А пред-история чуть подлинней: выписал с Китая датчик температуры и влажности: ну разве не соблазн родить грамоШный будильник? И на той же Атмеге328 будильник был реализован, но размер символов на LCD1602 оставлял желать лучшего и под руку попался LCD12864В и... О! Да! И время - для ОсобоСлепых, и будильник, и ДД/ММ/ГГГГ, и t', и влажность, и... В общем: всё - оГуенчик, но... Как оказалось печать на ЛСД через библиотИку U8g2lib "весит" аж 29 Кб + сам будильник 7 = итого: в 32 кб Атмеги - не помещается: "Скетч слишком большой..." И, незамедлительно, было решено снять с дистанции устаревшую Атмегу и к финишу пришла НодеМЦУв3.0... И худо-бедно будильник был отлажен без всяких ТЦП/УДП, но гудение "главбуха": - "А ты выключил(включил) свет в аквариуме(ах)" заставило задуматься: валяются же ещё 2 ЕСПхи... И был будильник переписан, и управляет он теперь освещением аквариумов... Но и в этот раз не обошлось без Клиент_Сервера... С УДП как-то не срослось (хотя с сортирным автоматом всё было откатано вродь как донельзя лучше) и теперь будильник (как ТЦПсервер) указывает аквариуму(каждые 5 мин. запрос) включиться (6:15) и выключиться (21:00)... И решил я "допилить" Клиент_Сервера до безобразия, но упёрся в то же УДП - вот скетч:
C++:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <GyverButton.h>
#define Lamp_pin 16 // br_Lamp
#define wc_sens 5
#define br_sens 13
const char *ssid = "FX-4300";//UDP_Tester_007
const char *pass = "12345678";
//const char* host = "192.168.127.0";
const uint16_t localPort = 8086;
GButton WC(wc_sens, HIGH_PULL, NORM_CLOSE);
GButton BR(br_sens, HIGH_PULL, NORM_CLOSE);
WiFiUDP MyUdp;
void setup() {
delay(1000);
Serial.begin(115200);
Serial.println();
// Serial.println("Configuring access point...");
// WiFi.softAP(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(myIP);
Serial.println("HTTP server started");
// MyUdp.begin(localPort);
if (MyUdp.begin(localPort)) Serial.println("UDP = started");
pinMode(Lamp_pin, OUTPUT);
// digitalWrite(Lamp_pin, 1);
// WiFi.begin(ssid);//, password);
Serial.print(F("server started on IP: "));
Serial.println(WiFi.softAPIP());//localIP
WC.setTickMode(AUTO);
WC.setDebounce(150);
WC.setTimeout(1500); // 7500 настройка таймаута на удержание (по умолчанию 500 мс)
WC.setStepTimeout(3000);// 60000
BR.setDebounce(150);
BR.setTickMode(AUTO);
BR.setTimeout(1500); // 7500 настройка таймаута на удержание (по умолчанию 500 мс)
BR.setStepTimeout(3000);// 60000
}
void loop() {
if (WC.isPress()){
SendMsg("WC.isPress");
digitalWrite(Lamp_pin, 1);
Serial.print(F("softAPIP: "));
Serial.println(WiFi.softAPIP());
Serial.print(F("localIP: "));
Serial.println(WiFi.localIP());
Serial.print("localPort = ");
Serial.println(MyUdp.localPort());
Serial.print("remoteIP = ");
Serial.println(MyUdp.remoteIP());
Serial.print("remotePort = ");
Serial.println(MyUdp.remotePort());
Serial.print("destinationIP = ");
Serial.println(MyUdp.destinationIP());
}
if (WC.isHold()){// проверка на удержание
SendMsg("WC.isHold");
}
if (BR.isPress()){
SendMsg("BR.isPress");
digitalWrite(Lamp_pin, 0);
}
if (BR.isHold()){// проверка на удержание
SendMsg("BR.isHold");
}
// String s = RecvMsg();
// if (s.length() != 0) SendMsg("принято");
}
void SendMsg(String Messg){
char sendchars[Messg.length()+1];// буфер для строки
Messg.toCharArray(sendchars, Messg.length()+1);//преобразовываем в буфер
MyUdp.beginPacket(MyUdp.remoteIP(), MyUdp.remotePort());
MyUdp.write(sendchars);
MyUdp.endPacket();
/* Ввиду того, что в UDP доставка пакета НЕ гарантирована клиент отправляет
* только что принятое сообщение и отправитель сравнивает переданное с
* возвращённым */
/* String tmp;
do tmp = RecvMsg();
while (Messg != tmp);// коню понятно - чревато переполнением стека
*/
}
String RecvMsg(){
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1]; //buffer to hold incoming packet,
// if there's data available, read a packet
int packetSize = MyUdp.parsePacket();
if (packetSize) {
/*Serial.printf("Received packet of size %d from %s:%d\n (to %s:%d, free heap = %d B)\n",
packetSize,
MyUdp.remoteIP().toString().c_str(), MyUdp.remotePort(),
MyUdp.destinationIP().toString().c_str(), MyUdp.localPort(),
ESP.getFreeHeap());
*/
// read the packet into packetBufffer
int n = MyUdp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
packetBuffer[n] = 0;
SendMsg(String(packetBuffer));//подтверждаем приём - принято именно то, что передано
return String(packetBuffer);
}
}
А вот и Клиент_Сервер...
З.Ы. Изначально подумал: "Ну наконец-то форум где можно выложить файл (а не ссылку на какой-нить Я-диск)"... но файл не может превышать FDD3,5 поэтому пришлось 1.744 резать, а вам чтобы собрать ВинКомандёром надо удалить из имени файлов ".zip"
P.P.S. Предлагаю "всем миром" отладить Клиент_Сервера
Вложения
-
713 KB Просмотры: 17
-
713 KB Просмотры: 13
-
277.4 KB Просмотры: 8
-
58 байт Просмотры: 7