Advertisement
T3N0N

Arduino - BME680 & Waveshare 2.9 epaper via SPI - NOT WORKING?!

Jul 17th, 2025 (edited)
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Arduino 3.50 KB | Software | 0 0
  1. // Arduino BME680 & Waveshare 2.9 epaper via SPI - NOT WORKING?!
  2.  
  3. #include <SPI.h>
  4. #include <GxEPD2_BW.h>
  5. #include <Fonts/FreeMonoBold9pt7b.h>
  6. #include <Adafruit_Sensor.h>
  7. #include "Adafruit_BME680.h"
  8.  
  9.  
  10. // SPI pin mapping (ESP32)
  11. #define BME_SCK   18
  12. #define BME_MISO  19
  13. #define BME_MOSI  23
  14. #define BME_CS    21
  15. #define DISP_CS   5
  16. #define DISP_DC   17
  17. #define DISP_RST  16
  18. #define DISP_BUSY 4
  19.  
  20. #define SEALEVELPRESSURE_HPA (1013.25)
  21.  
  22. // Display driver
  23. GxEPD2_BW<GxEPD2_290_T94_V2, GxEPD2_290_T94_V2::HEIGHT> display(
  24.   GxEPD2_290_T94_V2(DISP_CS, DISP_DC, DISP_RST, DISP_BUSY)
  25. );
  26.  
  27.  
  28. // BME680 via SPI
  29. Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);
  30.  
  31. bool sensor_error = false;
  32. float temperature, humidity, pressure, gas, alt;
  33.  
  34.  
  35. // Chip select switching
  36. void selectSensor() {
  37.   digitalWrite(DISP_CS, HIGH);
  38.   digitalWrite(BME_CS, LOW);
  39.   sensor_error = false;
  40. }
  41.  
  42. void selectDisplay() {
  43.   digitalWrite(BME_CS, HIGH);
  44.   digitalWrite(DISP_CS, LOW);
  45. }
  46.  
  47. // Read sensor data
  48. void readValues() {
  49.   selectSensor();
  50.   if (!bme.performReading()) {
  51.     sensor_error = true;
  52.     Serial.println("Error reading from sensor!");
  53.     return;
  54.   }
  55.   delay(400);
  56.   temperature = bme.temperature;
  57.   humidity    = bme.humidity;
  58.   pressure    = bme.pressure;
  59.   alt         = bme.readAltitude(SEALEVELPRESSURE_HPA);
  60.  
  61.   Serial.print("Sensor values: ");
  62.   Serial.print(temperature); Serial.print(" °C, ");
  63.   Serial.print(humidity);    Serial.print(" %, ");
  64.   Serial.print(pressure);    Serial.println(" Pa");
  65. }
  66.  
  67. // Update display
  68. void displayValues(int16_t x, int16_t y, int16_t sep) {
  69.   if (sensor_error) return;
  70.   selectDisplay();
  71.  
  72.   display.setRotation(1);
  73.   display.setFont(&FreeMonoBold9pt7b);
  74.   display.setTextColor(GxEPD_BLACK);
  75.   display.setFullWindow();
  76.   display.firstPage();
  77.   do {
  78.     display.fillScreen(GxEPD_WHITE);
  79.     display.setCursor(x, y);
  80.     display.print("T: ");  display.print(temperature, 1); display.println(" C");
  81.     display.setCursor(x, y + sep);
  82.     display.print("H: ");  display.print(humidity, 1);    display.println(" %");
  83.     display.setCursor(x, y + sep*2);
  84.     display.print("P: ");  display.print(pressure / 100.0, 1); display.println(" hPa");
  85.     display.setCursor(x, y + sep*3);
  86.     display.print("Alt: "); display.print(alt, 1);        display.println(" m");
  87.   } while (display.nextPage());
  88.  
  89.   Serial.println("Display updated.");
  90. }
  91.  
  92.  
  93. // Setup
  94. void setup() {
  95.   Serial.begin(115200);
  96.   delay(100);
  97.  
  98.   // Start SPI manually
  99.   SPI.begin(BME_SCK, BME_MISO, BME_MOSI);
  100.  
  101.   // Configure CS pins
  102.   pinMode(BME_CS, OUTPUT);
  103.   pinMode(DISP_CS, OUTPUT);
  104.   digitalWrite(BME_CS, HIGH);
  105.   digitalWrite(DISP_CS, HIGH);
  106.  
  107.   // Initialize display
  108.   selectDisplay();
  109.   display.init(115200, true, 2, false);  // works for you!
  110.  
  111.   // Clear display once
  112.   display.setRotation(1);
  113.   display.setFullWindow();
  114.   display.firstPage();
  115.   do {
  116.     display.fillScreen(GxEPD_WHITE);
  117.   } while (display.nextPage());
  118.  
  119.   // Initialize sensor
  120.   selectSensor();
  121.   if (!bme.begin()) {
  122.     Serial.println("BME680 not found!");
  123.     while (1);
  124.   }
  125.  
  126.   bme.setTemperatureOversampling(BME680_OS_4X);
  127.   bme.setHumidityOversampling(BME680_OS_2X);
  128.   bme.setPressureOversampling(BME680_OS_4X);
  129.   bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  130.  
  131.   Serial.println("Setup complete.");
  132.   delay(2000);
  133. }
  134.  
  135. // Loop
  136. void loop() {
  137.   Serial.println("\nNew cycle...");
  138.   readValues();
  139.   displayValues(20, 20, 20);
  140.   Serial.println("Waiting 30 seconds...\n");
  141.   delay(30000);
  142. }
  143.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement