Lettura di temperatura e umidità con Si7021

La serie Si70xx/si701X/si702x di sensori di temperatura e umidità digitali prodotti da Silicon Labs integra un sensore di umidità, un sensore di temperatura, un'interfaccia seriale I2C, calibratura e condizionamento del segnale on-chip in un unico contenitore.

Quando l'aria viene a contatto con il sensore in poliammide esposto, l'umidità nell'aria causa una modifica della capacità nel sensore che viene convertita in una lettura dell'umidità da parte del condizionamento on-chip. Questa lettura viene poi messa a disposizione dell'utente tramite interfaccia i2C.

La tensione di funzionamento è compresa tra da 1,9 V a 3,6 V.

Il modulo è disponibilie anche monato su una breakout board che contiene la circuiteria che ne consente un utilizzo con tensioni di alimentazione a 5V. In tal caso l'alimentazione dovrà essere data tra i piedini Vin e GND.

Uno schema di collegamento ad Arduino è riportato in figura:

Per il funzionamento è possibile scaricare una qualunque libreria che gestisca il modulo. La più utilizzata è la "Adafruit_Si7021 library".

Per includere la libreria nell'IDE di sviluppo di Arduino è sufficiente utilizzare il Gestore Library (disponibile da IDE versione 1.6.2). Aprire l'IDE e fare clic sul menu "Sketch” e poi: #include libreria -> Gestione librerie... . Si aprirà una finestra di dialogo che come prima opzione avrà "gestione librerie". Cliccare su tale opzione e cercare "Adafruit Si7021 Library". Se non è installata, scegliere la versione (senza dubbio è meglio la più recente) e successivamente cliccare sul tasto "installa".

Successivamente andando su File -> Esempi -> Adafruit Si7021 Library -> si7021 è possibile caricare uno sketch che mostra come il sensore viene interrogato.

Per comodità lo sketch viene riportato anche qui sotto:

#include "Adafruit_Si7021.h"

bool enableHeater = false;
uint8_t loopCnt = 0;

Adafruit_Si7021 sensor = Adafruit_Si7021();

void setup() {
Serial.begin(115200);

// wait for serial port to open
while (!Serial) {
delay(10);
}

Serial.println("Si7021 test!");
if (!sensor.begin()) {
Serial.println("Did not find Si7021 sensor!");
while (true)
;
}

Serial.print("Found model ");
switch(sensor.getModel()) {
case SI_Engineering_Samples:
Serial.print("SI engineering samples"); break;
case SI_7013:
Serial.print("Si7013"); break;
case SI_7020:
Serial.print("Si7020"); break;
case SI_7021:
Serial.print("Si7021"); break;
case SI_UNKNOWN:
default:
Serial.print("Unknown");
}
Serial.print(" Rev(");
Serial.print(sensor.getRevision());
Serial.print(")");
Serial.print(" Serial #"); Serial.print(sensor.sernum_a, HEX); Serial.println(sensor.sernum_b, HEX);
}

void loop() {
Serial.print("Humidity: ");
Serial.print(sensor.readHumidity(), 2);
Serial.print("\tTemperature: ");
Serial.println(sensor.readTemperature(), 2);
delay(1000);

// Toggle heater enabled state every 30 seconds
// An ~1.8 degC temperature increase can be noted when heater is enabled
if (++loopCnt == 30) {
enableHeater = !enableHeater;
sensor.heater(enableHeater);
Serial.print("Heater Enabled State: ");
if (sensor.isHeaterEnabled())
Serial.println("ENABLED");
else
Serial.println("DISABLED");
loopCnt = 0;
}
}

Analisi del codice
è importante la definizione globale

Adafruit_Si7021 sensor = Adafruit_Si7021();

che definisce un oggetto "sensor"  Adafruit_Si7021. Successivamente nel setup:

sensor.begin()

inizializza il sensore. Infine le due funzioni:

sensor.readTemperature()
sensor.readHumidity()

invitano il sensore ad eseguire una misura rispettivamente di temperatura ed umidità e successivamente leggono la misura.

Il sensore ha anche un piccolo elemento riscaldante, chiamato heater che il produttore consiglia di accendere quando le letture di umidità sono superiori all'80%. L'accensione provoca anche un incremento della temperatura letta.

Protocollo di comunicazione
In primo luogo è necessario specificare che la lettura della temperatura e della pressione da parte del sensore Si7021 NON è continua. Deve essere richiesta dal microcontrollore che poi deve attendere che venga eseguita prima di poterla leggere.

L'attesa può essere gestita in due modi:

  • hold master mode: in questo caso ill sensore Si7021 (che nel bus I2C è uno slave) "cattura" e prolunga il livello basso il canale SLC (clock) alla fine dell'interrogazione fino a che la misura non è conclusa. Nel momento in cui il clock viene rilasciato il master può procedere a richiedere il valore di temperatura o umidità misurato. Questo modo di operare viene chiamato anche "I2C clock stretching".
  • no hold master mode: in questo caso il clock non viene catturato e il master "si accorge" che ma misura è in corso perché fino a che la misura non è conclusa il sensore Si7021 risponderà alle interrogazioni sull'I2C con un "Not Acknowledging read requests" (non sono in grado di rispondere alla richiesta del master).
La sequenza dei comandi e delle risposte in hold master mode è: 

  • Master: invia l'indirizzo (il sensore ha indirizzo 0x40 non modificabile) dello slave (7 bit) indicando che desidera scrivere nello slave (ottavo bit basso, ovvero W).
  • Slave: invia l'acknowledge (A).
  • Master: invia un comando di misura in modalità hold master mode (0xE5 per umidità o 0xE3 per temperatura).
  • Slave: invia l'acknowledge(A).
  • Master: invia l'indirizzo indicando che desidera ricevere (ottavo bit dell'indirizzo alto, ovvero R).
  • Slave: mantiene basso il segnale di clock SCL fino a che non ha finito  la conversione. Quando ha finito lo rilascia.
  • Master: riceve (finalmente) due byte che rappresentano la misura eseguita.
Facoltativamente, è possibile restituire dallo slave un byte di checksum da utilizzare per verificare la presenza di errori di trasmissione.
Il byte di checksum seguirà il byte LSB della misura se questo viene "riconosciuto" dal master (il master invia un ACK alla fine della ricezione del byte LSB). Il byte di checksum non viene restituito se il master “non riconosce” il byte LSB.
Il byte di checksum viene calcolato utilizzando un polinomio del generatore CRC di x8 + x5 + x4 + 1, con un'inizializzazione di 0x00.

La sequenza dei comandi e delle risposte in no hold master mode è: 

 
  • Master: invia l'indirizzo (il sensore ha indirizzo 0x40 non modificabile) dello slave (7 bit) indicando che desidera scrivere nello slave (ottavo bit basso, ovvero W).
  • Slave: invia l'acknowledge (A).
  • Master: invia un comando di misura in modalità no hold master mode (0xF5 per umidità o 0xF3 per temperatura).
  • Slave: invia l'acknowledge(A).
  • Master: invia l'indirizzo indicando che desidera ricevere (ottavo bit dell'indirizzo alto, ovvero R).
  • Slave: risponde a tutte le interrogazioni con not  acknowledge (NA) fino a che non ha finito  la conversione.
  • Master: ritenta inviando l'indirizzo indicando che desidera ricevere.
  • Slave: quando ha finito la conversione invia l'acknowledge (A).
  • Master: riceve due byte che rappresentano la misura eseguita.
Anche in questo caso è possibile richiedere (con le stesse modalità dell'hold master mode) la restituzione da parte dello slave di un byte di checksum.






 



Ultime modifiche: martedì, 28 marzo 2023, 09:40