mirror of
https://github.com/airgradienthq/arduino.git
synced 2025-07-03 03:16:30 +02:00
PRO v9 (C3 Version), added LED config
This commit is contained in:
@ -1,16 +1,25 @@
|
||||
#include "PMS.h"
|
||||
|
||||
#include <HardwareSerial.h>
|
||||
|
||||
#include <Wire.h>
|
||||
|
||||
#include "s8_uart.h"
|
||||
|
||||
#include <HTTPClient.h>
|
||||
|
||||
#include <WiFiManager.h>
|
||||
|
||||
#include <Adafruit_NeoPixel.h>
|
||||
|
||||
#include <EEPROM.h>
|
||||
|
||||
#include "SHTSensor.h"
|
||||
|
||||
#include <SensirionI2CSgp41.h>
|
||||
|
||||
#include <NOxGasIndexAlgorithm.h>
|
||||
|
||||
#include <VOCGasIndexAlgorithm.h>
|
||||
|
||||
#include <U8g2lib.h>
|
||||
@ -56,12 +65,14 @@ boolean inUSAQI = false;
|
||||
// Display Position
|
||||
boolean displayTop = true;
|
||||
|
||||
// use RGB LED Bar
|
||||
boolean useRGBledBar = true;
|
||||
|
||||
// set to true if you want to connect to wifi. You have 60 seconds to connect. Then it will go into an offline mode.
|
||||
boolean connectWIFI = true;
|
||||
|
||||
int loopCount = 0;
|
||||
|
||||
|
||||
unsigned long currentMillis = 0;
|
||||
|
||||
const int oledInterval = 5000;
|
||||
@ -106,18 +117,10 @@ void setup() {
|
||||
|
||||
Wire.begin(I2C_SDA, I2C_SCL);
|
||||
pixels.begin();
|
||||
|
||||
pixels.clear();
|
||||
for(int i=0; i<11; i++) {
|
||||
pixels.setPixelColor(i, pixels.Color(255, 255, 255));
|
||||
pixels.show();
|
||||
delay(100);
|
||||
}
|
||||
|
||||
Serial1.begin(9600, SERIAL_8N1, 0, 1);
|
||||
Serial0.begin(9600);
|
||||
|
||||
Serial.println("Hello");
|
||||
u8g2.begin();
|
||||
|
||||
updateOLED2("Warming Up", "Serial Number:", String(getNormalizedMac()));
|
||||
@ -126,24 +129,15 @@ void setup() {
|
||||
sht.init(Wire);
|
||||
sht.setAccuracy(SHTSensor::SHT_ACCURACY_MEDIUM);
|
||||
|
||||
//init Watchdog
|
||||
pinMode(2, OUTPUT);
|
||||
digitalWrite(2, LOW);
|
||||
|
||||
sensor_S8 = new S8_UART(Serial1);
|
||||
|
||||
// Check if S8 is available
|
||||
sensor_S8->get_firmware_version(sensor.firm_version);
|
||||
int len = strlen(sensor.firm_version);
|
||||
if (len == 0) {
|
||||
debugln("SenseAir S8 CO2 sensor not found!");
|
||||
}
|
||||
|
||||
// Show basic S8 sensor info
|
||||
// debugln(">>> SenseAir S8 NDIR CO2 sensor <<<");
|
||||
// sensor.sensor_id = sensor_S8->get_sensor_ID();
|
||||
|
||||
EEPROM.begin(512);
|
||||
delay(500);
|
||||
|
||||
|
||||
// push button
|
||||
pinMode(9, INPUT_PULLUP);
|
||||
|
||||
@ -154,10 +148,8 @@ buttonConfig = String(EEPROM.read(addr)).toInt();
|
||||
Serial.println("buttonConfig: " + String(buttonConfig));
|
||||
updateOLED2("Press Button", "Now for", "Config Menu");
|
||||
delay(2000);
|
||||
// pinMode(D7, INPUT_PULLUP);
|
||||
currentState = digitalRead(9);
|
||||
if (currentState == LOW)
|
||||
{
|
||||
if (currentState == LOW) {
|
||||
updateOLED2("Entering", "Config Menu", "");
|
||||
delay(3000);
|
||||
lastState = HIGH;
|
||||
@ -167,8 +159,7 @@ buttonConfig = String(EEPROM.read(addr)).toInt();
|
||||
|
||||
countdown(3);
|
||||
|
||||
if (connectWIFI)
|
||||
{
|
||||
if (connectWIFI) {
|
||||
connectToWifi();
|
||||
}
|
||||
sendPing();
|
||||
@ -185,8 +176,7 @@ void loop() {
|
||||
sendToServer();
|
||||
}
|
||||
|
||||
void updateTVOC()
|
||||
{
|
||||
void updateTVOC() {
|
||||
uint16_t error;
|
||||
char errorMessage[256];
|
||||
uint16_t defaultRh = 0x8000;
|
||||
@ -219,17 +209,16 @@ void updateTVOC()
|
||||
}
|
||||
}
|
||||
|
||||
void updateCo2()
|
||||
{
|
||||
void updateCo2() {
|
||||
if (currentMillis - previousCo2 >= co2Interval) {
|
||||
previousCo2 += co2Interval;
|
||||
Co2 = sensor_S8 -> get_co2();
|
||||
Serial.println(String(Co2));
|
||||
setRGBledCO2color(Co2);
|
||||
}
|
||||
}
|
||||
|
||||
void updatePm()
|
||||
{
|
||||
void updatePm() {
|
||||
if (currentMillis - previousPm >= pmInterval) {
|
||||
previousPm += pmInterval;
|
||||
if (pms1.readUntil(data1, 2000)) {
|
||||
@ -241,8 +230,7 @@ void updatePm()
|
||||
}
|
||||
}
|
||||
|
||||
void updateTempHum()
|
||||
{
|
||||
void updateTempHum() {
|
||||
if (currentMillis - previousTempHum >= tempHumInterval) {
|
||||
previousTempHum += tempHumInterval;
|
||||
|
||||
@ -279,7 +267,6 @@ void updateOLED() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void inConf() {
|
||||
setConfig();
|
||||
currentState = digitalRead(9);
|
||||
@ -292,9 +279,7 @@ void inConf(){
|
||||
|
||||
if (lastState == HIGH && currentState == LOW) {
|
||||
pressedTime = millis();
|
||||
}
|
||||
|
||||
else if(lastState == LOW && currentState == HIGH) {
|
||||
} else if (lastState == LOW && currentState == HIGH) {
|
||||
releasedTime = millis();
|
||||
long pressDuration = releasedTime - pressedTime;
|
||||
if (pressDuration < 1000) {
|
||||
@ -322,7 +307,6 @@ void inConf(){
|
||||
inConf();
|
||||
}
|
||||
|
||||
|
||||
void setConfig() {
|
||||
if (buttonConfig == 0) {
|
||||
updateOLED2("Temp. in C", "PM in ug/m3", "Long Press Saves");
|
||||
@ -357,9 +341,9 @@ void switchLED(boolean ledON) {
|
||||
}
|
||||
|
||||
void sendPing() {
|
||||
String payload = "{\"wifi\":" + String(WiFi.RSSI())
|
||||
+ ", \"boot\":" + loopCount
|
||||
+ "}";
|
||||
String payload = "{\"wifi\":" + String(WiFi.RSSI()) +
|
||||
", \"boot\":" + loopCount +
|
||||
"}";
|
||||
}
|
||||
|
||||
void updateOLED2(String ln1, String ln2, String ln3) {
|
||||
@ -377,18 +361,18 @@ void updateOLED2(String ln1, String ln2, String ln3) {
|
||||
void sendToServer() {
|
||||
if (currentMillis - previoussendToServer >= sendToServerInterval) {
|
||||
previoussendToServer += sendToServerInterval;
|
||||
String payload = "{\"wifi\":" + String(WiFi.RSSI())
|
||||
+ (Co2 < 0 ? "" : ", \"rco2\":" + String(Co2))
|
||||
+ (pm01 < 0 ? "" : ", \"pm01\":" + String(pm01))
|
||||
+ (pm25 < 0 ? "" : ", \"pm02\":" + String(pm25))
|
||||
+ (pm10 < 0 ? "" : ", \"pm10\":" + String(pm10))
|
||||
+ (pm03PCount < 0 ? "" : ", \"pm003_count\":" + String(pm03PCount))
|
||||
+ (TVOC < 0 ? "" : ", \"tvoc_index\":" + String(TVOC))
|
||||
+ (NOX < 0 ? "" : ", \"nox_index\":" + String(NOX))
|
||||
+ ", \"atmp\":" + String(temp)
|
||||
+ (hum < 0 ? "" : ", \"rhum\":" + String(hum))
|
||||
+ ", \"boot\":" + loopCount
|
||||
+ "}";
|
||||
String payload = "{\"wifi\":" + String(WiFi.RSSI()) +
|
||||
(Co2 < 0 ? "" : ", \"rco2\":" + String(Co2)) +
|
||||
(pm01 < 0 ? "" : ", \"pm01\":" + String(pm01)) +
|
||||
(pm25 < 0 ? "" : ", \"pm02\":" + String(pm25)) +
|
||||
(pm10 < 0 ? "" : ", \"pm10\":" + String(pm10)) +
|
||||
(pm03PCount < 0 ? "" : ", \"pm003_count\":" + String(pm03PCount)) +
|
||||
(TVOC < 0 ? "" : ", \"tvoc_index\":" + String(TVOC)) +
|
||||
(NOX < 0 ? "" : ", \"nox_index\":" + String(NOX)) +
|
||||
", \"atmp\":" + String(temp) +
|
||||
(hum < 0 ? "" : ", \"rhum\":" + String(hum)) +
|
||||
", \"boot\":" + loopCount +
|
||||
"}";
|
||||
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
Serial.println(payload);
|
||||
@ -405,8 +389,7 @@ void sendToServer() {
|
||||
http.end();
|
||||
resetWatchdog();
|
||||
loopCount++;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
Serial.println("WiFi Disconnected");
|
||||
}
|
||||
}
|
||||
@ -423,6 +406,7 @@ void countdown(int from) {
|
||||
}
|
||||
|
||||
void resetWatchdog() {
|
||||
Serial.println("Watchdog reset");
|
||||
digitalWrite(2, HIGH);
|
||||
delay(20);
|
||||
digitalWrite(2, LOW);
|
||||
@ -435,8 +419,6 @@ void resetWatchdog() {
|
||||
//WiFi.disconnect(); //to delete previous saved hotspot
|
||||
String HOTSPOT = "AG-" + String(getNormalizedMac());
|
||||
wifiManager.setTimeout(180);
|
||||
|
||||
|
||||
if (!wifiManager.autoConnect((const char * ) HOTSPOT.c_str())) {
|
||||
switchLED(false);
|
||||
Serial.println("failed to connect and hit timeout");
|
||||
@ -472,6 +454,68 @@ String getNormalizedMac() {
|
||||
return mac;
|
||||
}
|
||||
|
||||
void setRGBledCO2color(int co2Value) {
|
||||
if (co2Value < 800) setRGBledColor('g');
|
||||
if (co2Value >= 800 && co2Value < 1000) setRGBledColor('y');
|
||||
if (co2Value >= 1000 && co2Value < 1500) setRGBledColor('o');
|
||||
if (co2Value >= 1500 && co2Value < 2000) setRGBledColor('r');
|
||||
if (co2Value >= 2000 && co2Value < 3000) setRGBledColor('p');
|
||||
if (co2Value >= 3000 && co2Value < 10000) setRGBledColor('b');
|
||||
}
|
||||
|
||||
void setRGBledColor(char color) {
|
||||
if (useRGBledBar) {
|
||||
//pixels.clear();
|
||||
switch (color) {
|
||||
case 'g':
|
||||
for (int i = 0; i < 11; i++) {
|
||||
pixels.setPixelColor(i, pixels.Color(0, 255, 0));
|
||||
delay(100);
|
||||
pixels.show();
|
||||
}
|
||||
break;
|
||||
case 'y':
|
||||
for (int i = 0; i < 11; i++) {
|
||||
pixels.setPixelColor(i, pixels.Color(255, 255, 0));
|
||||
delay(100);
|
||||
pixels.show();
|
||||
}
|
||||
break;
|
||||
case 'o':
|
||||
for (int i = 0; i < 11; i++) {
|
||||
pixels.setPixelColor(i, pixels.Color(255, 128, 0));
|
||||
delay(100);
|
||||
pixels.show();
|
||||
}
|
||||
break;
|
||||
case 'r':
|
||||
for (int i = 0; i < 11; i++) {
|
||||
pixels.setPixelColor(i, pixels.Color(255, 0, 0));
|
||||
delay(100);
|
||||
pixels.show();
|
||||
}
|
||||
break;
|
||||
case 'p':
|
||||
for (int i = 0; i < 11; i++) {
|
||||
pixels.setPixelColor(i, pixels.Color(153, 0, 153));
|
||||
delay(100);
|
||||
pixels.show();
|
||||
}
|
||||
break;
|
||||
case 'b':
|
||||
for (int i = 0; i < 11; i++) {
|
||||
pixels.setPixelColor(i, pixels.Color(102, 0, 0));
|
||||
delay(100);
|
||||
pixels.show();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
// if nothing else matches, do the default
|
||||
// default is optional
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Calculate PM2.5 US AQI
|
||||
int PM_TO_AQI_US(int pm02) {
|
||||
|
Reference in New Issue
Block a user