【树莓派 PICO 2 测评】扩展板和DHT11温湿度计

【树莓派 PICO 2 测评】扩展板和DHT11温湿度计

本文介绍了树莓派 Pico 2 扩展板设计,以及 OLED 显示的 DHT11 温湿度计项目设计。

扩展板

介绍了树莓派 Pico 2 扩展板设计,包括外观、原理图、特点和资源介绍等。

外观

Top view

在这里插入图片描述

原理图

在这里插入图片描述

特点

  • 所有 IO 接口引出
  • 多排 3V3 和 5V 电源及 GND
  • 一组 OLED 和 TFT 接口
  • UART、ADC、IIC、SPI 接口
  • DHT11 接口
  • OLED、TFT、DHT11 供电处包含 100nF 滤波电容,提高稳定性
  • 支持 直插贴片 两种安装方式
  • ……

为树莓派Pico 2 开发板的快速开发和 DIY 应用设计提供了极大便利。

详见:树莓派Pico扩展板 - 立创开源硬件平台 .

设计参考

OSHWHub树莓派pico扩展板 - 立创开源硬件平台 .

WaveShare树莓派 Pico扩展板 - 微雪 , WaveShare - Pico Kit .

DFRobotGravity 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.pyPicoDHT22.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 的快速开发和应用以及相关物联网设计提供了参考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值