【ESP32】1306oled spi显示屏模块+温湿控模块DHT11输出温湿度

发布时间:2024年01月23日

先放这张图吧
在这里插入图片描述
每个板子可能引脚布局不同,注意引脚后面的支持协议,尤其是在输出屏幕模块时,并不是所有的引脚都可以自定义输出,得参考引脚后的支持来,你可以花时间琢磨琢磨,学习期间必然会浪费点时间。如果没有没有指定或推荐引脚,那么可以 machine.Pin 自定义,遵循这些规则,入门时可以少花点时间浪费。

纯oled代码

import machine
from libs import ssd1306

# 定义SPI引脚

# sck:SPI时钟引脚,用于同步数据传输。
sck = machine.Pin(18, machine.Pin.OUT)
# mosi:SPI主设备输出从设备输入引脚,用于发送数据。
mosi = machine.Pin(19, machine.Pin.OUT)
# cs:SPI从设备片选引脚,用于选择要与主设备通信的从设备。
cs = machine.Pin(15, machine.Pin.OUT)
# dc:数据/命令引脚,用于指示发送的是数据还是命令。
dc = machine.Pin(4, machine.Pin.OUT)
# rst:复位引脚,用于复位OLED屏幕。
rst = machine.Pin(5, machine.Pin.OUT)


# 初始化SPI总线 软SPI模式

# 在这行代码中,我们使用machine.SPI()函数创建了一个SPI对象,用于与OLED屏幕进行通信。
# 1:指定SPI总线的编号,此处为1。
# baudrate=8000000:设置SPI总线的时钟速率为8MHz(8,000,000Hz)。
# polarity=0:设置时钟极性为0,表示在空闲状态下时钟线为低电平。
# phase=0:设置时钟相位为0,表示数据在时钟的下降沿进行传输。
# sck=sck:指定SPI总线的时钟引脚。
# mosi=mosi:指定SPI总线的MOSI(主设备输出从设备输入)引脚。
spi = machine.SoftSPI(baudrate=8000000, polarity=0, phase=0, sck=sck, mosi=mosi,miso=machine.Pin(22))

# 初始化SSD1306 OLED屏幕
oled = ssd1306.SSD1306_SPI(128, 64, spi, dc, rst, cs)

# 清空屏幕
oled.fill(0) 
oled.text("First line", 0, 0, 1)
oled.text("Second line", 0, 8, 1)
oled.text("Third line", 0, 16, 1)
oled.text("Forth line", 0, 24, 1)
oled.text("Fifth line", 0, 32, 1)
oled.text("Sixth line", 0, 40, 1)
oled.text("Seventh line", 0, 48, 1)
oled.text("Last line", 0, 56, 1)
oled.show()

# 清空屏幕
oled.fill(0)
oled.show()

# 在屏幕上显示文本
oled.text("Hello, World!", 0, 0)
oled.text("MicroPython", 0, 10)
oled.text("OLED Test", 0, 20)
oled.show()

纯温湿度代码代码

import dht
from machine import Pin
import time

# 设置DHT11传感器的引脚
# 设置为输入模式,并启用了上拉电阻。这样可以确保DHT11传感器的数据引脚始终保持在逻辑高电平。
dht_pin = Pin(21, Pin.IN, Pin.PULL_UP)

# 创建DHT11对象
dht_sensor = dht.DHT11(dht_pin)

while True:
    try:
        # 读取温湿度数据
        dht_sensor.measure()
        temperature = dht_sensor.temperature()
        humidity = dht_sensor.humidity()
        # 打印测量结果
        print("温度: %d°C" % temperature)
        print("湿度: %d%%" % humidity)
        
    except OSError as e:
        print("读取传感器数据失败:", e)
    
    # 延时一段时间后再次测量
    time.sleep(3)

温湿度输出到显示屏

在这里插入图片描述

import machine
from libs import ssd1306
import dht
import time
import utime


# 定义SPI引脚

# sck:SPI时钟引脚,用于同步数据传输。
sck = machine.Pin(18, machine.Pin.OUT)
# mosi:SPI主设备输出从设备输入引脚,用于发送数据。
mosi = machine.Pin(19, machine.Pin.OUT)
# cs:SPI从设备片选引脚,用于选择要与主设备通信的从设备。
cs = machine.Pin(15, machine.Pin.OUT)
# dc:数据/命令引脚,用于指示发送的是数据还是命令。
dc = machine.Pin(4, machine.Pin.OUT)
# rst:复位引脚,用于复位OLED屏幕。
rst = machine.Pin(5, machine.Pin.OUT)


# 初始化SPI总线 软SPI模式
# 在这行代码中,我们使用machine.SPI()函数创建了一个SPI对象,用于与OLED屏幕进行通信。
# 1:指定SPI总线的编号,此处为1。
# baudrate=8000000:设置SPI总线的时钟速率为8MHz(8,000,000Hz)。
# polarity=0:设置时钟极性为0,表示在空闲状态下时钟线为低电平。
# phase=0:设置时钟相位为0,表示数据在时钟的下降沿进行传输。
# sck=sck:指定SPI总线的时钟引脚。
# mosi=mosi:指定SPI总线的MOSI(主设备输出从设备输入)引脚。
spi = machine.SoftSPI(baudrate=8000000, polarity=0, phase=0, sck=sck, mosi=mosi,miso=machine.Pin(22))
# 初始化SSD1306 OLED屏幕
oled = ssd1306.SSD1306_SPI(128, 64, spi, dc, rst, cs)


## 温湿度代码
# 设置DHT11传感器的引脚
# 设置为输入模式,并启用了上拉电阻。这样可以确保DHT11传感器的数据引脚始终保持在逻辑高电平。
dht_pin = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP)
# 创建DHT11对象
dht_sensor = dht.DHT11(dht_pin)




#fonts=....
fonts= {
    
    0xE6B8A9:
    [0x00,0x23,0x12,0x12,0x83,0x42,0x42,0x13,0x10,0x27,0xE4,0x24,0x24,0x24,0x2F,0x00,
    0x00,0xF8,0x08,0x08,0xF8,0x08,0x08,0xF8,0x00,0xFC,0xA4,0xA4,0xA4,0xA4,0xFE,0x00],#温0*/
    
    0xE5BAA6:
     [0x01,0x00,0x3F,0x22,0x22,0x3F,0x22,0x22,0x23,0x20,0x2F,0x24,0x42,0x41,0x86,0x38,
    0x00,0x80,0xFE,0x20,0x20,0xFC,0x20,0x20,0xE0,0x00,0xF0,0x10,0x20,0xC0,0x30,0x0E],#湿1*/

    0xE6B9BF:
     [0x00,0x27,0x14,0x14,0x87,0x44,0x44,0x17,0x11,0x21,0xE9,0x25,0x23,0x21,0x2F,0x00,
    0x00,0xF8,0x08,0x08,0xF8,0x08,0x08,0xF8,0x20,0x20,0x24,0x28,0x30,0x20,0xFE,0x00],#度1*
    
    0xE6B58B:
    [0x00,0x27,0x14,0x14,0x85,0x45,0x45,0x15,0x15,0x25,0xE5,0x21,0x22,0x22,0x24,0x08,
    0x04,0xC4,0x44,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x54,0x04,0x84,0x44,0x14,0x08],#测3*/

    0xE9878F:
    [0x00,0x1F,0x10,0x1F,0x10,0xFF,0x00,0x1F,0x11,0x1F,0x11,0x1F,0x01,0x1F,0x01,0x7F,
    0x00,0xF0,0x10,0xF0,0x10,0xFE,0x00,0xF0,0x10,0xF0,0x10,0xF0,0x00,0xF0,0x00,0xFC]#量4*/

}



#中文渲染 函数部分
def chinese(ch_str, x_axis, y_axis): 
   offset_ = 0 
   for k in ch_str: 
       code = 0x00  # 将中文转成16进制编码 
       data_code = k.encode("utf-8")
       code |= data_code[0] << 16
       code |= data_code[1] << 8
       code |= data_code[2]
       byte_data = fonts[code]
       for y in range(0, 16):
           a_ = bin(byte_data[y]).replace('0b', '')
           while len(a_) < 8:
               a_ = '0'+ a_
           b_ = bin(byte_data[y+16]).replace('0b', '')
           while len(b_) < 8:
               b_ = '0'+ b_
           for x in range(0, 8):
               oled.pixel(x_axis + offset_ + x,    y+y_axis, int(a_[x]))   
               oled.pixel(x_axis + offset_ + x +8, y+y_axis, int(b_[x]))   
       offset_ += 16


while True:
    try:
        # 读取温湿度数据
        dht_sensor.measure()
        temperature = dht_sensor.temperature()
        humidity = dht_sensor.humidity()
        
        # 清空屏幕
        oled.fill(0)

        # 显示温湿度
#         chinese('温度',20,20) 
#         oled.text("temperature: %dC" % temperature, 0, 20)
        oled.text("temperature: "+str(temperature), 0, 18)
#         chinese('湿度',30,40)
        oled.text("humidity: %d%%" % humidity, 0, 30)
        chinese('温湿度测量',0,45)
        
        # 获取系统时间
        current_time = utime.localtime()
        time_str = "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(
        current_time[0], current_time[1], current_time[2],
        current_time[3], current_time[4], current_time[5])
        
        oled.text("Now: " + time_str, 0, 2)
        
        # 显示屏幕内容
        oled.show()
        
    except OSError as e:
        print("读取传感器数据失败:", e)
    
    # 延时一段时间后再次测量
    time.sleep(3)
文章来源:https://blog.csdn.net/weixin_55323831/article/details/135760354
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。