之前就对物联网的相关知识有兴趣,最近由于疫情在家挺闲的,又看到了一些相关的视频,就来尝试尝试
ESP-01s以及其搭配的固件烧写器 、DHT11 温湿度传感器
Arduino IDE 、dweet 、 微信公众号开发平台
c++ 、 php
首先,思路是DHT读取到温湿度信息 ——> 发送到dweet平台 ——> 服务器中设置定时任务,定时访问 dweet 然后将数据写进日志中 ——> 当公众号查询时读取日志返回数据
(中间多了一步定时任务,是因为dweet是国外网站,访问速度过慢,公众号响应超过时间就报错了。。。)
代码并没有给全,只给了部分的,其实很简单,按照思路很容易就可以实现
#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);
}
*/2 * * * * /usr/bin/curl -o /home/cron/iot/dht.txt https://dweet.io/get/latest/dweet/for/xxx
这里设置了每隔两分钟通过curl将获取到的结果写入 /home/cron/iot/dht.txt
中
// 当用户向公众号发送关键字 '家里温湿度' 时,读取日志并返回数据的逻辑
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;
}
解决方案:
dweet这个库里用了ArduinoJson 5.*版本的库,所以需要下载5.*版本,因为上面用的dweet的函数里调用的是5.*版本的。。。
下载地址
由于网站服务器是国外的,post数据时会时不时就超时,Posting your variables之后就阻塞了
解决方案:
修改一开始下载的dweetESP8266
库文件代码
dweetESP8266.cpp
:
165 while(!_client.available());
166 while (_client.available()){
168 char c = _client.read();
169 Serial.write(c);
}
把这一段代码删了,不读取返回结果就行了。因为之前一直卡着就是因为等待读取返回结果,现在删了,丢给你信息就跑,就这样就不会阻塞住了