Curiosity
LilyGO T-SIM7080G S3 ($36.02): all-in-one battery-tracker dev board SIM7080G NB-IoT/Cat-M + ESP32-S3 (PSRAM) + AXP2101 PMIC + TF card + STEMMA QT. Form factor βstickβ ~110Γ30 mm. Vincitore bench Visla per Visla Tag battery-powered NB-IoT (memo project_sim7080g_lilygo_winner.md).
πΊοΈ Pinout completo
Modem SIM7080G β ESP32-S3 (pinout UFFICIALE da repo LilyGO)
| Funzione | ESP32-S3 GPIO |
|---|---|
| PWRKEY | 41 |
| TXD (ESP32 β Modem RX) | 5 β |
| RXD (ESP32 β Modem TX) | 4 β |
| DTR | 42 |
| RI | 3 |
β οΈ CORREZIONE 2026-06-06: precedente pinout della card (17/18 modem, 25 DTR) era SBAGLIATO β quelle sono pin Camera (Reset=18, VSYNC=16, HREF=17). Pinout corretto verificato da github.com/Xinyuan-LilyGO/LilyGo-T-SIM7080G/examples/ATDebug/utilities.h.
AXP2101 PMU β ESP32-S3 (I2C)
| Funzione | ESP32-S3 GPIO |
|---|---|
| SDA | 15 |
| SCL | 7 |
| IRQ | 6 |
PMU rail assignments (β οΈ FIX VISLA)
| Rail | Factory default | FIX Visla | Per |
|---|---|---|---|
| DC3 (modem main VBAT) | 3.0V | 3.0V keep | Range AXP2101 = 2.7-3.4V (3.7V era invalido!) |
| BLDO1 (level shifter) | 3.3V | 3.3V | Logic 3.3V/1.8V |
β οΈ Lo sketch factory imposta DC3=3.0V β modem registra solo NB-IoT B20 (segnale forte 800 MHz), NON registra Cat-M B3 (sensibilitΓ RX ridotta). Fix bench Visla 2026-06-06: DC3=3.7V via XPowersLib. Sketch in test-moduli/lilygo-t-sim7080g-s3/.
STEMMA QT / Qwiic (JST-SH 4-pin)
| Pin | ESP32-S3 GPIO |
|---|---|
| PWR | 41 |
| DTR | 42 |
| RI | 3 |
| RXD | 4 |
| TXD | 5 |
β οΈ Attenzione: il connettore JST-SH STEMMA QT/Qwiic Γ¨ UART, NON I2C standard! u-blox MAX-M10S Qwiic (I2C) NON funziona direttamente. Memo per cablaggio custom.
TF Card slot (SPI)
| Funzione | ESP32-S3 GPIO |
|---|---|
| CMD | 39 |
| CLK | 38 |
| DATA | 40 |
Camera PIN (opzionale, per OV camera)
Reset=18, XCLK=08, SIOD=02, SIOC=01, VSYNC=00, HREF=48, PCLK=12, CMYK=β1 Y2-Y9: 09/10/11/13/12/06/07/05
Switch + Button
- Switch: 1=Reset 2=Boot 3=PWR 4=SIM-BOOT
- Button: programmabile (GPIO 0)
π Breakout headers 16-pin (verificato silkscreen 2026-06-06)
Riga inferiore del breakout sul lato destro del PCB:
DC1 β DC1 β IO1 β IO2 β TXD β RXD β IO37 β IO36 β IO35 β IO0 β IO45 β IO48 β IO47 β IO21 β GND β VSYS
Significato pin:
DC1= PMU_DCDC1 = rail 3.3V principale (alimenta ESP32-S3 e logica)IO1= ESP32-S3 GPIO 1 (CAM_SCK / SCCB SCL)IO2= ESP32-S3 GPIO 2 (CAM_SDA / SCCB SDA)TXD/RXD= UART USB-CDC alternativoIO35/36/37= β οΈ OCCUPATI da Octal SPI / PSRAM β non usareIO0= boot strapping (button)IO45/47/48= GPIO LIBERI βIO21= GPIO LIBERO β (unico tra IO20-25 disponibile su ESP32-S3 WROOM-1)VSYS= batteria diretto (~3.7-4.2V)
β οΈ CRITICAL su ESP32-S3:
- IO19/IO20 = USB D-/D+: se usi
pinMode(19, OUTPUT)rompi il USB CDC β device sparisce! - IO22, IO23, IO24, IO25 NON ESISTONO sul WROOM-1 (non bonded out)
- IO32 NON ESISTE (sostituito da IO35+ per Octal SPI)
Foto silkscreen di riferimento: breakout-silkscreen.jpg
Specs tecniche
| Parametro | Valore |
|---|---|
| Modem | SIM7080G NB-IoT + Cat-M |
| MCU host | ESP32-S3 (8MB Flash + 8MB PSRAM) |
| PMIC | AXP2101 (Solar/USB charging, BAT monitoring) |
| Solar input | DC 4.4V ~ 6V |
| LiPo | esterno via MX1.25 (no holder onboard come T-A7670E) |
| Slot SIM | Nano-SIM |
| TF Card | sì, SPI |
| Antenne | LTE main IPEX + GNSS IPEX |
| Forma | stick ~100Γ25 mm |
| Switch | 4-position (Reset/Boot/PWR/SIM-BOOT) |
| Prezzo | $36.02 |
π§ͺ Bench-test Visla 2026-06-06
Test setup
- USB-C ESP32-S3 connesso al Mac
- SIM 1NCE inserita (ICCID 89882280666225121627)
- Antenna LTE collegata su IPEX MAIN
- Sketch passthrough USB-CDC β Serial1
Identificazione
- Manufacturer: SIMCom Ltd
- Model: SIM7080G
- Firmware: R1951B17 (+1 minor vs Waveshare 1951B16) π
- IMEI: 860016049553337
Risultati registrazione
| Tech | Risultato | Note |
|---|---|---|
| NB-IoT B20 Voda IT | β CSQ 25 (-65 dBm) RSRP -74 dBm | eccellente |
| Cat-M B3 1800 MHz | β no service | factory DC3=3.0V troppo basso |
| HTTP GET | β 200 OK | egress 18.193.152.39 (AWS Frankfurt 1NCE NAT) |
| PDP IP | 100.107.94.9 | CGNAT 1NCE |
Stesso modem, segnale +24 dB vs Waveshare HAT
Antenna LTE del LilyGO molto piΓΉ efficace del Waveshare HAT in zona Orvieto:
- LilyGO: -65 dBm CSQ 25 β
- Waveshare: -91 dBm CSQ 14
π Bench-test autonomia Visla 2026-06-08 β duty-cycle 30s
Setup
- LilyGO T-SIM7080G S3 base
- Qwiic chain: MAX-M10S GPS (0x42) + LSM6DS3 IMU (0x6A) su IO21/IO45
- FNB58 inline tra Mac PD e LilyGO USB-C (Bluetooth β localhost:5001)
- Tool:
visla-power-monitor - Sketch:
visla-v2-dutycycle-30s.ino - Pattern: wake β GPS poll + IMU read β ESP32 deep sleep 27s β ripete
Risultati 10 minuti = 20 cicli (21636 samples FNB58)
| Parametro | Valore |
|---|---|
| Voltaggio USB-C | 5.130 V stabile (range 5.115β5.136) |
| Corrente media | 16.4 mA (sleep 14.0, peak burst 71.6, Ο=6.6) |
| Potenza media | 84.0 mW |
| Energia totale | 14.02 mWh in 600s |
| Samples | 21636 (~36 Hz) |
Pattern observato
ESP32 deep sleep (27s) ββββββββββββββββββ 14.0 mA (sleep current)
Wake + boot + Qwiic init βββ 50-70 mA burst
GPS poll + parse NMEA ββ 35-45 mA
IMU read accel+gyro+temp β 35 mA
Serial log + flush + sleep β 30 mA
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ratio: ~10% del tempo a 50+ mA, ~90% a 14 mA
Confronto continuous vs duty-cycle 30s
| Config | Corrente media | LiPo 2000 mAh autonomia |
|---|---|---|
| LilyGO + Qwiic continuous (no sleep) | 41 mA | 49 h (2 giorni) |
| LilyGO duty-cycle 30s ESP32 deep sleep | 16.4 mA | 122 h (5.1 giorni) |
| Risparmio | β60% | +2.5Γ autonomia |
Autonomia stimata (sistema completo, duty-cycle 30s)
| LiPo | Autonomia | In giorni |
|---|---|---|
| 500 mAh | 30.6 h | 1.3 giorni |
| 1000 mAh | 61.2 h | 2.5 giorni |
| 2000 mAh (Visla v2 standard) | 122.3 h | 5.1 giorni |
| 5000 mAh (battery pack) | 305.8 h | 12.7 giorni |
π― Bottleneck identificato
I 14 mA in sleep current sono dominati dal MAX-M10S in continuous tracking (chip GPS resta sempre alimentato).
- ESP32-S3 deep sleep β 10 Β΅A (trascurabile) β
- AXP2101 PMU quiescent β 1 mA β
- MAX-M10S GPS continuous tracking β 12 mA β οΈ β qui il grosso
- LSM6DS3 IMU β 0.5 mA β
Tentativo PSMOO (UBX-RXM-PMREQ) β FALLITO 2026-06-08
Sketch visla-v2-dutycycle-30s-psmoo β invia UBX-RXM-PMREQ via I2C prima del deep sleep ESP32 per metter MAX-M10S in backup mode.
Risultato (10 min bench): β 50.7 mA media (vs 3-5 mA attesi)
| Config | Corrente media | Note |
|---|---|---|
| Continuous | 41 mA | tutto on |
| Duty-cycle 30s | 16.4 mA | ESP32 sleep, GPS continuous tracking |
| PSMOO attempt | 50.7 mA β οΈ | HIGHER than continuous! |
Diagnosi possibili (da debug prossima sessione):
- UBX-RXM-PMREQ checksum errato β chip ignora il comando
wakeup mask 0x08 (uartrx)triggerato da qualsiasi I2C activity β chip si auto-sveglia subito- ESP32 non sta entrando in deep sleep (qualcosa panica/loopa)
- MAX-M10S su Qwiic SparkFun non supporta backup mode via I2C
- Active time per ciclo cresciuto (gps_poll timeout 5000ms vs 2000ms del duty-cycle base)
Next session debug:
- Verifica serial output del sketch PSMOO (controllo ciclo deep sleep)
- Test PMREQ con checksum online verifier (e.g. https://www.u-blox.com/en/online-tool/ubx-decoder)
- Try UBX-CFG-VALSET con keys CFG-PM-OPERATEMODE (M10 native power management)
- Alternativa hardware: power-gate Qwiic rail via AXP2101 (se possibile senza brick)
- Test alternativo: ESP32 dorme 27s + accende GPS solo nei 3s attivi
- Considerare di switchare a sketch che disabilita Qwiic via PMU rail enable/disable
β οΈ Caveat noti
- USB direct modem (microUSB) non enumera su Mac β SimCom usa driver Qualcomm proprietary, solo Windows
- Factory DC3=3.0V β Cat-M B3 non registra. Fix β flash sketch custom DC3=3.7V
- STEMMA QT Γ¨ UART non I2C β Qwiic GPS I2C non funzionerΓ direttamente
- Boot mode richiede switch + BOOT button β vedi documentazione LilyGO
- VBAT modem letto via AT+CBC: deve essere β₯3700 mV per performance piena
𧬠Bench Visla 2026-06-09 β PoC end-to-end LilyGO β GKE decoder
Validato in produzione: pipeline completa dal modem fisico fino al cluster GKE Visla.
Stack provato
LilyGO T-SIM7080G S3 + 1NCE SIM
β NB-IoT B20 (Vodafone Italy)
β TCP 34.154.98.175:5050
GKE decoder-lb (LoadBalancer)
β
decoder-0 pod (Java + Netty + Spring)
β Gx02FrameDecoder (H02 parser)
RedisPositionAdapter
β
Redis cluster
Sequenza init testata (funzionante)
- AXP2101 PMU init (vedi memoria pinout β NON skippare!):
PMU.disableDC3(); delay(200); PMU.setBLDO1Voltage(3300); PMU.enableBLDO1(); // level shifter PMU.setDC3Voltage(3000); PMU.enableDC3(); // modem rail 3.0V PMU.setBLDO2Voltage(3300); PMU.enableBLDO2(); // GPS antenna - PWRKEY pulse: LOW 100ms β HIGH 1000ms β LOW
- AT handshake in <2s
- NB-IoT mode:
AT+CFUN=1+AT+CMNB=2(NB-IoT only) - Wait registration
AT+CGREG?(~30-90s) - PDP context APN
iot.1nce.net:AT+CGDCONT+AT+CNCFG+AT+CNACT=0,1 - TCP socket:
AT+CAOPEN=0,0,"TCP","34.154.98.175",5050 - Send H02 packet:
AT+CASEND+ payload*HQ,<id>,V1,<time>,A,<lat>,N,<lon>,E,...# - Read ACK:
AT+CARECVβ+CARECV: 36,*HQ,<id>,V4,V1,<srv_time>#
Risultato bench reale
TX dal modem:
*HQ,7777777777,V1,164530,A,4242.000,N,01206.000,E,000.0,000,090626,FFFFFFFF#
RX da decoder GKE:
*HQ,7777777777,V4,V1,20260609145434# β ACK timestampato server-side
Logs decoder GKE confirm:
Sessione creata β device 7777777777
Presenza online pubblicata β Redis pub
Gx02FrameDecoder: V1 parsed
Posizione decodata: lat=42.7 lon=12.1 valid=true
Pubblicata su Redis (protocol="visla1")
Timing cold-start misurati
| Fase | Durata |
|---|---|
| AXP2101 init | <500ms |
| Modem power-on + boot | ~5s |
| AT handshake | 1-2s |
| Network registration NB-IoT | 30-90s (cellulare) |
| PDP context activation | 2-5s |
| TCP socket open | 1-3s |
| H02 packet + ACK | ~200ms |
| Totale cold-start β position published | ~60-100s |
Insights per Visla Tag NB-IoT
- β 1NCE SIM funziona su Vodafone IT NB-IoT B20 (multi-operator EU SIM viable)
- β
AXP2101 init Γ¨ MANDATORY β senza
enableDC3()il modem rail Γ¨ OFF (lezione persa+ritrovata oggi) - β Backend Visla agnostic protocollo β supporta giΓ H02/Gx02, S21L, JT808 senza modifiche
- β Cold-start ~60-90s dominato da NB-IoT registration (rete, non device)
- β TCP raw vince su MQTT per battery: ~30 byte/msg vs 80 byte
- β οΈ Plain TCP non cifrato β security upgrade TLS roadmap necessario
- π― Sub-100s + PSM datasheet 3.2Β΅A = combinazione winner per Visla Tag
π§ Firmware tests (cliccabili)
Tutti gli sketch validati sul bench, con codice e specs.
Path nel repo: test-moduli/lilygo-t-sim7080g-s3/
π₯ firmware-test-1: GPS nativo SimCom + H02 β Visla GKE Β· β Done Β· 2026-06-09
Cosa fa
Sketch end-to-end completo che:
- Inizializza AXP2101 (DC3 3.0V modem + BLDO1 3.3V level shifter + BLDO2 3.3V GPS antenna)
- Accende modem SIM7080G via PWR_KEY pulse
- Si registra su NB-IoT (Voda IT B20 / 1NCE SIM)
- Attiva PDP context APN
iot.1nce.net - Accende GNSS interno del SIM7080G (
AT+CGNSPWR=1) - Apre TCP socket verso decoder GKE Visla (
34.154.98.175:5050) - Trasmette H02 packet ogni 30s con coords:
- π°οΈ GPS reale quando fix disponibile (status
A) - π‘ Coords finte Orvieto fallback (status
V)
- π°οΈ GPS reale quando fix disponibile (status
- Riceve V4 ACK dal decoder
- Auto-reconnect se socket TCP cade
Specs bench testato
| Metrica | Valore |
|---|---|
| Cold-start to first position | ~60-100s |
| GPS Time-to-First-Fix (outdoor) | ~30-60s |
| GPS sensitivity (datasheet) | -147 dBm |
| Satelliti tracking (Orvieto outdoor) | 5-8 |
| Constellation | GPS + GLONASS |
| RSSI cellulare (CSQ 13/31) | ~ -91 dBm |
| ACK latency H02 β V4 | <200ms |
| Consumo medio | ~55 mA (no PSM ancora) |
| Autonomia stimata (1000 mAh) | ~18 ore (cap. ridotta senza sleep) |
Esempio packet H02 catturato
π°οΈ *HQ,7777777777,V1,163232,A,4243.0469,N,01206.4717,E,000.0,0,090626,FFFFFFFF#
sats=5 alt=326m speed=0.0km/h
ACK ricevuto:
*HQ,7777777777,V4,V1,20260609162345#
Pinout usato
#define I2C_SDA 15 // AXP2101 PMU
#define I2C_SCL 7 // AXP2101 PMU
#define MODEM_PWRKEY 41 // Modem power button
#define MODEM_DTR 42 // Modem DTR
#define MODEM_RX 4 // ESP32 RX β modem TX
#define MODEM_TX 5 // ESP32 TX β modem RX
Pro
- β Integrato (1 chip cellular+GPS = BOM ridotta)
- β AT command set ben documentato
- β Tempo dev veloce
- β Antenna GPS condivisibile (uFL/SMA)
Contro
- β Solo GPS+GLONASS (no Galileo, no BeiDou)
- β SensibilitΓ -147 dBm (vs u-blox MAX-M10S -167 dBm)
- β Indoor difficile
- β Update rate fisso 1Hz
- β GPS legato al modem (off insieme)
- β A-GPS comando ritorna ERROR su revision corrente
Codice completo
π firmware-test-1-gps-simcom-only.ino su GitHub (~370 righe)
π README dettagliato
Flash command
# Compile
arduino-cli compile \
--fqbn "esp32:esp32:esp32s3:USBMode=hwcdc,CDCOnBoot=cdc,PSRAM=opi,FlashSize=16M,PartitionScheme=app3M_fat9M_16MB" \
firmware-test-1-gps-simcom-only.ino
# Upload
arduino-cli upload \
--fqbn "esp32:esp32:esp32s3:USBMode=hwcdc,CDCOnBoot=cdc,PSRAM=opi,FlashSize=16M,PartitionScheme=app3M_fat9M_16MB" \
-p /dev/cu.usbmodem101 \
firmware-test-1-gps-simcom-only.ino
π₯ firmware-test-2: WiFi AP + web dashboard debug Β· β Done Β· 2026-06-10
Cosa fa (vs test-1)
Identico al test-1 + aggiunge WiFi Access Point + dashboard web per debug live senza USB.
Procedura test (smartphone)
- Connetti smartphone al WiFi
visla-lilygo(passwordvisla1234) - Apri browser β http://192.168.4.1
- Vedi dashboard live auto-refresh ogni 1.5s
Dashboard mostra
- π Modem: status, RSSI con colore, IMEI, operator, PDP, IP
- π°οΈ GPS: fix status, sats counter, lat/lon, alt, speed, link Google Maps
- π TCP: socket status, packets sent, ACK received, success rate, last packet, last ACK, countdown next send
- π₯οΈ Sistema: uptime, free RAM, device ID
- β οΈ Errori: box rosso quando qualcosa va male
Use cases
| Scenario | Vantaggio |
|---|---|
| Test antenna GPS outdoor | Sats salgono live, fix β mappa cliccabile |
| Debug RSSI cellular | Spostati, RSSI cambia in tempo reale |
| Field troubleshooting | Cliente: screenshot dashboard, mandami |
| Verify decoder ACK | Sent count == ACK count? |
Specs
| Aspetto | test-1 | test-2 |
|---|---|---|
| Flash size | 368 KB | 988 KB (+620 KB WiFi) |
| RAM | 24 KB | 48 KB |
| Consumo extra | - | ~80 mA WiFi AP |
Codice
π firmware-test-2-wifi-debug.ino su GitHub
π README dettagliato
Endpoints HTTP
| Path | Returns |
|---|---|
/ | HTML dashboard auto-refresh |
/status | JSON full state (per scripting) |
Feature extra (bench 2026-06-10)
- π‘ Tech display LTE-M vs NB-IoT live (
AT+CPSI?) + banda - π Batteria LiPo % + V + charging (AXP2101 ADC)
- π OTA flash via WiFi (ArduinoOTA, no USB) β validato anche a -96 dBm
- π°οΈ GPS timestamp reale dai satelliti
π§ͺ Finding sul campo (importanti per Visla)
| Finding | Dettaglio |
|---|---|
| π΄ LTE-M assente a Orvieto | CMNB=1 β No service indoor+outdoor. Voda IT = solo NB-IoT B20 |
| π΄ NB-IoT TCP socket fantasma | NAT operatore droppa idle in 10-30s; CASTATE inaffidabile β app offline. Soluzione: UDP |
| π‘ Web server bloccante | AT lunghe freezano dashboard/OTA β serve refactor non-bloccante |
| β GPS outdoor | 14 sat, fix solido |
| β OTA WiFi | Affidabile, flash da remoto |
π firmware-test-3: GPS u-blox MAX-M10S via Qwiic + H02 Β· TODO
Obiettivo
Stessa pipeline di test-1 ma usando u-blox MAX-M10S esterno via Qwiic I2C invece del GNSS interno SIM7080G. Confronto diretto sensibilitΓ + TTFF + constellation.
Setup hardware previsto
- u-blox MAX-M10S Qwiic breakout (SparkFun)
- Cavo Qwiic β Dupont per attaccare ai pin neri LilyGO
- I2C address default
0x42 - Library Arduino:
SparkFun_u-blox_GNSS_Arduino_Library v3
Cosa misureremo vs test-1
| Metrica | SIM7080G interno | u-blox MAX-M10S |
|---|---|---|
| TTFF cold start | 30-60s | ~30s atteso |
| Sensibility | -147 dBm | -167 dBm (20 dB meglio) |
| Constellation | GPS + GLONASS | GPS+GLONASS+Galileo+BeiDou |
| Sats visible (Orvieto) | 5-8 | 12-20 atteso |
| Update rate | 1 Hz fisso | fino a 25 Hz |
| Consumo | dipende dal modem | ~25 mA active, ~22Β΅A backup |
Pro u-blox attesi
- β Multi-constellation = +60% sat = fix piΓΉ stabile in urban canyon
- β Sensibility +20 dB = funziona indoor near-window
- β Update rate programmabile
- β Independent dal modem (puΓ² rimanere acceso in PSM)
Contro u-blox attesi
- β +β¬8 al BOM (vs β¬0 del integrato)
- β Antenna GPS extra serve (uFL su MAX-M10S)
- β Pin I2C dedicati (Qwiic occupato)
- β Library extra (1KB flash + 256 byte RAM)
π firmware-test-3: Hybrid GPS (SIM7080G + u-blox in parallelo) Β· Idea
A/B test live: entrambi i GPS attivi, packet H02 con coordinate del GPS con piΓΉ satelliti in quel momento, log diff in serial per analisi.
Use case: scoprire condizioni reali dove uno batte lβaltro (indoor near-window, urban canyon, tunnel, cielo libero).
π firmware-test-4: PSM (Power Saving Mode) battery test Β· Idea
Aggiungi AT+CPSMS=1 + AT+CGEREP=2,1 per deep sleep modem 5-15 min tra send.
Target: passare da 18 ore β 6 mesi+ autonomia (datasheet SIM7080G PSM = 3.2 Β΅A).
Misura realmente con FNB58 inline.
π firmware-test-5: TLS port 5051 con cert client Β· Idea
Migrazione da TCP plain (port 5050) a TLS cifrato (port 5051) usando AT commands AT+CSSLCFG.
Pre-requisito: cert client distinct per device generato dal backend Visla. Server-side: terminator TLS sul decoder-lb.
Security upgrade obbligatorio per production.