Buongiorno a tutti
Ancora una volta ho bisogno del vostro aiuto.
Ho da poco acquistato dei moduli WiFi ESP-01 per un progetto che richiede la trasmissione pressoché continua di dati tra dei client e un server (la base, un piccolo pc con un software ad hoc e router wifi connesso via cavo ethernet, riceve continuamente dati da ognuno dei client = tanti Arduino Mega dotati ognuno di un proprio modulo ESP-01).
Per trasmettere i dati, non faccio altro che effettuarne l'invio attraverso scritture sulla porta seriale 1 di Arduino, dirette al modulo WiFi, che funziona con dei comandi chiamati "AT", come ben saprete
Fin qui, nessun problema Ora, ciò che voglio che cercare di fare è effettuare una sorta di controllo su ciò che mi arriva in seriale dal modulo (cioè le varie response) per verificarne il corretto funzionamento ed intervenire in caso di problemi. Faccio un esempio per essere -spero- un po' piu' chiaro:
Un classico sistema per verificare il funzionamento del modulo è scrivere sulla seriale: AT e premere invio. Se tutto funziona correttamente, dopo un attimo il modulo dovrebbe rispondere OK.
Ora vengo al dunque: il modulo ha un funzionamento molto particolare perché lavora a 115200 baud e, inoltre, formatta le proprie risposte con un ritorno carrello e a capo \r\n ovvero l'opzione "entrambi" sul monitor seriale, diversamente non apparirà alcun dato sul monitor.
Ciò che vorrei fare, quindi, è creare un programma che mi vada a "selezionare" la parte di risposta del modulo, in grado quindi di far fronte a questa complessa formattazione che, per comodità, riepilogo di seguito:
AT
OK
Di seguito allego il codice (scopiazzato su internet) che utilizzo per scrivere e monitorare le risposte del modulo:
void setup()
{
Serial.begin(9600);
Serial1.begin(115200);
}
void loop()
{
while (Serial1.available()) {
Serial.write(Serial1.read());
}
while (Serial.available()) {
Serial1.write(Serial.read());
}
}
mentre questo è il codice che impiego per inviare comandi al modulo (senza monitorare le risposte):
void setup()
{
Serial.begin(9600);
Serial1.begin(115200); // your esp's baud rate might be different
//espSend("AT+RST\r\n",1000, DEBUG);
delay(3000);
espSend("AT+CIPMUX=0\r\n", 1000, DEBUG);
espSend("AT+CIPSTART=\"UDP\",\"0\",0,1336,2\r\n", 1000, DEBUG);
espSend("AT+CIPMUX=1\r\n", 1000, DEBUG);
espSend("AT+CIPSEND=0,5,\"192.168.0.255\",1336\r\n", 1000, DEBUG);
espSend("R1_UP", 1000, DEBUG);
}
void loop()
{
//LETTURA SERIALI
while (Serial1.available()) {
Serial.write(Serial1.read());
}
while (Serial.available()) {
Serial1.write(Serial.read());
}
}
String espSend(String command, const int timeout, boolean debug)
{
String response = "";
Serial1.print(command); // send the read character to the esp8266
long int time = millis();
while( (time+timeout) > millis())
{
while(Serial1.available())
{
// The esp has data so display its output to the serial window
char c = Serial1.read(); // read the next character.
response+=c;
}
}
if(debug)
{
Serial.print(response);
}
return response;
}
Il collegamento va eseguito in questo modo:
utilizzando un adattatore ESP collego il pin VCC a 5V, GND a ground, Rx e tx del modulo, in maniera invertita, rispettivamente a TX1 e RX1 di Arduino.
Ringrazio in anticipo tutti coloro i quali vorranno aiutarmi
Spero di essere stato chiaro ma se non lo fossi stato, vi chiedo di rispondere a questo post, elencando le vostre perplessità
Grazie ancora e buona giornata!