ESP32检测家中温湿度上云,随时随地多端查看温湿度

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代码:

<?php  

$servername = "localhost";  // 数据库服务器名称或IP地址  

$username = "root";     // 数据库用户名  

$password = "password";     // 数据库密码  

$dbname = "dbname";       // 数据库名称  

  

// 1.获取提交的消息  

//$msg = $_POST["msg"];

$msg = $_REQUEST["msg"];

// 密钥

$key = $_REQUEST["key"];

// 接收 JSON 数据  

//$jsonData = $_POST['data']; // 或者 $_GET['data'],根据您的实际情况选择  

  

// 解析 JSON 数据  

//$data = json_decode($jsonData, true);  



// 访问解析后的数据  

//echo $data['key']; // 输出 "John"  

//echo $data['msg']; // 输出 30





// 验证密钥,否则不进行数据库连接(用于简单的验证)

if($key == "key_string"){

// 2-1.向数据库中存入提交的消息





// 将消息插入到数据库中  

$sql = "INSERT INTO `simplemsg` (msg) VALUES ('$msg')";

if(!empty($msg)){

    // 创建连接

     $conn = new mysqli($servername, $username, $password, $dbname);

    

     // 检查连接是否成功  

     if ($conn->connect_error) {

     die("连接失败: " . $conn->connect_error);

     }

    

    

    if ($conn->query($sql) === TRUE) {

     echo "消息已成功存储到数据库";

     } else {

     echo "错误: " . $sql . "<br>" . $conn->error;

     }

}else{

    echo "消息为空,不予添加。";

}



}else{

    echo "本网页为消息添加页面,需要授权才可访问!";

}

?>

数据显示页面代码:

<!DOCTYPE html>

<html lang="zh">

<head>

    <meta charset="utf-8">

    <title>消息内容显示</title>

    <!--link rel="stylesheet" type="text/css" href=""-->

</head>

<style rel="stylesheet" type="text/css">

table,

th,

td {

  border: 1px solid;

}

table {

  width: 100%;

  max-width: 1200px;

  border-spacing: 0;

}

</style>

<body>

<table>

    <tr><td>消息内容</td><td>添加时间</td></tr>

<?php

$servername = "localhost";  // 数据库服务器名称或IP地址  

$username = "root";     // 数据库用户名  

$password = "password";     // 数据库密码  

$dbname = "dbname";       // 数据库名称  



// 连接到数据库  

$conn = new mysqli($servername, $username, $password, $dbname);  

  

// 检查连接是否成功

if ($conn->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 "<tr><td>".$row["msg"]."</td><td>".$row["insertTime"]."</td></tr>";  

    }  

} else {  

    echo "没有消息可显示";  

}  

?>

</table>

</body>

</html>

页面显示添加的信息,如下图:

数据表定义及参考查询语句:

/* 创建数据表格 */

CREATE TABLE simplemsg (  

  id INT AUTO_INCREMENT PRIMARY KEY,  

  msg TEXT NOT NULL,

  insertTime TIMESTAMP default CURRENT_TIMESTAMP

);



/* 插入语句 */

INSERT INTO `simplemsg`(`msg`) VALUES ("");



/* 查询最新100条消息 */

SELECT * FROM `simplemsg`  

ORDER BY insertTime DESC  

LIMIT 100;

/* 查询2 */

SELECT msg,insertTime FROM `simplemsg`

ORDER BY insertTime DESC  

LIMIT 100;

  • 后续

一点反思:1.ESP32光光来做温湿度监控还是非常的大材小用了。另外,如果考虑成本,其实可以用ESP8266板子替代ESP32,8266板子比ESP32还要便宜10多个元。2.DHT11的精度不高,读取出来的温湿度都是int型,如果追求更高精度需要更换更高级别的传感器。另外最好加上气压传感器,这样对天气更有参考意义。还可以考虑加入空气质量检测模块。

网页端在实际使用中要考虑用户验证。特别是云服务器这种公开的场合,数据风险很高。

另外,网页数据显示可以考虑引入图标显示库,以图标、仪表盘的方式显示气象信息,这样就更加的美观且直观。

使用HTTP Web的方式提交和查看数据具有天然的兼容性,无论是电脑、手机还是平板,只要带有浏览器都可以进行数据的查看,免去各种适配上的麻烦。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐骁虎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值