背景
在某次逛淘宝时,突然发现微雪家竟然有个4寸的彩色电子墨水屏!
这个是个好东西呀,就像是kindle,不伤眼呀,给宝宝用最好。所以就想着用这个墨水屏来做个早教机吧,就当是儿子的儿童节礼物了。(其实当时已经是6月20号了。。。)
用树莓派驱动墨水屏
1
2
3
4
5
6
7
8
9
10
11
12
13
| from PIL import Image, ImageDraw, ImageFont
from waveshare_epd import epd4in01f
epd = epd4in01f.EPD()
epd.init()
Himage = Image.open(pic_path)
Himage = Himage.transpose(Image.FLIP_LEFT_RIGHT) #水平翻转
Himage = Himage.transpose(Image.FLIP_TOP_BOTTOM) #垂直翻转
epd.display(self.epd.getbuffer(Himage))
epd4in01f.epdconfig.module_exit()
exit()
|
把图片转成7色
https://www.waveshare.net/wiki/4.01inch_e-Paper_HAT_(F)
由于我的PS到期了,所以我使用开源的GIMP:
- 打开GIMP,导入需要转换的图片:
- 裁剪图片,调整画布大小。最后缩放到640*400像素。
- 在图像上右击,选择“图像”->“模式”->“索引”->选择之前导入的7色色板。
- 可以放大一些看效果。最后导出成bmp即可。
用播放语音掩盖刷新时间
由于这款彩色墨水屏的刷新时间高达20秒。。。所以肯定要让它在刷新图像时干点什么才能等得不那么尴尬。。。
所以我就想到了用多线程来播放语音。。。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| from pygame import mixer
mixer.init()
class Display_pic_thread (threading.Thread): # 继承父类threading.Thread
def __init__(self, father, pic_path):
threading.Thread.__init__(self)
self.pic_path = pic_path
self.father = father
def run(self): # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
self.father.display_pic(self.pic_path)
def display_pic_and_play_sound(self, bmp_path, mp3_path, music_time=None):
thread1 = self.Display_pic_thread(self, bmp_path)
thread1.start()
mixer.music.load(mp3_path)
while threading.activeCount() > 1:
mixer.music.play()
time.sleep(music_gap_time)
display_over_time = time.time()
while music_time and time.time()-display_over_time < music_time:
mixer.music.play()
time.sleep(music_gap_time)
|
实现按键控制前后图片播放和自动随机播放功能
为了有点交互功能,所以准备加入两个大按钮,分别对应上一张图片和下一张。但同时,也要支持自动随机播放功能。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| key_state = {KEY_LEFT: GPIO.HIGH, KEY_RIGHT: GPIO.HIGH}
def key_callback(channel):
global last_press_time
if (key_state[channel] == GPIO.LOW):
key_state[channel] = GPIO.HIGH
else:
key_state[channel] = GPIO.LOW
last_press_time = time.time()
# 在通道上添加临界值检测,忽略由于开关抖动引起的边缘操作
GPIO.add_event_detect(KEY_LEFT, GPIO.BOTH,
callback=key_callback, bouncetime=10)
GPIO.add_event_detect(KEY_RIGHT, GPIO.BOTH,
callback=key_callback, bouncetime=10)
class State(Enum):
none = 0
repeat = 1
state = State.none
last_press_time = time.time()
last_random_display_time = time.time()
if __name__ == '__main__':
items = Items(data_path)
while True:
if key_state[KEY_LEFT] == GPIO.LOW:
logging.info("KEY_LEFT low")
items.display_up_pic()
last_press_time = time.time()
elif key_state[KEY_RIGHT] == GPIO.LOW:
logging.info("KEY_RIGHT low")
items.display_down_pic()
last_press_time = time.time()
if time.time()-last_press_time > random_display_start_time and time.time()-last_random_display_time > random_display_gap_time:
logging.info("display_random_pic")
items.display_random_pic()
last_random_display_time = time.time()
|
利用gitee实现ota远程更新
建立一个shell启动脚本,在里面git pull,这样就可以实现ota远程更新啦。
1
2
| #!/bin/bash
git pull && python3 main.py
|
硬件添加ups不间断电源和锂电板
想做成手持型的,所以肯定要加入ups和电板。还要开关,不然就会一直开机到没电了。。。
用autocad给早教机外壳三维建模
淘宝购买模型3d打印服务
修复及组装