DHT11模塊監測家中溫溼度並通過微信公衆號獲取數據

前言

之前就對物聯網的相關知識有興趣,最近由於疫情在家挺閒的,又看到了一些相關的視頻,就來嘗試嘗試

準備

硬件

ESP-01s以及其搭配的固件燒寫器 、DHT11 溫溼度傳感器

開發平臺

Arduino IDE 、dweet 、 微信公衆號開發平臺

開發語言

c++ 、 php

c++所需庫

DHT.h 、 dweetESP8266.h 需要在github上自行下載並按如下添加
在這裏插入圖片描述

流程

首先,思路是DHT讀取到溫溼度信息 ——> 發送到dweet平臺 ——> 服務器中設置定時任務,定時訪問 dweet 然後將數據寫進日誌中 ——> 當公衆號查詢時讀取日誌返回數據
(中間多了一步定時任務,是因爲dweet是國外網站,訪問速度過慢,公衆號響應超過時間就報錯了。。。)

部分相關代碼

代碼並沒有給全,只給了部分的,其實很簡單,按照思路很容易就可以實現

c++:
#include "DHT.h"
#include "dweetESP8266.h"
 
char ssid[] = "";//wifi 名
char pswd[] = "";//wifi 密碼

#define DHTPIN 2      //定義DHT11模塊連接管腳io2
 
#define DHTTYPE DHT11   // 使用DHT 11溫度溼度模塊 

#define THIG_NAME "xxx" //指定dweet的標題

dweet dweetClient; //定義dweet
DHT dht(DHTPIN, DHTTYPE);    //定義dht


void setup() {
	Serial.begin(115200);
	dht.begin();
    dweetClient.wifiConnection(ssid, pswd);
}

void loop() {
	float h = dht.readHumidity();
	float t = dht.readTemperature();
	dweetClient.wifiConnection(ssid, pswd);
	dweetClient.add("dht", String(h) + "," + String(t));
	dweetClient.sendAll(THIG_NAME);
	delay(3000);
}
設置crond定時任務:
*/2 * * * * /usr/bin/curl -o /home/cron/iot/dht.txt https://dweet.io/get/latest/dweet/for/xxx

這裏設置了每隔兩分鐘通過curl將獲取到的結果寫入 /home/cron/iot/dht.txt

php:
// 當用戶向公衆號發送關鍵字 '家裏溫溼度' 時,讀取日誌並返回數據的邏輯
if ($keyword == '家裏溫溼度') {
   $path = '/home/cron/iot/dht.txt';
         $oldData = json_decode(file_get_contents($path), true);

         if(empty($oldData) || $oldData['this'] == "failed") {
             $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, "設備可能存在異常");
             echo $resultStr;
         }

         $str = explode(",", $oldData['with'][0]['content']['dht']);
         $humidity = $str[0];
         $temperature = $str[1];
         $contenStr = "溼度:" . $humidity . "%\r\n" . "溫度:" . $temperature . "℃\r\n";
         $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contenStr);
         echo $resultStr;
     }

踩坑

1. 編譯時提示找不到 ArduinoJson庫(已解決)

解決方案:
dweet這個庫裏用了ArduinoJson 5.*版本的庫,所以需要下載5.*版本,因爲上面用的dweet的函數裏調用的是5.*版本的。。。
下載地址

2. 設備不能持續的向dweet發送數據(已解決)

由於網站服務器是國外的,post數據時會時不時就超時,Posting your variables之後就阻塞了
在這裏插入圖片描述
解決方案:
修改一開始下載的dweetESP8266庫文件代碼
dweetESP8266.cpp:

165   while(!_client.available());
166   while (_client.available()){
168    	char c = _client.read();
169     Serial.write(c);
   }

把這一段代碼刪了,不讀取返回結果就行了。因爲之前一直卡着就是因爲等待讀取返回結果,現在刪了,丟給你信息就跑,就這樣就不會阻塞住了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章