野路子学习esp32(十七)ESP32-MicroPython OLED AND DHT11 @a.宏万,,最近在做一个智能孵化


最近在做一个智能孵化器

需要用到 温度 湿度传感器 OLED屏幕 继电器 舵机 舵机控制器 加热线 等 最后在3D打印一个外壳

最近买了传感器DHT11 温度湿度传感器 这个传感器价格很低,但是精度不高 温度只能测量整数 比如 38 34 35 没有小数

温度也是只有整数 没有小数 建议购买DHT22

DHT11技术图片 DHT22技术图片

实际使用过程中 发现没有小数点 实在很难受 计划后期升级到DHT22 .

好消息是 DHT11 与 DHT22的使用代码一样,换传感器后 代码几乎不用动 就可以直接使用了

先看下DHT11 的代码

import dhtsensor = dht.DHT11(Pin(23))#读取DHT11数据sensor.measure()  # 调用DHT类库中测量数据的函数 temp_ = str(sensor.temperature())#读取measure()函数中的温度数据hum_ = str(sensor.humidity())  # 读取measure()函数中的湿度数据 

使用方法很简单

就是引用 初始化 一个io 如何读取就可以了

time.sleep(2.5)

官方建议读取数据的间隔大于2秒 以保证数据的准确性

接下来就是输出了,手里有有一个OLED的屏幕 7线的

技术图片

esp32与oled的接线方法

这里要说明下 这个oled使用 spi 传输

esp32 一共可以使用的spi 有两个

硬件SPI总线

有两个硬件SPI通道,可实现更快的传输速率(最高80Mhz)。这些可以在支持所需方向的任何IO引脚上使用,否则不使用(请参见引脚和GPIO),但是如果未将其配置为默认引脚,则它们需要通过额外的GPIO多路复用层,这可能会影响其高速可靠性。当使用下面列出的默认引脚以外的引脚时,硬件SPI通道限制为40MHz。

HSPI(id = 1)VSPI(id = 2)
sck1418岁
莫西1323
味噌1219

硬件SPI与上述软件SPI具有相同的方法:

从 机 进口 针, SPI

from machine import Pin, SPIhspi = SPI(1, 10000000, sck=Pin(14), mosi=Pin(13), miso=Pin(12))vspi = SPI(2, baudrate=80000000, polarity=0, phase=0, bits=8, firstbit=0, sck=Pin(18), mosi=Pin(23), miso=Pin(19))

初始化 OLED

display = ssd1306.SSD1306_SPI(128, 64, hspi, Pin(17),Pin(16), Pin(4))
  display.poweron() display.init_display()

显示内容的代码

            display.fill(0)#清屏            display.text(‘Wen Shi Du Data‘,1,1)            display.text(‘temperature:‘+temp_+"C",1,16)            display.text(‘humidity:‘+hum_+"%",1,31)            display.text(srctime,1,47)            display.show()        

ssd1306.py  是一个官方的库,加到自己的工程里就可以了 
技术图片
# MicroPython SSD1306 OLED driver, I2C and SPI interfacesfrom micropython import constimport framebuf# register definitionsSET_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.htmlclass 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)
View Code

SSD1306.py中带有的函数不多,主要函数有:

text(string, x, y),在(x, y)处显示字符串,注意text()函数内置的字体是8x8的,暂时不能替换poweroff(),关闭OLED显示poweron(),空函数,无任何效果。可以用 write_cmd(0xAF) 代替fill(n),n=0,清空屏幕,n大于0,填充屏幕contrast(),调整亮度。0最暗,255最亮invert(),奇数时反相显示,偶数时正常显示pixel(x, y, c),在(x, y)处画点show(),更新显示内容。前面大部分函数只是写入数据到缓冲区,并不会直接显示到屏幕,需要调用show()后才能显示出来。


另外还有部分功能可以用下面方法实现:

framebuf.line(x1,y1,x2,y2,c),画直线framebuf.hline(x,y,w,c),画水平直线framebuf.vline(x,y,w,c),画垂直直线framebuf.fill_rect(x,y,w,h,c),画填充矩形framebuf.rect(x,y,w,h,c),画空心矩形

这里有一个时间的显示 使用的是

RTC
from machine import Timer,Pin,I2C,SPI,RTCfrom emp_utils import sync_time#定义变量rtc = RTC()    sync_time()#通过网络来校准时间     t = rtc.datetime()     srctime =‘20-‘ + str(t[1]) +‘-‘+ str(t[2]) +‘ ‘+ str(t[4]) +‘:‘+ str(t[5]) +‘:‘+ str(t[6]) 

rtc.datetime() 是一个元组的数据类型 可以用 下标来取值

实现效果

技术图片

野路子学习esp32(十七)ESP32-MicroPython OLED AND DHT11 @a.宏万

评论关闭