ESP32检测家中温湿度上云,随时随地多端查看温湿度
背景介绍
上次说到用Arduino Uno板子结合DHT11温湿度传感器,在Serial里实时返回温湿度的方法,总觉得还差点意思,一是只能配合电脑查看,不够节能,也不环保,不够爱护地球母亲,毕竟诸如Arduino之类的板子的电耗最高也就几十个毫安,0.1瓦都不到,电脑一开机那可是一两百瓦的功耗;二是查看温湿度也不方便,只能在电脑的Serial端口上看或者在板子上加个液晶屏(无论是液晶屏还是数码管),都不太方便。
因此,我觉得使用ESP32板子来实现温湿度检测就有了非常大的优势,利用ESP32自带的WiFi模块,考虑到实现的便利性,使用HTTP协议可以轻松将采集到的温湿度信息上传到云服务器上,这样在服务器段只需要简单的编写2个网页即可实现信息的存储和读取,这样在手机或者办公室电脑上只需通过访问网页的方式就能查看家里的温湿度,真正做到随时随地监控家里的温湿度。
总体架构
总体加入如下图:
非常的简洁明了,就是通过ESP32读取DHT11传感器的温湿度信息,然后通过家里的WiFi使用HTTP的方式向云服务器上的PHP网页提交信息,该网页会向MySQL数据库中添加ESP32提交的信息,然后再编写一个查看数据的网页,读取MySQL数据里存储的温湿度信息即可。
通过HTTP传输数据就几个好处,一是技术上比较熟悉,笔者对网页后端编程比较熟悉,所以编写起来没有难度。二是实现也简单,还容易扩展。在服务器端只需要部署Web服务器,然后再编写相应的PHP代码即可。如果以后需要多点收集温湿度信息,也只需简单接入,稍加区分即可。不需要额外编写其他通信的模块。第三是使用方便,通服务器托管网过HTTP无论是提交数据还是查看数据都很简单,电脑手机平板都可兼容。
另外,关于云服务器,最近阿里云推出一个99元一年的云服务器真的很好,实惠好用,用来做实验或者假设小网站真的是绝佳(笔者不是打广告,没必要,反正又饭恰),本例中就是使用阿里云的服务器,安装个宝塔面板或者1号面板架设网站很方便,(宝塔现在商业化严重,到处都要你掏钱,很讨厌。),如果linux用的溜也可以用lnmp.org的一键脚本,无图像化界面,稍微有点门槛;当然,如果不想掏钱,也可以在本地搭建PHP环境,比较出名的有WAMPServer、PHPStudy等集成环境,一直点下一步即可安装完成,在本地局域网上也可以玩的很嗨。
本地端实现
本地端在硬件上主要是ESP32传感器+DHT11的组合,选择一个合适的引脚(任意GPIO口都可以),连接到DHT11的2脚,本例中使用22号引脚。
板子连接图,如下:
图中红色线连接DHT11的1脚,为3.3v供电,黑色线连DHT11的4脚,为GND,棕色线连接DHT11的2脚,数据传输线,此线另一头连接ESP32的22脚。连接好硬件后,需要在Thonny中输入相关的代码,确认代码无误后可以下载至ESP32中进行运行。
这里使用了network、urequests、machine、dht和time库。特别注意urequests库前面有个u,网上许多文章都直接使用requests对象,那是它们已经声明了import urequests as requests这行代码,不然会调不通。另外urequests的官方API文档也是语焉不详,我本希望使用POST方法,但是看了官方示例和网上其他的文章,发现都调不通,遂只能放弃,改而使用GET方法,如果大家有使用POST提交参数的使用经验,请一定留言赐教,感谢!
代码如下:
import network
import urequests
from machine import Pin# 导入Pin模块
from machine import Timer# 导入Timer模块
import dht #导入dht传感器模块
import time
#import ujson
def send_http_message():
ssid = 'WiFi的名字' # 替换为您的Wi-Fi SSID
password = 'WiFi的密码' # 替换为您的Wi-Fi密码
request_url = 'http://192.168.1.1/msg.php' # 替换为您要发送HTTP请求的URL,IP或者域名。我这里替换成IP地址了
sample_interval = 60 # 取样时间,单位秒
# 连接到Wi-Fi网络
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('正在连接网络...')
wlan.connect(ssid, password)
while not wlan.isconnected():
pass
print('WiFi网络配置信息:',服务器托管网 wlan.ifconfig())
# DHT11传感器
# 定义DHT11传感器引脚和采样间隔时间(单位:秒)
dht11=dht.DHT11(Pin(22)) # 22引脚,模式输入
# 定义温湿度数据的变量
temperature = 0.0
humidity = 0.0
while True:
dht11.measure() #使用DHT库里的测量函数
temperature=dht11.temperature() #温度
humidity=dht11.humidity() #湿度
if temperature==None:
print("DHT11温湿度检测失败!")
else:
print("temp=%d℃ humi=%dRH"%(temperature,humidity)) #在控制台打印温湿度信息
# 通过urequests发送HTTP GET消息,提交温湿度信息
response = urequests.get(request_url+"?msg=t:"+str(temperature)+",h:"+str(humidity));
print("HTTP响应码:",response.status_code) # 状态码,HTTP状态码200表示正常
print(response.text) # 打印响应内容
time.sleep(sample_interval) #休眠n秒
#程序入口
if __name__=="__main__":
send_http_message()
Python代码注意缩进要对齐,以上代码写的比较琐碎,有需要大家可以自行调整一下。这是代码运行后的Shell输出,另外在Thonny中要主要选择正确的COM口,如下图:
云端实现
云端采用PHP+MySQL的经典组合,近年总是有争议PHP已死,但是PHP真的非常方便,笔者的主力语言是Java,但是对于这种小工程,PHP真的是方便太多,如果换用Java实现服务器端那真的是一场噩梦,配置部署复杂、代码编写也十分庞大。所以我觉得PHP还是有它自身的优势的,语言就是一个工具,真的无所谓好坏,如果你PHP用得好,肯定也能有高薪。
好了,闲话少叙。
服务器端笔者编写了2个网页,一个用于接受本地端提交的信息,另一个用于显示已存储在MySQL里的数据。这2个网页写的都比较简单,后续还有很大的优化空间。这里作为示例,也是够用了。希望大家不要喷。
接收数据的PHP代码:
connect_error) {
die("连接失败: " . $conn->connect_error);
}
if ($conn->query($sql) === TRUE) {
echo "消息已成功存储到数据库";
} else {
echo "错误: " . $sql . "
" . $conn->error;
}
}else{
echo "消息为空,不予添加。";
}
}else{
echo "本网页为消息添加页面,需要授权才可访问!";
}
?>
数据显示页面代码:
消息内容显示
table,
th,
td {
border: 1px solid;
}
table {
width: 100%;
max-width: 1200px;
border-spacing: 0;
}
消息内容
添加时间
connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 查询所有消息并显示在页面上
$sql = "SELECT msg,insertTime FROM `simplemsg` ORDER BY insertTime DESC LIMIT 100";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "
".$row["msg"]."
".$row["insertTime"]."
";
}
} else {
echo "没有消息可显示";
}
?>
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
Python简介 Python是一种高级编程语言,它诞生于上世纪90年代初期,其创造者是Guido van Rossum。 Python在开发时非常注重代码的可读性和简洁性,同时也支持面向对象和函数式编程。Python语言并不复杂,新手很容易掌握,因此它是一种…