前言
之前就對物聯網的相關知識有興趣,最近由於疫情在家挺閒的,又看到了一些相關的視頻,就來嘗試嘗試
準備
硬件
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);
}
把這一段代碼刪了,不讀取返回結果就行了。因爲之前一直卡着就是因爲等待讀取返回結果,現在刪了,丟給你信息就跑,就這樣就不會阻塞住了