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

perseverance52 perseverance52     2022-10-23     476

关键词:

【MicroPython esp32】读取DHT11温湿度传感器数据+ 0.96“I2C oled显示


🎄DHT11传感器

🎄ssd1306 I2C 0.96寸 OLED屏幕

📢接线说明

dht11----esp32
data----GPIO 22

I2C OLED ---- esp32
SCL ====GPIO 26
SDA ---- GPIO 25

📌注意事项

⛳在运行代码前,需要先将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 esp32设备中

  • 导入后,可以在设备信息文件栏看到。(如果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(26), sda=Pin(25), freq=400000)       # 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(22, 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()

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

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

玩转传感器——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总结... 查看详情

12-开发板接入小五物联实现远程控制(stm32采集温湿度传感器dht11)(代码片段)

采集DHT11温湿度数据,使用stm32f103zet6的GPIOG11引脚读取SHT11数据,通过串口打印采集的温湿度 dht11.c文件:#include"dht11.h"#include"delay.h"//复位DHT11voidDHT11_Rst(void)DHT11_IO_OUT();//SETOUTPUTDHT11_DQ_OUT=0;//拉低DQdelay_ms(20);/ 查看详情

stm32+dht11温湿度数据实验-stm32将采集dht11温湿度通过usart1在串口助手打印(代码片段)

...GPIO_SetBits(GPIOC,GPIO_Pin_4);17else18GPIO_ResetBits(GPIOC,GPIO_Pin_4)19//读取引脚的电平20#defineDHT11_DATA_IN()GPIO_Read 查看详情

arduioesp32将dht11温湿度传感器数据在网页上显示(代码片段)

ArduioESP32将DHT11温湿度传感器数据在网页上显示串口监视数据和网页数据同步显示温湿度传感器ESP32开发板接线说明DHT11----ESP8266Data-----D7(gpio13)-- 查看详情

esp3222.智能家居-dht11温湿度采集(wifi)

上一篇:【ESP32】21.WIFIWebServers继电器实验(ESPAsyncWebServer-异步服务器库)前言:先放电路连接图:ESP32最为核心的就是自带蓝牙和WiFi功能。可以通过简单的设置使esp32模块联网,完成物联网的基础配置,进而完成相关操作。DHT11... 查看详情

esp3222.智能家居-dht11温湿度采集(wifi)

上一篇:【ESP32】21.WIFIWebServers继电器实验(ESPAsyncWebServer-异步服务器库)前言:先放电路连接图:ESP32最为核心的就是自带蓝牙和WiFi功能。可以通过简单的设置使esp32模块联网,完成物联网的基础配置,进而完成相关操作。DHT11... 查看详情

stm32实例——基于stm32开发板实现传感数据采集-dht11温湿度采集(代码片段)

STM32开发板实现传感数据采集-DHT11温湿度采集一、前言本项目是基于STM32开发板的温湿度采集,传感器采用DHT11温湿度传感器,软件采用keil5等。本项目采用ARM结构中最为代表的Cortex-M4系列的芯片,选用STM32F407ZGT6开发板... 查看详情

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

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

温湿度传感器(代码片段)

温湿度传感器硬件使用STM32F103RCT6DHT11(温湿度传感器)软件使用keil5MDK环境串口调试助手实现说明​根据DHT11温湿度传感器手册1.初始化DHT11复位DHT11,根据时序图写出设置```voiddht_Rst(void) dht_output();//设置dht11为普通推挽输出 dh... 查看详情

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

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

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

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

《嵌入式-stm32开发指南》第三部分外设篇-第1章温湿度传感器dht11(代码片段)

1.1理论分析1.1.1DHT11介绍DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。DHT11传感器包括一个... 查看详情

002_stm32程序移植之_dht11

1.测试环境:STM32C8T62.测试模块:DHT11温湿度模块3.测试接口:1.DHT11温湿度模块接口:DS1302引脚---------单片机引脚VCC--------------------3.3VGND-------------------GNDDATA-------------------PA5 2.串口使用串口一,波特率9600单片机引脚---------CH340... 查看详情

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

【MicroPythonRP2040】读取DHT11温湿度传感器数据+oled显示✨本示例基于Thonny平台开发。📒RP2040开发板📘YD-RP2040开发板🎄DHT11传感器🎄ssd1306I2C0.96寸OLED屏幕📌注意事项⛳在运行代码前,需要先将ssd13060.96寸I2... 查看详情

stm32实例——基于stm32开发板实现传感数据采集-dht11温湿度采集(代码片段)

STM32开发板实现传感数据采集-DHT11温湿度采集一、前言本项目是基于STM32开发板的温湿度采集,传感器采用DHT11温湿度传感器,软件采用keil5等。本项目采用ARM结构中最为代表的Cortex-M4系列的芯片,选用STM32F407ZGT6开发板... 查看详情

arduinoleonardo读取dht22温湿度传感器

首先在该地址下载库:https://codeload.github.com/nethoncho/Arduino-DHT22/zip/master使用以下代码测试:/*******************************************************这个程序用来测试DHT22的温湿度。********************************************* 查看详情

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

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