最近梅雨天,有个房间湿度很大,而我需要远程查看温湿度,所以无所谓有没有显示屏,某宝上的温湿度计都是带屏的,如果连WIFI查看温湿度操作也比较麻烦,还需要换电池,实在不能满足我的需求,于是买了ESP32-WROOM和DHT11。
ESP32是乐鑫开发的一系列低成本、低功耗的片上系统微控制器,具有 Wi-Fi 和蓝牙无线功能以及双核处理器。手上的ESP32-WROOM-32是38针角版,板载一颗蓝色LED可由Pin1控制。
DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,内部由一个 8 位单片机控制一个电阻式感湿元件和一个 NTC 测温元件。DHT11 采用单总线协议。
手上的DHT11板是把DHT11传感器封装在板上了,板载10k上拉电阻,使用时直接接单片机,引脚定义为:
1:data(S)
2:VCC
3:GND(-)
接线用杜邦线,data接G22,VCC接3V3(3.3V,接5V也可以):
最后用阳光板做了个外壳(红白线交换了)
胶带固定,留LED窗口
工作原理是定时测量温湿度后通过webhook推送到钉钉的,钉钉消息包括成功连接WIFI,成功同步网络时间,时间是GMP0时区时间,未换算为8区,我尝试输出摄氏度符号℃,但网络请求会报错,所以暂时用C代替。
程序是用python,具体说是使用MicroPyhton编写的,MicroPython是一种适用于微控制器的Python3编程语言实现。它基于Python语言,并且与标准的Python解释器具有相同的语法和语义。MicroPython可以在微型计算机上运行,比如Arduino、ESP8266和ESP32等。它可以通过串口或WiFi连接进行编程和传输,可以控制各种传感器、执行各种操作和处理各种数据。它提供了便捷的开发环境,具有高效的脚本语言和小巧的代码大小,更容易理解和编写代码。它是一个非常流行的嵌入式开发语言,可用于开发各种物联网、机器人和嵌入式系统。
使用MicroPyhton需先刷入MicroPyhton固件,可以使用Thonny就很方便地刷入,步骤:工具->设置->Install or update firmware->Port+Firmware->安装。
MicroPyhton固件下载地址(MicroPython - Python for microcontrollers)
需要把WEBHOOK_DINGDING改为自己的机器人webhook,上电后会尝试连接WIFI,成功后会收到钉钉,然后马上同步到网络时间,成功也会钉钉,然后马上测量温湿度,同时LED会闪烁,直到测量成功(如果传感器有问题会一直闪),并钉钉。
# -*- coding: UTF-8 -*-
import network
import urequests
import ntptime
import time
import dht
from machine import Pin,RTC,Timer
ssid = 'ssid'
password = '123456'
WEBHOOK_DINGDING = 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxx'
TIME_MINUTES = 15
rtc = RTC()
# 设置温湿度传感器引脚
dht_pin = Pin(22, Pin.IN, Pin.PULL_UP) # 将传感器引脚连接到ESP32的GPIO 22引脚
# 创建DHT对象
dht_sensor = dht.DHT11(dht_pin)
# 连接WIFI
def connect_wifi(ssid,password):
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
print('scan wifi',wlan.scan())
wlan.connect(ssid,password)
while not wlan.isconnected():
print('.',end='')
time.sleep(0.2)
text = 'WIFI connect OK'
print(text)
r = dingMe(text)
print(r)
# 同步时间
def sync_time():
print(rtc.datetime())
print('Sync time')
for i in range(60): #时间校准
try:
print('.',end='')
ntptime.settime()
print('time ok')
break;
except:
time.sleep(3)
print(rtc.datetime())
(y,m,d,H,M,S,w,dd) = time.localtime()
text = '{}-{} {}:{} sync time OK'.format(m,d,H,M)
print(text)
r = dingMe(text)
print(r)
def measure():
try:
# 读取传感器数据
dht_sensor.measure()
# 获取温度和湿度
temperature = dht_sensor.temperature()
humidity = dht_sensor.humidity()
data=[temperature,humidity]
return data
except:
return [0,0]
# 发送消息到钉钉
# https://open.dingtalk.com/document/orgapp/custom-robot-access
def dingMe(content,WEBHOOK_DINGDING=WEBHOOK_DINGDING):
mHeader = {'Content-Type': 'application/json; charset=UTF-8'}
mBody = {
"text": {
"content":'WT:'+content
},
"msgtype": "text"
}
# 注意:json=mBody 必须用json
r = urequests.post(url=WEBHOOK_DINGDING, json=mBody, headers=mHeader)
return r.text
# 读取传感器数据并传到钉钉
def push_message():
# 声明LED引脚对象
led_pin = Pin(1, Pin.OUT)
for i in range(60):
data = measure()
# 测量失败,闪烁LED
led_pin.value(0)
time.sleep(0.5)
led_pin.value(1)
time.sleep(0.5)
if [0,0] != data:
break
(y,m,d,H,M,S,w,dd) = time.localtime()
text = '{}-{} {}:{} {}C {}%'.format(m,d,H,M,data[0],data[1])
print(text)
r = dingMe(text)
print(r)
if __name__ == '__main__':
connect_wifi(ssid,password)
sync_time()
push_message()
# 创建定时器对象
timer = Timer(0)
# 设置定时器触发时间为TIME_MINUTES分钟
timer.init(period=TIME_MINUTES*60*1000, mode=Timer.PERIODIC, callback=lambda t: push_message())