ESP32: gestire più seriali e logging per il debug – 3

Spread the love

ESP32 multiple Serial UART and Logging levels
ESP32 multiple Serial UART and Logging levels

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

esp32 dev kit pinout v1
esp32 dev kit pinout v1

Ed un ESP32 sicuramente migliore come il WeMos LOLIN32.

ESP32 WeMos LOLIN32 pinout
ESP32 WeMos LOLIN32 pinout

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.

CH340G Module It is my forced choice

Puoi trovare quello più economico qui su USB to TTL CH340G - USB to TTL FT232RL


FT232RL Module

Lo schema di connessione è molto semplice, qui per il DOIT DEV KIT v1

esp32 DOIT DEV KIT v1 Serial2 UART2 ttl to usb schema
esp32 DOIT DEV KIT v1 Serial2 UART2 ttl to usb schema

e qui per il WeMos LOLIN32

esp32 WeMos LOLIN32 Serial2 UART2 ttl to usb schema
esp32 WeMos LOLIN32 Serial2 UART2 ttl to usb schema

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.

ArduinoIDE esp32 log levels
ArduinoIDE esp32 log levels

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

  1. ESP32: piedinatura, specifiche e configurazione dell’Arduino IDE
  2. ESP32: fileSystem integrato SPIFFS
  3. ESP32: gestire più seriali e logging per il debug
  4. ESP32 risparmio energetico pratico
    1. ESP32 risparmio energetico pratico: gestire WiFi e CPU
    2. ESP32 risparmio energetico pratico: modem e light sleep
    3. ESP32 risparmio energetico pratico: deep sleep e ibernazione
    4. ESP32 risparmio energetico pratico: preservare dati al riavvio, sveglia a tempo e tramite tocco
    5. ESP32 risparmio energetico pratico: sveglia esterna e da ULP
    6. ESP32 risparmio energetico pratico: sveglia da UART e GPIO
  5. ESP32: filesystem integrato LittleFS
  6. ESP32: filesystem integrato FFat (Fat/exFAT)
  7. ESP32-wroom-32
    1. ESP32-wroom-32: flash, piedinatura, specifiche e configurazione dell’Arduino IDE
  8. ESP32-CAM
    1. ESP32-CAM: piedinatura, specifiche e configurazione dell’Arduino IDE
    2. ESP32-CAM: upgrade CamerWebServer con gestione della luce flash
  9. ESP32: ethernet w5500 con chiamate standard (HTTP) e SSL (HTTPS)
  10. ESP32: ethernet enc28j60 con chiamate standard (HTTP) e SSL (HTTPS)
  11. Come usare la scheda SD con l’esp32
  12. esp32 e esp8266: file system FAT su memoria SPI flash esterna
  13. Gestione aggiornamenti firmware e OTA
    1. Gestione del firmware
      1. ESP32: flash del firmware binario compilato (.bin)
      2. ESP32: flash del firmware e filesystem (.bin) con strumenti grafici
    2. Aggiornamento OTA con Arduino IDE
      1. Aggiornamenti OTA su ESP32 con Arduino IDE: filesystem, firmware e password
    3. Aggiornamento OTA con browser web
      1. Aggiornamenti OTA su ESP32 tramite browser web: firmware, filesystem e autenticazione
      2. Aggiornamenti OTA su ESP32 tramite browser web: caricamento in HTTPS (SSL/TLS) con certificato autofirmato
      3. Aggiornamenti OTA su ESP32 tramite browser web: interfaccia web personalizzata
    4. Aggiornamenti automatici OTA da un server HTTP
      1. Aggiornamento automatico Firmware OTA dell’ESP32 dal server
      2. Aggiornamento automatico Firmware OTA dell’ESP32 dal server con controllo della versione
      3. Aggiornamento automatico Firmware OTA dell’ESP32 in HTTPS (SSL/TLS) con certificato autofirmato affidabile
    5. Aggiornamento del firmware non standard
      1. Aggiornamento firmware e filesystem ESP32 dalla scheda SD
      2. Aggiornamento firmware e filesystem ESP32 con client FTP
  14. Integrare LAN8720 con ESP32 per la connettività Ethernet con plain (HTTP) e SSL (HTTPS)
  15. Collegare l’EByte E70 (CC1310) ai dispositivi ESP32 c3/s3 ed un semplice sketch di esempio
  16. ESP32-C3: piedinatura, specifiche e configurazione dell’IDE Arduino
  17. i2c esp32: gestione rete a 5v, 3.3v e interfaccia aggiuntiva
  18. […]

Spread the love

2 Risposte

  1. Stefano ha detto:

    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!

    • Renzo Mischianti ha detto:

      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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *