本帖最后由 knight34 于 2024-8-9 13:59 编辑
墨水屏时钟,以其低能耗、高对比度和纸质阅读感,成为桌面上长时间清晰显示时间的理想选择。本文介绍一下我们设计制作的墨水屏时钟。 1、所需硬件1)合宙的ESP32-C3:
2)电子价签拆出来的2.9寸墨水屏: ——电子价签型号为:Stellar-L,墨水屏型号为:E029A01。 3)自己设计的一块墨水屏驱动板:
——这块PCB比较复杂了,贴片电容、电阻、二极管有20多个,再加上贴片AHT20和24P的FPC,焊接难度有点大,建议上加热台和焊锡膏。 4)402030锂电池3.7V
——立创商城上买的小体积锂电池(402030),刚好可以藏在墨水屏时钟后面。 5)墨水屏时钟背面
2、原理图
——墨水屏使用SPI协议,8个引脚分别与ESP32-C3连接: mosi = Pin(3) sck = Pin(2) cs = Pin(7) dc = Pin(4) rst = Pin(5) busy = Pin(6) ——电源方案使用ETA6093充放电芯片,这块芯片只要加一个开关、两个led指示灯,就可以利用ESP32-C3的USB口实现充电、放电,非常方便。但是,也有个明显的缺点——功耗较高,基本上150mA的锂电池半天就没电了。所以,这个墨水屏时钟基本上要一直接着电源。 3、所需驱动1)墨水屏驱动 Github上有墨水屏驱动,选择2.9寸的epaper2in9.py。 2)framebuf 驱动墨水屏需要使用Micropython自带的framebuf模块,但是Micropython自带的framebuf模块只能显示固定大小的文字,而且无法旋转方向。我们找到了提取自CircuitPython的framebuf模块,这个模块支持旋转方向和字体大小,但还是不支持中文。我们把这个模块命名为cframebuf.py。 3)ahtx0 驱动板上集成了AHT20,从Github找了个驱动。
4、测试代码墨水屏时钟需要显示的内容有日期、星期、时间、温度和湿度,日期、星期、时间需要联网获取或校准,温度和湿度通过驱动板上的AHT20获取。 1)联网 ESP32联网的代码网上很多,官方也有提供示例:
- def do_connect():#联网
- import network
- wlan = network.WLAN(network.STA_IF)
- wlan.active(True)
- if not wlan.isconnected():
- print('connecting to network...')
- wlan.connect('XXX', 'XXX')#填写你的WIFI名和密码
- while not wlan.isconnected():
- pass
- print('network config:', wlan.ifconfig())
复制代码2)获取或校准时间
通过NTP服务器获取或校准时间,这里用的NTP服务器是阿里云的: - def sync_ntp():#校时
- print("开始同步网络时间")
- import ntptime
- try:
- ntptime.NTP_DELTA = 3155644800 # 可选 UTC+8偏移时间(秒),不设置就是UTC0
- ntptime.host = 'time1.aliyun.com' # 可选,ntp服务器,默认是"pool.ntp.org"
- ntptime.settime() # 修改设备时间,到这就已经设置好了
- except Exception as e:
- print("同步ntp时间错误",repr(e))
复制代码3)墨水屏引脚和驱动定义
- # 定义对应的引脚
- mosi = Pin(3)
- sck = Pin(2)
- cs = Pin(7)
- dc = Pin(8)
- rst = Pin(10)
- busy = Pin(6)
- spi = SPI(1, baudrate=2000000, polarity=0, phase=0, sck=sck, mosi=mosi)
- i2c = I2C(scl=Pin(5), sda=Pin(4))
- # 创建墨水屏驱动对象
- e = epaper2in9.EPD(spi, cs, dc, rst, busy)
- e.init()
- # 定义要显示的内容宽度高度
- w = 128
- h = 296
- x = 0
- y = 0
- black = 0
- white = 1
- # 创建framebuf对象
- buf = bytearray(w * h // 8) # 296 * 128 // 8 = 4736
- fb = cframebuf.FrameBuffer(buf, w, h, cframebuf.MHMSB)
- fb.rotation = 1 # 调整显示的方向,可以在0/1右转90度/2右转180/3右转270之间选择
-
- # 联网,校准时间,初始化温湿度
- do_connect()
- sync_ntp()
- sensor = ahtx0.AHT10(i2c)
-
- # 将星期转换为英文显示
- weekday_dict = {
- 0: "Monday",
- 1: "Tuesday",
- 2: "Wednesday",
- 3: "Thursday",
- 4: "Friday",
- 5: "Saturday",
- 6: "Sunday"
- }
复制代码4)使用while True循环显示时间、温湿度
- while True:
- fb.fill(white)
- localtime_now=time.localtime()
- year = localtime_now[0]
- month = localtime_now[1]
- day = localtime_now[2]
- hour = localtime_now[3]
- minute = localtime_now[4]
- weekday = localtime_now[6]
- showdate="%.2d-%.2d-%.2d" % (year, month, day)
- showtime="%.2d:%.2d" % (hour, minute)
- fb.text(showdate, 10, 10, black, size=2)
- fb.text(weekday_dict[weekday], 200, 10, black, size=2)
- fb.hline(0, 30, 296, black)#画一个水平线
- fb.text(showtime, 70, 40, black, size=5)
- fb.hline(0, 90, 296, black)#画一个水平线
- fb.text("Tem:%0.1fC" % (sensor.temperature-2), 20, 100, black, size=2)
- fb.text("Hum:%0.1f%%" % (sensor.relative_humidity+10), 170, 100, black, size=2)
- e.set_frame_memory(buf, x, y, w, h)
- e.display_frame()
- time.sleep(19)
复制代码——墨水屏官方文档建议刷新频率不要太高,至少要超过15秒,因此我们设定为19秒。
最终显示效果: 放在桌面还是挺好看的。我们只设计了一个简单的界面,有需要可以再美化一下。
5、视频展示
|