Realizziamo una semplicissima stazione meteo con STM32 ed il sensore digitale SHT31, stampando i dati su un Display LCD 1602 I2C
Vi presentiamo il nostro primo progetto con STM32F103C8T6, dev-board che abbiamo imparato a programmare con IDE Arduino a questo LINK. Il progetto è sarà molto semplice e vedrà adoperato il sensore digitale SHT31, che adopera l’interfaccia I2C e un Display LCD 16×02, dotato di adattatore che sfrutterà sempre l’interfaccia I2C.
Progetto
L’idea è nata per iniziare ad approcciarsi in modo più serio a queste dev-board economiche e performanti, poco note ma molto valide. Piccole come un Arduino Nano, sono potenti come le ESP8266. Ad essa abbiniamo un sensore molto completo e sufficientemente preciso, conosciuto già su questo sito e molto apprezzato per la semplicità di programmazione: SHT31. Al fine di mostrare i dati rilevati, abbiamo deciso di sfruttare un economico e molto usato Display LCD a 16 colonne e 2 righe, sul quale appariranno prima i dati relativi alla temperatura, espressa in gradi Celsius e Fahrenheit, poi i valori di umidità relativa e assoluta.
Componenti
Della STM32F103C8T6 abbiamo visto anche come sfruttarne le seriale, mentre in questo progetto ci concentreremo sull’interfaccia I2C, visto che possiamo sfruttarla sia per un sensore che per un attuatore. Abbiamo visto che la dev-board lavora con i 3,3V, anche se tollera alacremente i 5V, necessari per alimentare il Display LCD. Questo display è dotato, quindi, dell’adattatore che riduce notevolmente il numero di connessioni necessarie e semplifica di molto il lavoro. Abbiamo quindi 16 colonne e 2 righe che adopereremo al meglio per mostrare tutti i dati rilevati dal sensore SHT31. Quest’ultimo ci permetterà di rilevare più dati di quelli necessari, grazie ad una brillante libreria che agevola il lavoro di programmazione. I dati rilevati sono tutti a virgola mobile e sufficientemente precisi per considerarli affidabili. L’ultimo componente necessario, ma solo in fase di caricamento dello sketch è l’adattatore FTDI per caricare tramite comunicazione seriale lo sketch sulla scheda. A tal proposito, vi rimandiamo alla guida per configurare la STM32 con la IDE di Arduino a questo LINK.
Lista componenti su Amazon:
- STM32F103C8T6: https://amzn.to/31FXpBB
- Modulo FTDI: https://amzn.to/2PRMpyx
- Display LCD I2C 1602: https://amzn.to/3cNa0cK
- SHT31: https://amzn.to/3sYDw4A
Lista componenti su Aliexpress:
- STM32F103C8T6: https://s.click.aliexpress.com/e/_ArCCbM
- Modulo FTDI: https://s.click.aliexpress.com/e/_AAnHSa
- Display LCD I2C 1602: https://s.click.aliexpress.com/e/_AtK4eW
- SHT31: https://s.click.aliexpress.com/e/_Ac4PU2
Collegamenti
Partiamo come sempre collegando la STM32F103C8T6 al modulo FTDI, collegando il Vcc del modulo ai 5V della dev-board, il GND al GND, i pin RX e TX ai pin A9 e A10 della dev-board. Passando al sensore ed al display, entrambi i pin SDA vanno connessi al pin B7, mentre i pin SCL al pin B6. Vi ricordiamo che il Vcc del display va collegato ai 5V, mentre il pin Vin del SHT31 ai 3,3V.
I collegamenti tramite interfaccia I2C semplificano parecchio il lavoro, grazie anche ai diversi indirizzi dei dispositivi che permettono ad entrambi di essere connessi ai medesimi pin della STM32.
Codice
Iniziamo lo sketch, scaricabile a questo LINK, includendo la libreria Wire.h per interfaccia I2C, la libreria LiquidCrystal_I2C.h per gestire il Display LCD, la stessa usata per adoperarlo su ESP32, e la libreria SHT3x.h per il sensore digitale di temperatura e umidità. Creiamo gli oggetti Sensor e lcd con cui gestire i due dispositivi.
#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <SHT3x.h> SHT3x Sensor; LiquidCrystal_I2C lcd(0x3F, 16, 2);
Nel VOID SETUP inizializziamo il Display, avviamo il sensore e facciamo apparire una scritta che contiene il titolo del progetto. Puliamo poi il display.
Sensor.Begin(); lcd.init(); lcd.backlight(); lcd.setCursor(0,0); lcd.print("Weather Station"); lcd.setCursor(0,1); lcd.print("STM32 | SHT31"); delay(3000); lcd.clear();
Nel VOID LOOP creiamo le quattro variabili a virgola mobile per rilevare temperatura in gradi Celsius, in gradi Fahrenheit, l’umidità relativa e l’umidità assoluta espressa in Torr. Usiamo le due righe del display per stampare la temperatura nelle sue due rilevazioni, poi, dopo 3 secondi, puliamo il display e stampiamo i dati relativi all’umidità.
Sensor.UpdateData(); float t = Sensor.GetTemperature(); float f = Sensor.GetTemperature(SHT3x::Far); float h = Sensor.GetRelHumidity(); float a = Sensor.GetAbsHumidity(); lcd.setCursor(0,0); lcd.print("Temperatura: "); lcd.setCursor(0,1); lcd.print(t); lcd.print("C"); lcd.print(" | "); lcd.print(f); lcd.print("F"); delay (3000); lcd.clear(); lcd.setCursor(0,0); lcd.print("U/R: "); lcd.print(h); lcd.print("%"); lcd.setCursor(0,1); lcd.print("U/A: "); lcd.print(a); lcd.print(" Torr"); delay (3000); lcd.clear();