Curiosity
Diymore “ESP32-S3 Screw Terminal Kit” (€21.59 su Amazon Business — 2 pezzi): bundle che include il modulo ESP32-S3 DevKitC-1 N16R8 (clone diymore della scheda Espressif ufficiale) + shield breakout con 44 morsetti a vite verdi. Risolve in modo definitivo il problema “fili Dupont che scappano” del banco Visla — avvitare le 8 connessioni del CC1101 EBYTE, le 5 dello SIM7080G HAT Waveshare, o le 3 del RXB6 e non doverle più ricontrollare.
Modello PCB su retro shield: S6483R_Y34_240506 (FACD0008-001 / -002 / -003).
Specs core:
- Chip: ESP32-S3-WROOM-1-N16R8 (Xtensa LX7 dual-core @ 240 MHz)
- Flash: 16 MB QSPI
- PSRAM: 8 MB octal (più del 7080G S3 LilyGO 8 MB)
- USB-C: 2 porte (D+/D- USB-OTG nativo su IO19/IO20 + UART CP210x per debug)
- Power: USB-C 5V o jack DC 2.1 mm 6.5-9V
- Wi-Fi: 802.11 b/g/n 2.4 GHz · Bluetooth LE 5.0 + Mesh
- Antenna: PCB integrata + connettore IPEX/U.FL per esterna
- RGB LED user su IO48 + builtin LED su IO38
🗺️ Pinout completo
Lato sinistro (22 morsetti, dall’alto)
| Morsetto | GPIO | Funzioni speciali | Note |
|---|---|---|---|
| 3.3V | — | Power | 3.3V regolato (da LDO interno) |
| 3.3V | — | Power | duplicato per distribuire alimentazione |
| RST | — | Reset hardware | tieni low per reset MCU |
| IO4 | GPIO 4 | Touch4 · ADC1_3 · RTC GPIO4 | wake-on-touch capable |
| IO5 | GPIO 5 | Touch5 · ADC1_4 · RTC GPIO5 | |
| IO6 | GPIO 6 | Touch6 · ADC1_5 · RTC GPIO6 | |
| IO7 | GPIO 7 | Touch7 · ADC1_6 · RTC GPIO7 | |
| IO15 | GPIO 15 | Touch12 · RXD1 · RTC0 · ADC2_4 | UART1 RX disponibile |
| IO16 | GPIO 16 | AL_32K_N · TXD1 · CTS0 · ADC2_5 | UART1 TX |
| IO17 | GPIO 17 | TXD1 (alt) · ADC2_6 · RTC GPIO17 | |
| IO18 | GPIO 18 | CLK_OUT3 · RXD1 (alt) · ADC2_7 | clock output |
| IO8 | GPIO 8 | SDA I2C · Touch8 · ADC1_7 | I2C standard Visla |
| IO3 | GPIO 3 | JTAG · Touch3 · ADC1_2 · RTC GPIO3 | strapping pin |
| IO46 | GPIO 46 | LOG (strapping ROM message) | strapping pin |
| IO9 | GPIO 9 | SCL I2C · FSPIHD · Touch9 · ADC1_8 | I2C standard Visla |
| IO10 | GPIO 10 | FSPIIO4 · FSPI CS · Touch10 · ADC1_9 | SPI CS default |
| IO11 | GPIO 11 | FSPIIO5 · FSPI MOSI · Touch11 · ADC2_0 | SPI MOSI default |
| IO12 | GPIO 12 | FSPIIO6 · FSPI SCK · Touch12 · ADC2_1 | SPI SCK default |
| IO13 | GPIO 13 | FSPIIO7 · FSPI MISO · Touch13 · ADC2_2 | SPI MISO default |
| IO14 | GPIO 14 | FSPIWP · FSPIDQS · Touch14 · ADC2_3 | |
| 5V | — | Power | direttamente da USB-C VBUS |
| GND | — | Ground |
Lato destro (22 morsetti, dall’alto)
| Morsetto | GPIO | Funzioni speciali | Note |
|---|---|---|---|
| GND | — | Ground | |
| TX | GPIO 43 | UART0 TX (U0RXD/TXD0) | console seriale debug |
| RX | GPIO 44 | UART0 RX (U0TXD/RXD0) | console seriale debug |
| IO1 | GPIO 1 | Touch1 · ADC1_0 · RTC GPIO1 | |
| IO2 | GPIO 2 | Touch2 · ADC1_1 · RTC GPIO2 | |
| IO42 | GPIO 42 | MTMS (JTAG) | strapping pin |
| IO41 | GPIO 41 | CLK_OUT1 · MTDI | |
| IO40 | GPIO 40 | CLK_OUT2 · MTDO | |
| IO39 | GPIO 39 | MTCK · MICK | strapping pin |
| IO38 | GPIO 38 | BUILTIN LED · FSPIWP | LED user-controllable |
| IO37 | GPIO 37 | SPI MISO OTG · FSPIQ · SPIDQS | |
| IO36 | GPIO 36 | SPI SCK OTG · FSPICLK · SPIIO7 | |
| IO35 | GPIO 35 | SPI MOSI OTG · FSPID · SPIIO6 | |
| IO0 | GPIO 0 | BOOT (strapping) | tieni low per entrare in download mode |
| IO45 | GPIO 45 | VSPI · strapping | |
| IO48 | GPIO 48 | RGB LED · SPICLK_N | LED RGB onboard |
| IO47 | GPIO 47 | SPICLK_P | |
| IO21 | GPIO 21 | RTC GPIO21 | wake-up capable |
| IO20 | GPIO 20 | CTS · CLK_OUT1 · TXD2 · ADC2_9 · USB_D+ | UART2 TX o USB native |
| IO19 | GPIO 19 | RTS · CLK_OUT2 · RXD2 · ADC2_8 · USB_D- | UART2 RX o USB native |
| GND | — | Ground | |
| GND | — | Ground | duplicato |
🔧 Quick-wire per moduli Visla bench
CC1101 EBYTE E07-M1101D-SMA (radio 433 MHz)
| CC1101 | → Morsetto diymore | Funzione |
|---|---|---|
| VCC | 3.3V ⚠️ | MAX 3.6V — non 5V |
| GND | GND | |
| SCK | IO12 | FSPI SCK |
| MISO | IO13 | FSPI MISO |
| MOSI | IO11 | FSPI MOSI |
| CSN | IO10 | Chip select |
| GDO0 | IO4 | RX interrupt |
| GDO2 | IO5 | sync detect (opzionale) |
RXB6 / RXB14 (receiver 433 MHz OOK semplice)
| RXB6 | → Morsetto | Funzione |
|---|---|---|
| VCC | 5V | 4.5-5.5V |
| GND | GND | |
| DATA | IO2 | digital baseband |
3 fili totali, library RCSwitch decodifica EV1527/PT2262 nativa.
SIM7080G HAT Waveshare (modem NB-IoT)
| HAT pin | → Morsetto | Note |
|---|---|---|
| VCC | 5V | HAT è 5V tolerant |
| GND | GND | |
| TX (HAT → ESP) | IO15 | UART1 RX |
| RX (HAT ← ESP) | IO16 | UART1 TX |
| PWR | IO6 | momentary high per power on |
| RST | IO7 | active high reset |
I2C sensori (BME280, LSM6DS3TR-C STEMMA QT, OLED, BMP180)
| Sensor | → Morsetto |
|---|---|
| SDA | IO8 |
| SCL | IO9 |
| VCC | 3.3V |
| GND | GND |
⚠️ Gotchas importanti
- ⚠️ NON alimentare a 5V moduli a 3.3V (CC1101 friggi): controlla prima quale morsetto è 3.3V e quale 5V. I morsetti sono a coppia: 2× 3.3V in alto-sinistra, 1× 5V in basso-sinistra
- ⚠️ Strapping pins: IO0 (BOOT), IO3, IO45, IO46 — non usarli per device fissi durante reset, perché vengono campionati al boot e cambiano la modalità di avvio
- ⚠️ IO19 + IO20 condivisi con USB-OTG: se usi USB nativo dell’S3 (non solo CDC del CP210x), questi 2 GPIO sono bloccati. Per Visla v2 con USB-OTG riserva IO19/20
- ⚠️ IO35-IO37 usati internamente per QSPI flash/PSRAM (octal PSRAM N16R8 versione → usa anche più pin SPI internamente). Verifica datasheet ESP32-S3-WROOM-1U N16R8 prima di usarli — alcuni potrebbero non essere disponibili in realtà
- ⚠️ 2 porte USB-C: una è UART debug (CP210x), l’altra è USB-OTG nativo S3. Per programmare la prima volta usa la UART debug (più affidabile). Per upload veloce + AT passthrough → USB native
🧬 Bench Visla 2026-06-09 — lezioni dal debug CC1101
Sessione di 4 ore di debug col diymore + CC1101 EBYTE: scoperti diversi gotcha non-ovvi.
USBMode / CDCOnBoot decide DOVE va Serial
Il default Arduino ESP32 core 3.x è USBMode=hwcdc + CDCOnBoot=default → Serial sul USB nativo S3 (/dev/cu.usbmodemXXX). Ma per usare la porta CH9102 debug (/dev/cu.wchusbserialXXX), serve:
FQBN="esp32:esp32:esp32s3:FlashSize=16M,PartitionScheme=app3M_fat9M_16MB,PSRAM=opi,USBMode=default,CDCOnBoot=default"
Se sbagli, il flash riesce ma vedi solo silence sulla seriale (perché Serial.print va su un’altra porta).
Le 2 USB-C non sono intercambiabili per upload:
- UART debug (CH9102): serve
USBMode=default,CDCOnBoot=defaultper vedere log - USB-OTG nativo S3: serve
USBMode=hwcdc,CDCOnBoot=cdcper vedere log
SmartRC-CC1101-Driver-Lib freeza su ESP32-S3
La libreria popolare CC1101 si blocca in Init() su ESP32-S3 (loop infinito wait MISO low). Workaround: scrittura registri raw via SPIClass(FSPI). Vedi dettagli + config corretta nella pagina CC1101 EBYTE → sezione “Bench Visla 2026-06-09”.
WiFi + brownout con USB-OTG nativo
Quando il cavo USB è sulla porta USB nativa S3 (non sulla CH9102), l’alimentazione VBUS passa attraverso il chip S3 stesso → corrente disponibile minore di ~150 mA. WiFi WiFi.begin() in peak può fare brownout e cause:
- WiFi non si connette
- ESP32 si resetta in loop
MARC=0x00(CC1101 mai inizializzato perché setup early-exit)
Soluzione: usa la porta UART debug CH9102 per banco con WiFi attivo. Quella porta ha alimentazione USB diretta a VBUS senza intermediari.
Workflow ottimale Arduino-cli con diymore screw
# Flash + log via CH9102 (porta UART debug)
PORT=/dev/cu.wchusbserial5B790699921
FQBN="esp32:esp32:esp32s3:FlashSize=16M,PartitionScheme=app3M_fat9M_16MB,PSRAM=opi,USBMode=default,CDCOnBoot=default"
arduino-cli compile --fqbn "$FQBN" sketch_dir
arduino-cli upload -p "$PORT" --fqbn "$FQBN" sketch_dir
arduino-cli monitor -p "$PORT" -c baudrate=115200
Pattern affidabile setup()
void setup() {
Serial.begin(115200); delay(2000);
// 1. INIT HARDWARE LOCALE PRIMA (CC1101, sensori) — funziona anche senza WiFi
if (cc1101_init()) attachInterrupt(...);
// 2. WiFi DOPO, non-bloccante: se fallisce, continua comunque
WiFi.mode(WIFI_STA); WiFi.begin(SSID, PASS);
uint32_t t = millis() + 15000;
while (WiFi.status() != WL_CONNECTED && millis() < t) { delay(500); Serial.print("."); Serial.flush(); }
if (WiFi.status() == WL_CONNECTED) {
server.begin();
Serial.printf(">>> http://%s/ <<<\n", WiFi.localIP().toString().c_str());
} else {
Serial.println("[!] WiFi fail — continuo senza web server");
}
}
Garantisce che il banco hardware funzioni anche se la rete WiFi cade — utile per debug fisico via Serial.
🔗 Risorse
- 🛒 Amazon Business listing — €21.59 / 2 pezzi (ordine 2026-05-26)
- 📄 ESP32-S3-WROOM-1 datasheet — Espressif official
- 📖 ESP32-S3 DevKitC-1 Getting Started — Espressif (pinout identico a questo clone)
- 📖 RCSwitch library — decodifica EV1527/PT2262 su pin digitale
- 📖 ELECHOUSE CC1101 library — driver SPI completo