6.Thingspeak 氣象站
[重要事項]傳輸過程中,Tingspeak可能因為連線問題導致掉資料的問題
在 AT+CIPSTART="TCP","184.106.153.149",80 指令下達後
遲遲沒有成功連線 (成功連線時將回應 > )
目前本程式碼尚未因應此狀況下連線中斷指令
因此可能會有某分鐘掉資料的問題發生
但若非ESP8266本身硬體故障,程式碼預設每3分鐘重新開機一次
重新開機時會重啟ESP8266並重新登入AP,
大多數的連線狀況都可以在重新開機的過程中排除
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "GP2Y1010AU0F.h"
#include <DHT.h> //載入DHT.h函式庫
////////////////////////////////////////////////////////////////////////
#define DHTPIN 8 //將DHT11連接到8腳位
#define DHTTYPE DHT22 //設定感測器型號為DHT22
#define RX 3 //ESP8266 TX接3
#define TX 2 //ESP8266 RX接2
#define PIN_LED 15 //AQI SENSOR 發光
#define PIN_OUTPUT A0 //AQI SENSOR 接收
////////////////////////////////////////////////////////////////////////
#define SSID "----------" //這裡填入你家AP的SSID
#define PASSWORD "------------" //這裡填入你家AP的密碼
#define Rec "184.106.153.149" //Thingspeak網站的IP
String GET = "GET /update?key=41W2M9TQQCGBODVW"; // replace with your channel key
/////////////////////////////////////////////////////////////////////////
int i=0;
unsigned long t1,t2,t3;
int sw=1;
SoftwareSerial esp8266(RX,TX);
LiquidCrystal_I2C lcd(0x3F,20,4); //或 0x27
DHT dht(DHTPIN, DHTTYPE);
GP2Y1010AU0F GP2Y1010AU0F(PIN_LED, PIN_OUTPUT);
void sendData(String command, const int time1) {
esp8266.print(command); // send the read character to the esp8266
String response="";
unsigned long timeout = time1 + millis();
while(esp8266.available() || millis() < timeout) {
while(esp8266.available()) {
char c=esp8266.read(); // read the next character.
response += c;
}
}
Serial.println(response);
}
void datatoweb(String voltage1,String voltage2,String voltage3){
digitalWrite(13,1); //當ESP8266 連上AP,自動亮燈
String cipStart="AT+CIPSTART=\"TCP\",\"";
cipStart += Rec; //Tingspeak IP
cipStart += "\",80";
cipStart +="\r\n";
sendData("AT\r\n",200);
sendData(cipStart,5000); //延遲時間800毫秒可以自行調整
String Command = GET + "&field1=" + voltage1 + "&field2=" + voltage2 + "&field3=" + voltage3 + "\r\n"; //這裡填入你要傳送的指令或數據
String cipSend = "AT+CIPSEND=";
cipSend +=Command.length();
cipSend +="\r\n";
sendData(cipSend,300);
sendData(Command,2000);
digitalWrite(13,0);
}
void debug(){
String cmd="AT+CWJAP=\"";
cmd+=SSID;
cmd+="\",\"";
cmd+=PASSWORD;
cmd+="\"";
cmd+="\r\n";
sendData("AT+RST\r\n",1000); //重啟ESP8266
sendData("AT+CWMODE=1\r\n",500); // 設定為STA模式
sendData(cmd,15000); // 取得連線(視AP連線效能作調整,預設7000毫秒)
sendData("AT+CIFSR\r\n",200); // 獲得IP
// sendData("AT+CIPMUX=1\r\n",100); // 開啟多除連接模式
// sendData("AT+CIPSERVER=1,80\r\n",100); // 設定連接埠為80
}
void setup() {
Serial.begin(9600); //start hardware serial port
esp8266.begin(9600); //start soft serial port
lcd.init();
lcd.backlight();
pinMode(13,OUTPUT); //連線指示燈
pinMode(7,OUTPUT); //連線指示燈
digitalWrite(7,HIGH);
debug();
t1=millis();
}
void loop() {
digitalWrite(7,HIGH);
float h = dht.readHumidity(); //讀取感測器濕度
float t = dht.readTemperature(); //讀取感測器溫度
double outputV = GP2Y1010AU0F.getOutputV(); //采样获取输出电压
double ugm3 = GP2Y1010AU0F.getDustDensity(outputV); //计算灰尘浓度
double aqi = GP2Y1010AU0F.getAQI(ugm3); //计算aqi
int gradeInfo = GP2Y1010AU0F.getGradeInfo(aqi); //计算级别
String grade;
switch (gradeInfo) {
case GRADE_PERFECT:
grade = String("Good");
break;
case GRADE_GOOD:
grade = String("Moderate");
break;
case GRADE_POLLUTED_MILD:
grade = String("Bad for Sensitive");
break;
case GRADE_POLLUTED_MEDIUM:
grade = String("Unhealthy");
break;
case GRADE_POLLUTED_HEAVY:
grade = String("Very Unhealthy");
break;
case GRADE_POLLUTED_SEVERE:
grade = String("Hazardous");
break;
}
lcd.setCursor(0,0);
lcd.print("RH= ");
lcd.print(h);
lcd.print(" %");
lcd.setCursor(0,1);
lcd.print("T= ");
lcd.print(t);
lcd.print((char) 0xDF);
lcd.print("C");
lcd.setCursor(0,2);
lcd.print("pm10= ");
lcd.print(aqi);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print(" ");
lcd.setCursor(0,3);
lcd.print(grade);
lcd.setCursor(19,0);
lcd.print(i);
if(t3>=10){
lcd.setCursor(18,1);
lcd.print(t3);
}else{
lcd.setCursor(18,1);
lcd.print(" ");
lcd.setCursor(19,1);
lcd.print(t3);
}
if(sw==1&&i<3){
datatoweb(String(t) , String(h), String(aqi));
i++;
}
t2=millis();
t3=60-(t2-t1)/1000;
if(t2 >= t1 + 60000){
sw=1;
t1=t2;
}else{
sw=0;
}
if(i>=3){
delay(1000);
esp8266.println(F("AT"));
delay(1000);
if (esp8266.find("OK")) {
lcd.setCursor(14,0);
lcd.print("reboot");
debug();
i=0;
lcd.setCursor(14,0);
lcd.print(" ");
lcd.setCursor(19,0);
lcd.print(i);
}else{
lcd.setCursor(14,0);
lcd.print("repair");
digitalWrite(7,LOW);
delay(1000);
digitalWrite(7,HIGH);
delay(500);
debug();
i=0;
lcd.setCursor(14,0);
lcd.print(" ");
lcd.setCursor(19,0);
lcd.print(i);
}
}
delay(1000);
}