物联网开发笔记(11)- 使用Wokwi仿真MicroPython on ESP32开发板实现温度和湿度检测并使用屏幕显示(升级版)_wokwi上用1602显示屏显示温度

153 阅读4分钟

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

i2c = I2C(1, scl=Pin(27), sda=Pin(26)) oled_width = 128 oled_height = 64 oled = oled.SSD1306_I2C(oled_width, oled_height, i2c) #初始化Oled

led_red=Pin(14,Pin.OUT) led_yellow=Pin(15,Pin.OUT) #初始化led

while True:
oled.fill(0) #清屏 time.sleep(3) DHT22.read_bytes(resultList) #DHt22数据的采集 HumData = ((resultList[0] << 8) + resultList[1]) / 10 #湿度 TemData = ((resultList[2] << 8) + resultList[3]) / 10 #温度

oled.text('RH={}% T={}C'.format(HumData,TemData), 0, 0) #数据处理   
oled.show()   #显示到oled
if TemData>20:  #对温度进行判断
  pwm0.freq(1000)
  led_red.on()
if HumData>30: #对湿度进行判断
  pwm0.freq(1000)
  led_yellow.on()

diagram.json



{ "version": 1, "author": "Anonymous maker", "editor": "wokwi", "parts": [ { "type": "wokwi-pi-pico", "id": "pico", "top": 0, "left": 0, "attrs": { "env": "micropython-20220117-v1.18" } }, { "type": "wokwi-dht22", "id": "dht1", "top": -98.59, "left": -113.64, "attrs": {} }, { "type": "wokwi-ssd1306", "id": "oled1", "top": -71.05, "left": 109.69, "attrs": {} }, { "type": "wokwi-buzzer", "id": "bz1", "top": 56.43, "left": -148.61, "attrs": { "volume": "0.1" } }, { "type": "wokwi-led", "id": "led1", "top": 151.47, "left": -161.92, "attrs": { "color": "red" } }, { "type": "wokwi-led", "id": "led2", "top": 150.83, "left": -124.53, "attrs": { "color": "yellow" } }, { "type": "wokwi-pushbutton", "id": "btn1", "top": 155.62, "left": 165.22, "attrs": { "bounce": "0", "color": "green" } } ], "connections": [ [ "dht1:GND", "pico:GND.2", "black", [ "v0" ] ], [ "pico:3V3", "oled1:VIN", "green", [ "h202.69", "v-135.43", "h-74.67" ] ], [ "oled1:GND", "pico:GND.8", "black", [ "v-26.46", "h-122.84", "v116.67" ] ], [ "dht1:VCC", "pico:3V3", "red", [ "v0" ] ], [ "dht1:SDA", "pico:GP2", "green", [ "v0" ] ], [ "bz1:1", "pico:GND.2", "green", [ "v11.66", "h55.05", "v-67.17" ] ], [ "bz1:2", "pico:GP4", "green", [ "v4.69", "h43.45", "v-78.57" ] ], [ "led2:A", "pico:GP15", "green", [ "v0" ] ], [ "led1:A", "pico:GP14", "green", [ "v8.58", "h117.45", "v-16.48" ] ], [ "pico:GND.4", "led2:C", "black", [ "h-55.32", "v35.5", "h-51.33" ] ], [ "pico:GND.4", "led1:C", "black", [ "h-54.69", "v33.6", "h-91.25", "v2.53" ] ], [ "oled1:DATA", "pico:GP26", "green", [ "v-17.98", "h-40.03", "v180.07" ] ], [ "oled1:CLK", "pico:GP27", "green", [ "v-50.9", "h-56.23", "v10.29" ] ], [ "btn1:1.l", "pico:GP18", "green", [ "h0" ] ], [ "btn1:2.l", "pico:GND.5", "green", [ "h-64.99", "v-4.74" ] ] ], "serialMonitor": { "display": "plotter", "newline": "lf" } }


oled.py



#MicroPython SSD1306 OLED driver, I2C and SPI interfaces created by Adafruit

import time 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)

class SSD1306: def init(self, width, height, external_vcc): self.width = width self.height = height self.external_vcc = external_vcc self.pages = self.height // 8 # Note the subclass must initialize self.framebuf to a framebuffer. # This is necessary because the underlying data buffer is different # between I2C and SPI implementations (I2C needs an extra byte). self.poweron() 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.height == 32 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 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_framebuf()

def fill(self, col):
    self.framebuf.fill(col)

def pixel(self, x, y, col):
    self.framebuf.pixel(x, y, col)

def scroll(self, dx, dy):
    self.framebuf.scroll(dx, dy)

def text(self, string, x, y, col=1):
    self.framebuf.text(string, x, y, col)

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) # Add an extra byte to the data buffer to hold an I2C data/command byte # to use hardware-compatible I2C transactions. A memoryview of the # buffer is used to mask this byte from the framebuffer operations # (without a major memory hit as memoryview doesn't copy to a separate # buffer). self.buffer = bytearray(((height // 8) * width) + 1) self.buffer[0] = 0x40 # Set first byte of data buffer to Co=0, D/C=1 self.framebuf = framebuf.FrameBuffer1(memoryview(self.buffer)[1:], width, height) 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_framebuf(self):
    # Blast out the frame buffer using a single I2C transaction to support
    # hardware I2C interfaces.
    self.i2c.writeto(self.addr, self.buffer)

def poweron(self):
    pass

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 self.buffer = bytearray((height // 8) * width) self.framebuf = framebuf.FrameBuffer1(self.buffer, width, height) super().init(width, height, external_vcc)

def write_cmd(self, cmd):
    self.spi.init(baudrate=self.rate, polarity=0, phase=0)
    self.cs.high()
    self.dc.low()
    self.cs.low()
    self.spi.write(bytearray([cmd]))
    self.cs.high()

def write_framebuf(self):
    self.spi.init(baudrate=self.rate, polarity=0, phase=0)
    self.cs.high()
    self.dc.high()
    self.cs.low()
    self.spi.write(self.buffer)
    self.cs.high()

def poweron(self):
    self.res.high()
    time.sleep_ms(1)
    self.res.low()
    time.sleep_ms(10)
    self.res.high()

dt22.py



from machine import Pin import time

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。 img img

如果你需要这些资料,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!