arduino

[arduino]偵測家中溫溼度,透過wifi傳回伺服器

我因為睡覺常常覺得濕度不夠,想說乾脆來偵測一下房間的溫溼度好了,把它做成圖表,就可以知道在怎樣的條件下我會覺得口乾舌燥。

做法不難。首先我們會需要一塊arduino版,跟一個溫溼度的senser。然後要有wifi

所以 溫濕度的senser你可以買DHT11或DHT22這兩個都可以 22的精準度比較高 但是也比較貴(台幣兩百多) 而arduino版有wifi的,其實你可以買標準版+wifi模組,或是像我直接買webmos D1 wifi開發版 直接整合好的都行(一片才兩三百塊台幣)

接線接好後如下圖很簡單(注意開發版不同,接線的方式有可能會不同不要接錯)

把下面程式燒錄進去後就可以Work了

#include "ESP8266WiFi.h"
#include "ESP8266WiFiMulti.h"
ESP8266WiFiMulti WiFiMulti;

#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE); // Initialize DHT sensor
void setup() {
Serial.begin(115200);
delay(10);

// We start by connecting to a WiFi network
//davidou_ap應該要改成你家的ssid 而1121314151是wifi密碼
WiFiMulti.addAP("davidou_ap", "1121314151");

Serial.println();
Serial.println();
Serial.print("Wait for WiFi... ");

while(WiFiMulti.run() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}

Serial.println("");
Serial.println("[成功]WiFi 已連接");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());

delay(500);
Serial.println("溫溼度測試.");
dht.begin();
}

String floatToString(float x, byte precision = 2) {
char tmp[50];
dtostrf(x, 0, precision, tmp);
return String(tmp);
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
float f = dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("濕Humidity: ");
Serial.print(h);
Serial.print("%\t");
Serial.print("溫: ");
Serial.print(t);
Serial.print("*C\t");
Serial.print(f);
Serial.print("*F\n");

const uint16_t port = 80;
const char * host = "192.168.2.150"; // ip or dns
//這邊192.168.2.150是我後端要記錄溫溼度的server
Serial.print("連線至");
Serial.println(host);

// Use WiFiClient class to create TCP connections
WiFiClient client;

if (!client.connect(host, port)) {
Serial.println("connection failed");
Serial.println("wait 5 sec...");
delay(5000);
return;
}

String url = "/123.php?tmp="+floatToString( dht.readTemperature())+"&h="+floatToString(dht.readHumidity())+"&f="+ floatToString(dht.readTemperature(true));
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"User-Agent: BoardDetectorESP8266davidouHomeSystem\r\n" +
"Connection: close\r\n\r\n");

Serial.println("連線關閉");
client.stop();

Serial.println("wait 5 sec...");
delay(300000);
}

這邊程式碼偵測到溫溼度除了會在console顯示出來之外,我還讓他透過網頁get的方式 送到 192.168.2.150/123.php去儲存。而我的伺服器(192.168.2.150)就可以把收到的資料存到資料庫去使用了,這邊就跟arduino比較沒有關係。 我設定每5分鐘(300秒)抓一次資料來送。 然後把收到的資料顯示到網頁去,這樣就搞定拉

網址如下: http://www.davidou.org/homesystem/Temperature/

4 comments

你好,我想請問一下,如果要將float string同時使用多個參數(如:tmp)推上去,並需要新增哪一類的語法讓他合理,已試過將那一段複製並且更改”tmp”以及”float x”,但仍然有誤。

你要有後台伺服器接收資料

你有資料庫的話 就看怎呈現出來而已 html碼部份 我的網址你直接檢視原始碼就有了

Leave a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

(若看不到驗證碼,請重新整理網頁。)