mostek wifi z esp32 zamiast przewodu uart-usb - medzie - 09-05-2024
Cześć wszystkim.
Moje obecne połączenie wygląda tak: urządzenie z prostym dosem -> przewód uart-usb -> laptop(tera term) na COM10 z prędkością przesyłu danych 115200.
Moje pytanie - czy da się zamienić przewód uart-usb na esp32 przesyłające dane w obie strony przez wifi/bt?
Miałam kilka prób, lecz za każdym razem dane wyświetlały się jedynie w monitorze portu szeregowego arduino ide, nie przechodząc między urządzeniami.
Połączenia: rx-17 tx-16 gnd-gnd vcc-3v3.
Poniżej wklejam mój kod.
Kod: #include <WiFi.h>
#include <HardwareSerial.h>
const char *ssid = "ESP32_Hotspot";
const char *password = "password";
WiFiServer server(23);
HardwareSerial SerialPort(2);
void setup() {
Serial.begin(115200); // monitor szeregowy
SerialPort.begin(115200, SERIAL_8N1, 16, 17);
WiFi.softAP(ssid, password);
IPAddress IP = WiFi.softAPIP();
Serial.print("Adres IP punktu dostępowego: ");
Serial.println(IP);
server.begin();
}
void loop() {
WiFiClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
String dataFromClient = client.readStringUntil('\n');
SerialPort.print(dataFromClient);
Serial.println(dataFromClient);
}
if (SerialPort.available()) {
String dataFromUART = SerialPort.readStringUntil('\n');
client.print(dataFromUART);
Serial.println(dataFromUART);
}
}
client.stop();
}
}
Z góry dziękuję za każdą odpowiedź
RE: mostek wifi z esp32 zamiast przewodu uart-usb - kaczakat - 10-05-2024
Jest gotowy wsad do ESP z mostem UART przez WIFI. W Win można zainstalować manager wirtualnych portów COM, darmowy Tibbo. Działa to na tańszym ESP8266, może być np. fajny moduł WEMOS MINI.
Natomiast taką samą funkcjonalność uzyskałem z przykładem Telnet, przykład WIFITelnetToSerial wszystko co przyleci z UART wysyłasz na Telnet. Tak samo z TCP, czy UDP. Zobacz jak tam wyglądają te funkcje, nie kojarzę żadnego readUntlil \n, jak to ma być przeźroczyste to cokolwiek przyleci przesyłasz dalej, nie widzę sensu tego analizować.
W ESP32 też jest ten przykład telet.
Z UDP robiłem coś takiego, na bazie tego:
Kod: /*
WiFiEsp example: WiFi UDP Send and Receive String
This sketch wait an UDP packet on localPort using a WiFi shield.
When a packet is received an 'ACK' packet is sent to the client on port remotePort.
For more details see: http://yaab-arduino.blogspot.com/p/wifiesp-example-client.html
*/
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>
const char* ssid = "nnn";
const char* password = "nnn";
int status = WL_IDLE_STATUS; // the Wifi radio's status
unsigned int localPort = 2390; // local port to listen on
char packetBuffer[255]; // buffer to hold incoming packet
char ReplyBuffer[] = "ACK"; // a string to send back
WiFiUDP Udp;
void setup() {
// initialize serial for debugging
Serial.begin(115200);
// initialize ESP module
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to wifi");
printWifiStatus();
Serial.println("\nStarting connection to server...");
// if you get a connection, report back via serial:
Udp.begin(localPort);
Serial.print("Listening on port ");
Serial.println(localPort);
}
void loop() {
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if (packetSize) {
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From ");
IPAddress remoteIp = Udp.remoteIP();
Serial.print(remoteIp);
Serial.print(", port ");
Serial.println(Udp.remotePort());
// read the packet into packetBufffer
int len = Udp.read(packetBuffer, 255);
if (len > 0) {
packetBuffer[len] = 0;
}
Serial.println("Contents:");
Serial.println(packetBuffer);
// send a reply, to the IP address and port that sent us the packet we received
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(ReplyBuffer);
Udp.endPacket();
}
}
void printWifiStatus() {
// print the SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// print your WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
// print the received signal strength:
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
}
Odwróciłem to tak, by wysyłało mi do Putty co przyleci na UART, faktycznie składałem to w linie, ale na bazie przykładu z serialEvent:
Kod: #include <ESP8266WiFi.h>
#include <WiFiUDP.h>
#define buffsize 32
#define reczneIP 1
// wifi connection variables
const char* ssid = "nnn";
const char* password = "nnn";
boolean wifiConnected = false;
char serial_input[buffsize]; // a String to hold incoming data
bool stringComplete = false; // whether the string is complete
//byte index = 0;
// UDP variables
unsigned int localPort = 8888;
WiFiUDP UDP;
boolean udpConnected = false;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged"; // a string to send back
#if (reczneIP)
IPAddress ip(192, 168, 1, 37);
IPAddress gateway(192, 168, 1, 3);
IPAddress subnet(255, 255, 255, 0);
IPAddress dns(192, 168, 1, 3);
#endif
void setup() {
// Initialise Serial connection
Serial.begin(115200);
// Initialise wifi connection
wifiConnected = connectWifi();
// only proceed if wifi connection successful
if(wifiConnected){
udpConnected = connectUDP();
if (udpConnected){
// initialise pins
//pinMode(5,OUTPUT);
}
}
}
void loop() {
serialEvent();//w esp nie ma serialevent, ktos cos wie?
// check if the WiFi and UDP connections were successful
if(wifiConnected){
if(udpConnected){
// if there’s data available, read a packet
int packetSize = UDP.parsePacket();
if(packetSize)
{
//Serial.println("");
//Serial.print("Received packet of size ");
//Serial.println(packetSize);
//Serial.print("From ");
//IPAddress remote = UDP.remoteIP();
//for (int i =0; i < 4; i++)
//{
//Serial.print(remote[i], DEC);
//if (i < 3)
//{
//Serial.print(".");
//}
//}
//Serial.print(", port ");
//Serial.println(UDP.remotePort());
// read the packet into packetBufffer
UDP.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
//Serial.println("Contents:");
//int value = packetBuffer[0]*256 + packetBuffer[1];
//Serial.println(value);
Serial.println(packetBuffer);
// send a reply, to the IP address and port that sent us the packet we received
delay(50);
serialEvent();//w esp nie ma serialevent, ktos cos wie?
if(stringComplete)
{
UDP.beginPacket(UDP.remoteIP(), UDP.remotePort());
char *odpowiedz=serial_input;
UDP.write(odpowiedz);
stringComplete=false;
UDP.endPacket();
Serial.println("Wyslano i wyzerowano");
} else
{
UDP.beginPacket(UDP.remoteIP(), UDP.remotePort());
UDP.write(ReplyBuffer);
Serial.println("czy on to napierdala czaly czas?");
UDP.endPacket();
}
// turn LED on or off depending on value recieved
//digitalWrite(5,value);
}
delay(1);
}
//if(stringComplete)
//{
// UDP.beginPacket(UDP.remoteIP(), UDP.remotePort());
// char *odpowiedz=serial_input;
// UDP.write(odpowiedz);
// stringComplete=false;
// UDP.endPacket();
// Serial.println("Wyslano i wyzerowano");
//}
}
}
// connect to UDP – returns true if successful or false if not
boolean connectUDP(){
boolean state = false;
Serial.println("");
Serial.println("Connecting to UDP");
if(UDP.begin(localPort) == 1){
Serial.println("Connection successful");
state = true;
}
else{
Serial.println("Connection failed");
}
return state;
}
// connect to wifi – returns true if successful or false if not
boolean connectWifi(){
boolean state = true;
int i = 0;
#if (reczneIP)
WiFi.config(ip, dns, gateway, subnet); //only when IP static
#endif
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("Connecting to WiFi");
// Wait for connection
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (i > 10){
state = false;
break;
}
i++;
}
if (state){
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
else {
Serial.println("");
Serial.println("Connection failed.");
}
return state;
}
void serialEvent() {
while (Serial.available()>0) {
char aChar = Serial.read();
static byte index=0;
if(aChar == '\n')
{
// wykryto znak konca linii \n, koniec odbioru
serial_input[index] = 0;
index = 0;
stringComplete = true;
}
else
{
serial_input[index] = aChar;
if(index<(buffsize-1)) index++; //jesli napis bedzie dluzszy niz bufor to nadmiar leci w kosz
serial_input[index] = '\0'; // Na koncu napisu wstawiamy 0
}
}
}
Do ESP32 trzeba to sobie przepisać, jak w przykładzie z Telnet. Nie interesowało mnie co przyleci z UDP, bo tylko monitorowałem co robi ESP, ale jest to dalej, tylko zakomentowane.
Prawdę mówiąc to próbowałem skompilować dla ESP32 i wyszła lipa, rzuca się o składnie i konwersję zmiennych, wrzuciłem w Google pytanie o gotowca i też wysypuje błędy, mam najnowszy core, trochę w nim pomieszali i wiele rzeczy nie jest już tak proste jak kiedyś, a tu jest sprzed 5 lat: https://github.com/ajaybnl/UDP-SERIAL-FOR-ESP32-ESP8266- więc pewnie z core 1.x by działał.
RE: mostek wifi z esp32 zamiast przewodu uart-usb - oscarX - 10-05-2024
Kolega opisał WiFi, jeśli chodzi o BT to istnieją niedrogie konwertery UART-BT , można użyć pary by mieć serial-serial, albo z laptopa, telefonu, tabletu czy innego komputera wyposażonego w BT można też podłączyć od razu po BT.
Oczywiście zasięg malutki w porównaniu z WiFi.
RE: mostek wifi z esp32 zamiast przewodu uart-usb - Jarewa0606 - 10-05-2024
Esp bez anteny zewnętrznej też nie powala zasięgiem.
RE: mostek wifi z esp32 zamiast przewodu uart-usb - kaczakat - 10-05-2024
A to urządzenie z prostym dosem to co to w ogóle jest? Bo jak to jest jakiś RS232 to nie możesz tego podłączyć do ESP.
ESP można podłączyć do komputera tylko przez konwertery, albo USB-UART, albo RS232-UART, a jak tam jest jakiś prosty DOS, to może nie ma USB? Opisz to dokładniej.
Połączenie z HC-05 jest bardzo proste i działa do 10m, wystarczy skonfigurować moduły komendami AT, trzeba uważać by nie być za sprytnym i nie kupować jakiś "lepszych" modułów typu HC06 czy HM10, ale też nie jest to wprost do połączenia z jakimś DOS, to jest do połączenia dwóch UART 3.3-5V.
Z zasięgiem ESP to zależy, mam jakiś moduł ESP32 C3 super mini i on nie łapie zasięgu dalej niż metr, po kombinacjach i modyfikacji mocy z 6m, niemal identyczny z inną antenką ceramiczną działa od strzału na 10m, a Wemos MINI bez problemu wysyła dane z kurnika do routera przez ścianę i 10m. No a potem to te dane lecą już kilkadziesiąt metrów dalej po wewnętrznym LAN i dalej w świat, więc można mieć takie połączenie UART w obrębie zasięgu Internetu. Jest też ESP NOW, który spokojnie sięga na kilkadziesiąt m między ESP.
Edit.
No a zanim tu coś dokładni opiszesz, to zrobiłem test, bo mam innego laptopa z W10 i nie mam wielu programów, do ESP8266 wrzuciłem wprost przykład UDP z core ESP, mam jakiś 3.1.2, ściągnąłem Tibbo, wrzuciłem jakiś wirtualny port COM 31 na parametry ustawione w szkicu Arduino UDP, odpaliłem Putty, wskazałem COM31 i 115200,standardowe ustawienia, połączył, i wszystko leci w obie strony. Akurat putty wysyła każdą literkę od razu po wpisaniu, ale można w drugą stronę ustawić COM15 w Putty i wysyłać linie do UDP na COM31:
[attachment=1489]
[attachment=1490]
[attachment=1489]
A jeśli masz ten ESP8266 to możesz też wgrać gotowego ESPLINK do wirtualnych portów.
RE: mostek wifi z esp32 zamiast przewodu uart-usb - kaczakat - 11-05-2024
Napiszę w nowym poście, by nie robić taśmociągu. Po pierwszych testach dodałem odczyt uart, utworzyłem na drugim lapku w Tibbo port com po udp do 192.168.1.121:8888 i usunąłem wszystkie komentarze, wydruki informacyjne, teraz przylatuje w obie strony tylko to co wklepane w okno terminala Arduino. Putty wysyła od razu każdy znak, z terminala Arduino wygląda to lepiej:
[attachment=1492]
Kod: /*
UDPSendReceive.pde:
This sketch receives UDP message strings, prints them to the serial port
and sends an "acknowledge" string back to the sender
A Processing sketch is included at the end of file that can be used to send
and received messages for testing with a computer.
created 21 Aug 2010
by Michael Margolis
This code is in the public domain.
adapted from Ethernet library examples
*/
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#ifndef STASSID
#define STASSID "n"
#define STAPSK "n"
#endif
unsigned int localPort = 8888; // local port to listen on
// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1]; // buffer to hold incoming packet,
char ReplyBuffer[] = "acknowledged\r\n"; // a string to send back
#define buffsize 255
char serial_input[buffsize]; // buffer to hold outcoming packet,
bool stringComplete = false; // whether the string is complete
boolean udpConnected = false;
WiFiUDP Udp;
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(STASSID, STAPSK);
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
Serial.print("Connected! IP address: ");
Serial.println(WiFi.localIP());
Serial.printf("UDP server on port %d\n", localPort);
Udp.begin(localPort);
}
void loop() {
serialEvent();
// if there's data available, read a packet
int packetSize = Udp.parsePacket();
if (packetSize) {
// Serial.printf("Received packet of size %d from %s:%d\n (to %s:%d, free heap = %d B)\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort(), Udp.destinationIP().toString().c_str(), Udp.localPort(), ESP.getFreeHeap());
// read the packet into packetBufffer
int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
packetBuffer[n] = 0;
// Serial.println("Contents:");
Serial.println(packetBuffer);
udpConnected=1;
// send a reply, to the IP address and port that sent us the packet we received
// Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
// Udp.write(ReplyBuffer);
// Udp.endPacket();
}
if(udpConnected){
if(stringComplete)
{
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
char *odpowiedz=serial_input;
Udp.write(odpowiedz);
Udp.endPacket();
stringComplete=false;
// Serial.println("Wyslano i wyzerowano");
}
}
}
void serialEvent() {
while (Serial.available()>0) {
char aChar = Serial.read();
static byte index=0;
if(aChar == '\n')
{
// wykryto znak konca linii \n, koniec odbioru
serial_input[index] = 0;
index = 0;
stringComplete = true;
}
else
{
serial_input[index] = aChar;
if(index<(buffsize-1)) index++; //jesli napis bedzie dluzszy niz bufor to nadmiar leci w kosz
serial_input[index] = '\0'; // Na koncu napisu wstawiamy 0
}
}
}
Kod jest tak napisany, że klient musi coś wysłać, by server w ESP mógł zacząć co wysyłać, odpowiedzieć.
Ten kod już łatwo zmodyfikować też pod ESP32, wpadłem o co się pluł, w ESP32 używają do tekst print zamiast write, tu jest nie do pomyślenia by tą samą metodą wysłać zmienną 8 bitową, no i biblioteka do podmiany na WiFi.h, wgrałem na ESP32 C3 super mini i działa. No i dla ESP32 jest jeszcze biblioteka asyncUDp, przykład z klient/server, tu można wydłubać to samo.
RE: mostek wifi z esp32 zamiast przewodu uart-usb - medzie - 17-05-2024
Kod: #include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#define STASSID "hotspot"
#define STAPSK "haslo"
unsigned int localPort = 8888;
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1];
#define buffsize 255
char serial_input[buffsize];
bool stringComplete = false;
boolean udpConnected = false;
WiFiUDP Udp;
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(STASSID, STAPSK);
while (WiFi.status() != WL_CONNECTED) {
//Serial.print('.');
delay(500);
}
//Serial.print("Connected! IP address: ");
Serial.println(WiFi.localIP());
//Serial.printf("UDP server on port %d\n", localPort);
Udp.begin(localPort);
}
void loop() {
serialEvent();
int packetSize = Udp.parsePacket();
if (packetSize) {
int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
packetBuffer[n] = 0;
Serial.println(packetBuffer);
udpConnected = true;
}
if (udpConnected) {
if (stringComplete) {
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
char *odpowiedz = serial_input;
Udp.write(odpowiedz);
Udp.endPacket();
stringComplete = false;
}
}
}
void serialEvent() {
while (Serial.available() > 0) {
char aChar = Serial.read();
static byte index = 0;
if (aChar == '\n') {
serial_input[index] = 0;
index = 0;
stringComplete = true;
} else {
serial_input[index] = aChar;
if (index < (buffsize - 1)) index++;
serial_input[index] = '\0';
}
}
}
Wrzuciłam twój kod, śmigał na konfiguracji: laptop(putty) z fibbo(com) ->wifi-> esp8266 podłączone do pc w arduino ide
Dziś podłączyłam: laptop(putty) z fibbo(com) ->wifi-> esp8266 podłączone przez uart do płyty głównej(urządzenie) ,esp dodatkowo przez usbc przewodem zasilającym do prądu. esp8266 łączy się z hotspotem jak wcześniej, ale w tibbo monitorze wyskakują takie komunikaty:
Kod: 05/17/24 08:43:26 - COM10 (INFO): Established UDP connection with 192.168.222.62:8888
05/17/24 08:43:36 - COM10 (ERROR): "On-the-Fly" command for 192.168.222.62 - set baud rate to 115200 bps...timed out
05/17/24 08:43:36 - COM10 (WARNING): "On-the-Fly" settings disabled (until connection established or port opened next time)
05/17/24 08:49:19 - COM10 (INFO): UDP connection with 192.168.222.62:8888 closed (timed out)
połączenia esp: gnd-gnd 3v3-vcc tx-rx rx-tx
RE: mostek wifi z esp32 zamiast przewodu uart-usb - kaczakat - 17-05-2024
Dalej nie ma informacji co tam łączysz konkretnie, czy są zgodne napięcia, ESP pracuje na 3.3V, UART może być też na 5V, a RS232 to już w ogóle +-15V.
Może jest tam jakiś konflikt sprzętowy, może ESP się resetuje i dlatego traci połączenie. Możesz dodać miganie ledem na jakimś pinie gdy łączy się z wifi co 100ms, a potem w trakcie loop co 1s, oczywiście bez delay. Możesz też dodać sprawdzanie czy jest połączony z wifi, jak nie to ponowić próbę łączenia. No i tak na koniec to bym dodał jakiś WIFI manager, by nie ustawiać na sztywno w kodzie SSID, jak ESP znajduje znaną sieć to się do niej loguje, jak nie to stawia AP, można się do niego podłączyć i przeskanować okolicę, wybrać AP, podać hasło. Dla testów możesz też połączyć dwa ESP ze sobą, zrobić im dwa porty COM w Tibbo i pogadać między nimi, jednak jak podłączasz do laptopa to leci przez USB, konwerter UART.
RE: mostek wifi z esp32 zamiast przewodu uart-usb - medzie - 17-05-2024
(17-05-2024, 12:55)kaczakat napisał(a): Dalej nie ma informacji co tam łączysz konkretnie, czy są zgodne napięcia, ESP pracuje na 3.3V, UART może być też na 5V, a RS232 to już w ogóle +-15V.
Może jest tam jakiś konflikt sprzętowy, może ESP się resetuje i dlatego traci połączenie. Możesz dodać miganie ledem na jakimś pinie gdy łączy się z wifi co 100ms, a potem w trakcie loop co 1s, oczywiście bez delay. Możesz też dodać sprawdzanie czy jest połączony z wifi, jak nie to ponowić próbę łączenia. No i tak na koniec to bym dodał jakiś WIFI manager, by nie ustawiać na sztywno w kodzie SSID, jak ESP znajduje znaną sieć to się do niej loguje, jak nie to stawia AP, można się do niego podłączyć i przeskanować okolicę, wybrać AP, podać hasło. Dla testów możesz też połączyć dwa ESP ze sobą, zrobić im dwa porty COM w Tibbo i pogadać między nimi, jednak jak podłączasz do laptopa to leci przez USB, konwerter UART. Wybacz, jest to płyta główna od maszyny przemysłowej. wychodzą z niej piny(6), do których był podłączony ten przewód (https://www.tme.eu/Document/d35506873b14f725c7860a0579268c67/DS_TTL-232R_CABLES.pdf) - 11 strona. Po zmierzeniu pinów tylko na rx i tx było 3.3v a reszta 0. esp cały czas jest połączone. zrobiłam test - zamiast pinów od esp do płyty dałam z przejsciowką przewód uart-usb i połączenie było:
Kod: 05/17/24 12:58:46 - COM10 (INFO): VSP opened, transport=UDP(TDI), routing=client, remote=192.168.222.62:8888, connect=on data, OTF=disabled
05/17/24 12:59:05 - COM10 (INFO): Established UDP connection with 192.168.222.62:8888
ale nadal nie przesyłało lub nie odpowiada.
RE: mostek wifi z esp32 zamiast przewodu uart-usb - kaczakat - 17-05-2024
Może GND nie podłączone? No coś powoduje, że ESP przestaje działać i tracisz połączenie z Tibbo, nie wygląda to na problem z programem, skoro podłączony do innego urządzenia działa OK.
|