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);

}