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 }