#include "BluetoothSerial.h" #include #include #include #include #include #include #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 BluetoothSerial SerialBT; Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); Adafruit_BME280 bme; Adafruit_CCS811 ccs; #define ICON_WIDTH 8 #define ICON_HEIGHT 16 static const unsigned char PROGMEM temp[] = { B00011100, B00100010, B00100011, B00100010, B00101011, B00101010, B00101011, B00101010, B00101010, B00101010, B01001001, B01011101, B01000001, B00111110, B00000000, B00000000}; static const unsigned char PROGMEM height[] = { B01111110, B01000010, B01000010, B01111010, B01000010, B01000010, B01111010, B01000010, B01000010, B01111010, B01000010, B01000010, B01111010, B01000010, B01000010, B01111110}; static const unsigned char PROGMEM humid[] = { B00000000, B00011000, B00100100, B00100100, B01000010, B01000010, B10000001, B10000001, B10100101, B10001001, B10010001, B10100101, B10000001, B01000010, B00111100, B00000000}; void setup() { Serial.begin(115200); SerialBT.begin("AQM"); //Bluetooth device name if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32 Serial.println(F("SSD1306 allocation failed")); while (1) delay(100); } display.clearDisplay(); // clear display display.setTextSize(1); // 1:1 pixel scale display.setFont(&FreeSans9pt7b); // set font display.setTextColor(SSD1306_WHITE); // draw white text display.setCursor(0, 15); // start at top-left corner if (!bme.begin(0x76, &Wire)) { Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!"); display.write("no BME280 sensor"); display.display(); while (1) delay(100); } if(!ccs.begin()){ Serial.println("Failed to start CCS sensor! Please check your wiring."); display.write("no CCS811 sensor"); display.display(); while (1) delay(100); } ccs.setEnvironmentalData(bme.readHumidity(), bme.readTemperature()); display.write("waiting for CCS811 sensor"); Serial.println("Waiting for sensor"); display.display(); while(!ccs.available()){ delay(100); } // draw initial icons and static info display.clearDisplay(); display.drawBitmap(0, 0, temp, ICON_WIDTH, ICON_HEIGHT, 1); display.drawBitmap(60, 0, height, ICON_WIDTH, ICON_HEIGHT, 1); display.drawBitmap(0, 16, humid, ICON_WIDTH, ICON_HEIGHT, 1); display.drawCircle(48, 5, 2, SSD1306_WHITE); display.drawCircle(47, 21, 2, SSD1306_WHITE); display.drawCircle(53, 29, 2, SSD1306_WHITE); display.drawLine(47,28, 53,22, SSD1306_WHITE); } char line[128]; // line buffer uint16_t eCO2 = 0; // CO2 value in parts per million uint16_t TVOCppb = 0; // RVOC in parts per billion void loop() { uint8_t ccRead = ccs.readData(); // read CCS sensor if (!ccRead) { eCO2 = ccs.geteCO2(); TVOCppb = ccs.getTVOC(); } float temperature = bme.readTemperature(); // in °C float pressure = bme.readPressure() / 100.0; // in hPa / 1 milli Bar float humidity = bme.readHumidity(); // in % // send status to USB serial and bluetooth snprintf(line,127, "T: %3.1f°C P: %6.2fhPa H: %4.2f%% eCO2:%i ppm, tvoc:%i ppb\n", temperature, pressure, humidity, eCO2, TVOCppb); Serial.print(line); SerialBT.print(line); // draw to display // clear text / draw bar graph area display.fillRect(8, 0, 37, 32, SSD1306_BLACK); display.fillRect(8+64, 0, 56, 32, SSD1306_BLACK); display.fillRect(0, 32, 128, 32, SSD1306_BLACK); display.fillRect(64, 32, 64.0 * eCO2 / 8192, 16, SSD1306_WHITE); display.fillRect(64, 48, 64.0 * TVOCppb / 1187, 16, SSD1306_WHITE); // draw temperature display.setCursor(9, 15); snprintf(line,127, "%3.1f", temperature); display.write(line); // draw pressure snprintf(line,127, "%6.1f", pressure); display.setCursor(73, 15); display.write(line); // draw humidity display.setCursor(9, 31); snprintf(line,127, "%3.1f", humidity); display.write(line); // draw CO2 level display.setCursor(9, 46); snprintf(line,127, "%04i",eCO2); display.write(line); // draw TVOC display.setCursor(9, 61); snprintf(line,127, "%04i",TVOCppb); display.write(line); // update display display.display(); // zzzZZZZzzz delay(10000); }