7.溫溼度站 Thingspeak
1.先刷ESP8266韌體:請先點選以下連結,並下載以下兩個檔案安裝
(1) ESP8266 AT韌體下載
(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);
}