Created
December 8, 2019 19:02
-
-
Save Dvorson/581b27e58a8b608a6f749fa95f108aea to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <M5Stack.h> | |
#include "Free_Fonts.h" | |
#include <Wire.h> | |
#include "DFRobot_SHT20.h" | |
#include <WiFi.h> | |
#include <PubSubClient.h> | |
#define TFT_GREY 0x7BEF | |
#define DATA_LEN 32 | |
#define X_LOCAL 40 | |
#define Y_LOCAL 30 | |
#define X_OFFSET 160 | |
#define Y_OFFSET 23 | |
#define FRONT 2 | |
const char* ssid = ".........."; | |
const char* password = "........."; | |
const char* mqtt_server = "........."; | |
DFRobot_SHT20 sht20; | |
WiFiClient espClient; | |
PubSubClient client(espClient); | |
uint16_t CheckSum; | |
uint16_t CheckCode; | |
uint8_t Air_val[32] = {0}; | |
int16_t p_val[16] = {0}; | |
uint8_t i = 0; | |
float humd = 0; | |
float temp = 0; | |
unsigned long lastMsg = 0; | |
String clientId = "M5Stack_AirQuality"; | |
// Print the header for a display screen | |
void header(const char *string, uint16_t color) { | |
M5.Lcd.fillScreen(color); | |
M5.Lcd.setTextSize(1); | |
M5.Lcd.setTextColor(TFT_MAGENTA, TFT_BLUE); | |
M5.Lcd.fillRect(0, 0, 320, 30, TFT_BLUE); | |
M5.Lcd.setTextDatum(TC_DATUM); | |
M5.Lcd.drawString(string, 160, 3, 4); | |
} | |
void setup() { | |
M5.begin(); | |
Serial.begin(9600); | |
Serial2.begin(9600, SERIAL_8N1, 16, 17); | |
pinMode(10, OUTPUT); | |
digitalWrite(10, 1); | |
M5.Lcd.fillScreen(TFT_BLACK); | |
header("P M 2.5", TFT_BLACK); | |
M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL , FRONT); | |
M5.Lcd.print("Connecting"); | |
WiFi.begin(ssid, password); | |
while (WiFi.status() != WL_CONNECTED) { | |
delay(500); | |
M5.Lcd.print("."); | |
} | |
client.setServer(mqtt_server, 1883); | |
client.connect(clientId.c_str()); | |
M5.Lcd.println(); | |
M5.Lcd.print("Connected"); | |
delay(1000); | |
M5.Lcd.fillScreen(TFT_BLACK); | |
header("P M 2.5", TFT_BLACK); | |
sht20.initSHT20(); // Init SHT20 Sensor | |
delay(100); | |
sht20.checkSHT20(); | |
} | |
void LCD_Display_Val(void) { | |
for (int i = 0, j = 0; i < 32; i++) { | |
if (i % 2 == 0) { | |
p_val[j] = Air_val[i]; | |
p_val[j] = p_val[j] << 8; | |
} else { | |
p_val[j] |= Air_val[i]; | |
j++; | |
} | |
} | |
// M5.Lcd.setTextSize(FRONT); | |
M5.Lcd.setTextColor(TFT_RED, TFT_BLACK); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL , FRONT); | |
M5.Lcd.print("Standard"); | |
M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET, FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET, FRONT); | |
M5.Lcd.print("PM1.0 : "); | |
M5.Lcd.print( p_val[2]); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET * 2 , FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET * 2 , FRONT); | |
M5.Lcd.print("PM2.5 : "); | |
M5.Lcd.print(p_val[3]); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET * 3, FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET * 3, FRONT); | |
M5.Lcd.print("PM10 : "); | |
M5.Lcd.print(p_val[4]); | |
M5.Lcd.setTextColor(TFT_RED, TFT_BLACK); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL , FRONT); | |
M5.Lcd.print("Ambient "); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET, FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET, FRONT); | |
M5.Lcd.print("PM1.0 : "); | |
M5.Lcd.print(p_val[5]); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET * 2 , FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET * 2 , FRONT); | |
M5.Lcd.print("PM2.5 : "); | |
M5.Lcd.print(p_val[6]); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET * 3 , FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET * 3 , FRONT); | |
M5.Lcd.print("PM10 : "); | |
M5.Lcd.print(p_val[7]); | |
M5.Lcd.setTextColor(TFT_RED, TFT_BLACK); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET / 4, Y_LOCAL + Y_OFFSET * 4 , FRONT); | |
M5.Lcd.print("Number of particles"); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET * 5 , FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET * 5 , FRONT); | |
M5.Lcd.print("0.3um : "); | |
M5.Lcd.print(p_val[8]); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET * 6 , FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET * 6 , FRONT); | |
M5.Lcd.print("0.5um : "); | |
M5.Lcd.print(p_val[9]); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET * 7 , FRONT); | |
M5.Lcd.print("1.0um : "); | |
M5.Lcd.print(p_val[10]); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET * 5 , FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET * 5 , FRONT); | |
M5.Lcd.print("2.5um : "); | |
M5.Lcd.print(p_val[11]); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET * 6 , FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET * 6 , FRONT); | |
M5.Lcd.print("5.0um : "); | |
M5.Lcd.print(p_val[12]); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET * 7 , FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET * 7 , FRONT); | |
M5.Lcd.print("10um : "); | |
M5.Lcd.print(p_val[13]); | |
} | |
void TempHumRead(void) { | |
humd = sht20.readHumidity(); // Read Humidity | |
temp = sht20.readTemperature(); // Read Temperature | |
M5.Lcd.setTextColor(TFT_GREEN, TFT_BLACK); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET * 8, FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET * 8 , FRONT); | |
M5.Lcd.print("T M P : "); | |
M5.Lcd.print(temp); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET * 8, FRONT); | |
M5.Lcd.print(" "); | |
M5.Lcd.setCursor(X_LOCAL + X_OFFSET, Y_LOCAL + Y_OFFSET * 8, FRONT); | |
M5.Lcd.print("H U M : "); | |
M5.Lcd.print(humd); | |
} | |
void Publish() { | |
String pubStr = "{"\ | |
"\"PM1.0\":" + String(p_val[2]) + \ | |
",\"PM2.5\":" + String(p_val[3]) + \ | |
",\"PM10\":" + String(p_val[4]) + \ | |
",\"0.3um\":" + String(p_val[8]) + \ | |
",\"0.5um\":" + String(p_val[9]) + \ | |
",\"1.0um\":" + String(p_val[10]) + \ | |
",\"2.5um\":" + String(p_val[11]) + \ | |
",\"5.0um\":" + String(p_val[12]) + \ | |
",\"10um\":" + String(p_val[13]) + \ | |
",\"hmd\":" + String(humd) + \ | |
",\"tmp\":" + String(temp) + \ | |
"}"; | |
client.beginPublish("spb/home/airquality", 134, false); | |
client.print(pubStr); | |
client.endPublish(); | |
} | |
void reconnect() { | |
// Loop until we're reconnected | |
while (!client.connected()) { | |
if (!client.connect(clientId.c_str())) { | |
M5.Lcd.setTextColor(TFT_GREEN, TFT_BLACK); | |
M5.Lcd.setCursor(X_LOCAL, Y_LOCAL + Y_OFFSET * 8, FRONT); | |
M5.Lcd.fillScreen(TFT_BLACK); | |
M5.Lcd.print("failed, rc="); | |
M5.Lcd.print(client.state()); | |
M5.Lcd.println(" try again in 5 seconds"); | |
// Wait 5 seconds before retrying | |
delay(5000); | |
header("P M 2.5", TFT_BLACK); | |
} | |
} | |
} | |
void loop() { | |
if (!client.connected()) { | |
reconnect(); | |
} | |
if (Serial2.available()) { | |
Air_val[i] = Serial2.read(); | |
// Serial.write( Air_val[i]); | |
i++; | |
} else { | |
i = 0; | |
} | |
if (i == DATA_LEN) { | |
LCD_Display_Val(); | |
TempHumRead(); | |
if (millis() - lastMsg > 10000) { | |
Publish(); | |
lastMsg = millis(); | |
} | |
} | |
client.loop(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment