【树莓派 PICO 2 测评】扩展板和DHT11温湿度计
本文介绍了树莓派 Pico 2 扩展板设计,以及 OLED 显示的 DHT11 温湿度计项目设计。
扩展板
介绍了树莓派 Pico 2 扩展板设计,包括外观、原理图、特点和资源介绍等。
外观
Top view
Bottom view
原理图
特点
- 所有 IO 接口引出
- 多排 3V3 和 5V 电源及 GND
- 一组 OLED 和 TFT 接口
- UART、ADC、IIC、SPI 接口
- DHT11 接口
- OLED、TFT、DHT11 供电处包含 100nF 滤波电容,提高稳定性
- 支持 直插 和 贴片 两种安装方式
- ……
为树莓派Pico 2 开发板的快速开发和 DIY 应用设计提供了极大便利。
设计参考
OSHWHub :树莓派pico扩展板 - 立创开源硬件平台 .
WaveShare :树莓派 Pico扩展板 - 微雪 , WaveShare - Pico Kit .
DFRobot :Gravity Expansion Sheild For Pico , Pico Gravity扩展板 - DFRobot .
注意事项
扩展板 PCB 设计时需要重点关注电源供电部分,根据树莓派 PICO2 原理图的电源部分
VBUS 来自 Micro USB 接口的 5V 输入电源,它通过肖特基二极管D1馈电产生VSYS,VBUS到VSYS二极管(D1)采用多电源选择功能的Oring电源架构来增加其灵活性。
VSYS 是主系统的“输入电压”,它为RT6150降压-升压型SMPS(Switching Mode Power Supply,开关电源)芯片供电,RT6150输出固定的3.3V电源,该电源可用于RP2040 MCU芯片及其GPIO(可用作外部电路供电)。
注意:Pico开发板RP2040 MCU芯片内部有一个片上低压差稳压器(LDO, Low Dropout Regulator)模块,它用于将3.3V电源转换成1.1V标称电源为MCU数字核供电。
VSYS经R5、C3滤波并除以3[即:VSYS×R6/(R5+R6)=3.3V/3=1.1V,可通过ADC3(GPIO29)进行监视,比如可用作简单的电池电压监测。
参考:树莓派Pico开发板硬件扩展接口及电源模块解析 - CSDN博客 .
若扩展板对主控或开发板供电,仅需接 VBUS 引脚即可,其他供电(VSYS、3V3)应保持隔离。外设部分由扩展板供电。
参考:关于 Raspberry Pi Pico 的一切 | PiCockpit .
DHT11 温湿度计
介绍了树莓派 Pico 2 及其扩展板、DHT11 温湿度模块实现环境温湿度监测的项目设计。
硬件连接
OLED_SCL -> GPIO5
OLED_SDA -> GPIO4
DHT11_data -> GPIO7
DHT11 模块 PCB 工程详见:DHT11 模块 - 立创开源硬件平台 .
DHT11 传感器
DHT11 是一款常用的数字温湿度传感器,具有已校准的数字信号输出。
包括
- 1 个电阻式感湿元件
- 1 个 NTC 测温元件
- 与 1 个高性能 8 位单片机相连接
工作电压: 3 - 5.5V
信号传输距离:20米以上
应用领域:空调、汽车、消费品、气象站、湿度调节器、除湿器、家电、医疗、自动控制等。
测量范围
- 湿度:20-90%RH
- 温度:0 ~ 50 ℃
测量精度
- 湿度:±5%RH
- 温度:±2 ℃
DHT11 模块原理图
代码
主代码
'''
Name: DHT11 temperature sensor and IIC OLED
Version: v1.0
Date: 2025.04
Author: ljl
Other: Acquiring temperature and humidity data and showing on OLED screen
'''
from machine import Pin
from PicoDHT22 import PicoDHT22
import utime
# OLED
from machine import Pin, SoftI2C
import ssd1306
# ==== Initialized IIC OLED ====
i2c = SoftI2C(scl=Pin(5), sda=Pin(4))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
def display_TH(temp,humi):
oled.fill(0) # 清屏
oled.text("Temperature:", 0, 0)
oled.text("{:.2f} C".format(temp), 20, 15)
oled.text("Humidity:", 0, 35)
oled.text("{:.2f} %".format(humi), 20, 50)
oled.show()
dht_sensor=PicoDHT22(Pin(7,Pin.IN,Pin.PULL_UP),dht11=True)
while True:
temp,humi = dht_sensor.read()
if temp is None:
print(" sensor error")
else:
print("Temp: {:.2f}°C Humi: {:.2f}%".format(temp,humi))
# 显示到OLED
display_TH(temp,humi)
#DHT22 not responsive if delay to short
utime.sleep_ms(500)
需要调用库函数定义文件 ssd1306.py
和 PicoDHT22.py
,将其写入 Pico 2 开发板
# PicoDHT22.py
import utime
import rp2
from rp2 import PIO, asm_pio
from machine import Pin
@asm_pio(set_init=(PIO.OUT_HIGH),autopush=True, push_thresh=8)
def DHT22_PIO():
# clock set at 500Khz Cycle is 2us
# drive output low for at least 20ms
set(y,1) # 0
pull() # 1
mov(x,osr) # 2
set(pindirs,1) # 3 set pin to output
set(pins,0) # 4 set pin low
label ('waitx')
jmp(x_dec,'waitx') # 5 decrement x reg every 32 cycles
set(pindirs,0) # 6 set pin to input
# STATE A. Wait for high at least 80us. max should be very short
set(x,31) # 7
label('loopA')
jmp(pin,'got_B') # 8
jmp(x_dec,'loopA') # 9
label('Error')
in_(y,1) # 10
jmp('Error') # 11 Infinity loop error
# STATE B. Get HIGH pulse. max should be 40us
label('got_B')
set(x,31) # 12
label('loop_B')
jmp(x_dec,'check_B') # 13
jmp('Error') # 14
label('check_B')
jmp(pin,'loop_B') # 15
# STATE C. Get LOW pulse. max should be 80us
set(x,31) # 16
label('loop_C')
jmp(pin,'got_D') # 17
jmp(x_dec,'loop_C') # 18
jmp('Error') # 19
# STATE D. Get HIGH pulse. max should be 80us
label('got_D')
set(x,31) # 20
label('loop_D')
jmp(x_dec,'check_D') # 21
jmp('Error') # 22
label('check_D')
jmp(pin,'loop_D') # 23
# STATE E. Get Low pulse delay. should be around 50us
set(x,31) # 24
label('loop_E')
jmp(pin,'got_F') # 25
jmp(x_dec,'loop_E') # 26
jmp('Error') # 27
# STATE F.
# wait 40 us
label('got_F')
nop() [20] # 28
in_(pins,1) # 29
# now wait for low pulse
set(x,31) # 30
jmp('loop_D') # 31
class PicoDHT22:
def __init__(self,dataPin, powerPin=None,dht11=False,smID=1):
self.dataPin = dataPin
self.powerPin = powerPin
self.dht11 = dht11
self.smID = smID
self.dataPin.init(Pin.IN, Pin.PULL_UP)
if self.powerPin is not None:
self.powerPin.init(Pin.OUT)
self.powerPin.value(0)
self.sm= rp2.StateMachine(self.smID)
def read_array(self):
if self.powerPin is not None:
self.powerPin.value(1)
utime.sleep_ms(800)
utime.sleep_ms(200)
#start state machine
self.sm.init(DHT22_PIO,freq=500000,
set_base=self.dataPin,
in_base=self.dataPin,
jmp_pin=self.dataPin)
if self.dht11:
self.sm.put(10000)
else:
self.sm.put(1000)
self.sm.active(1)
value = []
for i in range(5):
value.append(self.sm.get())
self.sm.active(0)
if self.powerPin is not None:
self.powerPin.value(0)
return value
def read(self):
value = self.read_array()
sumV = 0
for i in range(4):
sumV += value[i]
if (sumV & 0xff) == value[4]:
if self.dht11:
humidity=value[0] & 0x7f
temperature=value[2]
else:
humidity=((value[0]<<8) + value[1])/10.0
temperature=(((value[2] &0x7f) << 8) + value[3]) /10.0
if (value[2] & 0x80) == 0x80:
temperature = -temperature
return temperature, humidity
else:
return None, None
OLED 驱动库函数文件 ssd1302.py
详见前一篇帖子:【树莓派PICO 2测评】DS18B20 的OLED显示-芯查查 .
代码参考:树莓派 Pico 上使用 DHT11/DHT22 温湿度传感器 – 树莓派 Pico 实验室(RP2040) .
效果
总结
本文介绍了树莓派 Pico 2 扩展板设计,以及 OLED 显示的 DHT11 温湿度计项目设计。包括扩展板原理图、特点参数等信息、DHT11 温湿度计项目的硬件连接、工程代码、效果演示等,为树莓派 Pico 2 的快速开发和应用以及相关物联网设计提供了参考。
全部评论