Interfacciamo il sensore BME680 con il Wemos D1 mini

In un  precedente articolo abbiamo visto le caratteristiche del sensore  BME680  (BME680 Sensore di pressione, temperatura, umidità), si tratta di un sensore digitale 4 in 1.
Il sensore è in grado di rilevare diversi parametri ambientali come: la temperatura, l’umidità, la pressione barometrica ed i composti organici volatili (VOC).
In questo articolo vedremo come collegare il sensore BME680 al modulo Wemos D1 mini, i dati rilevato saranno riportati su un display TFT a colori.

Descrizione del sensore BME680

Il sensore BME680 , prodotto dalla Bosch Sensortec costituito da un package LGA che misura 3 x 3 x 1 mm con coperchio metallico e 8 pin , integra sensori di gas, pressione, umidità e temperatura ad elevata linearità e accuratezza. È progettato per consumi ottimizzati a seconda delle specifiche modalità di funzionamento, stabilità a lungo termine e robustezza EMC elevata.
I sui utilizzi possono essere:

  • Misurazione della qualità dell’aria
  • Stazione meteo personalizzata
  • Consapevolezza del contesto, ad esempio rilevamento dell’umidità della pelle, delle variazioni nell’ambiente
  • Monitoraggio fitness/benessere
  • Avvertimento in caso di aria secca o temperature elevate
  • Misurazione del volume e del flusso d’aria
  • Controllo automazione domestica (ad es. HVAC)
  • Miglioramento GPS
  • Navigazione indoor (rilevamento del cambio di piano, rilevamento spostamenti in ascensore)
  • Tracciamento dell’altitudine e del consumo di calorie per le attività sportive

 

Pin del modulo

Pressione Temperatura Umidità BME680

PinDescrizione
VCCPin alimentazione , compresa tra 3,3-5 V CC
GNDPin di massa
SCLI2C / SPI Clock line
SDAI2C / SPI data line
SDOSPI data line
CSSPI Slave Device Enable

Caratteristiche del LCD TFT Shield 2.4 ” a colori

Il Wemos LCD TFT Shield 2.4 Pollici a colori con Touch è stato progettato non solo per essere utilizzato con la scheda  WeMos D1 Mini, ma è compatibile anche con la WeMos D1 Mini Pro e Lolin D32 Pro.
Il display offre una risoluzione di 340×240 pixel, è utilizza il driver ILI9341 come controller per il display LCD ed il chip XPT2046 come controller per la funzione touch.

TFT touch Wemos D1Altre informazioni sul tipo di display potranno essere trovate nell’articolo Display TFT Risoluzione 320×240 2,8″ – ILI9341.

Libreria di gestione del sensore

Per facilitare la gestione come sempre ci vengono aiuto delle librerie già pronte, tra le tante presenti la scelta è andata a quella fornita dal sito Adafruit, anche se è stata creata per un altro modulo sensore la libreria è perfettamente compatibile.
Nel campo ricerca si inserirà “BME680” trovata la libreria “Adafruit BME680 Libray“, premendo su “More info..” apparirà il tasto “Installa” cliccare il tasto

Per ulteriori informazioni vedere l’articolo BME680 Sensore di pressione, temperatura, umidità

Schema dei collegamenti

Vediamo ora come interfacciare il sensore BME680 al Wemos D1 mini. Sotto sono riportati i componenti utilizzati.

Per Il collegamento delle varie parti è riportato nella figura sottostante, in questo caso il display è collegato tramite il protocollo SPI, mentre il sensore con protocollo I2C.

Wemos D1 miniShield TFTBME680
D1SCL
D2SDA
RSTTFT_RST
D8TFT_DC
D0TFT_CS
3V3VCC
5VVCC
GNDGNDGND

Dove trovare i componenti utilizzati

I componenti utilizzati possono essere acquistati presso il sito HomotixModulo Wemos D1 compatibileWemos LCD TFT Shield 2.4 Pollici con Touch per Wemos D1 Mini, BME680 Sensore di Gas Pressione Temperatura Umidità

Sketch utilizzato

Il programma utilizzato mostra i dati rilevati dal sensore, compreso il dato di altitudine locale.
Tuttavia, per avere un risultato accurato occorre avere inserito nel programma la pressione hPa a livello del mare per la vostra posizione.
Si consideri poi che il sensore è abbastanza preciso ma se non hai i dati aggiornati per il giorno corrente,  e può essere difficile ottenere una precisione maggiore di 10 metri.

Nota: per il funzionamento del programma occorre che siano presenti le librerie per la gestione del Sensore BME680 (Adafruit_sensor.h e Adafruit_BME680), quelle per la gestione del display TFT (Adafruit_GFX e Adafruit_ILI9341), le librerie per i protocolli I2C (Wire) e SPI (SPI) sono già presenti nelle librerie base dell’IDE

 

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"
#include <dafruit_GFX.h>
#include <Adafruit_ILI9341.h>

#define TFT_CS D0
#define TFT_DC D8
#define TFT_RST -1 //Connesso al pin RESET del Wemos
#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME680 bme; // I2C
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST); //TTF

void setup() {
  Serial.begin(9600);
  while (!Serial);
  Serial.println(F("BME680 test"));

  if (!bme.begin()) {
    Serial.println("Could not find a valid BME680 sensor, check wiring!");
    while (1);
  }

  // Set up oversampling and filter initialization
  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  bme.setGasHeater(320, 150); // 320*C for 150 ms

  tft.begin();
  tft.fillScreen(ILI9341_BLACK);
  tft.setRotation(3);
  tft.setCursor(0, 0);
  tft.setTextColor(ILI9341_RED);
  tft.setTextSize(3);
  tft.println(" WWW.ADRIROBOT.IT");
  tft.println();
  tft.setTextSize(2);
  tft.setTextColor(ILI9341_GREEN);
  tft.println("  Lettura dati da BME 680");
  tft.println();
}

void loop() {
  if (! bme.performReading()) {
    Serial.println("Failed to perform reading :(");
    return;
  }

  tft.fillRect(0, 80, 240, 340, ILI9341_BLACK);
  tft.setCursor(0, 80);
  tft.setTextColor(ILI9341_YELLOW);
  tft.print("Temperatura: ");
  tft.print(bme.temperature);
  tft.print(" *C" );

  tft.setCursor(0, 100);
  tft.setTextColor(ILI9341_RED);
  tft.print("Pressione: ");
  tft.print(bme.pressure / 100.0);
  tft.print(" hPa");

  tft.setCursor(0, 120);
  tft.setTextColor(ILI9341_CYAN);
  tft.print("Umidita': ");
  tft.print(bme.humidity);
  tft.print(" %");

  tft.setCursor(0, 140);
  tft.setTextColor(ILI9341_GREEN);
  tft.print("Gas :");
  tft.print((bme.gas_resistance / 1000.0));
  tft.print(" KOhms");

  tft.setCursor(0, 160);
  tft.setTextColor(ILI9341_ORANGE);
  tft.print("Altitudine: ");
  tft.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  tft.print(" m");
  delay (1000);
}