Khai báo thư viện cần thiết
Khai báo thư viện cần thiết
#include <PMS.h>
#include <Wire.h>
#include <Servo.h>
#include <DS3231.h>
#include <Arduino.h>
#include <ArduinoJson.h>
#include <Adafruit_SHT31.h>
#include <SparkFunCCS811.h>
int PM1 = 0;
int PM25 = 0;
int PM10 = 0;
float sum_sec_PM1 = 0;
float sum_sec_PM25 = 0;
float sum_sec_PM10 = 0;
float sum_min_PM1 = 0;
float sum_min_PM25 = 0;
float sum_min_PM10 = 0;
int AQI_h = 0;
Serial.println("ChuoiSendEsp: ");
serializeJsonPretty(doc, Serial);
Serial.println();
serializeJsonPretty(doc, Serial1);
Serial1.flush();
doc.clear();
}
if (doc.containsKey("Mode") > 0) {
Mode = doc["Mode"];
// chonchedo(Mode);
if ((ssMode != Mode) && Mode == 1) {
ttMode = 1;
ssMode = Mode;
if(Control == 2) {
Serial2.print("page Home");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if (Control == 3) {
Serial2.print("page HomeLock");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
}
Serial2.print("bt1.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt2.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt0.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
} else if ((ssMode != Mode) && Mode == 2) {
ttMode = 2;
ssMode = Mode;
Serial2.print("bt0.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt2.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt1.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("page HomeNormal");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
if(ttIon == 0) {
Serial2.print("bt3.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else {
Serial2.print("bt3.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
}
if(ttSpeed == 0) {
Serial2.print("h0.val=");
Serial2.print(25);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if(ttSpeed == 1) {
Serial2.print("h0.val=");
Serial2.print(50);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if(ttSpeed == 2) {
Serial2.print("h0.val=");
Serial2.print(75);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if(ttSpeed == 3) {
Serial2.print("h0.val=");
Serial2.print(100);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
}
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
} else if ((ssMode != Mode) && Mode == 3) {
ttMode = 3;
ssMode = Mode;
if(Control == 2) {
Serial2.print("page Home");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if (Control == 3) {
Serial2.print("page HomeLock");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
}
Serial2.print("bt0.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt1.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt2.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
}
}
if (doc.containsKey("Speed") >= 0) {
Speed = doc["Speed"];
if ((ssSpeed != Speed) && Speed == 0) {
ttSpeed = 0;
ssSpeed = Speed;
Serial2.print("h0.val=");
Serial2.print(25);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
} else if ((ssSpeed != Speed) && Speed == 1) {
ttSpeed = 1;
ssSpeed = Speed;
Serial2.print("h0.val=");
Serial2.print(50);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
} else if ((ssSpeed != Speed) && Speed == 2) {
ttSpeed = 2;
ssSpeed = Speed;
Serial2.print("h0.val=");
Serial2.print(75);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
} else if ((ssSpeed != Speed) && Speed == 3) {
ttSpeed = 3;
ssSpeed = Speed;
Serial2.print("h0.val=");
Serial2.print(100);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
}
}
if (doc.containsKey("Ion") >= 0) {
Ion = doc["Ion"];
if ((ssIon != Ion) && Ion == 0) {
ttIon = 0;
ssIon = Ion;
Serial2.print("bt3.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
} else if ((ssIon != Ion) && Ion == 1) {
ttIon = 1;
ssIon = Ion;
Serial2.print("bt3.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
}
}
if (doc.containsKey("Control") >= 0) {
Control = doc["Control"];
Serial2.print("page Logo");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
} else if ((ssControl != Control) && Control == 1) {
ssControl = Control;
ttControl = 1;
Serial2.print("page LogoLock");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
} else if ((ssControl != Control) && Control == 2) {
ssControl = Control;
ttControl = 2;
if(ttMode == 2) {
Serial2.print("page HomeNormal");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
if(ttIon == 0) {
Serial2.print("bt3.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else {
Serial2.print("bt3.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
}
if(ttSpeed == 0) {
Serial2.print("h0.val=");
Serial2.print(25);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if(ttSpeed == 1) {
Serial2.print("h0.val=");
Serial2.print(50);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if(ttSpeed == 2) {
Serial2.print("h0.val=");
Serial2.print(75);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if(ttSpeed == 3) {
Serial2.print("h0.val=");
Serial2.print(100);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
}
} else {
Serial2.print("page Home");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
}
if (Mode == 1) {
Serial2.print("bt1.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt2.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt0.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if (Mode == 2) {
Serial2.print("bt0.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt2.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt1.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if (Mode == 3) {
Serial2.print("bt0.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt1.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt2.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
}
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
} else if ((ssControl != Control) && Control == 3) {
ssControl = Control;
ttControl = 3;
Serial2.print("page HomeLock");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
}
}
doc.clear();
}
}
}
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
break;
case 0x11:
ttMode = 2;
if(Control == 2) {
ttControl = 2;
} else if (Control == 3) {
ttControl = 3;
}
Serial2.print("page HomeNormal");
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
if(ttIon == 0) {
Serial2.print("bt3.val=");za
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else {
Serial2.print("bt3.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
}
if(ttSpeed == 0) {
Serial2.print("h0.val=");
Serial2.print(25);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if(ttSpeed == 1) {
Serial2.print("h0.val=");
Serial2.print(50);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if(ttSpeed == 2) {
Serial2.print("h0.val=");
Serial2.print(75);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if(ttSpeed == 3) {
Serial2.print("h0.val=");
Serial2.print(100);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
}
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
break;
case 0x12:
ttMode = 3;
if(Control == 2) {
ttControl = 2;
} else if (Control == 3) {
ttControl = 3;
}
DataJson(String(ttMode), String(Temp), String(Humid),
String(CO2), String(TVOC), String(PM1), String(PM25), String(PM10),
String(ttControl), String(ttIon), String(ttSpeed), String(AQI_h));
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
break;
case 0x13:
ttControl = 2;
Control = 2;
DataJson(String(ttMode), String(Temp), String(Humid),
String(CO2), String(TVOC), String(PM1), String(PM25), String(PM10),
String(ttControl), String(ttIon), String(ttSpeed), String(AQI_h));
if (Mode == 1) {
Serial2.print("bt1.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt2.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt0.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if (Mode == 2) {
Serial2.print("bt0.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt2.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt1.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
} else if (Mode == 3) {
Serial2.print("bt0.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt1.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt2.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
}
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
break;
case 0x14:
ttControl = 0;
Control = 0;
DataJson(String(ttMode), String(Temp), String(Humid),
String(CO2), String(TVOC), String(PM1), String(PM25), String(PM10),
String(ttControl), String(ttIon), String(ttSpeed), String(AQI_h));
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
break;
case 0x20:
ttSpeed = 0;
DataJson(String(ttMode), String(Temp), String(Humid),
String(CO2), String(TVOC), String(PM1), String(PM25), String(PM10),
String(ttControl), String(ttIon), String(ttSpeed), String(AQI_h));
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
break;
case 0x21:
ttSpeed = 1;
DataJson(String(ttMode), String(Temp), String(Humid),
String(CO2), String(TVOC), String(PM1), String(PM25), String(PM10),
String(ttControl), String(ttIon), String(ttSpeed), String(AQI_h));
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
break;
case 0x22:
ttSpeed = 2;
DataJson(String(ttMode), String(Temp), String(Humid),
String(CO2), String(TVOC), String(PM1), String(PM25), String(PM10),
String(ttControl), String(ttIon), String(ttSpeed), String(AQI_h));
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
break;
case 0x23:
ttSpeed = 3;
DataJson(String(ttMode), String(Temp), String(Humid),
String(CO2), String(TVOC), String(PM1), String(PM25), String(PM10),
String(ttControl), String(ttIon), String(ttSpeed), String(AQI_h));
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
break;
case 0x24:
ttIon = 0;
DataJson(String(ttMode), String(Temp), String(Humid),
String(CO2), String(TVOC), String(PM1), String(PM25), String(PM10),
String(ttControl), String(ttIon), String(ttSpeed), String(AQI_h));
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
break;
case 0x25:
ttIon = 1;
DataJson(String(ttMode), String(Temp), String(Humid),
String(CO2), String(TVOC), String(PM1), String(PM25), String(PM10),
String(ttControl), String(ttIon), String(ttSpeed), String(AQI_h));
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
break;
case 0x26:
Serial2.print("bt0.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt2.val=");
Serial2.print(0);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("bt1.val=");
Serial2.print(1);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
digitalWrite(buzzer, HIGH);
delay(200);
digitalWrite(buzzer, LOW);
break;
}
}
}
void UpdateValueHMI() {
Serial2.print("pm25V.val=");
Serial2.print(PM25);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("tvocV.val=");
Serial2.print(TVOC);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.print("co2V.val=");
Serial2.print(CO2);
Serial2.write(0xff);
Serial2.write(0xff);
Serial2.write(0xff);
void ChonCheDo() {
if (ttMode == 1) {
// Chếđộ Auto
// 3 tiếng bật tắt Ion 1 lần
if(check) {
digitalWrite(relay, HIGH);
} else {
digitalWrite(relay, LOW);
}
if (PM1 >= 36 || PM25 >= 36 || PM10 >= 155 || TVOC >= 661 ||
giatrimp135 >= 1000) {
analogWrite(FAN_PIN, 255);
} else if ((PM1 >= 13 && PM1 <= 35) || (PM25 >= 13 && PM25 <= 35) ||
(PM10 >= 55 && PM10 <= 154) || (TVOC >= 221 && TVOC <= 660) ||
(giatrimp135 >= 547 && giatrimp135 < 1000)) {
// Tốc độ quạt tb
analogWrite(FAN_PIN, 150);
} else {
analogWrite(FAN_PIN, 50);
}
} else if (ttMode == 2) {
// Chếđộ Normal
if (ttSpeed == 0) {
analogWrite(FAN_PIN, 0);
} else if (ttSpeed == 1) {
analogWrite(FAN_PIN, 50);
} else if (ttSpeed == 2) {
analogWrite(FAN_PIN, 150);
} else if (ttSpeed == 3) {
analogWrite(FAN_PIN, 255);
}
// Bật tắt Ion
if (ttIon == 0) {
digitalWrite(relay, LOW);
} else {
digitalWrite(relay, HIGH);
}
} else {
// Chếđộ Sleep
analogWrite(FAN_PIN, 50);
digitalWrite(relay, LOW);
}
}
void setup() {
rtc.begin();
Wire.begin();
Serial.begin(9600);
Serial1.begin(9600);
Serial2.begin(9600);
Serial3.begin(9600);
if (mySensor.begin() == false) {
while (1)
;
}
time = rtc.getTime();
sec = time.sec;
minute = time.min;
pre_sec = sec;
pre_minute = minute;
delay(1000);
}
void loop() {
Read_UART_JSON();
time = rtc.getTime();
sec = time.sec;
minute = time.min;
if (ttControl == 0 || ttControl == 1) {
digitalWrite(relay, LOW);
analogWrite(FAN_PIN, 0);
} else if (ttControl == 2 || ttControl == 3) {
if (pms.read(data) && (millis() - last >= 2000 || last == 0)) {
giatrimp135 = analogRead(mp135);
Temp = sht31.readTemperature();
Humid = sht31.readHumidity();
if (!isnan(Temp)) {
} else {
}
if (!isnan(Humid)) {
} else {
}
if (mySensor.dataAvailable()) {
mySensor.readAlgorithmResults();
CO2 = mySensor.getCO2();
TVOC = mySensor.getTVOC();
}
if (pms.read(data)) {
Serial1.print("PM 1.0 (ug/m3): ");
Serial1.println(data.PM_AE_UG_1_0);
Serial1.println();
}
// Đọc giá trị các cảm biến
last = millis();
PM1 = data.PM_AE_UG_1_0;
PM25 = data.PM_AE_UG_2_5;
PM10 = data.PM_AE_UG_10_0;
count_sec += 1;
sum_sec_PM1 += PM1;
sum_sec_PM25 += PM25;
sum_sec_PM10 += PM10;
pre_minute = minute;
count_min += 1;
sum_min_PM1 += sum_sec_PM1;
sum_min_PM25 += sum_sec_PM25;
sum_min_PM10 += sum_sec_PM10;
count_sec = 0;
sum_sec_PM1 = 0;
sum_sec_PM25 = 0;
sum_sec_PM10 = 0;
// 1h đã trôi qua
if (minute == 0) {
// Đếm 3 tiếng đổi trạng thái 1 lần
if(Mode == 1) {
dem++;
if(dem == 3) {
dem = 0;
check = !check;
}
}
// Tính tb của 1h
sum_min_PM1 /= count_min;
sum_min_PM25 /= count_min;
sum_min_PM10 /= count_min;
count_min = 0;
sum_min_PM1 = 0;
sum_sec_PM25 = 0;
sum_sec_PM10 = 0;
}
}
UpdateValueHMI();
ChonCheDo();
}
}
DieuKhienHMI();
}