123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #include "Adafruit_CCS811.h"
- #include "Adafruit_Si7021.h"
- #include "ArduinoLowPower.h"
- #define VBATPIN A7
- #define ENABLE_GxEPD2_GFX 0
- #include <GxEPD2_BW.h>
- #include <GxEPD2_3C.h>
- #include <Fonts/FreeMonoBold9pt7b.h>
- #define MAX_DISPLAY_BUFFER_SIZE 800
- #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
- // PIN definitions for Adafruit Feather M0
- GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=A3*/ 17, /*DC=A2*/ 16, /*RST=A1*/ 15, /*BUSY=A0*/ 14));
- Adafruit_CCS811 ccs;
- Adafruit_Si7021 temperature_sensor = Adafruit_Si7021();
- void setup() {
- Serial.begin(9600);
- if(!ccs.begin()){
- Serial.println("Failed to start sensor! Please check your wiring.");
- while(true);
- }
- ccs.setDriveMode(CCS811_DRIVE_MODE_10SEC);
- if (!temperature_sensor.begin()) {
- Serial.println("Did not find Si7021 sensor!");
- while (true);
- }
-
- // Wait for the sensor to be ready
- while(!ccs.available());
- display.init();
- }
- void loop() {
- displayData(
- readEco2(), temperature_sensor.readHumidity(),
- temperature_sensor.readTemperature(), readTVOC(),
- readBatteryPercentage());
- LowPower.sleep(300000);
- }
- uint16_t readEco2() {
- uint16_t eco2;
- if (ccs.available()) {
- if (!ccs.readData()) {
- eco2 = ccs.geteCO2();
- } else {
- eco2 = 0;
- }
- return eco2;
- }
- }
- uint16_t readTVOC() {
- uint16_t tvoc;
- if (ccs.available()) {
- if (!ccs.readData()) {
- tvoc = ccs.getTVOC();
- } else {
- tvoc = 0;
- }
- }
- return tvoc;
- }
- float readVBatVoltage() {
- float measuredVBat = analogRead(VBATPIN);
- measuredVBat *= 2; // we divided by 2, so multiply back
- measuredVBat *= 3.3; // Multiply by 3.3V, our reference voltage
- measuredVBat /= 1024; // convert to voltage
- return measuredVBat;
- }
- int readBatteryPercentage() {
- float voltage = readVBatVoltage();
- float difference = 4.25 - 3.2;
- int percentage = (voltage - 3.2) / difference * 100;
- return percentage;
- }
- void displayData(uint16_t eco2, float humidity, float temperature, float tvoc, int batteryPercentage) {
- display.clearScreen();
- display.setRotation(1);
- display.setFont(&FreeMonoBold9pt7b);
- display.setTextColor(GxEPD_BLACK);
- char co2_string[128];
- snprintf(co2_string, 128, "eCo2: %d ppm\nHumidity: %.2f%%\nTemperature: %.2fC\nTVOC: %.0f ppm\nBattery: %d%%", eco2, humidity, temperature, tvoc, batteryPercentage);
- int16_t tbx, tby; uint16_t tbw, tbh;
- display.getTextBounds(co2_string, 0, 0, &tbx, &tby, &tbw, &tbh);
- uint16_t x = 0 - tbx;
- uint16_t y = 0 - tby + 10;
- display.setFullWindow();
- display.firstPage();
- do {
- display.fillScreen(GxEPD_WHITE);
- display.setCursor(x, y);
- display.print(co2_string);
- } while (display.nextPage());
- display.hibernate();
- }
|