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 openwhile (!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 enabledif (++loopCnt == 30) {enableHeater = !enableHeater;sensor.heater(enableHeater);Serial.print("Heater Enabled State: ");if (sensor.isHeaterEnabled())Serial.println("ENABLED");elseSerial.println("DISABLED");loopCnt = 0;}}
Analisi del codice
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).

- 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.

- 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.