Jumping Jack Flash weblog

COVID-19 – Misurare temperatura corporea con accuratezza di +/-0.1°C – puntata 2

Posted in hardware by jumpjack on 22 maggio 2020

— IN AGGIORNAMENTO — PROGETTO IN CORSO —

E’ arrivato l’ultimo componente hardware necessario per il progetto: il ClosedCube breakout SHT35-D. Datasheet.

 

Quello che serve adesso per realizzare il progetto completo è:

Hardware

  • nuovo supporto stampato in 3d per il cinturino
    • ne ho stampato uno provvisorio tanto per provare, e funziona, ma non avendo tra  le mani la schedina SHT35 non potevo progettare quello definitivo, che contiene sia l’m5stickC che il sensore
    • FATTO; da mettere online il file 3d –>è sbagliato perchè l’ho predisposto per avere i pin dell’SHT sul lato dell’m5stickC col connettore lungo, ma i pin SDA/SCL sono sul connettore GROVE!
    • testare fissaggio del cinturino con perni in fil di ferro
  • connessione hardware tra sensore e m5stickC

M5stickC pinout

24/5/2020: FATTO. Connessione effettuata, sketch di prova funziona: vedo valori di temperatura e umidità sulla seriale; però ho dovuto cambiare da 0x44 a 0x45 l’indirizzo I2C del sorgente di esempio.

In compenso non vengono mostrati correttamente i valori float sul display, nonostante la copiatura dall’esempio “TFT_Float_Test.ino”

    • Esiste comunuque una libreria che permette di usare come pin I2C qualunque coppia di pin
    • L’alimentazione dell’SHT35 può essere sia 3.3V che  5V (max 5.5V), e la Vout della porta GROVE è 5V.
  • Altri pin utili:
    ESP32 GPIO10 GPIO9 GPIO37 GPIO39
    RED LED LED pin
    IR transmitter Transmitter pin
    BUTTON A Button pin
    BUTTON B Button pin
  • isolamento elettrico dei contatti del sensore dal sudore della pelle
  • verificare presenza di cicalino a bordo per allarme acustico in caso di temperatura pericolosa –> no, serve esterno

Software

Il software dovrà avere una serie di componenti, alcuni accessori, altri indispensabili; ovviamente non reinventerò la ruota ma andrò scopiazzando di qua e di là cosa c’è di disponibile. Chiaramente la prima cosa da fare è visualizzare la temperatura, anche senza ora attuale; il resto verrà dopo.

  • scansione dispositivi I2C (anche le periferiche di bordo sono su I2C, su pin vari) LINK
  • lettura e visualizzazione dati sensore SHT35
    • c’è una libreria specifica ClosedCube e una Adafruit, verificare
    • pare che nella libresria ClosedCube esista un modo per leggere la temperatura “periodicamente”, verificare se consuma di meno –> è una caratteristica del sensore, ma consuma 30 volte più corrente della lettura singola (70 uA invece che 2 uA)
    • Nella libreria ClosedCube il risultato della lettura del sensore tramite le varie funzioni possibili è di questo tipo:
      struct SHT31D {
      float t;
      float rh;
      SHT31D_ErrorCode error;
      };
      Quindi bisogna:

      • Definire la variabile:
        • SHT31D   risultato;
      • Assegnare alla variabile il valore della lettura effettuato tramite una delle 3 funzioni:
        1. readTempAndHumidity(repeatability, mode, timeout);
          • E’ la più generica: permette di scegliere una delle altre due in base al parametro “mode”.
        2. readTempAndHumidityClockStretch(repeatability);
        3. readTempAndHumidityPolling(repeatability, timeout);
      • Non sono riuscito a trovare nessuna info in merito alla differenza dei due metodi, quindi userei quello più semplice, con singolo parametro, tenendo in considerazione l’unica cosa che ho capito: più è basso il valore di repeatability, minori son i consumi; e noi dobbiamo tenere i consumi al minimo per prolungare la durata della batteria. Useremo quindi la funzione 2, con parametro pari alla costante SHT3XD_REPEATABILITY_LOW.
      • Utilizzare di temperatura contenuto nella variabile-risultato:
        • risultato.t
  • impostazione ora attuale
    • ho scoperto che è possibile impostare l’ora del PC sull’ESP32 al momento del caricamento dello sketch; questa riga memorizza in una variabile data e ora attuale:
      const char compile_date[] = __DATE__ ” ” __TIME__;
      risultato: May 22 2020 16:55:46  –> verificare configurabilità formato
    • l’orario andrà in qualche modo memorizzato nell’RTC di bordo
    • l’istruzione setTime(8,29,0,1,1,11) è valida solo per Arduino/AVR o anche per ESP32/M5stickC?
    • ho trovato diversi sorgenti, sia per orologi digitali che analogici; molti si basano su millis(), ma sarebbe meglio basarsi sull’RTC incorporato; pare che abbia una pessima precisione (5%, quindi un minuto perso ogni 3 ore!) se basato su riferimento interno, ma ottima se basato su un cristallo “esterno”: da verificare quanto/come “esterno. Discussione, discussione
    • esempio ufficiale RTC su M5stickC
    • si può usare server NTP er impostare l’ora; ci sono vari sorgenti, ma bisogna prima riuscire a collegarsi al WiFi! E al momento il mio m5stickC non si collega… Impostare oratio NTP con una riga singola: configTime(0, 0, pool.ntp.org);
  • visualizzazione ora/data: FATTO
  • visualizzazione livello batteria
  • impostazione deepsleep: la batteria deve durare almeno 24 ore, chissà se è possibile.
    • verificare i consumi in deepsleep dell’m5stickC –> 10uA (solo RTC e RTC memory); è presente anche un ULP (Ultra Low Power) processor, che consuma appena 100 uA o 150 uA durante il deepsleep, secondo come viene impostato, ma va programmato separatamente dallo sketch principale.
    • verificare i consumi in deepsleep dell’SHT35 –> 2 uA in attesa, 1500uA in misurazione, durata da 4ms a 15ms a seconda della ripetibilità impostata
    • Considerando i dati sopra, con un consumo di 12uA e una batteria da 80.000 uAh si avrebbe un’autonomia teorica di 6666 ore. Ovviamente però ogni tanto il dispositivo si accende, vuoi per leggere i valori e salvarli, vuoi perchè consultato dall’utente, quindi i consumi reali sono da valutare. Poichè l’M5stickC è dotato di appositi comandi per leggere la quantità di corrente assorbita in un dato momento grazie al power manager di bordo AXP192, volendo è possibile salvare questi dati durante l’utilizzo e fare una stima dell’autonomia reale possibile.
  • logging dei dati in memoria FLASH tramite SPIFFS; esempio1
  • visualizzazione grafico temperatura delle ultime X ore direttamente sul display; bisogna tracciare gli ultimi “n” valori; il display è 80×160. la temperatura può oscillare tra 36.0 e 38.0, quindi basterebbe una striscia alta 20 pixel. drawPixel(int16_t x, int16_t y, [uint16_t color]);
  • visualizzazione alert visivo in caso di temperatura pericolosa: usare immagini in formato XBM (BMP monocromatiche in formato testuale/esadecimale)
Tagged with: , , ,

Puoi inserire un commento qui sotto; diventerà visibile dopo la moderazione dell'amministratore

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: