Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 9|回复: 0

盘点:EPS32+DHT11温湿传感器+OLEAD显示屏整合MicroPython现温湿度读取并显示

[复制链接]

31万

主题

0

回帖

93万

积分

超级版主

Rank: 8Rank: 8

积分
935994
发表于 昨天 20:04 | 显示全部楼层 |阅读模式
环境需求
Python版本大于等于38、Thonny软件、EPS32已烧录MicroPython固件,可参考上一篇文章?ESP32初学教程Python版-从环境搭建到完成控制LED灯闪烁

硬件需求
EPS32开发板、DHT11的温湿度传感器、OLEAD显示屏、杜邦线、安卓数据线

引脚连接
DHT11温湿度传感器连接ESP32
使用杜邦线连接传感器与EPS32,将DHT11的温湿度传感器VCC、DATA、GND引脚分别连接到EPS32的3V3、GND、D4引脚,如下图。



OLEAD显示屏连接ESP32
使用杜邦线连接OLEAD显示屏与EPS32,将OLEAD显示屏的VCC、GND、SCL、SDA引脚分别连接到EPS32的N、GND、D22、D21引脚,如下图。



编写温湿度读取代码?
用数据线将ESP32和电脑连接,打开Thonny软件,新建文件ssd1306py,加入如下代码

#MicroPythonSSD1306OLEDdriver,I2CandSPIinterfacescreatedbyAdafruit

importtime
importframebuf

#registerdefinitions
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)


classSSD1306:
def__init__(self,width,height,external_vcc):
selfwidth=width
selfheight=height
selfexternal_vcc=external_vcc
selfpages=selfheight8
#Notethesubclassmustinitializeselfframebuftoaframebuffer
#Thisisnecessarybecausetheunderlyingdatabufferisdifferent
#betweenI2CandSPIimplementations(I2Cneedsanextrabyte)
selfpoweron()
selfinit_display()

definit_display(self):
forcmdin(
SET_DISP|0x00,#off
#addresssetting
SET_MEM_ADDR,0x00,#horizontal
#resolutionandlayout
SET_DISP_START_LINE|0x00,
SET_SEG_REMAP|0x01,#columnaddr127m脚本edtoSEG0
SET_MUX_RATIO,selfheight-1,
SET_COM_OUT_DIR|0x08,#scanfromCOM[N]toCOM0
SET_DISP_OFFSET,0x00,
SET_COM_PIN_CFG,0x02ifselfheight==32else0x12,
#timinganddringscheme
SET_DISP_CLK_DIV,0x80,
SET_PRECHARGE,0x22ifselfexternal_vccelse0xf1,
SET_VCOM_DESEL,0x30,#083*Vcc
#display
SET_CONTRAST,0xff,#maximum
SET_ENTIRE_ON,#outputfollowsRAMcontents
SET_NORM_INV,#notinverted
#chargepump
SET_CHARGE_PUMP,0x10ifselfexternal_vccelse0x14,
SET_DISP|0x01):#on
selfwrite_cmd(cmd)
selffill(0)
selfshow()

defpoweroff(self):
selfwrite_cmd(SET_DISP|0x00)

defcontrast(self,contrast):
selfwrite_cmd(SET_CONTRAST)
selfwrite_cmd(contrast)

definvert(self,invert):
selfwrite_cmd(SET_NORM_INV|(invert1))

defshow(self):
x0=0
x1=selfwidth-1
ifselfwidth==64:
#displayswithwidthof64pixelsareshiftedby32
x0+=32
x1+=32
selfwrite_cmd(SET_COL_ADDR)
selfwrite_cmd(x0)
selfwrite_cmd(x1)
selfwrite_cmd(SET_PAGE_ADDR)
selfwrite_cmd(0)
selfwrite_cmd(selfpages-1)
selfwrite_framebuf()

deffill(self,col):
selfframebuffill(col)

defpixel(self,x,y,col):
selfframebufpixel(x,y,col)

defscroll(self,dx,dy):
selfframebufscroll(dx,dy)

deftext(self,string,x,y,col=1):
selfframebuftext(string,x,y,col)


classSSD1306_I2C(SSD1306):
def__init__(self,width,height,i2c,addr=0x3c,external_vcc=False):
selfi2c=i2c
selfaddr=addr
selftemp=bytearray(2)
#AddanextrabytetothedatabuffertoholdanI2Cdatacommandbyte
#tousehardware-compatibleI2CtransactionsAmemoryewofthe
#bufferisusedtomaskthisbytefromtheframebufferoperations
#(withoutamajormemoryhitasmemoryewdoesn'tcopytoaseparate
#buffer)
selfbuffer=bytearray(((height8)*width)+1)
selfbuffer[0]=0x40#SetfirstbyteofdatabuffertoCo=0,DC=1
selfframebuf=framebufFrameBuffer1(memoryew(selfbuffer)[1:],width,height)
super()__init__(width,height,external_vcc)

defwrite_cmd(self,cmd):
selftemp[0]=0x80#Co=1,DC#=0
selftemp[1]=cmd
selfi2cwriteto(selfaddr,selftemp)

defwrite_framebuf(self):
#BlastouttheframebufferusingasingleI2Ctransactiontosupport
#hardwareI2Cinterfaces
selfi2cwriteto(selfaddr,selfbuffer)

defpoweron(self):
pass


classSSD1306_SPI(SSD1306):
def__init__(self,width,height,spi,dc,res,cs,external_vcc=False):
selfrate=10*1024*1024
dcinit(dcOUT,value=0)
resinit(resOUT,value=0)
csinit(csOUT,value=1)
selfspi=spi
selfdc=dc
selfres=res
selfcs=cs
selfbuffer=bytearray((height8)*width)
selfframebuf=framebufFrameBuffer1(selfbuffer,width,height)
super()__init__(width,height,external_vcc)

defwrite_cmd(self,cmd):
selfspiinit(baudrate=selfrate,polarity=0,phase=0)
selfcshigh()
selfdclow()
selfcslow()
selfspiwrite(bytearray([cmd]))
selfcshigh()

defwrite_framebuf(self):
selfspiinit(baudrate=selfrate,polarity=0,phase=0)
selfcshigh()
selfdchigh()
selfcslow()
selfspiwrite(selfbuffer)
selfcshigh()

defpoweron(self):
selfreshigh()
timesleep_ms(1)
selfreslow()
timesleep_ms(10)
selfreshigh()
这个ssd1306完整库可以在官方下载,但是这里我主要是将读取的数据显示到显示屏上,因此只需要这一个文件即可。

新建文件为mainpy,加入如下代码

frommachineimportPin,I2C
importdht
importtime
importssd1306

#设置I2C引脚
i2c=I2C(0,scl=Pin(22),sda=Pin(21),freq=200000)

#初始化显示屏
oled=ssd1306SSD1306_I2C(128,64,i2c)

#设置DHT11传感器
dht_sensor=dhtDHT11(Pin(4))#将4替换为际连接的引脚编号

whileTrue:
try:
#读取传感器数据
dht_sensormeasure()
temperature=dht_sensortemperature()#获取温度
humidity=dht_sensorhumidity()#获取湿度

#打印温湿度数据
print("温度:{}°C"format(temperature))
print("湿度:{}%"format(humidity))

#清空屏幕并显示数据
oledfill(0)#清空屏幕
oledtext('Temperature:{}C'format(temperature),0,0)
oledtext('Humidity:{}%'format(humidity),0,20)
oledshow()#刷新屏幕

exceptOSErrorase:
print("Failedtoreadsensordata:",e)

timesleep(2)#每2秒读取一次数据
需要注意的是在显示屏上法显示中文,打印是可以的。

启动程序
直接启动在Thonny运行程序,看Thonny控制台是否有温度湿度数据打印,并查看显示屏是否有显示,如图可以看到成功了





结语
以上是幽络源的EPS32+DHT11温湿传感器+OLEAD显示屏整合MicroPython现温湿度读取并显示的教程,适合初学者理解与学习。如有不懂之处可在评论区留言或加Q群询问307531422

?



为了便于用户有更好的体验,幽络源在产品上做了很多的升级尝试,结果也是非常的好,市场表现也趋于良好状态。幽络源-免费源码,网络兼职,技术教程,项目服务一站式综合平台。https://www.youluoyuan.com/

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|汕巨家居(浙江)有限公司

GMT+8, 2025-4-21 19:48 , Processed in 0.047306 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表