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

把这一段代码删了,不读取返回结果就行了。因为之前一直卡着就是因为等待读取返回结果,现在删了,丢给你信息就跑,就这样就不会阻塞住了

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