micropythonrp2040读取dht11温湿度传感器数据+0.96“i2coled显示(代码片段)

perseverance52 perseverance52     2022-12-08     124

关键词:

【MicroPython RP2040】读取DHT11温湿度传感器数据+ oled显示


  • ✨本示例基于Thonny平台开发。

📒RP2040开发板

  • 📘YD-RP2040开发板

🎄DHT11传感器

🎄ssd1306 I2C 0.96寸 OLED屏幕

📌注意事项

⛳在运行代码前,需要先将ssd1306 0.96寸 I2C OLED连接到RP2040开发板对应的引脚上,否则会报错,找不到I2C设备。

📔所需库模块

💎dht.py

import array
import micropython
import utime
from machine import Pin
from micropython import const
 
class InvalidChecksum(Exception):
    pass
 
class InvalidPulseCount(Exception):
    pass
 
MAX_UNCHANGED = const(100)
MIN_INTERVAL_US = const(200000)
HIGH_LEVEL = const(50)
EXPECTED_PULSES = const(84)
 
class DHT11:
    _temperature: float
    _humidity: float
 
    def __init__(self, pin):
        self._pin = pin
        self._last_measure = utime.ticks_us()
        self._temperature = -1
        self._humidity = -1
 
    def measure(self):
        current_ticks = utime.ticks_us()
        if utime.ticks_diff(current_ticks, self._last_measure) < MIN_INTERVAL_US and (
            self._temperature > -1 or self._humidity > -1
        ):
            # Less than a second since last read, which is too soon according
            # to the datasheet
            return
 
        self._send_init_signal()
        pulses = self._capture_pulses()
        buffer = self._convert_pulses_to_buffer(pulses)
        self._verify_checksum(buffer)
 
        self._humidity = buffer[0] + buffer[1] / 10
        self._temperature = buffer[2] + buffer[3] / 10
        self._last_measure = utime.ticks_us()
 
    @property
    def humidity(self):
        self.measure()
        return self._humidity
 
    @property
    def temperature(self):
        self.measure()
        return self._temperature
 
    def _send_init_signal(self):
        self._pin.init(Pin.OUT, Pin.PULL_DOWN)
        self._pin.value(1)
        utime.sleep_ms(50)
        self._pin.value(0)
        utime.sleep_ms(18)
 
    @micropython.native
    def _capture_pulses(self):
        pin = self._pin
        pin.init(Pin.IN, Pin.PULL_UP)
 
        val = 1
        idx = 0
        transitions = bytearray(EXPECTED_PULSES)
        unchanged = 0
        timestamp = utime.ticks_us()
 
        while unchanged < MAX_UNCHANGED:
            if val != pin.value():
                if idx >= EXPECTED_PULSES:
                    raise InvalidPulseCount(
                        "Got more than  pulses".format(EXPECTED_PULSES)
                    )
                now = utime.ticks_us()
                transitions[idx] = now - timestamp
                timestamp = now
                idx += 1
 
                val = 1 - val
                unchanged = 0
            else:
                unchanged += 1
        pin.init(Pin.OUT, Pin.PULL_DOWN)
        if idx != EXPECTED_PULSES:
            raise InvalidPulseCount(
                "Expected  but got  pulses".format(EXPECTED_PULSES, idx)
            )
        return transitions[4:]
 
    def _convert_pulses_to_buffer(self, pulses):
        """Convert a list of 80 pulses into a 5 byte buffer
        The resulting 5 bytes in the buffer will be:
            0: Integral relative humidity data
            1: Decimal relative humidity data
            2: Integral temperature data
            3: Decimal temperature data
            4: Checksum
        """
        # Convert the pulses to 40 bits
        binary = 0
        for idx in range(0, len(pulses), 2):
            binary = binary << 1 | int(pulses[idx] > HIGH_LEVEL)
 
        # Split into 5 bytes
        buffer = array.array("B")
        for shift in range(4, -1, -1):
            buffer.append(binary >> shift * 8 & 0xFF)
        return buffer
 
    def _verify_checksum(self, buffer):
        # Calculate checksum
        checksum = 0
        for buf in buffer[0:4]:
            checksum += buf
        if checksum & 0xFF != buffer[4]:
            raise InvalidChecksum()


💎ssd1306.py

# MicroPython SSD1306 OLED driver, I2C and SPI interfaces
 
from micropython import const
import framebuf
 
# register definitions
SET_CONTRAST = const(0x81)
SET_ENTIRE_ON = const(0xA4)
SET_NORM_INV = const(0xA6)
SET_DISP = const(0xAE)
SET_MEM_ADDR = const(0x20)
SET_COL_ADDR = const(0x21)
SET_PAGE_ADDR = const(0x22)
SET_DISP_START_LINE = const(0x40)
SET_SEG_REMAP = const(0xA0)
SET_MUX_RATIO = const(0xA8)
SET_COM_OUT_DIR = const(0xC0)
SET_DISP_OFFSET = const(0xD3)
SET_COM_PIN_CFG = const(0xDA)
SET_DISP_CLK_DIV = const(0xD5)
SET_PRECHARGE = const(0xD9)
SET_VCOM_DESEL = const(0xDB)
SET_CHARGE_PUMP = const(0x8D)
 
# Subclassing FrameBuffer provides support for graphics primitives
# http://docs.micropython.org/en/latest/pyboard/library/framebuf.html
class SSD1306(framebuf.FrameBuffer):
    def __init__(self, width, height, external_vcc):
        self.width = width
        self.height = height
        self.external_vcc = external_vcc
        self.pages = self.height // 8
        self.buffer = bytearray(self.pages * self.width)
        super().__init__(self.buffer, self.width, self.height, framebuf.MONO_VLSB)
        self.init_display()
 
    def init_display(self):
        for cmd in (
            SET_DISP | 0x00,  # off
            # address setting
            SET_MEM_ADDR,
            0x00,  # horizontal
            # resolution and layout
            SET_DISP_START_LINE | 0x00,
            SET_SEG_REMAP | 0x01,  # column addr 127 mapped to SEG0
            SET_MUX_RATIO,
            self.height - 1,
            SET_COM_OUT_DIR | 0x08,  # scan from COM[N] to COM0
            SET_DISP_OFFSET,
            0x00,
            SET_COM_PIN_CFG,
            0x02 if self.width > 2 * self.height else 0x12,
            # timing and driving scheme
            SET_DISP_CLK_DIV,
            0x80,
            SET_PRECHARGE,
            0x22 if self.external_vcc else 0xF1,
            SET_VCOM_DESEL,
            0x30,  # 0.83*Vcc
            # display
            SET_CONTRAST,
            0xFF,  # maximum
            SET_ENTIRE_ON,  # output follows RAM contents
            SET_NORM_INV,  # not inverted
            # charge pump
            SET_CHARGE_PUMP,
            0x10 if self.external_vcc else 0x14,
            SET_DISP | 0x01,
        ):  # on
            self.write_cmd(cmd)
        self.fill(0)
        self.show()
 
    def poweroff(self):
        self.write_cmd(SET_DISP | 0x00)
 
    def poweron(self):
        self.write_cmd(SET_DISP | 0x01)
 
    def contrast(self, contrast):
        self.write_cmd(SET_CONTRAST)
        self.write_cmd(contrast)
 
    def invert(self, invert):
        self.write_cmd(SET_NORM_INV | (invert & 1))
 
    def show(self):
        x0 = 0
        x1 = self.width - 1
        if self.width == 64:
            # displays with width of 64 pixels are shifted by 32
            x0 += 32
            x1 += 32
        self.write_cmd(SET_COL_ADDR)
        self.write_cmd(x0)
        self.write_cmd(x1)
        self.write_cmd(SET_PAGE_ADDR)
        self.write_cmd(0)
        self.write_cmd(self.pages - 1)
        self.write_data(self.buffer)
 
 
class SSD1306_I2C(SSD1306):
    def __init__(self, width, height, i2c, addr=0x3C, external_vcc=False):
        self.i2c = i2c
        self.addr = addr
        self.temp = bytearray(2)
        self.write_list = [b"\\x40", None]  # Co=0, D/C#=1
        super().__init__(width, height, external_vcc)
 
    def write_cmd(self, cmd):
        self.temp[0] = 0x80  # Co=1, D/C#=0
        self.temp[1] = cmd
        self.i2c.writeto(self.addr, self.temp)
 
    def write_data(self, buf):
        self.write_list[1] = buf
        self.i2c.writevto(self.addr, self.write_list)
 
 
class SSD1306_SPI(SSD1306):
    def __init__(self, width, height, spi, dc, res, cs, external_vcc=False):
        self.rate = 10 * 1024 * 1024
        dc.init(dc.OUT, value=0)
        res.init(res.OUT, value=0)
        cs.init(cs.OUT, value=1)
        self.spi = spi
        self.dc = dc
        self.res = res
        self.cs = cs
        import time
 
        self.res(1)
        time.sleep_ms(1)
        self.res(0)
        time.sleep_ms(10)
        self.res(1)
        super().__init__(width, height, external_vcc)
 
    def write_cmd(self, cmd):
        self.spi.init(baudrate=self.rate, polarity=0, phase=0)
        self.cs(1)
        self.dc(0)
        self.cs(0)
        self.spi.write(bytearray([cmd]))
        self.cs(1)
 
    def write_data(self, buf):
        self.spi.init(baudrate=self.rate, polarity=0, phase=0)
        self.cs(1)
        self.dc(1)
        self.cs(0)
        self.spi.write(buf)
        self.cs(1)

先将所需模块导入到micropython RP2040设备中

  • 导入后,可以在设备信息文件栏看到。(如果Thonny软件没有将文件勾选上将看不到。)

🎯主程序代码

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import utime as time
from dht import DHT11, InvalidChecksum
 
WIDTH  = 128                                            # oled display width
HEIGHT = 64                                             # oled display height
 
i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=200000)       # Init I2C using pins GP8 & GP9 (default I2C0 pins)
print("I2C Address      : "+hex(i2c.scan()[0]).upper()) # Display device address
print("I2C Configuration: "+str(i2c))                   # Display I2C config
 
 
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)                  # Init oled display
 
while True:
    time.sleep(1)
    pin = Pin(28, Pin.OUT, Pin.PULL_DOWN)
    sensor = DHT11(pin)
    t  = (sensor.temperature)
    h = (sensor.humidity)
    print("Temperature: ".format(sensor.temperature))
    print("Humidity: ".format(sensor.humidity))
    # Clear the oled display in case it has junk on it.
    oled.fill(0)       
    
    # Add some text
    oled.text("Temp: ",10,16)
    oled.text(str(sensor.temperature),50,16)
    oled.text("*C",90,16)
    
    oled.text("Humi: ",10,40)
    oled.text(str(sensor.humidity),50,40)
    oled.text("%",90,40)
    
    time.sleep(1)
    oled.show()

  • Shell调试窗口输出dht传感器数据

micropythonrp2040点灯实验(代码片段)

MicroPythonRP2040点灯实验本实验基于Thonny平台本示例所使用的版本;YD-RP2040版(源地YD-RP2040)源地YD-RP2040开发板资料:http://152.32.187.208:8080/yd-data/YD-RP2040/本实验YD-RP2040开发板所烧录的固件:PimoroniPicoLiPo固件下载地址:https 查看详情

micropythonesp32读取dht11温湿度传感器数据+0.96“i2coled显示(代码片段)

...;0.96“I2Coled显示✨本示例基于Thonny平台开发。相关篇《【MicroPythonRP2040】读取DHT11温湿度传感器数据+0.96“I2Coled显示》-📖ESP32dev引脚功能图🎄DHT11传感器🎄ssd1306I2C0.96寸OLED屏幕&#x 查看详情

micropythonrp2040通过adc调节pwm输出示例(代码片段)

【MicroPythonRP2040】通过ADC调节PWM输出示例🔖RaspberryPiPico引脚功能图🔖YD2040📖RP2040ADC介绍📝RP2040共有5个ADC通道,其中4个是基于12位SAR的ADC:GP26、GP27、GP28和GP29。ADC0、ADC1、ADC2、ADC3的输入信号分别可以连接到GP 查看详情

micropythonrp2040可编程ios(pio)示例介绍(代码片段)

【MicroPythonRP2040】可编程IOs(PIO)原文链接:https://www.cnx-software.com/2021/01/27/a-closer-look-at-raspberry-pi-rp2040-programmable-ios-pio/为什么用可编程I/O?所有的电路板通常都带有对数字通信协议(如I2C、SPI和UART)的硬 查看详情

micropythonrp2040micropython固件烧录以及thonny开发初探(代码片段)

【MicroPython】RP2040MicroPython固件烧录以及Thonny开发初探基于RP2040主控的的PIPICO官方的RaspberryPiPicoMicroPython固件烧写以RP2040为主控核心的RaspberryPiPico固件MicroPythonUF2烧录文件:https://micropython.org/download/rp2-pico/rp2-p 查看详情

micropythonrp2040/esp32/c3自编译4mb/8mb/16mb固件分享(代码片段)

micropythonRP2040/esp32/c3自编译4MB/8MB/16MB固件分享固件基于当前版本:MicroPythonv1.19.1自编译的,可以根据自己的PIPICO,esp32/c3开发板flash容量自行选择其对应的固件进行烧录。本文也提供了官方固件资源,例如:PIPIC... 查看详情

51单片机dht11+ds1302+lcd1602温湿度监测系统(代码片段)

...示灯会亮起。本电路包含的主要器件主控:AT89C51、用于读取时间的DS1302,用于显示的LCD1602,DHT11温湿度传感器,超温报警的蜂鸣器,主程序代码#include"reg52.H"#include"stdio.h"< 查看详情

Arduino DHT11 读数交换位置

...和带有DHT库的DHT11是否有其他人遇到这种问题。我每分钟读取一次传感器湿度和温度。我没有使用延迟,而是检查当前毫秒-最后读取毫秒来检查何时需要再次读取值。无论如何,这是我绘制的数据。有时它可以轻松工作几个 查看详情

micropythonesp32读取dht11温湿度传感器数据(代码片段)

MicroPythonESP32读取DHT11温湿度传感器数据DHT11温湿度传感器接线说明ESP32-----DHT113.3V-----VCCGND-----GNDGPIO22-----DOUT本示例基于Thonny平台开发所引入的模块,如果没有按照,可以通过pipinstallxxxx命令在命令提示窗中进行安装,或... 查看详情

stm32读取温湿度传感器dht11和dht21(am2301)系列问题(代码片段)

1、DHT11和DHT21传感器  这两种传感器都是奥松公司的产品,具体的传感器说明书在其官网上有(www.aosong.com)。  DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采... 查看详情

树莓派从dht11温度湿度传感器读取数据

时序图参考厂家说明书:DHT11数字湿温度传感器的原理和应用范例四个阵脚连接:VCC接3.3伏电源,Dout接GPIO口,我接的是物理12针脚,NC留空,GND接地。波折1:电阻被错接进了VCC,于是看了无数遍时序图,改了无数遍的驱动无论怎... 查看详情

stc15w408as读取dht11温湿度+数据串口打印详解

STC15W408AS读取DHT11温湿度+数据串口打印输出详解这个数据结果做了我2天时间来验证,主要难点是读取DHT11时序上,弄懂了时序,读这类传感器就很简单拿到数据了。网络上对于这类传感器的资料一搜索一箩筐不光是从源码到原理... 查看详情

arduinorp2040读取adc采样数据

ArduinoRP2040读取ADC采样数据 查看详情

stc15w408as读取dht11温湿度+oled显示+数据串口打印修订版(代码片段)

STC15W408AS读取DHT11温湿度+OLED显示+数据串口打印【修订版】相关篇《STC15W408AS读取DHT11温湿度+OLED显示+数据串口打印》该版本主要修正了温度显示精度问题。主程序代码#include"stdio.h"//#include"string.h"// 查看详情

2021-08-29(代码片段)

...始信号2.2主机等待DHT11响应2.3DHT11数据bit“0”,“1”读取2.4DHT11传输一个字节数据2 查看详情

stc15w408as读取dht11温湿度+oled显示+数据串口打印(代码片段)

STC15W408AS读取DHT11温湿度+OLED显示+数据串口打印相关篇《STC15W408AS读取DHT11温湿度+数据串口打印详解》只要读取到DHT11数据了,基本上只要解决的问题就是OLED驱动显示了。本程序,没有阉割OLED的主要功能代码,保留原有的驱动显... 查看详情

stm32g4备战蓝桥杯嵌入式---模块配置---dhl11(拓展板)(代码片段)

文章目录DHL111.引脚2.Cubemx实现的配置3.生成工程1.DHT11读取函数2.DHT11读取测试总结DHL111.引脚PA7->接HDQ2.Cubemx实现的配置3.生成工程1.DHT11读取函数uint8_tDHT11_Read_Data(uint8_t*temp,uint8_t*humi)uint8_tbuf[5];uint8_ti;DHT11_Rst();if(DHT11_Check()==0... 查看详情

玩转传感器——dht11温湿度传感器(stm32版)(代码片段)

...入输出GPIO1.2复位DHT111.3检查DHT11是否正常1.4DHT11初始化1.5读取一位数据(返回值0/1)1.6读取一个字节(返回值:读到的数据)1.7读取DHT11数据(读取成功返回0,失败返回1)1.8完成版.c文件2DHT11.h总结... 查看详情