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

沒有留言:

張貼留言