Grandezze come temperatura ed umidità variano lentamente nel tempo, quindi io non farei delle misure troppo ravvicinate, diciamo al massimo 1 ogni 5 minuti.
Per il resto del tempo mandi in deep sleep il microcontrollore e qui si apre tutto un capitolo:
Punto primo, per fare una stima che sia attendibile, devi misurare il consumo medio in corrente delle tue schede nelle condizioni di lavoro. Nell'ipotesi fatta sopra, serve fare una media del consumo durante il deep sleep ed una media durante la fase di wake-up e invio dei dati.
Tieni conto che i consumi reali delle schede di sviluppo, non sono solo quelli della MCU, ma devi considerare anche tutto il resto (flash, convertitore USB/TTL, regolatore di tensione etc)
Per farti un'idea, in deep sleep l'ESP32 "da solo" consuma circa 10 uA stando alle informazioni del datasheet, ma una scheda tipo NodeMCU 32-S arriva invece fino a 5-8 mA ovvero 500-800 volte di più.
Io ti consiglierei di usare una scheda basata su ESP32-C3 che ha tutto quello che ti serve ed è il più parsimonioso della famiglia ESP32. Ad esempio per la Seeed Studio XIAO ESP32C3 vengono dichiarati 43uA (inoltre ha anche l'integrato per la ricarica della batteria a bordo, che però credo sia adatto solo per le LiPo).
Per quanto riguarda il BLE, è un'ottima scelta per mantenere bassi i consumi però io adotterei un accorgimento che secondo me ti farebbe ridurre drasticamente consumi e tempi necessari per l'invio dei dati.
Il protocollo di comunicazione BLE prevede che per comunicare tra dispositivi sia necessario stabilire una connessione secondo questa sequenza di funzionamento:
- il dispositivo "peripheral" quando non connesso invia ciclicamente dei pacchetti di "advertising" che espongono alcune informazioni chiave.
- il dispositivo "central" fa lo scan e, quando individua queste trasmissioni, da inizio alla procedura di connessione.
- a connessione avvenuta, il peripheral smette di fare advertising.
Tutto questo handshake richiede del tempo e inoltre quando l'ESP32 va in deep sleep, la connessione viene interrotta e la volta successiva devi rifare tutto dall'inizio.
I pacchetti di advertising però, possono contenere anche dei dati custom detti "manufacturer data" in cui potresti inserire i tuoi valori di temperatura e umidità aggiornati e magari anche il livello della batteria.
Il peripheral si sveglia dal deep sleep, legge i valori dei sensori, invia 3/4 volte il pacchetto di avertising e poi torna immediatamente in sleep.
Dall'altra parte il central rimarrebbe sempre in ascolto di questi pacchetti filtrandoli ad esempio usando il nome o qualche altra caratteristica.
Se la batteria non eccede i 3.6V come nel capo della LiFePO4, puoi entrare direttamente sul pin 3.3V e bypassare il regolatore di tensione.