7.溫溼度站 Thingspeak

1.先刷ESP8266韌體:請先點選以下連結,並下載以下兩個檔案安裝

(2) ESPFlashDownloadTool_v3.4.4

2.連接好6條線 下圖以ESP-01為例

3.刷韌體

注意韌體檔案需要指定到記憶體的正確位置(手動輸入),請參考如下:

blank.bin 指定到 0xFB000

esp_init_data_default.bin 指定到 0xFC000

blank.bin 指定到 0x7E000

blank.bin 指定到 0xFE000

boot_v1.6.bin 指定到 0x00000

user1.1024.new.2.bin 指定到 0x01000

#include <SoftwareSerial.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

#include <DHT.h> //載入DHT.h函式庫

////////////////////////////////////////////////////////////////////////

#define DHTPIN 14 //將DHT22連接到數位14(A0)腳位 ps.此時A0腳位作為數位腳位用

#define DHTTYPE DHT22 //設定感測器型號為DHT22

#define RX 3 //ESP8266 TX接3

#define TX 2 //ESP8266 RX接2

////////////////////////////////////////////////////////////////////////

#define SSID "--------" //這裡填入你家AP的SSID

#define PASSWORD "-------------" //這裡填入你家AP的密碼

#define Rec "184.106.153.149" //Thingspeak網站的IP

String GET = "GET /update?key=LU3HEKQ3P6FVL7XB"; // 填入tingspeak的 Write API KEY

/////////////////////////////////////////////////////////////////////////

int i=0;

unsigned long t1,t2,t3;

int sw=1;

String ip;

int set;

SoftwareSerial esp8266(RX,TX);

LiquidCrystal_I2C lcd(0x3F,16,2); //或 0x27

DHT dht(DHTPIN, DHTTYPE);

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

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 + "\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

}

void setup() {

Serial.begin(9600); //start hardware serial port

esp8266.begin(9600); //start soft serial port

lcd.init();

lcd.backlight();

lcd.setCursor(0,0);

lcd.print("booting...");

pinMode(13,OUTPUT); //連線指示燈

debug();

esp8266.println(F("AT+CIFSR"));

delay(1000);

if (esp8266.find("STAIP,")) {

ip="";

while(esp8266.available()){

char c = esp8266.read();

ip += c;

}

}

for(int i=3 ; i<16 ; i++){

if(ip.charAt(i)=='"'){

set=i;

}

}

for(int i=1 ; i<set ; i++){

lcd.setCursor(i-1,1);

lcd.print(ip.charAt(i));

}

t1=millis();

}

void loop() {

float h = dht.readHumidity(); //讀取感測器濕度

float t = dht.readTemperature(); //讀取感測器溫度

lcd.setCursor(0,0);

lcd.print(" ");

lcd.setCursor(0,0);

lcd.print(t);

lcd.print((char) 0xDF);

lcd.print("C");

lcd.setCursor(8,0);

lcd.print(h);

lcd.print(" %");

if(sw==1&&i<3){

datatoweb(String(t) , String(h));

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+CIFSR"));

delay(1000);

if (esp8266.find("STAIP,")) {

ip = "";

while(esp8266.available()){

char c = esp8266.read();

ip += c;

}

for(int i=3 ; i<16 ; i++){

if(ip.charAt(i)=='"'){

set=i;

}

}

for(int i=1 ; i<set ; i++){

lcd.setCursor(i-1,1);

lcd.print(ip.charAt(i));

}

}

debug();

i=0;

}

delay(1000);

}