BME680 temperature sensor with ESP32 & 2.8" TFT Display

Connect BME680 temperature module to ESP32 Dev Kit and display on 2.8" TFT ST7789 Colour LCD Display.

To measure temperature, barometric pressure, elevation in metres above sea level, volatile gases and relative humidity in metric. With minimum and maximum for each quantity for a roughly 24 hour period. Plus small red counter in seconds. Updates every 16 seconds.

minMaxEsp32BME68022ST7789.ino (6.7 KB)

Should be fairly easy to adapt to Arduino. Connect BME680's SCL and SDA to pins A4 and A5 on Arduino, which are pins 21 and 22 on ESP32 (not in any order there). You'll need something like a level converter for the 5V Arduino if driving a 3.3V display.

#include <Arduino_GFX_Library.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"

#define SEALEVELPRESSURE_HPA (1013.25)
#define day  86400000 //  milliseconds in a day
#define hour 3600000 //  milliseconds in an hour
#define minute 60000 //  milliseconds in a minute
#define second  1000 //  milliseconds in a second

Adafruit_BME680 bme; // I2C

long lastday = 0;
long timenow;

float maxtemp=0;
float mintemp=999;
float temperatureC;

float maxhum=0;
float minhum=999;
float hum;

float maxpress=0;
float minpress=2000;
float press;

float maxgas=0;
float mingas=999;
float gas;

float maxm=0;
float minm=999;
float m;

// 2.8" TFT ST7789 display ==> ESP32 Dev Kit.  All pins are on one side of ESP32 board.
#define TFT_SCK    18
#define TFT_MOSI   23
#define TFT_MISO   19
#define TFT_CS     4
#define TFT_DC     16
#define TFT_RESET  17

//  BME680  to ESP32 pins: 
//  SDA ==> 21
//  SCL ==> 22

  Arduino_ESP32SPI bus = Arduino_ESP32SPI(TFT_DC, TFT_CS, TFT_SCK, TFT_MOSI, TFT_MISO);
  Arduino_ST7789 display = Arduino_ST7789(&bus, TFT_RESET);

  unsigned long previousMillis = 0;
const long interval = 1000; 

void setup(void)
{
  Serial.begin(115200);
 display.begin();
  display.fillScreen(BLACK);

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

  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
}
 
void loop() {

int time = round(millis()/1000);
 
   timenow = millis();

   if (timenow-lastday >= day){

      maxtemp=0;
      mintemp=999;

      maxhum=0;
      minhum=999;

     maxpress=0;
     minpress=2000;

     maxgas=0;
     mingas=999;

      maxm=0;
       minm=999;
       
      lastday = timenow;
  }
  // Tell BME680 to begin measurement.
  unsigned long endTime = bme.beginReading();
  if (endTime == 0) {
    Serial.println(F("Failed to begin reading :("));
   return;
 }
 
  // There's no need to delay() until millis() >= endTime: bme.endReading()
  // takes care of that. It's okay for parallel work to take longer than
  // BME680's measurement time.
// delay(8000);
  // Obtain measurement results from BME680. Note that this operation isn't
  // instantaneous even if milli() >= endTime due to I2C/SPI latency.
  if (!bme.endReading()) {
    Serial.println(F("Failed to complete reading :("));
    return;
  }

 temperatureC = bme.temperature;

  if (temperatureC >= maxtemp) {
    maxtemp=temperatureC; }
  if (temperatureC <= mintemp) {
    mintemp=temperatureC; }

   hum = bme.humidity;

     if (hum >= maxhum) {
    maxhum=hum; }
  if (hum <= minhum) {
    minhum=hum; }

       press = bme.pressure / 100.0;

     if (press >= maxpress) {
    maxpress=press; }
  if (press <= minpress) {
    minpress=press; }

   gas = bme.gas_resistance / 1000.0;

     if (gas >= maxgas) {
    maxgas=gas; }
  if (gas <= mingas) {
    mingas=gas; }

   m = bme.readAltitude(SEALEVELPRESSURE_HPA);

     if (m >= maxm) {
    maxm=m; }
  if (m <= minm) {
    minm=m; }


  Serial.print(F("Reading completed at "));
  Serial.println(millis());

  Serial.print(F("Temperature = "));
  Serial.print(bme.temperature);
  Serial.println(F(" *C"));

  Serial.print(F("Pressure = "));
  Serial.print(bme.pressure / 100.0);
  Serial.println(F(" hPa"));

  Serial.print(F("Humidity = "));
  Serial.print(bme.humidity);
  Serial.println(F(" %"));

  Serial.print(F("Gas = "));
  Serial.print(bme.gas_resistance / 1000.0);
  Serial.println(F(" KOhms"));

  Serial.print(F("Approx. Altitude = "));
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(F(" m"));

  Serial.println();


  display.fillScreen(BLACK);
    display.setRotation(1);
    display.setTextWrap(false);

  display.setCursor(198, 1);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Max");

  display.setCursor(272, 1);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Min");

  display.setCursor(180, 27);
  display.setTextSize(2);
  display.setTextColor(RED);
  display.print(maxtemp);

    display.setCursor(250, 27);
  display.setTextSize(2);
  display.setTextColor(RED);
  display.print(mintemp);

    display.setCursor(180, 60);
  display.setTextSize(2);
  display.setTextColor(GREEN);
  display.print(maxhum);

    display.setCursor(250, 60);
  display.setTextSize(2);
  display.setTextColor(GREEN);
  display.print(minhum);

  display.setCursor(20, 1);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Temp");

  display.drawCircle(46, 3, 1, WHITE);

  display.setCursor(50, 1);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("C");

    display.setCursor(2, 12);
  display.setTextSize(5);
  display.setTextColor(RED);
  display.print(temperatureC);

  display.setCursor(20, 54);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Hum %");

            display.setCursor(2, 69);
  display.setTextSize(5);
  display.setTextColor(GREEN);
  display.println(hum);

          display.setCursor(2, 120);
  display.setTextSize(4);
  display.setTextColor(YELLOW);
  display.println(press);

  display.setCursor(20, 109);
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.println("Pressure millibar");

      display.setCursor(164, 88);
  display.setTextSize(2);
  display.setTextColor(YELLOW);
  display.print(maxpress);

    display.setCursor(220, 118);
  display.setTextSize(2);
  display.setTextColor(YELLOW);
  display.print(minpress);
 
              display.setCursor(20, 156);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.println ("gas");
 
              display.setCursor(2, 165);
  display.setTextSize(4);
  display.setTextColor(0x067F);
  display.println (gas);

        display.setCursor(180, 150);
  display.setTextSize(2);
  display.setTextColor(0x067F);
  display.print(maxgas);

    display.setCursor(250, 150);
  display.setTextSize(2);
  display.setTextColor(0x067F);
  display.print(mingas);

  display.setCursor(20, 195);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.println("metres");
 
  display.setCursor(2, 205);
  display.setTextColor(BLUE);
  display.setTextSize(4);
  display.println(m);

          display.setCursor(150, 180);
  display.setTextSize(2);
  display.setTextColor(BLUE);
  display.print(maxm);

    display.setCursor(235, 180);
  display.setTextSize(2);
  display.setTextColor(BLUE);
  display.print(minm);

  display.setCursor(250, 230);
  display.setTextColor(RED);
  display.setTextSize(1);
  display.println(time);

  delay(16000);
  }

I improved the min max by making the numbers much larger. And took the equals sign out of the min max comparison to speed it up a bit. And added a line to include seconds since last min/max, bottom right in white.

i updated the .ino without changing the file name:
minMaxEsp32BME68022ST7789.ino (6.8 KB)

#include <Arduino_GFX_Library.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"

#define SEALEVELPRESSURE_HPA (1013.25)
#define day  86400000 //  milliseconds in a day
#define hour 3600000 //  milliseconds in an hour
#define minute 60000 //  milliseconds in a minute
#define second  1000 //  milliseconds in a second

Adafruit_BME680 bme; // I2C

long lastday = 0;
long timenow;

float maxtemp=-9999;
float mintemp=99999;
float temperatureC;

float maxhum=-9999;
float minhum=99999;
float hum;

float maxpress=-9999;
float minpress=99999;
float press;

float maxgas=-9999;
float mingas=99999;
float gas;

float maxm=-9999;
float minm=99999;
float m;

// 2.8" TFT ST7789 display ==> ESP32 Dev Kit.  All pins are on one side of ESP32 board.
#define TFT_SCK    18
#define TFT_MOSI   23
#define TFT_MISO   19
#define TFT_CS     4
#define TFT_DC     16
#define TFT_RESET  17

//  BME680  to ESP32 pins: 
//  SDA ==> 21
//  SCL ==> 22

  Arduino_ESP32SPI bus = Arduino_ESP32SPI(TFT_DC, TFT_CS, TFT_SCK, TFT_MOSI, TFT_MISO);
  Arduino_ST7789 display = Arduino_ST7789(&bus, TFT_RESET);

  unsigned long previousMillis = 0;
const long interval = 1000; 

void setup(void)
{
  Serial.begin(115200);
 display.begin();
  display.fillScreen(BLACK);
    display.setRotation(1);
   display.setTextWrap(false); 

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

  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
}
 
void loop() {

int time = round(millis()/1000);
 
   timenow = millis();

   if (timenow-lastday >= day){

      maxtemp=-9999;
      mintemp=99999;

      maxhum=-9999;
      minhum=99999;

     maxpress=-9999;
     minpress=99999;

     maxgas=-9999;
     mingas=99999;

      maxm=-9999;
       minm=99999;
       
      lastday = timenow;
  }

  // Tell BME680 to begin measurement.
  unsigned long endTime = bme.beginReading();
  if (endTime == 0) {
    Serial.println(F("Failed to begin reading :("));
   return;
 }
 
  // There's no need to delay() until millis() >= endTime: bme.endReading()
  // takes care of that. It's okay for parallel work to take longer than
  // BME680's measurement time.
// delay(8000);
  // Obtain measurement results from BME680. Note that this operation isn't
  // instantaneous even if milli() >= endTime due to I2C/SPI latency.
  if (!bme.endReading()) {
    Serial.println(F("Failed to complete reading :("));
    return;
  }

 temperatureC = bme.temperature;

  if (temperatureC > maxtemp) {
    maxtemp=temperatureC; }
  if (temperatureC < mintemp) {
    mintemp=temperatureC; }

   hum = bme.humidity;

     if (hum > maxhum) {
    maxhum=hum; }
  if (hum < minhum) {
    minhum=hum; }

       press = bme.pressure / 100.0;

     if (press > maxpress) {
    maxpress=press; }
  if (press < minpress) {
    minpress=press; }

   gas = bme.gas_resistance / 1000.0;

     if (gas > maxgas) {
    maxgas=gas; }
  if (gas < mingas) {
    mingas=gas; }

   m = bme.readAltitude(SEALEVELPRESSURE_HPA);

     if (m > maxm) {
    maxm=m; }
  if (m < minm) {
    minm=m; }


  Serial.print(F("Reading completed at "));
  Serial.println(millis());

  Serial.print(F("Temperature = "));
  Serial.print(bme.temperature);
  Serial.println(F(" *C"));

  Serial.print(F("Pressure = "));
  Serial.print(bme.pressure / 100.0);
  Serial.println(F(" hPa"));

  Serial.print(F("Humidity = "));
  Serial.print(bme.humidity);
  Serial.println(F(" %"));

  Serial.print(F("Gas = "));
  Serial.print(bme.gas_resistance / 1000.0);
  Serial.println(F(" KOhms"));

  Serial.print(F("Approx. Altitude = "));
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(F(" m"));

  Serial.println();

  display.fillScreen(BLACK);
    display.setCursor(250, 220);
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.println((timenow-lastday)/1000);

  display.setCursor(198, 1);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Max");

  display.setCursor(272, 1);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Min");

  display.setCursor(180, 27);
  display.setTextSize(2);
  display.setTextColor(RED);
  display.print(maxtemp);

    display.setCursor(250, 27);
  display.setTextSize(2);
  display.setTextColor(RED);
  display.print(mintemp);

    display.setCursor(180, 60);
  display.setTextSize(2);
  display.setTextColor(GREEN);
  display.print(maxhum);

    display.setCursor(250, 60);
  display.setTextSize(2);
  display.setTextColor(GREEN);
  display.print(minhum);

  display.setCursor(20, 1);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Temp");

  display.drawCircle(46, 3, 1, WHITE);

  display.setCursor(50, 1);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("C");

    display.setCursor(2, 12);
  display.setTextSize(5);
  display.setTextColor(RED);
  display.print(temperatureC);

  display.setCursor(20, 54);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.print("Hum %");

            display.setCursor(2, 69);
  display.setTextSize(5);
  display.setTextColor(GREEN);
  display.println(hum);

          display.setCursor(2, 120);
  display.setTextSize(4);
  display.setTextColor(YELLOW);
  display.println(press);

  display.setCursor(20, 109);
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.println("Pressure millibar");

      display.setCursor(164, 88);
  display.setTextSize(2);
  display.setTextColor(YELLOW);
  display.print(maxpress);

    display.setCursor(220, 118);
  display.setTextSize(2);
  display.setTextColor(YELLOW);
  display.print(minpress);
 
              display.setCursor(20, 156);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.println ("gas");
 
              display.setCursor(2, 165);
  display.setTextSize(4);
  display.setTextColor(0x067F);
  display.println (gas);

        display.setCursor(180, 150);
  display.setTextSize(2);
  display.setTextColor(0x067F);
  display.print(maxgas);

    display.setCursor(250, 150);
  display.setTextSize(2);
  display.setTextColor(0x067F);
  display.print(mingas);

  display.setCursor(20, 195);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.println("metres");
 
  display.setCursor(2, 205);
  display.setTextColor(BLUE);
  display.setTextSize(4);
  display.println(m);

          display.setCursor(150, 180);
  display.setTextSize(2);
  display.setTextColor(BLUE);
  display.print(maxm);

    display.setCursor(235, 180);
  display.setTextSize(2);
  display.setTextColor(BLUE);
  display.print(minm);

  display.setCursor(230, 230);
  display.setTextColor(RED);
  display.setTextSize(1);
  display.println(time);

  delay(16000);
  }

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.