feather-room-climate-sensor.ino 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "Adafruit_CCS811.h"
  2. #include "Adafruit_Si7021.h"
  3. #include "ArduinoLowPower.h"
  4. #define VBATPIN A7
  5. #define ENABLE_GxEPD2_GFX 0
  6. #include <GxEPD2_BW.h>
  7. #include <GxEPD2_3C.h>
  8. #include <Fonts/FreeMonoBold9pt7b.h>
  9. #define MAX_DISPLAY_BUFFER_SIZE 800
  10. #define MAX_HEIGHT(EPD) (EPD::HEIGHT <= MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8) ? EPD::HEIGHT : MAX_DISPLAY_BUFFER_SIZE / (EPD::WIDTH / 8))
  11. // PIN definitions for Adafruit Feather M0
  12. GxEPD2_BW<GxEPD2_213, GxEPD2_213::HEIGHT> display(GxEPD2_213(/*CS=A3*/ 17, /*DC=A2*/ 16, /*RST=A1*/ 15, /*BUSY=A0*/ 14));
  13. Adafruit_CCS811 ccs;
  14. Adafruit_Si7021 temperature_sensor = Adafruit_Si7021();
  15. void setup() {
  16. Serial.begin(9600);
  17. if(!ccs.begin()){
  18. Serial.println("Failed to start sensor! Please check your wiring.");
  19. while(true);
  20. }
  21. ccs.setDriveMode(CCS811_DRIVE_MODE_10SEC);
  22. if (!temperature_sensor.begin()) {
  23. Serial.println("Did not find Si7021 sensor!");
  24. while (true);
  25. }
  26. // Wait for the sensor to be ready
  27. while(!ccs.available());
  28. display.init();
  29. }
  30. void loop() {
  31. displayData(
  32. readEco2(), temperature_sensor.readHumidity(),
  33. temperature_sensor.readTemperature(), readTVOC(),
  34. readBatteryPercentage());
  35. LowPower.sleep(300000);
  36. }
  37. uint16_t readEco2() {
  38. uint16_t eco2;
  39. if (ccs.available()) {
  40. if (!ccs.readData()) {
  41. eco2 = ccs.geteCO2();
  42. } else {
  43. eco2 = 0;
  44. }
  45. return eco2;
  46. }
  47. }
  48. uint16_t readTVOC() {
  49. uint16_t tvoc;
  50. if (ccs.available()) {
  51. if (!ccs.readData()) {
  52. tvoc = ccs.getTVOC();
  53. } else {
  54. tvoc = 0;
  55. }
  56. }
  57. return tvoc;
  58. }
  59. float readVBatVoltage() {
  60. float measuredVBat = analogRead(VBATPIN);
  61. measuredVBat *= 2; // we divided by 2, so multiply back
  62. measuredVBat *= 3.3; // Multiply by 3.3V, our reference voltage
  63. measuredVBat /= 1024; // convert to voltage
  64. return measuredVBat;
  65. }
  66. int readBatteryPercentage() {
  67. float voltage = readVBatVoltage();
  68. float difference = 4.25 - 3.2;
  69. int percentage = (voltage - 3.2) / difference * 100;
  70. return percentage;
  71. }
  72. void displayData(uint16_t eco2, float humidity, float temperature, float tvoc, int batteryPercentage) {
  73. display.clearScreen();
  74. display.setRotation(1);
  75. display.setFont(&FreeMonoBold9pt7b);
  76. display.setTextColor(GxEPD_BLACK);
  77. char co2_string[128];
  78. snprintf(co2_string, 128, "eCo2: %d ppm\nHumidity: %.2f%%\nTemperature: %.2fC\nTVOC: %.0f ppm\nBattery: %d%%", eco2, humidity, temperature, tvoc, batteryPercentage);
  79. int16_t tbx, tby; uint16_t tbw, tbh;
  80. display.getTextBounds(co2_string, 0, 0, &tbx, &tby, &tbw, &tbh);
  81. uint16_t x = 0 - tbx;
  82. uint16_t y = 0 - tby + 10;
  83. display.setFullWindow();
  84. display.firstPage();
  85. do {
  86. display.fillScreen(GxEPD_WHITE);
  87. display.setCursor(x, y);
  88. display.print(co2_string);
  89. } while (display.nextPage());
  90. display.hibernate();
  91. }