【电子DIY作品】ESP32-C3墨水屏电子时钟(基于Micropython)

[复制链接]
查看536 | 回复5 | 2024-8-9 11:36:41 | 显示全部楼层 |阅读模式
本帖最后由 knight34 于 2024-8-9 13:59 编辑

墨水屏时钟,以其低能耗、高对比度和纸质阅读感,成为桌面上长时间清晰显示时间的理想选择。本文介绍一下我们设计制作的墨水屏时钟。
1、所需硬件
1)合宙的ESP32-C3:
ESP32-C3.png

2)电子价签拆出来的2.9寸墨水屏:
微信图片_20231118103750.jpg
——电子价签型号为:Stellar-L,墨水屏型号为:E029A01。
3)自己设计的一块墨水屏驱动板:
墨水屏PCB板.png

——这块PCB比较复杂了,贴片电容、电阻、二极管有20多个,再加上贴片AHT20和24P的FPC,焊接难度有点大,建议上加热台和焊锡膏。
4)402030锂电池3.7V
电池.jpg

——立创商城上买的小体积锂电池(402030),刚好可以藏在墨水屏时钟后面。
5)墨水屏时钟背面
墨水屏背面.png

2、原理图
墨水屏时钟.PNG
——墨水屏使用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联网的代码网上很多,官方也有提供示例:

  1. def do_connect():#联网
  2.     import network
  3.     wlan = network.WLAN(network.STA_IF)
  4.     wlan.active(True)
  5.     if not wlan.isconnected():
  6.         print('connecting to network...')
  7.         wlan.connect('XXX', 'XXX')#填写你的WIFI名和密码
  8.         while not wlan.isconnected():
  9.             pass
  10.     print('network config:', wlan.ifconfig())
复制代码
2)获取或校准时间
通过NTP服务器获取或校准时间,这里用的NTP服务器是阿里云的:
  1. def sync_ntp():#校时
  2.     print("开始同步网络时间")
  3.     import ntptime
  4.     try:
  5.         ntptime.NTP_DELTA = 3155644800  # 可选 UTC+8偏移时间(秒),不设置就是UTC0
  6.         ntptime.host = 'time1.aliyun.com'  # 可选,ntp服务器,默认是"pool.ntp.org"
  7.         ntptime.settime()  # 修改设备时间,到这就已经设置好了
  8.     except Exception as e:
  9.         print("同步ntp时间错误",repr(e))
复制代码
3)墨水屏引脚和驱动定义
  1. # 定义对应的引脚
  2. mosi = Pin(3)
  3. sck = Pin(2)
  4. cs = Pin(7)
  5. dc = Pin(8)
  6. rst = Pin(10)
  7. busy = Pin(6)
  8. spi = SPI(1, baudrate=2000000, polarity=0, phase=0, sck=sck, mosi=mosi)
  9. i2c = I2C(scl=Pin(5), sda=Pin(4))

  10. # 创建墨水屏驱动对象
  11. e = epaper2in9.EPD(spi, cs, dc, rst, busy)
  12. e.init()

  13. # 定义要显示的内容宽度高度
  14. w = 128
  15. h = 296
  16. x = 0
  17. y = 0
  18. black = 0
  19. white = 1

  20. # 创建framebuf对象
  21. buf = bytearray(w * h // 8)  # 296 * 128 // 8 = 4736
  22. fb = cframebuf.FrameBuffer(buf, w, h, cframebuf.MHMSB)
  23. fb.rotation = 1  # 调整显示的方向,可以在0/1右转90度/2右转180/3右转270之间选择
  24.    
  25. # 联网,校准时间,初始化温湿度
  26. do_connect()
  27. sync_ntp()
  28. sensor = ahtx0.AHT10(i2c)
  29.    
  30. # 将星期转换为英文显示
  31. weekday_dict = {
  32.     0: "Monday",
  33.     1: "Tuesday",
  34.     2: "Wednesday",
  35.     3: "Thursday",
  36.     4: "Friday",
  37.     5: "Saturday",
  38.     6: "Sunday"
  39. }
复制代码
4)使用while True循环显示时间、温湿度
  1.     while True:
  2.         fb.fill(white)
  3.         localtime_now=time.localtime()
  4.         year = localtime_now[0]
  5.         month = localtime_now[1]
  6.         day = localtime_now[2]
  7.         hour = localtime_now[3]
  8.         minute = localtime_now[4]
  9.         weekday = localtime_now[6]
  10.         showdate="%.2d-%.2d-%.2d" % (year, month, day)
  11.         showtime="%.2d:%.2d" % (hour, minute)      
  12.         fb.text(showdate, 10, 10, black, size=2)
  13.         fb.text(weekday_dict[weekday], 200, 10, black, size=2)
  14.         fb.hline(0, 30, 296, black)#画一个水平线
  15.         fb.text(showtime, 70, 40, black, size=5)
  16.         fb.hline(0, 90, 296, black)#画一个水平线
  17.         fb.text("Tem:%0.1fC" % (sensor.temperature-2), 20, 100, black, size=2)
  18.         fb.text("Hum:%0.1f%%" % (sensor.relative_humidity+10), 170, 100, black, size=2)
  19.         e.set_frame_memory(buf, x, y, w, h)
  20.         e.display_frame()
  21.         time.sleep(19)
复制代码
——墨水屏官方文档建议刷新频率不要太高,至少要超过15秒,因此我们设定为19秒。
最终显示效果:
墨水屏时钟最终.png
放在桌面还是挺好看的。我们只设计了一个简单的界面,有需要可以再美化一下。
5、视频展示

墨水屏时钟正面.png
回复

使用道具 举报

WT_0213 | 2024-8-9 11:49:13 | 显示全部楼层
电池胖胖的,这个屏幕刷新怎么样快吗
支不支持局部刷新呀。
回复 支持 反对

使用道具 举报

爱笑 | 2024-8-9 13:43:29 | 显示全部楼层
不错不错!
用心做好保姆工作
回复

使用道具 举报

knight34 | 2024-8-9 14:01:11 | 显示全部楼层
WT_0213 发表于 2024-8-9 11:49
电池胖胖的,这个屏幕刷新怎么样快吗
支不支持局部刷新呀。

可以快速刷新,不支持局部刷新。用C语言应该可以支持局部刷新
回复 支持 反对

使用道具 举报

iiv | 2024-8-9 20:50:54 | 显示全部楼层
这个好玩
回复

使用道具 举报

大猫的鱼 | 2024-8-12 13:30:56 | 显示全部楼层
不错不错
回复

使用道具 举报

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

本版积分规则