trinkey_qt2040_enviro.ino
  1  // SPDX-FileCopyrightText: 2021 Carter Nelson for Adafruit Industries
  2  //
  3  // SPDX-License-Identifier: MIT
  4  
  5  #include <Adafruit_NeoPixel.h>
  6  #include <Adafruit_BME280.h>
  7  #include <SensirionI2CScd4x.h>
  8  #include <Wire.h>
  9  
 10  //--| User Config |-----------------------------------------------
 11  #define DATA_FORMAT   0         // 0=CSV, 1=JSON
 12  #define DATA_RATE     5000      // generate new number ever X ms
 13  #define BEAT_COLOR    0xADAF00  // neopixel heart beat color
 14  #define BEAT_RATE     1000      // neopixel heart beat rate in ms, 0=none
 15  //----------------------------------------------------------------
 16  
 17  Adafruit_BME280 bme;
 18  SensirionI2CScd4x scd4x;
 19  Adafruit_NeoPixel neopixel(1, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);
 20  
 21  uint16_t CO2, data_ready;
 22  float scd4x_temp, scd4x_humid;
 23  float temperature, humidity, pressure;
 24  int current_time, last_data, last_beat;
 25  
 26  void setup() {
 27    Serial.begin(115200);
 28  
 29    // init status neopixel
 30    neopixel.begin();
 31    neopixel.fill(0);
 32    neopixel.show();
 33  
 34    // init BME280 first, this calls Wire.begin()
 35    if (!bme.begin()) {
 36      Serial.println("Failed to initialize BME280.");
 37      neoPanic();
 38    }
 39  
 40    // init SCD40
 41    scd4x.begin(Wire);
 42    scd4x.stopPeriodicMeasurement();
 43    if (scd4x.startPeriodicMeasurement()) {
 44      Serial.println("Failed to start SCD40.");
 45      neoPanic();
 46    }
 47  
 48    // init time tracking
 49    last_data = last_beat = millis();
 50  }
 51  
 52  void loop() {
 53    current_time = millis();
 54  
 55    //-----------
 56    // Send Data
 57    //-----------
 58    if (current_time - last_data > DATA_RATE) {
 59      temperature = bme.readTemperature();
 60      pressure = bme.readPressure() / 100;
 61      humidity = bme.readHumidity();
 62      scd4x.setAmbientPressure(uint16_t(pressure));
 63      scd4x.readMeasurement(CO2, scd4x_temp, scd4x_humid);
 64      switch (DATA_FORMAT) {
 65        case 0:
 66          sendCSV(); break;
 67        case 1:
 68          sendJSON(); break;
 69        default:
 70          Serial.print("Unknown data format: "); Serial.println(DATA_FORMAT);
 71          neoPanic();
 72      }
 73      last_data = current_time;
 74    }
 75  
 76    //------------
 77    // Heart Beat
 78    //------------
 79    if ((BEAT_RATE) && (current_time - last_beat > BEAT_RATE)) {
 80      if (neopixel.getPixelColor(0)) {
 81        neopixel.fill(0);
 82      } else {
 83        neopixel.fill(BEAT_COLOR);
 84      }
 85      neopixel.show();
 86      last_beat = current_time;
 87    }
 88  }
 89  
 90  void sendCSV() {
 91    Serial.print(CO2); Serial.print(", ");
 92    Serial.print(pressure); Serial.print(", ");
 93    Serial.print(temperature); Serial.print(", ");
 94    Serial.println(humidity);
 95  }
 96  
 97  void sendJSON() {
 98    Serial.print("{");
 99    Serial.print("\"CO2\" : "); Serial.print(CO2); Serial.print(", ");
100    Serial.print("\"pressure\" : "); Serial.print(pressure); Serial.print(", ");
101    Serial.print("\"temperature\" : "); Serial.print(temperature); Serial.print(", ");
102    Serial.print("\"humidity\" : "); Serial.print(humidity);
103    Serial.println("}");
104  }
105  
106  void neoPanic() {
107    while (1) {
108      neopixel.fill(0xFF0000); neopixel.show(); delay(100);
109      neopixel.fill(0x000000); neopixel.show(); delay(100);
110    }
111  }