airquality/main.ino

165 lines
4.5 KiB
C++

#include "BluetoothSerial.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_CCS811.h>
#include <Fonts/FreeSans9pt7b.h>
#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);
}