空氣品質偵測

高雄市自造教育與科技中心分享教材及程式碼https://drive.google.com/drive/folders/1JYHbcnI5nj4RF-t3PV8D_EbZwM-XHcRj

Arduion IDE 需先安裝如3個library
Adafruit_Sensor-master
DHT-sensor-library-master
LiquidCrystal_I2C

程式碼
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
LiquidCrystal_I2C lcd(0x3F,20,4);
SoftwareSerial Serial1(15, 16);
SoftwareSerial debug( 12, 13 );
DHT dht(DHTPIN, DHTTYPE);
int pmat25 = 0, lt = 0, LED = 6, motor = 0, ch = 0;
float t = 0, h = 0;
char buf[50];
//=========================================================================
#define SSID "wifi_ssid" //wifi帳號
#define PASS "wifi password" //wifi密碼
#define IP "184.106.153.149" // ThingSpeak IP Address: 184.106.153.149
String GET = "GET https://api.thingspeak.com/update?api_key=FBNW6TXVSWM19WOW&field1=0"; //thingspeak 註冊後的API
//=========================================================================

#include "allSub.h"

void setup()
{
Serial.begin(9600);
Serial1.begin(9600);
debug.begin(115200);
dht.begin();
pinMode(A3,INPUT);
pinMode(5,OUTPUT);
pinMode(LED,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
modeLCD();
while(ch < 1 )
{
int mode1 = digitalRead(8);
int mode2 = digitalRead(7);
if(mode1 < 1)
{
ch = 1;
}
if(mode2 < 1)
{
ch = 2;
}
}

if(ch==1)
{
wifiLoading();
sendDebug("AT");
Loding("sent AT");
wifiLoading();
connectWiFi();
}
}

void loop()

{

for(int x = 0;x<=5;x++)

{

Serial1.listen();
h = dht.readHumidity();
t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
float hic = dht.computeHeatIndex(t, h, false);
int count = 0;
unsigned char c;
unsigned char high;
while (Serial1.available()) {
c = Serial1.read();
if((count==0 && c!=0x42) || (count==1 && c!=0x4d)){
Serial.println("check failed");
break;
}

else if(count == 4 || count == 5 || count == 6 || count == 7 || count == 8 || count == 9 || count == 10 || count == 11 || count == 12 || count == 14 || count == 15) high = c;

else if(count == 13){
pmat25 = 256*high + c;
}

count++;
}
if(pmat25<20)
{
analogWrite(9,0); //B
analogWrite(10,0); //R
analogWrite(11,50); //G
}

else if(pmat25<50)
{
analogWrite(9,0); //B
analogWrite(10,30); //R
analogWrite(11,30); //G
}
else
{
analogWrite(9,0); //B
analogWrite(10,50); //R
analogWrite(11,0); //G
}

while(Serial1.available()) Serial1.read();
Serial.println();
Serial.print("atmosphere, PM2.5=");
Serial.print(pmat25);
Serial.print(" ug/m3\t");
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
printLCD();
delay(1000);
}

if(ch==1)
{
debug.listen();
SentOnCloud( String(pmat25), String(t), String(h), String(motor) );
printLCD();
delay(1000);
}
}

#allSub.h 程式碼
void modeLCD()
{
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Choose Mode:");
lcd.setCursor(0,1);
lcd.print("1.Wifi Mode.");
lcd.setCursor(0,2);
lcd.print("2.Normal Mode.");
}

void wifiLoading()

{

lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Wifi Loading...");
}

void showLCD(int PM,int Temp,int Humi,int Motor)

{

lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("PM2.5:");
lcd.setCursor(10,0);
lcd.print(PM);
lcd.setCursor(14,0);
lcd.print(" ug/m3");
lcd.setCursor(0,1);
lcd.print("Temp:");
lcd.setCursor(10,1);
lcd.print(Temp);
lcd.setCursor(18,1);
lcd.print("*C");
lcd.setCursor(0,2);
lcd.print("Humidity:");
lcd.setCursor(10,2);
lcd.print(Humi);
lcd.setCursor(18,2);
lcd.print(" %");
lcd.setCursor(0,3);
lcd.print("Motor: ");
lcd.setCursor(6,3);
lcd.print(Motor);
if(pmat25>lt)

{
digitalWrite(5,HIGH);
lcd.setCursor(17,3);
lcd.print(" ON");
motor = 1;
}
else
{
digitalWrite(5,LOW);
lcd.setCursor(17,3);
lcd.print("OFF");
motor = 0;
}

}

//========================================================

void sendDebug(String cmd)

{
Serial.print("SEND: ");
Serial.println(cmd);
debug.println(cmd);
}

//========================================================

void Loding(String state)

{

for (int timeout=0 ; timeout<10 ; timeout++)

{

if(debug.find("OK"))

{
Serial.println("RECEIVED: OK");
break;
}
else if(timeout==9){
Serial.print( state );
Serial.println(" fail...\nExit2");
}
else
{
Serial.print("Wifi Loading...");
delay(500);
}

}

}

//========================================================

void Wifi_connect()

{

String cmd="AT+CWJAP=\"";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASS;
cmd+="\"";
sendDebug(cmd);
Loding("Wifi_connect");

}

//========================================================

boolean connectWiFi()

{
debug.println("AT+CWMODE=1");
Wifi_connect();
}

//========================================================

void SentOnCloud( String T, String H, String P, String M ) //要傳送多少組Data,就新增幾組。
{
// 設定 ESP8266 作為 Client 端
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += IP;
cmd += "\",80";
sendDebug(cmd);
if( debug.find( "Error" ) )
{
Serial.print( "RECEIVED: Error\nExit1" );
return;
}

cmd = GET + "&field1=" + T + "&field2=" + H + "&field3=" + P + "&field4=" + M +"\r\n"; //要傳送多少組Data,就新增幾組。

debug.print( "AT+CIPSEND=" );
debug.println( cmd.length() );
if(debug.find( ">" ) )
{
Serial.print(">");
Serial.print(cmd);
debug.print(cmd);
}
else
{
debug.print( "AT+CIPCLOSE" );
}
if( debug.find("OK") )
{
Serial.println( "RECEIVED: OK" );
digitalWrite(LED,LOW);
}
else
{
Serial.println( "RECEIVED: Error\nExit2" );
digitalWrite(LED,HIGH);
wifiLoading();
connectWiFi();
}
}

//========================================================

void printLCD()

{
lt = analogRead(A3);
lt = map(lt,0,1023,100,0);
showLCD(pmat25,t,h,lt);
}