一、测试环境

我们同样使用在Wokwi网站上选择Micropython with ESP32进行仿真,来进行温度和湿度的检测。

ESP32官方技术参考手册:

https://www.espressif.com.cn/sites/default/files/documentation/esp32_technical_reference_manual_en.pdfhttps://www.espressif.com.cn/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf中文资料可查看乐鑫官网:

技术文档 | 乐鑫科技Downloads: SDK & Demos, APKs, Tools and Documents for Espressif Systems products and solutionshttps://www.espressif.com.cn/zh-hans/support/documents/technical-documents

二、硬件环境

温度湿度DHT22使用说明和显示屏ssd1366使用说明

wokwi-dht22 Reference | Wokwi DocsDigital Humidity and Temperature sensor.https://docs.wokwi.com/parts/wokwi-dht22board-ssd1306 Reference | Wokwi DocsMonochrome 128x64 OLED display with I2C interfacehttps://docs.wokwi.com/parts/board-ssd1306三、代码说明

main.py

'''
oled温湿度报警,
可手动设定警戒值的报警装置,可以用于一些特定环境的温湿度控制
可以自己设定间隔时间
可以通过串口进行最高最低温度的设置等,省的设置一堆按钮显得乱
'''
from machine import Pin,PWM,I2C,Timer,UART
import time,machine,ssd1306,dhtuart1=UART(1,115200)  #调用串口uart1
uart1.init(115200,bits=8,parity=None,stop=1)  #初始化串口相关参数
Tim_S=Timer(0)   #定时器对象,很怪,有了这个定时器,下面的蜂鸣器没有了短促的鸣叫
key=Pin(27, Pin.OUT)  # 蜂鸣器接GPIO27口
Buzzer= PWM(key)    #定义蜂鸣器
Buzzer.duty(0)      #控制蜂鸣器初始关闭状态
global data
data = dht.DHT22(Pin(15))  #实例化15号管脚,21被占用了
i2c = I2C(0, scl=Pin(22), sda=Pin(21))   #对应管脚
oled_width = 128  ##画幅大小。oled屏幕宽度128
oled_height = 64   #画幅大小。oled屏幕高度64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)   #调用,设置像素大小
i=0
space=3000   #设置数据更新时间,默认三秒,可修改但是要为整型。
point=['','.','..','...']   #oled显示“...”动态,表示在工作
Warn_tem_Max=29.0  # 设置最高温度。可修改为浮点型
Warn_tem_Min=26.0  # 设置最高温度。可修改为浮点型
Warn_hum_Max=60.0  # 设置最大湿度。可修改为浮点型
Warn_hum_Min=40.0  # 设置最小湿度。可修改为浮点型
L_Blue=Pin(2,Pin.OUT)  #内置小灯,判断状态,命令设置成功闪亮def Voice_On():   #开启调用Buzzer.duty(512)   #设置蜂鸣器占空比Buzzer.freq(2000)  #设置蜂鸣器频率time.sleep(0.5)Buzzer.duty(0)time.sleep(0.5)def Voice_Off():   #关闭调用Buzzer.duty(0)   #蜂鸣器关闭def Open_Test(t):data.measure()     #先调用测量函数,获取温湿度global temptemp=data.temperature()global humihumi=data.humidity()def max_or_min():global tem_Maxglobal tem_Minglobal hum_Maxglobal hum_Minif int(temp)>tem_Max:tem_Max=int(temp)if int(temp)<tem_Min:tem_Min=int(temp)if int(humi)>hum_Max:hum_Max=int(humi)if int(humi)<tem_Max:hum_Min=int(humi)def Print():global ioled.text('Temp:'+str(temp), 0, 12)oled.text('Max:'+str(tem_Max), 0, 26)    #空一段,最大最小oled.text('Min:'+str(tem_Min), 64, 26)oled.text('Humi:'+str(humi), 0,40)oled.text('Max:'+str(hum_Max), 0, 57)    oled.text('Min:'+str(hum_Min), 64, 57)oled.text('working'+point[i%4], 25, 0)oled.show()time.sleep(0.2)oled.fill(0)i=i+1def Is_Int(Dir):   #异常处理。整型try:int(Dir)return Trueexcept ValueError:passdef Is_Float(Dir):   #异常处理。浮点型try:float(Dir)return Trueexcept ValueError:passdef twink():L_Blue.value(1)time.sleep(0.5)L_Blue.value(0)time.sleep(0.5)L_Blue.value(1)time.sleep(0.5)L_Blue.value(0)time.sleep(0.5)oled.fill(0) #清屏
oled.text('Welcome!', 10, 10)   #欢迎界面
oled.show()
time.sleep(0.5)
oled.fill(0) #清屏Open_Test(0)  #先调用,才能全局改变下面的变量
Tim_S.init(period=space,mode=Timer.PERIODIC,callback=Open_Test)
#效果是到定义的时间就调用函数收集一下数据,但是程序依然在运行,到主函数后会因为未到指定时间
#而不启用收集函数,导致主函数出错,所以需要在定时器之前先调用一下函数,
#还有种办法,可以通过延时来达到等待函数运行后再去显示数据,但是因为后续会有自定义收集间隔
#所以如果通过延时来处理还需要让延时时间变量与间隔相同
#time.sleep(n)tem_Max=int(temp)  #控制空间,整数,大概
tem_Min=int(temp)
hum_Max=int(humi)
hum_Min=int(humi)#主程序负责数据的对比,定时器外部中断优先,保障间隔的准确
while True:   #循环获取温湿度if Warn_tem_Min<temp<Warn_tem_Max and Warn_hum_Min<humi<Warn_hum_Max:Voice_Off()else:Voice_On()max_or_min()Print()#大概有几个口令:警报最大最小温度,湿度;采集时间间隔就这五个,#注意判断类型,命令或类型不正确的不予理会,设置成功有闪灯提醒if uart1.any()>0:   #考虑放在定时器中,因为循环内很难监测到Dir=uart1.read()Dir=str(Dir)     #转换为字符串型
#Dir=Dir.lower(),字符小写就涉及到回车的问题,无法转变,会异常,所以我可以提前切出来想要的部分Dir=Dir[2:-3]  #提前切掉b'...\n'这个东西,在让这个正常的字符串去变小写if Dir.find('space')>=0:Dir=Dir[5:]if Is_Int(Dir)==True:space=int(Dir)Tim_S.init(period=space,mode=Timer.PERIODIC,callback=Open_Test)twink()elif Dir.find('tmax')>=0:Dir=Dir[4:]if Is_Float(Dir)==True:Warn_tem_Max=float(Dir)twink()elif Dir.find('tmin')>=0:Dir=Dir[4:]if Is_Float(Dir)==True:Warn_tem_Min=float(Dir)twink()elif Dir.find('hmax')>=0:Dir=Dir[4:]if Is_Float(Dir)==True:Warn_hum_Max=float(Dir)twink()elif Dir.find('hmin')>=0:Dir=Dir[4:]if Is_Float(Dir)==True:Warn_hum_Min=float(Dir)twink()
#串口这部分也可以考虑写成函数,看起来能简洁些

diagram.json

{"version": 1,"author": "魔都飘雪","editor": "wokwi","parts": [{ "type": "wokwi-esp32-devkit-v1", "id": "esp", "top": -68.61, "left": -8.02, "attrs": {} },{ "type": "wokwi-dht22", "id": "dht1", "top": -71.8, "left": 118.28, "attrs": {} },{ "type": "board-ssd1306", "id": "oled1", "top": 23.53, "left": -135.32, "attrs": {} },{"type": "wokwi-buzzer","id": "bz1","top": -81.64,"left": -146.94,"attrs": { "volume": "0.5" }}],"connections": [[ "esp:TX0", "$serialMonitor:RX", "", [] ],[ "esp:RX0", "$serialMonitor:TX", "", [] ],[ "dht1:VCC", "esp:3V3", "red", [ "v0" ] ],[ "dht1:SDA", "esp:D15", "green", [ "v0" ] ],[ "dht1:GND", "esp:GND.1", "black", [ "v0" ] ],[ "oled1:VCC", "esp:3V3", "red", [ "v-12.04", "h-51.43", "v113.03", "h241.73", "v-40.86" ] ],["oled1:GND","esp:GND.2","black",[ "v-12.72", "h-41.98", "v114.4", "h127.33", "v-50.39" ]],[ "oled1:SDA", "esp:D21", "green", [ "v-103.15", "h173.6", "v86.85" ] ],[ "bz1:1", "esp:GND.2", "green", [ "v8.67", "h101.46", "v72.79" ] ],[ "bz1:2", "esp:D27", "green", [ "v8.67", "h96.78", "v53.56" ] ],[ "oled1:SCL", "esp:D22", "green", [ "v-108.86", "h178.16", "v59.06" ] ]],"serialMonitor": { "display": "plotter", "newline": "lf" }
}

ssd1366.py(ssd1306屏幕的驱动)

# MicroPython SSD1306 OLED driver, I2C and SPI interfacesfrom micropython import const
import framebuf
import math# 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, color=framebuf.MONO_VLSB):self.width = widthself.height = heightself.external_vcc = external_vccself.pages = self.height // 8self.buffer = bytearray(self.pages * self.width)fb = framebuf.FrameBuffer(self.buffer, self.width, self.height, color)self.framebuf = fb# Provide methods for accessing FrameBuffer graphics primitives. This is a# workround because inheritance from a native class is currently unsupported.# http://docs.micropython.org/en/latest/pyboard/library/framebuf.htmlself.fill = fb.fillself.pixel = fb.pixelself.hline = fb.hlineself.vline = fb.vlineself.line = fb.lineself.rect = fb.rectself.fill_rect = fb.fill_rectself.text = fb.textself.scroll = fb.scrollself.blit = fb.blitself.init_display()def init_display(self):for cmd in (SET_DISP | 0x00, # off# address settingSET_MEM_ADDR, 0x00, # horizontal# resolution and layoutSET_DISP_START_LINE | 0x00,SET_SEG_REMAP | 0x01, # column addr 127 mapped to SEG0SET_MUX_RATIO, self.height - 1,SET_COM_OUT_DIR | 0x08, # scan from COM[N] to COM0SET_DISP_OFFSET, 0x00,SET_COM_PIN_CFG, 0x02 if self.height == 32 else 0x12,# timing and driving schemeSET_DISP_CLK_DIV, 0x80,SET_PRECHARGE, 0x22 if self.external_vcc else 0xf1,SET_VCOM_DESEL, 0x30, # 0.83*Vcc# displaySET_CONTRAST, 0xff, # maximumSET_ENTIRE_ON, # output follows RAM contentsSET_NORM_INV, # not inverted# charge pumpSET_CHARGE_PUMP, 0x10 if self.external_vcc else 0x14,SET_DISP | 0x01): # onself.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 = 0x1 = self.width - 1if self.width == 64:# displays with width of 64 pixels are shifted by 32x0 += 32x1 += 32self.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)#下面函数为添加的功能,根据pyboard板子厂商提供的例程修改def show_hanzi(self, row, col, charlist1):data = bytearray(charlist1)fbuf = framebuf.FrameBuffer(data, 16, 16, framebuf.MONO_VLSB)self.blit(fbuf,col,(row-1)*16)del fbufdef show_image(self, image_list):data = bytearray(image_list)fbuf = framebuf.FrameBuffer(data, 128, 96, framebuf.MONO_VLSB)self.blit(fbuf, 0, 0)del fbufclass SSD1306_I2C(SSD1306):def __init__(self, width, height, i2c, addr=0x3c, external_vcc=False, color=framebuf.MONO_VLSB):self.i2c = i2cself.addr = addrself.temp = bytearray(2)super().__init__(width, height, external_vcc, color)def write_cmd(self, cmd):self.temp[0] = 0x80 # Co=1, D/C#=0self.temp[1] = cmdself.i2c.writeto(self.addr, self.temp)def write_data(self, buf):self.i2c.writeto(self.addr, b'\x40' + buf)class SSD1306_SPI(SSD1306):def __init__(self, width, height, spi, dc, res, cs, external_vcc=False, color=framebuf.MONO_VLSB):self.rate = 10 * 1024 * 1024dc.init(dc.OUT, value=0)res.init(res.OUT, value=0)cs.init(cs.OUT, value=1)self.spi = spiself.dc = dcself.res = resself.cs = csimport timeself.res(1)time.sleep_ms(1)self.res(0)time.sleep_ms(10)self.res(1)super().__init__(width, height, external_vcc, color)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)

是不是,很简单!来看看效果:

也可以在网页上查看实际效果:

Wokwi Arduino and ESP32 Simulatorhttps://wokwi.com/projects/341771399848788563

物联网开发笔记(9)- 使用Wokwi仿真MicroPython on ESP32开发板实现温度和湿度检测并使用屏幕显示相关推荐

  1. 物联网开发笔记(64)- 使用Micropython开发ESP32开发板之控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:控件显示

    一.目的 这一节我们学习如何使用我们的ESP32开发板来控制ILI9341 3.2寸TFT-LCD触摸屏进行LVGL图形化编程:控件显示. 二.环境 ESP32 + ILI9341 3.2寸TFT-L ...

  2. 物联网开发笔记(77)- 使用Micropython开发ESP32开发板之使用MAX7219驱动控制8x8LED点阵模块(续)

    一.目的 这一节我们继续学习如何使用我们的ESP32开发板控制带MAX7219驱动的8x8LED点阵模.我们使用库来显示,更加方便. 二.环境 ESP32 + MAX7219驱动的8x8LED点阵模块 ...

  3. 物联网开发笔记(68)- 使用Micropython开发ESP32开发板之使用官方工具esptool烧录

    一.目的 这一节我们学习如何使用我们的ESP32开发板来烧录. 二.环境 ESP32 + esptool + Win10 + python3.10 + 其他工具. ESP32开发板购买地址: http ...

  4. 物联网开发笔记(94)- 使用Micropython开发ESP32开发板之获取天气数据并用ILI9341屏幕显示

    一.目的 这一节我们学习如何使用乐鑫的ESP32开发板通过心知天气API控获取实时天气的数据,并使用串口SPI控制ILI9341 液晶屏,显示出来. 二.环境 ESP32(固件:esp32-20220 ...

  5. 物联网开发笔记(53)- 使用Micropython开发ESP32开发板之蓝牙BLE通信

    一.目的 这一节我们学习如何使用我们的ESP32开发板通过蓝牙和手机进行通信. 二.环境 ESP32 + 手机(笔者用的小米10) + Thonny IDE 三.蓝牙介绍 这个知识大家自行百度吧,这里 ...

  6. 微信公众号Java开发-笔记01【微信公众号介绍、开发环境搭建】

    学习网址:哔哩哔哩网站 微信公众号开发-Java版 微信公众号Java开发-笔记01[微信公众号介绍.开发环境搭建] 微信公众号Java开发-笔记02[] 微信公众号Java开发-笔记03[] 微信公 ...

  7. JRtplib开发笔记(四):JRtplib的VS开发环境搭建以及Demo

    原博主博客地址:https://blog.csdn.net/qq21497936 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/84 ...

  8. DJI OSDK开发笔记(N3飞控)(1)——开发工作流程

    DJI OSDK开发笔记(N3飞控)(1)--开发工作流程 API层次结构 硬件设置 一般设置 数据 串口 连接器引脚排列 连接到记载计算机 软件环境设置 所有平台 下载SDK和所需工具 更新固件 启 ...

  9. 物联网开发笔记(48)- 使用Micropython开发ESP32开发板之控制OLED ssd1306屏幕

    一.目的 这一节我们学习如何使用我们的ESP32开发板来控制OLED ssd1306屏幕,此处使用的是I2C协议,大家可自行百度学习一下I2C. 二.环境 ESP32 + OLED ssd1306屏幕 ...

最新文章

  1. 基于php下载文件的详解
  2. AI大厂迎最冷冬天?网传阿里拟裁员2万人,净利下滑高管离职
  3. opencv中的approxPolyDP函数和boundingRect函数
  4. 前台Vue、后台Django、设置axios解决csrf_token问题
  5. 优化算法的意义,之二。
  6. python中写入文件数据及文件定位操作命令
  7. 取余运算(信息学奥赛一本通-T1326)
  8. java nextbyte()_java.util.Scanner.hasNextByte()方法实例
  9. ids和ips主要区别在于_接口测试和功能测试的区别
  10. python技术分享_分享几个python的使用技巧
  11. 使用阿里云npm镜像加速
  12. aspen吸收塔气液比优化_Aspen软件在天然气净化过程中的模拟与优化
  13. 关于微信服务号使用百度地图获取定位不准问题
  14. 保密计算机和移动存储介质台账,银行计算机和移动存储介质保密管理办法
  15. swustoj 1132 Coin-collecting by robot
  16. python中as是什么意思_python中with python中with as 是什么意思刚入门求解释!!!
  17. PHP自学---empty()和isset()的使用
  18. 青龙面板基本脚本运行必装依赖 一键式安装脚本安装依赖 2023年3月28日
  19. ubuntu VCS+verdi安装教程
  20. vue和layui哪个更好用_指纹锁哪个牌子更好用?

热门文章

  1. math_(函数数列)极限的含义误区和符号梳理/邻域去心邻域邻域半径
  2. java的发展(8-17新特性整理)
  3. OJ 1168 改写整数
  4. java毕业设计网站SpringBoot美容院预约管理系统
  5. 基于JAVA美发店预约系统设计与实现
  6. html5新年网页做给父母的,给父母的感谢信5篇模板
  7. Opencv C++ 学习视频整理源代码(1)
  8. 图像情感识别研究方向
  9. 树莓派?云服务器?小主机?旧手机使用Termux安卓手机中跑Java跑spring boot不香吗?
  10. 路由器,你身边的“地雷”?