ESP32: gestire più seriali e logging per il debug – 3
Come puoi vedere nel diagramma di pinout, l’esp32 può avere più UART, alcuni sono segnati come RX2 e TX2.
Puoi trovare gli esp32 che uso in questo articolo su ESP32 Dev Kit v1 - TTGO T-Display 1.14 ESP32 - NodeMCU V3 V2 ESP8266 Lolin32 - NodeMCU ESP-32S - WeMos Lolin32 - WeMos Lolin32 mini - ESP32-CAM programmer - ESP32-CAM bundle - ESP32-WROOM-32 - ESP32-S
Noi andremo a verede un ESP32 DOIT DEV KIT v1
Ed un ESP32 sicuramente migliore come il WeMos LOLIN32.
Questi pin possono essere utilizzati per trasmettere le informazioni di debug di base o come una classica seriale nominata Serial2.
Per connetterti, naturalmente, devi usare un convertitore da USB a TTL, lo trovi a 1$.
Esiste un modulo FT232RL o FT232 più costoso, ma un CH340G o un CH340 funzionano molto bene.
Puoi trovare quello più economico qui su USB to TTL CH340G - USB to TTL FT232RL
Lo schema di connessione è molto semplice, qui per il DOIT DEV KIT v1
e qui per il WeMos LOLIN32
Esempio di uso
/*
* ESP32 DOIT DEV KIT v1 - ESP32 WeMos LOLIN32
* Debug on standard Serial and Serial2 on GPIO17 pin
* by Mischianti Renzo <https://mischianti.org>
*
* https://mischianti.org/
*
*/
#include "Arduino.h"
void setup()
{
Serial.begin(9600);
Serial2.begin(9600);
}
int i = 0;
void loop()
{
i++;
Serial.print("Hi, I'm Serial on standard TX RX pin! --> ");
Serial.println(i);
Serial2.print("Hi, I'm Serial2 on GPIO17! --> ");
Serial2.println(i);
delay(1000);
}
Qui il monitor seriale su standard UART (connessione USB).
Hi, I'm Serial on standard TX RX pin! --> 1
Hi, I'm Serial on standard TX RX pin! --> 2
Hi, I'm Serial on standard TX RX pin! --> 3
Hi, I'm Serial on standard TX RX pin! --> 4
Qui la Serial2 (USB to TTL converter).
Hi, I'm Serial2 on GPIO17! --> 1
Hi, I'm Serial2 on GPIO17! --> 2
Hi, I'm Serial2 on GPIO17! --> 3
Hi, I'm Serial2 on GPIO17! --> 4
Debug delle funzioni di base del microcontrollore
È possibile attivare nel Tools --> Debug level
il livello di debug da impostare in fase di compilazione. Questo flag può attivare il logging di sistema di basso livello, il livello è
- None
- Error
- Warn
- Info
- Debug
- Verbose
Li scrivo in ordine gerarchico, quindi se selezioni None, non vengono visualizzati i registri, se selezioni Verbose vengono visualizzati tutti i registri.
Ma impostare il livello di debug di base non è sufficiente, devi abilitare il log sulla tua seriale:
Serial2.setDebugOutput(true);
Poi puoi usare questa funzionalità per il tuo progetto, con i comandi di log di sistema, uno per ogni livello:
log_v("Verbose");
log_d("Debug");
log_i("Info");
log_w("Warning");
log_e("Error");
Di seguito un semplice sketch per testarli:
/*
* ESP32 DOIT DEV KIT v1 - ESP32 WeMos LOLIN32
* Debug on standard Serial and Serial2 on GPIO17 pin
* And logging on Serial2
* You must set log level on option of your IDE
* by Mischianti Renzo <https://mischianti.org>
*
* https://mischianti.org/
*
*/
#include "Arduino.h"
#include <WiFi.h>
#define STA_SSID "<YOUR-SSID>"
#define STA_PASS "<YOUR-PASSWD>"
#include "esp32-hal-log.h"
void setup() {
Serial.begin(9600);
Serial2.begin(9600);
Serial2.setDebugOutput(true);
Serial2.println("START WIFI");
WiFi.begin(STA_SSID, STA_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial2.print(".");
}
Serial2.println("");
Serial2.println("WiFi connected");
Serial2.println("IP address: ");
Serial2.println(WiFi.localIP());
delay(1000);
}
int i = 0;
void loop() {
i++;
Serial.print("Hi, I'm Serial on standard TX RX pin! --> ");
Serial.println(i);
delay(100);
Serial2.print("Hi, I'm Serial2 on GPIO17! --> ");
Serial2.println(i);
delay(1000);
log_v("Verbose");
log_d("Debug");
log_i("Info");
log_w("Warning");
log_e("Error");
delay(5000);
}
Quindi se compili e carichi lo sketch con il livello di log impostato su Info ottieni questo risultato su Serial e Serial2
START WIFI
.
WiFi connected
IP address:
192.168.1.168
Hi, I'm Serial on standard TX RX pin! --> 1
Hi, I'm Serial2 on GPIO17! --> 1
[I][esp32_serial_serial2_log_test.ino:50] loop(): Info
[W][esp32_serial_serial2_log_test.ino:51] loop(): Warning
[E][esp32_serial_serial2_log_test.ino:52] loop(): Error
Hi, I'm Serial on standard TX RX pin! --> 2
Hi, I'm Serial2 on GPIO17! --> 2
[I][esp32_serial_serial2_log_test.ino:50] loop(): Info
[W][esp32_serial_serial2_log_test.ino:51] loop(): Warning
[E][esp32_serial_serial2_log_test.ino:52] loop(): Error
Ma se carichi uno sketch con impostato Verbose :
START WIFI
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 0 - WIFI_READY
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:337] _eventCallback(): Event: 7 - STA_GOT_IP
[D][WiFiGeneric.cpp:381] _eventCallback(): STA IP: 192.168.1.168, MASK: 255.255.255.0, GW: 192.168.1.1
.
WiFi connected
IP address:
192.168.1.168
Hi, I'm Serial on standard TX RX pin! --> 1
Hi, I'm Serial2 on GPIO17! --> 1
[V][esp32_serial_serial2_log_test.ino:48] loop(): Verbose
[D][esp32_serial_serial2_log_test.ino:49] loop(): Debug
[I][esp32_serial_serial2_log_test.ino:50] loop(): Info
[W][esp32_serial_serial2_log_test.ino:51] loop(): Warning
[E][esp32_serial_serial2_log_test.ino:52] loop(): Error
Hi, I'm Serial on standard TX RX pin! --> 2
Hi, I'm Serial2 on GPIO17! --> 2
[V][esp32_serial_serial2_log_test.ino:48] loop(): Verbose
[D][esp32_serial_serial2_log_test.ino:49] loop(): Debug
[I][esp32_serial_serial2_log_test.ino:50] loop(): Info
[W][esp32_serial_serial2_log_test.ino:51] loop(): Warning
[E][esp32_serial_serial2_log_test.ino:52] loop(): Error
Puoi vedere che ci sono anche i log di debug della funzione core WiFi marcati con [D]
, questo perché sono impostati sulla libreria WiFi.
Grazie
- ESP32: piedinatura, specifiche e configurazione dell’Arduino IDE
- ESP32: fileSystem integrato SPIFFS
- ESP32: gestire più seriali e logging per il debug
- ESP32 risparmio energetico pratico
- ESP32 risparmio energetico pratico: gestire WiFi e CPU
- ESP32 risparmio energetico pratico: modem e light sleep
- ESP32 risparmio energetico pratico: deep sleep e ibernazione
- ESP32 risparmio energetico pratico: preservare dati al riavvio, sveglia a tempo e tramite tocco
- ESP32 risparmio energetico pratico: sveglia esterna e da ULP
- ESP32 risparmio energetico pratico: sveglia da UART e GPIO
- ESP32: filesystem integrato LittleFS
- ESP32: filesystem integrato FFat (Fat/exFAT)
- ESP32-wroom-32
- ESP32-CAM
- ESP32: ethernet w5500 con chiamate standard (HTTP) e SSL (HTTPS)
- ESP32: ethernet enc28j60 con chiamate standard (HTTP) e SSL (HTTPS)
- Come usare la scheda SD con l’esp32
- esp32 e esp8266: file system FAT su memoria SPI flash esterna
- Gestione aggiornamenti firmware e OTA
- Gestione del firmware
- Aggiornamento OTA con Arduino IDE
- Aggiornamento OTA con browser web
- Aggiornamenti automatici OTA da un server HTTP
- Aggiornamento del firmware non standard
- Integrare LAN8720 con ESP32 per la connettività Ethernet con plain (HTTP) e SSL (HTTPS)
- Collegare l’EByte E70 (CC1310) ai dispositivi ESP32 c3/s3 ed un semplice sketch di esempio
- ESP32-C3: piedinatura, specifiche e configurazione dell’IDE Arduino
- Integrazione del modulo W5500 su ESP32 con Core 3: supporto nativo ai protocolli Ethernet con SSL e altre funzionalità
- Integrazione del modulo LAN8720 su ESP32 con Core 3: supporto nativo del protocollo Ethernet con SSL e altre funzionalità.
Ciao e grazie per i tuoi preziosi tutorial su ESP32!
Volevo solo dirti che c’e’ un errore sul primo sketch all’inizio, un typo, i 2 Serial1.print dentro al loop dovrebbero essere dei Serial2.print.
Io invece sto cercando di capire bene come gestire un sensore pluviometro (quanta pioggia è caduta?) con un ESP32…
In teoria per tutti gli altri sensori (anemometro, direzione vento, pressione, temperatura ecc…) basta che ogni tot minuti li misuri e li riporti via mosquitto, ma il pluviometro è una rogna, quello viaggia da se, o meglio deve attivarmi un risveglio dell’ESP32 ogni volta che viene ‘svuotato’ il contenitore e poi riaddormentarsi, mi sa che dovrò usare lo SPIFFS per memorizzare una coda dei valori rilevati e questa coda dovrà essere esaminata successvamete quando verranno inviati tutti gli altri valori rilevati dai sensori, che dici ? suggerimenti?
Ciao e complimenti ancora!
Grazie Stefano,
per il pluviometro puoi fare come dici tu, ad ogni risveglio invii il messaggio (o salvi sulla flash o EEPROM), non credo che si riempia in continuazione.
Oppure puoi usare un attyni o simili con un consumo minimo che salva il tutto nell’EEPROM.
Altra soluzione è usare l’ULP (sarebbe l’ottimo), ma è veramente poco user friendly.
Ciao Renzo