INTERROGAZIONE DEL SENSORE SI7021

Il sensore Si7021 della Silicon Labs è un sensore in grado di misurare temperatura e pressione. Osservando il datasheet del dispositivo (https://www.silabs.com/documents/public/data-sheets/Si7021-A20.pdf) si osserva che l'address I2C del dispositivo è 0x40.

Il master deve comunicare con il sensore usando una successione di comandi. I comandi sono contenuti nella Table 11

I comandi possono indicare al sensore Si7021 di eseguire una delle due possibili misurazioni: umidità relativa o temperatura. La procedura per inviare uno dei due comandi è identica.
Una volta indicato al sensore di effettuare la misura, questa non è subito disponibile ed è necessario introdurre un tempo di attesa tra l'invio della richiesta di misura e la lettura della misura stessa. È possibile operare in due modi:

  • Hold Master Mode: in questo caso mentre la misura è in avanzamento, è previsto che lo slave allunghi artificiosamente il tempo in cui mantiene la linea SCL al livello basso, fino a quando non finisce la conversione.
  • No Hold Master Mode: in questo caso una volta fatta partire la misurazione il master rilascia il bus I2C e periodicamente interrogherà il sensore per verificare se i dati sono disponibili. Se i dati non sono disponibili il sensore risponderà con un "not acknowledge". Questo metodo è quello più utilizzato avendo l'accortezza di lasciare un tempo sufficiente al sensore per effettuare la misurazione. Un tempo di 20 millisecondi si dimostra sufficiente.

Nel nostro caso useremo la seconda tecnica inserendo un ritardo di 20 millisecondi affinché la misura abbia luogo.

Creazione del collegamento con Arduino e il sensore

1- Creare un oggetto Arduino includendo la libreria I2C

>> a = arduino('COM9', 'Uno', 'Libraries', 'I2C');

2- Vedere quali dispositivi sono collegati al bus I2C (se si conosce già l'indirizzo questo passaggio è inutile

>> addrs = scanI2CBus(a)
addrs = 1×1 cell array
    {'0x40'}

3- Creare il dispositivo I2C

>> si7021 = device(a,'I2CAddress',0x40)

Lettura del valore di temperatura

Per avviare la misura è necessario scrivere all'indirizzo del sensore il comando con codice 0xF3 ed attendere un tempo sufficiente affinché la misura sia effettuata (bastano 20 millisecondi).

La lettura della temperatura del sensore viene digitalizzata in 12 bit in modalità Normale con 8 bit in MSB e 4 bit in LSB. 

Ogni LSB equivale a 0,0625 gradi Celsius. Scrivere prima l'indirizzo del registro da cui leggere e poi leggere due byte di dati da esso utilizzando il tipo di dati uint8.

>> write(si7021, 0xF3, 'uint8');
>> buf = read(si7021, 2, 'uint8');

A questo punto i due byte letti devono essere convertiti in un valore di temperatura. Per prima cosa è necessario i due byte ricevuti

>> val = ((int16_t)buf[0] << 8) | (buf[1]);

Successivamente usare la formula riportata nel datasheet del sensore per calcolare la temperatura

>> temp_c = val;
>> temp_c = temp_c * 175.72;
>> temp_c = temp_c / 65536;
>> temp_c = temp_c - 46.85;
>> temp_c = temp_c * 100

Cancellare gli oggetti

Quando la connessione non è più necessaria i due oggetti (che fanno riferimento ad Arduino e al sensore si7021) possono essere cancellati

>> clear si7021 a
Ultime modifiche: mercoledì, 3 gennaio 2024, 21:21