Misura della temperatura con I2C (sensore TMP102, blocking mode)

Esiste una molteplicità di sensori di temperatura che vengono comandati con il bus I2C o I2C (sono la stessa cosa).

Alcuni esempi sono il sensore TMP102 della Texas Instruments o il sensore Si7021 della Silicon Labs (quest'ultimo è in grado anche di misurare la pressione).

L'interrogazione di un sensore I2C avviene con successo se:

  1. il sensore è collegato correttamente al microcontrollore che lo controlla;
  2. il sensore è interrogato correttamente via software del microcontrollore.

Per comprendere come si ceffettuano le due operazioni è necessario in primo luogo comprendere come funziona il bus I2C

Il bus I2C o I2C

L'Inter-Integrated Circuit (I2C) è un protocollo bus di comunicazione sviluppato da Philips Semiconductor (ora NXP Semiconductors) nel 1982. È un protocollo relativamente lento ma è ancora largamente utilizzato grazie alla sua semplicità e robustezza. La maggior parte dei microcontrollori ha infatti almeno 1 controller periferico I2C integrato.

Collegamento sensore-microcontrollore

Indipendentemente dal sensore utilizzato il bus I2C prevede 2 collegamenti tra i terminali SCL (clock) e SDA (dati) di tutti i dispositivi coinvolti. A questi collegamenti comunemente è necessario aggiungere l'alimentazione (Vcc) e la massa (GND). Nella figura vengono riportati a titolo di esempio i collegamenti tra una scheda Nucleo e un modulo che monta il sensore TMP102.

Fritzing diagram of STM32 and TMP102

Interrogazione del sensore TMP102

Osservando il datasheet del sensore TMP102 (https://www.ti.com/lit/ds/symlink/tmp102.pdf) si determina che la lettura dei dati di temperatura richiede la lettura del registro temperature register che si trova all'indirizzo 0x00. Sempre osservando il datasheet del sensore di osserva che l'address I2C del dispositivo può assumere uno dei seguenti 4 valori: 0x48, 0x49, 0x50, 0x51 (di solito il più comune è 0x48 ed è a questo che faremo riferimento). In questo modo l'interrogazione corretta risulta essere

ovvero:

  • Si deve per prima cosa inviare un comando di scrittura dall'STM32 al TMP102 con 1 byte che contenga l'indirizzo del registro di temperatura nel TMP102 (indirizzo 0x00).

  • Deve seguire immediatamente un comando di lettura in cui vengono letti 2 byte dal TMP102. Questi 2 byte conterranno i dati della temperatura.

Per realizzare questo bisogna in primo luogo creare un nuovo progetto in STM32CubeIDE e quindi configurare correttamente i pidini del microcontrollore. Nell'esempio qui sotto riportato è stata selezionata la board NUCLEO-L452RE-P, ma la configurazione è la stessa per la maggior parte delle schede NUCLEO-64.

Nella finestra Pinout & Configuration , cliccare sui piedini PB7 e PB8 assegnadogli rispettivamente i collegamenti I2C1_SDA (controller I2C numero 1 linea SDA) e I2C1_SCL (controller I2C numero 1 linea SCL):