initial commit
parent
18779e2c2f
commit
338b3e116c
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) <year> <copyright holders>
|
Copyright (c) 2021 GrumyDeveloper https://contentnation.net/en/grumpydevelop/
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,164 @@
|
||||||
|
#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);
|
||||||
|
}
|
Loading…
Reference in New Issue