2016年4月9日 星期六
溫濕度連網紀錄
我討厭寫文件....
詳細內容參考這篇 http://ruten-proteus.blogspot.tw/2015/09/iot-esp8266-arduino-send.html
紀錄 https://thingspeak.com/channels/98470
PS. 太陽能板不需要全天日照
電路圖
電源指示LED線路會切斷,為了省電
分壓電阻,監看電池電壓
手機APP有支援監看
Arduino IDE ESP8266 的晶片設定
修改過的程式碼 > 記得要把
連線AP的 SSID & Password 填入
thingspeak 的 Write API Key 填入
以下複製後,貼到編輯器內即可
/*IoT ESP8266 only
減少喚醒後時間
無法連線Wi-Fi時的 time out 時間
無法傳送資料處理方式
2016-03-20 增加電池電壓監視,可上傳浮點數據,
ESP8266 類比接腳名稱為" A0 "
on Sleep mode GPIO pin 16 <--> Reset Pin 須連接(睡眠結束Pin 16 觸發 Reset)
耗電量 send data ~ 4 Sec / 約85mA , sleep ~約5mA, sleep & remove power LED ~約1mA
*/
#include "DHT.h" // 使用 ESP8266 自帶的 DHT11 函式庫 // 如果 libraries 已有其他的 DHT 函式庫,請先移除
#include <ESP8266WiFi.h>
#define _baudrate 115200 //*-- Hardware Serial
DHT dht11( 13, DHT11 ); // Initialize DHT sensor
float temperature, humidity, batt;
//*-- IoT Information
byte uptime = 10; //傳送間隔 : 分鐘
#define SSID "SSID"
#define PASS "Password"
#define HOST "api.thingspeak.com" // ThingSpeak IP Address: 184.106.153.149
#define PORT 80
byte count = 0;
// 使用 GET 傳送資料的格式 // GET /update?key=[THINGSPEAK_KEY]&field1=[data 1]&filed2=[data 2]...;
String GET = "GET /update?key=Write API Key";
void setup() {
Serial.begin( _baudrate );
pinMode(14, OUTPUT);
digitalWrite(14, LOW);
dht11.begin(); // DHT11 start
Serial.println( "DHT11 Ready!" );
Serial.println( "ESP8266 Ready!" );
WiFi.mode(WIFI_STA); //設定為Client 模式 Connecting to a WiFi network
Serial.print("Connect to ");
Serial.println( SSID );
WiFi.begin( SSID, PASS );
batt = (analogRead(A0) * 0.005); //先取得電池電壓 (1.1 / 1024) * 5.16)=0.005 ( 200K + 47k 分壓 , (200 + 47)/47 = 5.25 電阻值有誤差,需微調 )
// 持續等待並連接到指定的 WiFi SSID
while ( WiFi.status() != WL_CONNECTED )
{
delay(500);
Serial.print( "." );
if (count++ >= 20 && batt <= 3.7) ESP.deepSleep(600 * 1000000); // 無法連線Wi-Fi時 and 電壓過低 < 3.7V 時 重新進入睡眠,600 後喚醒種新上傳
if (count++ >= 30 && batt > 3.7) ESP.deepSleep(120 * 1000000); // 無法連線Wi-Fi時 and 電壓足夠 > 3.7V 重新進入睡眠 300 Sec 後喚醒種新上傳
}
Serial.println( "" );
Serial.println( "WiFi connected" );
Serial.println( "IP address: " );
Serial.println( WiFi.localIP() );
Serial.println( "" );
}
void loop() {
humidity = dht11.readHumidity();
temperature = dht11.readTemperature();
if ( isnan( humidity ) || isnan( temperature ) ) // 確認取回的溫溼度數據可用
{
Serial.println( "Failed to read form DHT11" );
delay(200);
if (count++ >= 11) ESP.deepSleep(600 * 1000000); // 無法取得DHT11數據時 重新進入睡眠
return;
}
else
{
// DHT11 溫度與濕度傳送
Serial.print( "Humidity: " );
Serial.print( humidity );
Serial.print( ", Temperature: " );
Serial.print( temperature );
Serial.print( ", Battery: " );
Serial.println( batt );
updateDHT11();
}
// 每隔多久傳送一次資料
// delay( 30000 ); //30 second
ESP.deepSleep(uptime * 60000000); //睡眠時間
}
void updateDHT11()
{
// 設定 ESP8266 作為 Client 端
WiFiClient client;
if ( !client.connect( HOST, PORT ) )
{
Serial.println( "connection failed" );
delay(100);
if (count++ >= 11) ESP.deepSleep(600 * 1000000); // 無法取連線伺服器傳送數據時 重新進入睡眠
return;
}
else
{
// 準備上傳到 ThingSpeak IoT Server 的資料
// 已經預先設定好 ThingSpeak IoT Channel 的欄位
// field1:溫度;field2:濕度
String getStr = GET +
"&field1 =" + String((float)temperature) +
"&field2 = " + String((float)humidity) +
"&field3 = " + String((float)batt) +
" HTTP / 1.1\r\n";;
client.print( getStr );
client.print( "Host: api.thingspeak.com\n" );
client.print( "Connection: close\r\n\r\n" );
delay(10);
//
// 處理遠端伺服器回傳的訊息,程式碼可以寫在這裡!
//
Serial.println(getStr);
client.stop();
}
}
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言