5.83inch e-Paper HAT (C)

来自Waveshare Wiki
跳转至: 导航搜索
5.83inch e-paper C
5.83inch e-Paper HAT (C)
{{{name2}}}
{{{name3}}}
功能简介
特性 树莓派5.83英寸墨水屏
分辨率 600×448
显示颜色 黄、黑、白
' 无特性,不解释
' 无特性,不解释
接口 RPi SPI

说明

说明

详细参数、原理说明

特点

  • 尺寸: 5.83inch
  • 外形尺寸(裸屏):125.40mm x 99.50mm x 1.18mm
  • 外形尺寸(驱动板):
  • 显示尺寸:118.80mm x 88.26mm
  • 工作电压:3.3V/5V
  • 通信接口:SPI
  • 点距:0.198 x 0.197
  • 分辨率:600 x 448
  • 显示颜色:黄、白、红
  • 灰度等级:2
  • 全局刷新 :26s
  • 刷新功耗 : 26.4mW(typ.)
  • 休眠电流 :<0.01uA(接近0)

【备注】: 刷新时间:刷新时间为实验测试数据,实际刷新时间会有误差,以实际效果为准。全局刷新过程中会有闪烁效果,这个是正常现象
功耗:功耗数据为实验测试数据,实际功耗由于驱动板的存在和实际使用情况的不同,会有一定误差,以实际效果为准

SPI 通信时序

E-paper-spi-timing.jpg

由于墨水屏只需要显示,这里将从机发,主机收的数据线(MISO)隐藏。
CS:从机片选,当CS为低电平的时候,芯片使能
DC:数据/命令控制引脚,当DC=0时写入命令;DC=1时写入数据
SCLK: SPI通信时钟
SDIN:SPI通信主机发送,从机接收
时序:CPHL=0, CPOL=0 (SPI0)
【备注】具体关于SPI通信的相关信息,可以自行网上搜索资料了解

墨水屏刷新原理

工作原理

  • 本产品使用的电子纸采用“微胶囊电泳显示”技术进行图像显示,其基本原理是悬浮在液体中的带电纳米粒子受到电场作用而产生迁移。电子纸显示屏是靠反射环境光来显示图案的,不需要背光,在环境光下,电子纸显示屏清晰可视,可视角度几乎达到了 180°。因此,电子纸显示屏非常适合阅读。

像素与字节的关系

对于黑白图片,我们可以规定,如果如果是黑色我们定义成0,如果是白色就定义成1,那么有了表示颜色的方式:
白色:□,对应1
黑色:■:对应0

  • 一个点在图形上一般称之为像素点(pixel),而颜色不是1就是0,也就是1个位就可以标识颜色:1Pixel = 1bit,那么一个字节里面就包含了8个像素点。
  • 以16个像素点为例,我们假设前8个像素点为黑,后8个像素点为白色,那么可以这么认为,像素点1-16,对应这0位到15位,0表示黑色,1表示白色:

E-paper hardware work 1.png
对于计算机而言,它的数据存储方式是高位在前,低位在后,且一个字节只有8个位,因此会有一点改变:
E-paper hardware work 2.png
这样只需要2个字节即可表示16个像素点了。

  • 5.83inch e-paper的黑白处理

因为控制器的问题,它定义0000b表示对应像素为黑色,0011b表示对应像素为白色,是4bit = 1pixel,且4bit的低两位同时为0才能显示黑色,反之,4bit最低两位同时为1才能显示白色,其他的数据会导致像素的颜色不确定;
例:
0x00:2个像素■■
0x03:2个像素■□
0x30:2个像素□■
0x33:2个像素□□
以4个像素点为例,我们假设前2个像素点为黑,后2个像素点为白色,那么人的逻辑是这样的,依次存储在:
E-paper hardware work 3.png
对于计算机而言,它的数据存储方式是高位在前,低位在后,且一个字节只有8个位,因此存储在字节中是这样的:
E-paper hardware work 4.png

  • 5.83inch e-paper B三色处理(黑白黄与黑白红的实质是一样的)

前面讲解其他三色屏幕使用2个寄存器来控制,而这个只用1个寄存器来控制,它仍然需要传输两张图片,一张黑白一张红白,然后显示会把两个图片进行叠加显示。
上面讲解了5.83寸和7.5寸的黑白处理,如果细心的会发发现为什么4bit的高两位没有使用,我们把这两位来表示红色或黄色。
那我们用两位来表示:
00b:白色
01b:红色
高两位表示红色,低两位表示黑色,如果点是红色,那么就不会显示黑色,会忽略低两位的值,于是墨水屏有了以下的定义:
0000b:黑色,实际值为0x0
0100b:红色,实际值为0x4
0111b:红色,实际值为0x4
0011b:白色,实际值为0x3
一张单色图片的处理是把1个像素点保存在1bit里面,因此一个字节里面存储了8个点的颜色,但是上面的处理确实4bit表示一个像素点:
为了方便理解,假设有8个像素点,那么显示8个像素点,需要红白色的8个像素点和黑白色的8个像素点,因为1个点是由两个像素点叠加的,8个像素点储存在1个字节中,红白和黑白分别占用两个字节。红白图片中的1标识红色,0标识白色,黑白图片中的0标识黑色,1表示白色。
E-paper hardware work 6.png
上面有说过,传输给墨水屏数据,1个像素需要占用4个字节因此8个点的数据需要处理成4个字节发送:
E-paper hardware work 7.png
因为红色的优先级高所以叠加之后前四个像素点都是红色。

Raspberry Pi

提供BCM2835、WiringPi、文件IO、RPI(Python)库例程

硬件连接

连接树莓派的时候,如果是驱动板带有40pin排座的,可以直接插到树莓派的40PIN排针上去,注意对好引脚。如果是选择用8PIN排线连接的话,请参考下方的引脚对应表格
对于1.02inch e-paper Module使用的是排针,需要对照以下表格连线

树莓派连接引脚对应关系
e-Paper Raspberry Pi
BCM2835编码 Board物理引脚序号
VCC 3.3V 3.3V
GND GND GND
DIN MOSI 19
CLK SCLK 23
CS CE0 24
DC 25 22
RST 17 11
BUSY 24 18
PWR 18 12

以7.5inch HD e-Paper (B)连接至e-paper Driver HAT为例,直接插在树莓派上即可:
7.5inch e-Paper(B)800-480 1.jpg

开启SPI接口

  • 打开树莓派终端,输入以下指令进入配置界面:
sudo raspi-config
选择Interfacing Options -> SPI -> Yes 开启SPI接口

RPI open spi.png

  • 重启树莓派:
sudo reboot
  • 检查 /boot/config.txt,可以看到 'dtparam=spi=on' 已被写入

RPI open spi 1.jpg

  • 为了确保 SPI 没有被占用,建议其他的驱动覆盖暂时先关闭。可以使用 ls /dev/spi* 来检查 SPI 占用情况,终端输出 /dev/spidev0.0 和 /dev/spidev0.1 表示 SPI 情况正常

RPI open spi 2.jpg

安装库

PS:使用 Bullseye 分支的系统时,建议使用“apt" 替换“apt-get”;且 Bullseye 分支的系统只支持 Python3。

如果使用bookworm系统,只能使用lgpio库,bcm2835跟wiringPi无法安装与使用,python库可以不安装,直接运行程序即可

BCM2835

#打开树莓派终端,并运行以下指令
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.71.tar.gz
tar zxvf bcm2835-1.71.tar.gz 
cd bcm2835-1.71/
sudo ./configure && sudo make && sudo make check && sudo make install
# 更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/

wiringPi

#打开树莓派终端,并运行以下指令
cd
sudo apt-get install wiringpi
#对于树莓派2019年5月之后的系统(早于之前的可不用执行),可能需要进行升级:
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb
gpio -v
# 运行gpio -v会出现2.52版本,如果没有出现说明安装出错

#Bullseye分支系统使用如下命令:
git clone https://github.com/WiringPi/WiringPi
cd WiringPi
./build
gpio -v
# 运行gpio -v会出现2.70版本,如果没有出现说明安装出错

lgpio

wget https://github.com/joan2937/lg/archive/master.zip
unzip master.zip
cd lg-master
sudo make install 
# 更多的可以参考官网:https://github.com/gpiozero/lg

安装Python函数库

#python2
sudo apt-get update
sudo apt-get install python-pip
sudo apt-get install python-pil
sudo apt-get install python-numpy
sudo pip install RPi.GPIO
sudo pip install spidev
#python3
sudo apt-get update
sudo apt-get install python3-pip
sudo apt-get install python3-pil
sudo apt-get install python3-numpy
sudo pip3 install RPi.GPIO
sudo pip3 install spidev

下载测试程序

打开树莓派终端,执行:
方法一:从我们官网下载

sudo apt-get install p7zip-full
wget  https://www.waveshare.net/w/upload/3/39/E-Paper_code.7z
7z x E-Paper_code.7z -O./e-Paper
cd e-Paper/RaspberryPi_JetsonNano/

方法二:使用github仓库

git clone https://github.com/waveshare/e-Paper
cd e-Paper/RaspberryPi_JetsonNano/

运行测试程序

以下命令请在RaspberryPi_JetsonNano下执行,否则不在索引不到目录;

C语言

  • 打开main.c选择对应尺寸的屏幕
cd c
sudo nano examples/main.c 

如果你使用的是2.7inch e-paper,那么就去掉EPD_2IN7_test()函数前面的//,然后按ctrl+c,然后按Y键并回车保存并退出,如图所示:(图片可能更新不及时,具体以例程为准)
E-paper rpi change main.png
可以查看到所有的屏幕尺寸的测试程序,按照尺寸分类:
1.02寸(128×80):
EPD_1in02d_test():对应1.02inch e-paper测试程序;

1.54寸(1.54inch e-paper c:152×152,其他:200×200):
EPD_1in54_test(): 对应1.54inch e-paper V1(黑)版本测试程序,目前已停产;
EPD_1in54_V2_test():对应1.54inch e-paper V2(黑)版本测试程序,购买日期晚于2019年11月为V2版本,目前出货版本,背面贴有V2标识;
EPD_1in54b_test(): 对应1.54inch e-paper B(黑)测试程序,目前已停产;
EPD_1in54b_V2_test(): 对应1.54inch e-paper B V2(黑)测试程序,购买日期晚于2020年4月为V2版本,目前出货版本,背面贴有V2标识;
EPD_1in54c_test(): 对应1.54inch e-paper C(黑)测试程序;

1.64寸(168*168):
EPD_1in64g_test(): 对应1.64inch e-paper G(黑)测试程序;

2.7寸(264×176):
EPD_2in7_test(): 对应2.7inch e-paper(黑)测试程序;
EPD_2in7b_test(): 对应2.7inch e-paper B(黑)测试程序;
EPD_2in7b_V2_test(): 对应2.7inch e-paper B V2(黑)测试程序,购买日期晚于2021年2月为V2版本,目前出货版本,背面贴有V2标识;

2.9寸(296×128):
EPD_2in9_test(): 对应2.9inch e-paper(黑)测试程序,目前已停产;
EPD_2in9_V2_test(): 对应2.9inch e-paper V2(黑)测试程序,购买日期晚于2020年12月为V2版本,目前出货版本,背面贴有V2标识;
EPD_2in9bc_test(): 对应2.9inch e-paper B(黑)和2.9inch e-paper C(黑)测试程序;
EPD_2in9b_V3_test(): 对应2.9inch e-paper B V3(黑)测试程序,购买日期晚于2020年7月为V3版本,目前出货版本,背面贴有V3标识;
EPD_2in9d_test(): 对应2.9inch e-paper D(黑)测试程序;

2.13寸(2.13inch e-Paper:250×122,其他:212×104):
EPD_2in13_test(): 对应2.13inch e-paper V1(黑)版本测试程序,目前已停产;
EPD_2in13_V2_test():对应2.13inch e-paper V2(黑)版本测试程序,购买日期晚于2019年5月为V2版本,目前已停产,背面贴有V2标识;
EPD_2in13_V3_test():对应2.13inch e-paper V3(黑)版本测试程序,购买日期晚于2022年2月为V3版本,目前出货版本,背面贴有V3标识;
EPD_2in13bc_test():对应2.13inch e-paper B(黑)和2.13inch e-paper C(黑)测试程序;
EPD_2in13b_V3_test(): 对应2.13inch e-paper B V3(黑)测试程序,购买日期晚于2020年4月为V3版本,目前出货版本,背面贴有V3标识;
EPD_2in13d_test(): 对应2.13inch e-paper D(黑)测试程序;

2.66寸(152×296):
EPD_2in66_test():对应2.66inch e-paper(黑)测试程序;
EPD_2in66b_test():对应2.66inch e-paper B(黑)测试程序;

3寸(400*168):
EPD_3in0g_test(): 对应3inch e-paper G(黑)测试程序;

3.52寸(360×240):
EPD_3in52_test():对应3.52inch e-paper(黑)测试程序;

3.7寸(280×480):
EPD_3in7_test():对应3.7inch e-paper(黑)测试程序;

4.01寸(640×400):
EPD_4in01f_test():对应4.01inch e-paper F(黑绿)测试程序;

4.2寸(400×300):
EPD_4in2_test(): 对应4.2inch e-paper(黑)测试程序;
EPD_4in2bc_test(): 对应4.2inch e-paper B(黑)测试程序;
EPD_4in2b_V2_test(): 对应4.2inch e-paper B V2(黑)测试程序,购买日期晚于2020年11月为V2版本,目前出货版本,背面贴有V2标识;

5.65寸(600×558):
EPD_5in65f_test():对应5.65inch e-paper F(黑绿)测试程序;

5.83寸(600×448):
EPD_5in83_test(): 对应5.83inch e-paper(黑)测试程序,目前已停产;
EPD_5in83_V2_test(): 对应5.83inch e-paper V2(黑)测试程序,购买日期晚于2020年12月为V2版本,目前出货版本,背面贴有V2标识;
EPD_5in83bc_test(): 对应5.83inch e-paper B(黑)和5.83inch e-paper C(黑)测试程序;
EPD_5in83b_V2_test(): 对应5.83inch e-paper B V2(黑)测试程序,购买日期晚于2020年8月为V2版本,目前出货版本,背面贴有V2标识;

7.3寸(800*480):
EPD_7in3g_test(): 对应7.3inch e-paper G(黑)测试程序;

7.5寸(V1:640×384,V2:800×480):
EPD_7in5_test(): 对应7.5inch e-paper(黑)测试程序,购买日期早于2019-12-07为V1版本,目前已停产;
EPD_7in5_V2_test(): 对应7.5inch e-paper V2(黑)测试程序,购买日期晚于2019-12-07为V2版本,目前出货版本,背面贴有V2标识;
EPD_7in5bc_test(): 对应7.5inch e-paper B(黑)和7.5inch e-paper C(黑)测试程序,7.5inch e-paper B购买日期早于2019-12-07为V1版本,目前已停产,7.5inch e-paper C正常供货;
EPD_7in5b_V2_test():对应7.5inch e-paper B V2(黑)测试程序,购买日期晚于2019-12-07为V2版本,背面贴有V2标识;购买日期晚于2021年3月为V3版本,目前7.5inch e-paper B出货版本,背面贴有V3标识,同样使用本程序

7.5寸(HD:880×528):
EPD_7in5_HD_test():对应7.5inch e-paper HD(黑)测试程序;
EPD_7in5b_HD_test():对应7.5inch e-paper B HD(黑)测试程序;

  • 注意:以上时间仅供参考,具体版本请看屏幕标识
  • 重新编译,编译过程可能需要几秒
返回c目录下,运行以下指令
make clean
make
sudo ./epd

python

PS:Bullseye 分支的系统只支持 Python3。
  • 进入python程序目录,并运行指令ls -al
cd python/examples
ls -al

E-paper rpi change python1.png
可以查看到所有的屏幕尺寸的测试程序,按照尺寸分类:
1.02寸(128×80):
epd_1in02_test.py:对应1.02inch e-paper测试程序;

1.54寸(1.54inch e-paper c:152×152,其他:200×200):
epd_1in54_test.py: 对应1.54inch e-paper V1(黑)版本测试程序,目前已停产;
epd_1in54_V2_test.py:对应1.54inch e-paper V2(黑)版本测试程序,购买日期晚于2019年11月为V2版本,目前出货版本,背面贴有V2标识;
epd_1in54b_test.py: 对应1.54inch e-paper B(黑)测试程序,目前已停产;
epd_1in54b_V2_test.py: 对应1.54inch e-paper B V2(黑)测试程序,购买日期晚于2020年4月为V2版本,目前出货版本,背面贴有V2标识;
epd_1in54c_test.py: 对应1.54inch e-paper C(黑)测试程序;

1.64寸(168*168):
epd_1in64g_test.py: 对应1.64inch e-paper G(黑)测试程序;

2.7寸(264×176):
epd_2in7_test.py: 对应2.7inch e-paper(黑)测试程序;
epd_2in7b_test.py: 对应2.7inch e-paper B(黑)测试程序;
epd_2in7b_V2_test.py: 对应2.7inch e-paper B V2(黑)测试程序,购买日期晚于2021年2月为V2版本,目前出货版本,背面贴有V2标识;

2.9寸(296×128):
epd_2in9_test.py: 对应2.9inch e-paper(黑)测试程序,目前已停产;
epd_2in9_V2_test.py: 对应2.9inch e-paper V2(黑)测试程序,购买日期晚于2020年12月为V2版本,目前出货版本,背面贴有V2标识;
epd_2in9bc_test.py: 对应2.9inch e-paper B(黑)和2.9inch e-paper C(黑)测试程序;
epd_2in9b_V3_test.py: 对应2.9inch e-paper B V3(黑)测试程序,购买日期晚于2020年7月为V3版本,目前出货版本,背面贴有V3标识;
epd_2in9d_test.py: 对应2.9inch e-paper D(黑)测试程序;

2.13寸(2.13inch e-Paper:250×122,其他:212×104):
epd_2in13_test.py: 对应2.13inch e-paper V1(黑)版本测试程序,目前已停产;
epd_2in13_V2_test.py:对应2.13inch e-paper V2(黑)版本测试程序,购买日期晚于2019年5月为V2版本,目前已停产,背面贴有V2标识;
epd_2in13_V3_test.py:对应2.13inch e-paper V3(黑)版本测试程序,购买日期晚于2022年2月为V3版本,目前出货版本,背面贴有V3标识;
epd_2in13bc_test.py:对应2.13inch e-paper B(黑)和2.13inch e-paper C(黑)测试程序;
epd_2in13b_V3_test.py: 对应2.13inch e-paper B V3(黑)测试程序,购买日期晚于2020年4月为V3版本,目前出货版本,背面贴有V3标识;
epd_2in13d_test.py: 对应2.13inch e-paper D(黑)测试程序;

2.66寸(152×296):
epd_2in66_test.py:对应2.66inch e-paper(黑)测试程序;
epd_2in66b_test.py:对应2.66inch e-paper B(黑)测试程序;

3寸(400*168):
epd_3in0g_test.py: 对应3inch e-paper G(黑)测试程序;

3.52寸(360×240):
epd_3in52_test.py:对应3.52inch e-paper(黑)测试程序;

3.7寸(280×480):
epd_3in7_test.py:对应3.7inch e-paper(黑)测试程序;

4.01寸(640×400):
epd_4in01f_test.py:对应4.01inch e-paper F(黑绿)测试程序;

4.2寸(400×300):
epd_4in2_test.py: 对应4.2inch e-paper(黑)测试程序;
epd_4in2bc_test.py: 对应4.2inch e-paper B(黑)测试程序;
epd_4in2b_V2_test.py: 对应4.2inch e-paper B V2(黑)测试程序,购买日期晚于2020年11月为V2版本,目前出货版本,背面贴有V2标识;

5.65寸(600×558):
epd_5in65f_test.py:对应5.65inch e-paper F(黑绿)测试程序;

5.83寸(600×448):
epd_5in83_test.py: 对应5.83inch e-paper(黑)测试程序,目前已停产;
epd_5in83_V2_test.py: 对应5.83inch e-paper V2(黑)测试程序,购买日期晚于2020年12月为V2版本,目前出货版本,背面贴有V2标识;
epd_5in83bc_test.py: 对应5.83inch e-paper B(黑)和5.83inch e-paper C(黑)测试程序;
epd_5in83b_V2_test.py: 对应5.83inch e-paper B V2(黑)测试程序,购买日期晚于2020年8月为V2版本,目前出货版本,背面贴有V2标识;

7.3寸(400*168):
epd_7in3g_test.py: 对应7inch3 e-paper G(黑)测试程序;

7.5寸(V1:640×384,V2:800×480):
epd_7in5_test.py: 对应7.5inch e-paper(黑)测试程序,购买日期早于2019-12-07为V1版本,目前已停产;
epd_7in5_V2_test.py: 对应7.5inch e-paper V2(黑)测试程序,购买日期晚于2019-12-07为V2版本,目前出货版本,背面贴有V2标识;
epd_7in5bc_test.py: 对应7.5inch e-paper B(黑)和7.5inch e-paper C(黑)测试程序,7.5inch e-paper B购买日期早于2019-12-07为V1版本,目前已停产,7.5inch e-paper C正常供货;
epd_7in5b_V2_test.py:对应7.5inch e-paper B V2(黑)测试程序,购买日期晚于2019-12-07为V2版本,背面贴有V2标识;购买日期晚于2021年3月为V3版本,目前7.5inch e-paper B出货版本,背面贴有V3标识,同样使用本程序

7.5寸(HD:880×528):
epd_7in5_HD_test.py:对应7.5inch e-paper HD(黑)测试程序;
epd_7in5b_HD_test.py:对应7.5inch e-paper B HD(黑)测试程序;

  • 注意:以上时间仅供参考,具体版本请看屏幕标识
  • 运行对应屏幕的程序即可,程序支持python2/3,以1.54 V2为例子
# python2
sudo python2.7 epd_1in54_V2_test.py
# python3
sudo python3 epd_1in54_V2_test.py

API详解(请选读c或python部分)

RaspberryPi与Jetson nano共用一套程序,因为他们都是嵌入式系统,兼容性比较强。
程序分为底层硬件接口、中间层墨水屏驱动、上层应用;

C

底层硬件接口

我们进行了底层的封装,由于硬件平台不一样,内部的实现是不一样的,如果需要了解内部实现可以去对应的目录中查看
在DEV_Config.c(.h)可以看到很多定义,在目录:RaspberryPi_JetsonNano\c\lib\Config

C语言使用了2种方式进行驱动:分别是BCM2835库、WiringPi库
默认使用BCM2835库进行操作,如果你需要使用WiringPi库来驱动的话,可以打开RaspberryPi_JetsonNano\c\Makefile,修改13-14行
E-paper Driver HAT RPI Makefile.png
  • 数据类型:
#define UBYTE   uint8_t
#define UWORD   uint16_t
#define UDOUBLE uint32_t
  • 模块初始化与退出的处理:
void DEV_Module_Init(void);
void DEV_Module_Exit(void);
注意:
1.这里是处理使用墨水屏前与使用完之后一些GPIO的处理。
2.对于PCB带有Rev2.1的,DEV_Module_Exit()之后整个模块会进入低功耗,经过测试这个功耗基本为0;
  • GPIO读写:
void DEV_Digital_Write(UWORD Pin, UBYTE Value);
UBYTE DEV_Digital_Read(UWORD Pin);
  • SPI写数据
void DEV_SPI_WriteByte(UBYTE Value);

中间层墨水屏驱动

e-paper驱动代码文件,在目录:RaspberryPi_JetsonNano\c\lib\e-Paper
如下图:
E-paper Driver HAT RPI epd.png
打开.h可以看到如下的函数

  • 墨水屏初始化,再屏幕开始工作时和退出睡眠模式之后调用
//1.54inch e-Paper、1.54inch e-Paper V2、2.13inch e-Paper、2.13inch e-Paper  V2、2.13inch e-Paper (D)、2.9inch e-Paper、2.9inch e-Paper (D)
void EPD_xxx_Init(UBYTE Mode); // Mode = 0 全局刷新初始化、Mode = 1 局部刷新初始化
//其他型号
void EPD_xxx_Init(void);

其中xxx表示,墨水屏型号。如是是2.13D,全屏初始化那么是EPD_2IN13D_Init(0),局部刷新初始化EPD_2IN13D_Init(1);如果是1.54 V2,那么EPD_1IN54_V2_Init();如果是7.5B,那就是EPD_7IN5BC_Init(),因为7.5B与7.5C公用驱动代码,只是显示的颜色不一样

  • 清屏,把墨水屏刷成白色
void EPD_xxx_Clear(void); 

其中xxx表示,墨水屏型号。如是是2.13D,那么是EPD_2IN9D_Clear();如果是7.5B,那就是EPD_7IN5_Clear(),因为7.5B与7.5C公用驱动代码,只是显示的颜色不一样

  • 传输一帧的图片数据并打开显示
//黑白双色墨水屏
void EPD_xxx_Display(UBYTE *Image);
//黑白红或黑白黄墨水屏
void EPD_xxx_Display(const UBYTE *blackimage, const UBYTE *ryimage);

需要注意以下的几个是特例:

//对于2.13inch e-paper (D)、2.9inch e-paper (D)两款柔性屏幕,局部刷新
void EPD_2IN13D_DisplayPart(UBYTE *Image);
void EPD_2IN9D_DisplayPart(UBYTE *Image);
//对于1.54inch e-paper V2、2.13inch e-paper V2由于控制芯片升级,对于局部刷新,需要调用EPD_xxx_DisplayPartBaseImage显示静态的背景图片,也就是以这个图片为基础进行局部刷新,然后调用动态的EPD_xxx_DisplayPart()
void EPD_1IN54_V2_DisplayPartBaseImage(UBYTE *Image);
void EPD_1IN54_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image);
  • 进入睡眠模式
void EPD_xxx_Sleep(void);

注意进入了睡眠模式,只有两个方式能够重新工作:第一种硬件复位,第二种重新调用初始化函数
其中xxx表示,墨水屏型号。如是是2.13D,那么是EPD_2IN13D_Sleep();如果是7.5B,那就是EPD_7IN5BC_Sleep(),因为7.5B与7.5C公用驱动代码,只是显示的颜色不一样

上层应用

对于屏幕而言,如果需要进行画图、显示中英文字符、显示图片等怎么办,这些都是上层应用做的。这有很多小伙伴有问到一些图形的处理,我们这里提供了一些基本的功能 在如下的目录中可以找到GUI,在目录:RaspberryPi_JetsonNano\c\lib\GUI\GUI_Paint.c(.h)
E-paper Driver HAT GUI.png
在如下目录下是GUI依赖的字符字体,在目录:RaspberryPi_JetsonNano\c\lib\Fonts
E-paper Driver HAT Fonts.png

  • 新建图像属性:新建一个图像属性,这个属性包括图像缓存的名称、宽度、高度、翻转角度、颜色
void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color)
参数:
 	image : 图像缓存的名称,实际上是一个指向图像缓存首地址的指针;
 	Width : 图像缓存的宽度;
 	Height: 图像缓存的高度;
 	Rotate:图像的翻转的角度
 	Color :图像的初始颜色;
  • 选择图像缓存:选择图像缓存,选择的目的是你可以创建多个图像属性,图像缓存可以存在多个,你可以选择你所创建的每一张图像
void Paint_SelectImage(UBYTE *image)
参数:
 	image: 图像缓存的名称,实际上是一个指向图像缓存首地址的指针;
  • 图像旋转:设置选择好的图像的旋转角度,最好使用在Paint_SelectImage()后,可以选择旋转0、90、180、270
void Paint_SetRotate(UWORD Rotate)
参数:
 	Rotate: 图像选择角度,可以选择ROTATE_0、ROTATE_90、ROTATE_180、ROTATE_270分别对应0、90、180、270度
【说明】不同选择角度下,坐标对应起始像素点不同,这里以1.54B为例,四张图,按顺序为0°, 90°, 180°, 270°。仅做为参考
SPI-epaper-C-0.png SPI-epaper-C-90.png SPI-epaper-C-180.pngSPI-epaper-C-270.png
  • 图像镜像翻转:设置选择好的图像的镜像翻转,可以选择不镜像、关于水平镜像、关于垂直镜像、关于图像中心镜像。
void Paint_SetMirroring(UBYTE mirror)
参数:
 	mirror: 图像的镜像方式,可以选择MIRROR_NONE、MIRROR_HORIZONTAL、MIRROR_VERTICAL、MIRROR_ORIGIN分别对应不镜像、关于水平镜像、关于垂直镜像、关于图像中心镜像
  • 设置点在缓存中显示位置和颜色:这里是GUI最核心的一个函数、处理点在缓存中显示位置和颜色;
void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color)
参数:
 	Xpoint: 点在图像缓存中X位置
 	Ypoint: 点在图像缓存中Y位置
 	Color : 点显示的颜色
  • 图像缓存填充颜色:把图像缓存填充为某颜色,一般作为屏幕刷白的作用
void Paint_Clear(UWORD Color)
参数:
 	Color: 填充的颜色
  • 图像缓存部分窗口填充颜色:把图像缓存的某部分窗口填充为某颜色,一般作为窗口刷白的作用,常用于时间的显示,刷白上一秒
void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color)
参数:
 	Xstart: 窗口的X起点坐标
 	Ystart: 窗口的Y起点坐标
 	Xend: 窗口的X终点坐标
 	Yend: 窗口的Y终点坐标
 	Color: 填充的颜色
  • 画点:在图像缓存中,在(Xpoint, Ypoint)上画点,可以选择颜色,点的大小,点的风格
void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style)
参数:
 	Xpoint: 点的X坐标
 	Ypoint: 点的Y坐标
 	Color: 填充的颜色
 	Dot_Pixel: 点的大小,提供默认的8种大小点
 	 	 typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  , 	 	// 3 X 3
 	 	 	 DOT_PIXEL_4X4  , 	 	// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	Dot_Style: 点的风格,大小扩充方式是以点为中心扩大还是以点为左下角往右上扩大
 	 	typedef enum {
 	 	   DOT_FILL_AROUND  = 1,		
 	 	   DOT_FILL_RIGHTUP,
 	 	} DOT_STYLE;
  • 画线:在图像缓存中,从 (Xstart, Ystart) 到 (Xend, Yend) 画线,可以选择颜色,线的宽度,线的风格
void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, LINE_STYLE Line_Style , LINE_STYLE Line_Style)
参数:
 	Xstart: 线的X起点坐标
 	Ystart: 线的Y起点坐标
 	Xend: 线的X终点坐标
 	Yend: 线的Y终点坐标
 	Color: 填充的颜色
 	Line_width: 线的宽度,提供默认的8种宽度
 	 	typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  ,		// 3 X 3
 	 	 	 DOT_PIXEL_4X4  ,		// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	 Line_Style: 线的风格,选择线是以直线连接还是以虚线的方式连接
 	 	typedef enum {
 	 	 	 LINE_STYLE_SOLID = 0,
 	 	 	 LINE_STYLE_DOTTED,
 	 	} LINE_STYLE;
  • 画矩形:在图像缓存中,从 (Xstart, Ystart) 到 (Xend, Yend) 画一个矩形,可以选择颜色,线的宽度,是否填充矩形内部
void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
参数:
 	Xstart: 矩形的X起点坐标
 	Ystart: 矩形的Y起点坐标
 	Xend: 矩形的X终点坐标
 	Yend: 矩形的Y终点坐标
 	Color: 填充的颜色
 	Line_width: 矩形四边的宽度,提供默认的8种宽度
 	 	typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  ,		// 3 X 3
 	 	 	 DOT_PIXEL_4X4  ,		// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	Draw_Fill: 填充,是否填充矩形的内部
 	 	typedef enum {
 	 	 	 DRAW_FILL_EMPTY = 0,
 	 	 	 DRAW_FILL_FULL,
 	 	} DRAW_FILL;
  • 画圆:在图像缓存中,以 (X_Center Y_Center) 为圆心,画一个半径为Radius的圆,可以选择颜色,线的宽度,是否填充圆内部
void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
参数:
 	X_Center: 圆心的X坐标
 	Y_Center: 圆心的Y坐标
 	Radius:圆的半径
 	Color: 填充的颜色
 	Line_width: 圆弧的宽度,提供默认的8种宽度
 	 	typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  ,		// 3 X 3
 	 	 	 DOT_PIXEL_4X4  ,		// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	Draw_Fill: 填充,是否填充圆的内部
 	 	typedef enum {
 	 	 	 DRAW_FILL_EMPTY = 0,
 	 	 	 DRAW_FILL_FULL,
 	 	} DRAW_FILL;
  • 写Ascii字符:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一个Ascii字符,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Ascii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	Ascii_Char:Ascii字符
 	Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
 	 	font8:5*8的字体
 	 	font12:7*12的字体
 	 	font16:11*16的字体
 	 	font20:14*20的字体
 	 	font24:17*24的字体
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 写英文字符串:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串英文字符,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	pString:字符串,字符串是一个指针
 	Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
 	 	font8:5*8的字体
 	 	font12:7*12的字体
 	 	font16:11*16的字体
 	 	font20:14*20的字体
 	 	font24:17*24的字体
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 写中文字符串:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串中文字符,可以选择GB2312编码字符字库、字体前景色、字体背景色;
void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	pString:字符串,字符串是一个指针
 	Font: GB2312编码字符字库,在Fonts文件夹中提供了以下字体:
 	 	font12CN:ascii字符字体11*21,中文字体16*21
 	 	font24CN:ascii字符字体24*41,中文字体32*41
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 写数字:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串数字,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	Nummber:显示的数字,这里使用的是32位长的int型保存,可以最大显示到2147483647
 	Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
 	 	font8:5*8的字体
 	 	font12:7*12的字体
 	 	font16:11*16的字体
 	 	font20:14*20的字体
 	 	font24:17*24的字体
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 显示时间:在图像缓存中,在 (Xstart Ystart) 为左顶点,显示一段时间,可以选择Ascii码可视字符字库、字体前景色、字体背景色;这里是方便测试局部刷新而写的,因为局部刷新需要的时间为0.3S,整体显示少于1S加上数据的传输,可以做到1S刷新一次
void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Background, UWORD Color_Foreground)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	pTime:显示的时间,这里定义好了一个时间的结构体,只要把时分秒各位数传给参数;
 	Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
 	 	font8:5*8的字体
 	 	font12:7*12的字体
 	 	font16:11*16的字体
 	 	font20:14*20的字体
 	 	font24:17*24的字体
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 写图片:把一个位图写入图像缓存中
void Paint_DrawBitMap(const unsigned char* image_buffer)
参数:
 	image_buffer: 图像数据的缓存中的首地址
  • 读取本地的bmp图片并写到缓存中

对于Jetson Nano, Raspberry Pi这些Linux操作系统的,可以读写图片
对于Raspberry Pi和Jetson Nano,在目录:RaspberryPi_JetsonNano\c\lib\GUI\GUI_BMPfile.c(.h)

UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart)
参数:
	path:BMP图片的相对路径
 	Xstart: 图片的左顶点X坐标,一般默认传0
 	Ystart: 图片的左顶点Y坐标,一般默认传0

用户测试代码

前三个章节介绍了经典的linux三层代码结构,这里稍微讲解一下用户测试代码
对于Raspberry Pi和Jetson Nano,在目录:RaspberryPi_JetsonNano\c\examples,为全部的测试代码,在本目录下的main.c中可以多个屏蔽;
E-Paper Shield c test.png
如果需要运行7.5inch e-paper测试程序,你需要把42行的屏蔽去掉

// EPD_7in5_test();

改成

EPD_7in5_test();

在linux命令模式下重新执行如下:

make clean
make
sudo ./epd

Python

适用于Jetson Nano\Raspberry Pi,基于python2.7和python3
对于python而言他的调用没有C复杂
Raspberry Pi和Jetson Nano:RaspberryPi_JetsonNano\python\lib\
E-paper Driver python lib.png

底层接口

epdconfig.py 文件封装了底层接口

  • 模块初始化与退出的处理:
def module_init()
def module_exit()
 注意:
 1.这里是处理使用墨水屏前与使用完之后一些GPIO的处理。
 2.对于PCB带有Rev2.1的,module_exit()之后整个模块会进入低功耗,经过测试这个功耗基本为0;
  • GPIO读写:
def  digital_write(pin, value)
def  digital_read(pin)
  • SPI写数据
def spi_writebyte(data)

驱动接口

epdxxx.py (xxx表示尺寸,若是2.13inch e-paper,则为epd2in13.py,依此类推)

  • 墨水屏初始化,再屏幕开始工作时和退出睡眠模式之后调用
对于1.54inch e-Paper、1.54inch e-Paper V2、2.13inch e-Paper、2.13inch e-Paper  V2、2.13inch e-Paper (D)、2.9inch e-Paper、2.9inch e-Paper (D)
def init(self, update) # 选择lut_full_update或lut_partial_update
其他型号
def init(self)
  • 清屏,把墨水屏刷成白色
def Clear(self)
def Clear(self, color) # 对于某几个屏幕需要调用这个
  • 把图片转换成数组
def getbuffer(self, image)
  • 传输一帧的图片数据并打开显示
黑白双色墨水屏
def display(self, image)
黑白红或黑白黄墨水屏
def display(self, blackimage, redimage)

需要注意以下的几个是特例:<br />
对于2.13inch e-paper (D)、2.9inch e-paper (D)两款柔性屏幕,局部刷新
def DisplayPartial(self, image)

对于1.54inch e-paper V2、2.13inch e-paper V2由于控制芯片升级,对于局部刷新,需要调用displayPartBaseImage()显示静态的背景图片,也就是以这个图片为基础进行局部刷新,然后调用动态的displayPart()
def displayPartBaseImage(self, image)
def displayPart(self, image)
  • 进入睡眠模式
def sleep(self)

测试函数

epd_xxx_test.py(xxx表示尺寸,若是2.13inch e-paper,则为epd_2in13_test.py,依此类推)
python在如下目录:
Raspberry Pi和Jetson Nano:RaspberryPi_JetsonNano\python\examples\
E-paper Driver python examples.png
如果你的python版本是python2,且需要运行7.5inch e-paper测试程序,在linux命令模式下重新执行如下:

sudo python epd_7in5_test.py

如果你的python版本是python3,且需要运行7.5inch e-paper测试程序,在linux命令模式下重新执行如下:

sudo python3 epd_7in5_test.py

关于旋转设置

如果在python程序中你需要设置屏幕旋转,可以通过语句blackimage = blackimage.transpose(Image.ROTATE_270)设置,注意要在绘制完图片且刷新前调用此语句。

blackimage = blackimage.transpose(Image.ROTATE_270) 
redimage = redimage.transpose(Image.ROTATE_270)
#支持ROTATE_90, ROTATE_180, ROTATE_270三个参数
旋转效果,以1.54B为例, 按顺序分别为0°, 90°,180°, 270°
SPI-epaper-Python-0.pngSPI-epaper-Python-90.pngSPI-epaper-Python-180.pngSPI-epaper-Python-270.png

画图GUI

由于python有一个image库pil官方库链接,他十分的强大,不需要像C从逻辑层出发编写代码,可以直接引用image库进行图像处理,以下将以1.54inch e-paper为例,对程序中使用了的进行简要说明

  • 需要使用image库,需要安装库
sudo apt-get install python3-pil  安装库

然后导入库

from PIL import Image,ImageDraw,ImageFont

其中Image为基本库、ImageDraw为画图功能、ImageFont为文字

  • 定义一个图像缓存,以方便在图片上进行画图、写字等功能
image = Image.new('1', (epd.width, epd.height), 255)  # 255: clear the frame

第一个参数定义图片的颜色深度,定义为1说明是2位图,第二个参数是一个元组,定义好图片的宽度和高度,第三个参数是定义缓存的默认颜色,0为黑色,255为白色。

  • 创建一个基于image的画图对象,所有的画图操作都在这个对象上
draw = ImageDraw.Draw(image)
  • 画框
draw.rectangle((0, 10, 200, 34), fill = 0)

第一个参数为一个4个元素的元组,(0,10)矩形左上角坐标值,(200,34)为矩形右下角坐标值,fill=0表示内部填充黑色。

  • 画线
draw.line((16, 60, 56, 60), fill = 0)

第一个参数为一个4个元素的元组,以(16,60)为起始点,(200,34)为终止点,画一条直线,fill=0表示线为黑色。

  • 画圆
draw.arc((90, 60, 150, 120), 0, 360, fill = 0)

在正方形内画一个内切圆,第一个参数为一个4个元素的元组,以(90,60)为正方形的左上角顶点,(150,120)为正方形右下角顶点,规定矩形框的水平中位线为0度角,角度顺时针变大,第二个参数表示开始角度,第三个参数标识结束角度,fill=0线为黑色
如果不是正方形,画出来的就是椭圆,这个实际上是圆弧的绘制。

除了arc可以话圆之外,还有chord可以画实心圆

draw.chord((90, 130, 150, 190), 0, 360, fill = 0)

实质是弦的绘制,第一个参数指定弦的圆外切矩形,第二、三两个参数分别是弦的起始和终止角度, 第四个参数是填充颜色,将弦从0度到360度连接并填充就变成了填充的圆了。

  • 写字符

写字符往往需要写不同大小的字符,需要导入ImageFont模块,并实例化:

font = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)

为了丰富字体库,这里使用的是windows目录下的字符文件,如果是其他的ttc结尾的字符文件也是支持的。

写英文字符直接使用即可,写中文,由于编码是GB2312所以需要在前面加个u:

draw.text((8, 12), 'hello world', font = font, fill = 255)
draw.text((8, 36), u'微雪电子', font = font, fill = 0)

第一个参数为一个2个元素的元组,以(8,12)为左顶点,字体为font,点,fill为字体颜色,第一句fill=255所以看上去是不会显示的,第二句显示微雪电子。

  • 读取本地图片
image = Image.open(os.path.join(picdir, '1in54.bmp'))

参数为图片路径。

  • 其他功能

python的image库十分强大,如果需要实现其他的更多功能,可以上官网学习http://effbot.org/imagingbook pil,官方的是英文的,如果感觉对你不友好,当然我们国内也有很多的优秀的博客都有讲解。

Jetson Nano

Jetson nano程序使用的是模拟SPI,所以刷新速度会相对较慢一些

硬件连接

Jetson Nano的40PIN引脚是兼容树莓派的40PIN引脚的,并且提供了一个Jetson.GPIO库跟树莓派的RPI.GPIO 库的API是一致的,所以这里连接的序号跟树莓派的是一样的

Jetson nano连接引脚对应关系
e-Paper Jetson Nano Developer Kit
BCM2835编码 Board物理引脚序号
VCC 3.3V 3.3V
GND GND GND
DIN 10(SPI0_MOSI) 19
CLK 11(SPI0_SCK 23
CS 8(SPI0_CS0) 24
DC 25 22
RST 17 11
BUSY 24 18
PWR 18 12

软件设置

安装函数库

  • 打开终端界面,输入以下指令安装相应的函数库
sudo apt-get update
sudo apt-get install python3-pip
sudo pip3 install Jetson.GPIO
sudo groupadd -f -r gpio
sudo usermod -a -G gpio your_user_name
sudo cp /opt/nvidia/jetson-gpio/etc/99-gpio.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm trigger

【注意】your_user_name 是你使用的用户名,比如说 waveshare

  • 安装I2C
sudo apt-get install python-smbus
  • 安装图像处理库:
sudo apt-get install python3-pil
sudo apt-get install python3-numpy

下载测试程序

打开linux终端,执行:
方法一:从我们官网下载,推荐使用。

sudo apt-get install p7zip-full
sudo wget  https://www.waveshare.net/w/upload/3/39/E-Paper_code.7z
7z x E-Paper_code.7z -O./e-Paper
cd e-Paper/RaspberryPi_JetsonNano/

方法二:使用github仓库,github可能更新会有延迟,推荐使用方法一。

sudo git clone https://github.com/waveshare/e-Paper
cd e-Paper/RaspberryPi_JetsonNano/

运行测试程序

以下命令请在RaspberryPi_JetsonNano下执行,否则不在索引不到目录;

C语言

  • 打开main.c选择对应尺寸的屏幕
cd c
sudo nano examples/main.c 

如果你使用的是2.7inch e-paper,那么就去掉EPD_2IN7_test()函数前面的//,然后按ctrl+c,然后按Y键并回车保存并退出,具体如下:
E-paper rpi change main.png
可以查看到所有的屏幕尺寸的测试程序,按照尺寸分类:
1.02寸(128×80):
EPD_1in02d_test():对应1.02inch e-paper测试程序;

1.54寸(1.54inch e-paper c:152×152,其他:200×200):
EPD_1in54_test(): 对应1.54inch e-paper V1(黑)版本测试程序,目前已停产;
EPD_1in54_V2_test():对应1.54inch e-paper V2(黑)版本测试程序,购买日期晚于2019年11月为V2版本,目前出货版本,背面贴有V2标识;
EPD_1in54b_test(): 对应1.54inch e-paper B(黑)测试程序,目前已停产;
EPD_1in54b_V2_test(): 对应1.54inch e-paper B V2(黑)测试程序,购买日期晚于2020年4月为V2版本,目前出货版本,背面贴有V2标识;
EPD_1in54c_test(): 对应1.54inch e-paper C(黑)测试程序;

1.64寸(168*168):
EPD_1in64g_test(): 对应1.64inch e-paper G(黑)测试程序;

2.7寸(264×176):
EPD_2in7_test(): 对应2.7inch e-paper(黑)测试程序;
EPD_2in7b_test(): 对应2.7inch e-paper B(黑)测试程序;
EPD_2in7b_V2_test(): 对应2.7inch e-paper B V2(黑)测试程序,购买日期晚于2021年2月为V2版本,目前出货版本,背面贴有V2标识;

2.9寸(296×128):
EPD_2in9_test(): 对应2.9inch e-paper(黑)测试程序,目前已停产;
EPD_2in9_V2_test(): 对应2.9inch e-paper V2(黑)测试程序,购买日期晚于2020年12月为V2版本,目前出货版本,背面贴有V2标识;
EPD_2in9bc_test(): 对应2.9inch e-paper B(黑)和2.9inch e-paper C(黑)测试程序;
EPD_2in9b_V3_test(): 对应2.9inch e-paper B V3(黑)测试程序,购买日期晚于2020年7月为V3版本,目前出货版本,背面贴有V3标识;
EPD_2in9d_test(): 对应2.9inch e-paper D(黑)测试程序;

2.13寸(2.13inch e-Paper:250×122,其他:212×104):
EPD_2in13_test(): 对应2.13inch e-paper V1(黑)版本测试程序,目前已停产;
EPD_2in13_V2_test():对应2.13inch e-paper V2(黑)版本测试程序,购买日期晚于2019年5月为V2版本,目前已停产,背面贴有V2标识;
EPD_2in13_V3_test():对应2.13inch e-paper V3(黑)版本测试程序,购买日期晚于2022年2月为V3版本,目前出货版本,背面贴有V3标识;
EPD_2in13bc_test():对应2.13inch e-paper B(黑)和2.13inch e-paper C(黑)测试程序;
EPD_2in13b_V3_test(): 对应2.13inch e-paper B V3(黑)测试程序,购买日期晚于2020年4月为V3版本,目前出货版本,背面贴有V3标识;
EPD_2in13d_test(): 对应2.13inch e-paper D(黑)测试程序;

2.66寸(152×296):
EPD_2in66_test():对应2.66inch e-paper(黑)测试程序;
EPD_2in66b_test():对应2.66inch e-paper B(黑)测试程序;

3寸(400*168):
EPD_3in0g_test(): 对应3inch e-paper G(黑)测试程序;

3.52寸(360×240):
EPD_3in52_test():对应3.52inch e-paper(黑)测试程序;

3.7寸(280×480):
EPD_3in7_test():对应3.7inch e-paper(黑)测试程序;

4.01寸(640×400):
EPD_4in01f_test():对应4.01inch e-paper F(黑绿)测试程序;

4.2寸(400×300):
EPD_4in2_test(): 对应4.2inch e-paper(黑)测试程序;
EPD_4in2bc_test(): 对应4.2inch e-paper B(黑)测试程序;
EPD_4in2b_V2_test(): 对应4.2inch e-paper B V2(黑)测试程序,购买日期晚于2020年11月为V2版本,目前出货版本,背面贴有V2标识;

5.65寸(600×558):
EPD_5in65f_test():对应5.65inch e-paper F(黑绿)测试程序;

5.83寸(600×448):
EPD_5in83_test(): 对应5.83inch e-paper(黑)测试程序,目前已停产;
EPD_5in83_V2_test(): 对应5.83inch e-paper V2(黑)测试程序,购买日期晚于2020年12月为V2版本,目前出货版本,背面贴有V2标识;
EPD_5in83bc_test(): 对应5.83inch e-paper B(黑)和5.83inch e-paper C(黑)测试程序;
EPD_5in83b_V2_test(): 对应5.83inch e-paper B V2(黑)测试程序,购买日期晚于2020年8月为V2版本,目前出货版本,背面贴有V2标识;

7.3寸(800*480):
EPD_7in3g_test(): 对应7.3inch e-paper G(黑)测试程序;

7.5寸(V1:640×384,V2:800×480):
EPD_7in5_test(): 对应7.5inch e-paper(黑)测试程序,购买日期早于2019-12-07为V1版本,目前已停产;
EPD_7in5_V2_test(): 对应7.5inch e-paper V2(黑)测试程序,购买日期晚于2019-12-07为V2版本,目前出货版本,背面贴有V2标识;
EPD_7in5bc_test(): 对应7.5inch e-paper B(黑)和7.5inch e-paper C(黑)测试程序,7.5inch e-paper B购买日期早于2019-12-07为V1版本,目前已停产,7.5inch e-paper C正常供货;
EPD_7in5b_V2_test():对应7.5inch e-paper B V2(黑)测试程序,购买日期晚于2019-12-07为V2版本,背面贴有V2标识;购买日期晚于2021年3月为V3版本,目前7.5inch e-paper B出货版本,背面贴有V3标识,同样使用本程序

7.5寸(HD:880×528):
EPD_7in5_HD_test():对应7.5inch e-paper HD(黑)测试程序;
EPD_7in5b_HD_test():对应7.5inch e-paper B HD(黑)测试程序;

  • 注意:以上时间仅供参考,具体版本请看屏幕标识
  • 重新编译,编译过程可能需要几秒
make clean
make JETSON
sudo ./epd

python

  • 进入python程序目录,并运行指令ls -al
cd python/examples
ls -al

E-paper rpi change python1.png
可以查看到所有的屏幕尺寸的测试程序,按照尺寸分类:
1.02寸(128×80):
epd_1in02_test.py:对应1.02inch e-paper测试程序;

1.54寸(1.54inch e-paper c:152×152,其他:200×200):
epd_1in54_test.py: 对应1.54inch e-paper V1(黑)版本测试程序,目前已停产;
epd_1in54_V2_test.py:对应1.54inch e-paper V2(黑)版本测试程序,购买日期晚于2019年11月为V2版本,目前出货版本,背面贴有V2标识;
epd_1in54b_test.py: 对应1.54inch e-paper B(黑)测试程序,目前已停产;
epd_1in54b_V2_test.py: 对应1.54inch e-paper B V2(黑)测试程序,购买日期晚于2020年4月为V2版本,目前出货版本,背面贴有V2标识;
epd_1in54c_test.py: 对应1.54inch e-paper C(黑)测试程序;

1.64寸(168*168):
epd_1in64g_test.py: 对应1.64inch e-paper G(黑)测试程序;

2.7寸(264×176):
epd_2in7_test.py: 对应2.7inch e-paper(黑)测试程序;
epd_2in7b_test.py: 对应2.7inch e-paper B(黑)测试程序;
epd_2in7b_V2_test.py: 对应2.7inch e-paper B V2(黑)测试程序,购买日期晚于2021年2月为V2版本,目前出货版本,背面贴有V2标识;

2.9寸(296×128):
epd_2in9_test.py: 对应2.9inch e-paper(黑)测试程序,目前已停产;
epd_2in9_V2_test.py: 对应2.9inch e-paper V2(黑)测试程序,购买日期晚于2020年12月为V2版本,目前出货版本,背面贴有V2标识;
epd_2in9bc_test.py: 对应2.9inch e-paper B(黑)和2.9inch e-paper C(黑)测试程序;
epd_2in9b_V3_test.py: 对应2.9inch e-paper B V3(黑)测试程序,购买日期晚于2020年7月为V3版本,目前出货版本,背面贴有V3标识;
epd_2in9d_test.py: 对应2.9inch e-paper D(黑)测试程序;

2.13寸(2.13inch e-Paper:250×122,其他:212×104):
epd_2in13_test.py: 对应2.13inch e-paper V1(黑)版本测试程序,目前已停产;
epd_2in13_V2_test.py:对应2.13inch e-paper V2(黑)版本测试程序,购买日期晚于2019年5月为V2版本,目前已停产,背面贴有V2标识;
epd_2in13_V3_test.py:对应2.13inch e-paper V3(黑)版本测试程序,购买日期晚于2022年2月为V3版本,目前出货版本,背面贴有V3标识;
epd_2in13bc_test.py:对应2.13inch e-paper B(黑)和2.13inch e-paper C(黑)测试程序;
epd_2in13b_V3_test.py: 对应2.13inch e-paper B V3(黑)测试程序,购买日期晚于2020年4月为V3版本,目前出货版本,背面贴有V3标识;
epd_2in13d_test.py: 对应2.13inch e-paper D(黑)测试程序;

2.66寸(152×296):
epd_2in66_test.py:对应2.66inch e-paper(黑)测试程序;
epd_2in66b_test.py:对应2.66inch e-paper B(黑)测试程序;

3.52寸(360×240):
epd_3in52_test.py:对应3.52inch e-paper(黑)测试程序;

3.7寸(280×480):
epd_3in7_test.py:对应3.7inch e-paper(黑)测试程序;

3.7寸(280×480):
epd_3in7_test.py:对应3.7inch e-paper(黑)测试程序;

4.01寸(640×400):
epd_4in01f_test.py:对应4.01inch e-paper F(黑绿)测试程序;

4.2寸(400×300):
epd_4in2_test.py: 对应4.2inch e-paper(黑)测试程序;
epd_4in2bc_test.py: 对应4.2inch e-paper B(黑)测试程序;
epd_4in2b_V2_test.py: 对应4.2inch e-paper B V2(黑)测试程序,购买日期晚于2020年11月为V2版本,目前出货版本,背面贴有V2标识;

5.65寸(600×558):
epd_5in65f_test.py:对应5.65inch e-paper F(黑绿)测试程序;

5.83寸(600×448):
epd_5in83_test.py: 对应5.83inch e-paper(黑)测试程序,目前已停产;
epd_5in83_V2_test.py: 对应5.83inch e-paper V2(黑)测试程序,购买日期晚于2020年12月为V2版本,目前出货版本,背面贴有V2标识;
epd_5in83bc_test.py: 对应5.83inch e-paper B(黑)和5.83inch e-paper C(黑)测试程序;
epd_5in83b_V2_test.py: 对应5.83inch e-paper B V2(黑)测试程序,购买日期晚于2020年8月为V2版本,目前出货版本,背面贴有V2标识;

7.3寸(400*168):
epd_7in3g_test.py: 对应7inch3 e-paper G(黑)测试程序;

7.5寸(V1:640×384,V2:800×480):
epd_7in5_test.py: 对应7.5inch e-paper(黑)测试程序,购买日期早于2019-12-07为V1版本,目前已停产;
epd_7in5_V2_test.py: 对应7.5inch e-paper V2(黑)测试程序,购买日期晚于2019-12-07为V2版本,目前出货版本,背面贴有V2标识;
epd_7in5bc_test.py: 对应7.5inch e-paper B(黑)和7.5inch e-paper C(黑)测试程序,7.5inch e-paper B购买日期早于2019-12-07为V1版本,目前已停产,7.5inch e-paper C正常供货;
epd_7in5b_V2_test.py:对应7.5inch e-paper B V2(黑)测试程序,购买日期晚于2019-12-07为V2版本,背面贴有V2标识;购买日期晚于2021年3月为V3版本,目前7.5inch e-paper B出货版本,背面贴有V3标识,同样使用本程序

7.5寸(HD:880×528):
epd_7in5_HD_test.py:对应7.5inch e-paper HD(黑)测试程序;
epd_7in5b_HD_test.py:对应7.5inch e-paper B HD(黑)测试程序;

  • 注意:以上时间仅供参考,具体版本请看屏幕标识
  • 运行对应屏幕的程序即可,程序支持python2/3,以1.54 V2为例子
# python2
sudo python2.7 epd_1in54_V2_test.py
# python3
sudo python3 epd_1in54_V2_test.py

程序详解

RaspberryPi与Jetson nano共用一套程序,因为他们都是嵌入式系统,兼容性比较强。
程序分为底层硬件接口、中间层墨水屏驱动、上层应用;

C

底层硬件接口

我们进行了底层的封装,由于硬件平台不一样,内部的实现是不一样的,如果需要了解内部实现可以去对应的目录中查看
在DEV_Config.c(.h)可以看到很多定义,在目录:RaspberryPi_JetsonNano\c\lib\Config

C语言使用了2种方式进行驱动:分别是BCM2835库、WiringPi库
默认使用BCM2835库进行操作,如果你需要使用WiringPi库来驱动的话,可以打开RaspberryPi_JetsonNano\c\Makefile,修改13-14行
E-paper Driver HAT RPI Makefile.png
  • 数据类型:
#define UBYTE   uint8_t
#define UWORD   uint16_t
#define UDOUBLE uint32_t
  • 模块初始化与退出的处理:
void DEV_Module_Init(void);
void DEV_Module_Exit(void);
注意:
1.这里是处理使用墨水屏前与使用完之后一些GPIO的处理。
2.对于PCB带有Rev2.1的,DEV_Module_Exit()之后整个模块会进入低功耗,经过测试这个功耗基本为0;
  • GPIO读写:
void DEV_Digital_Write(UWORD Pin, UBYTE Value);
UBYTE DEV_Digital_Read(UWORD Pin);
  • SPI写数据
void DEV_SPI_WriteByte(UBYTE Value);

中间层墨水屏驱动

e-paper驱动代码文件,在目录:RaspberryPi_JetsonNano\c\lib\e-Paper
如下图:
E-paper Driver HAT RPI epd.png
打开.h可以看到如下的函数

  • 墨水屏初始化,再屏幕开始工作时和退出睡眠模式之后调用
//1.54inch e-Paper、1.54inch e-Paper V2、2.13inch e-Paper、2.13inch e-Paper  V2、2.13inch e-Paper (D)、2.9inch e-Paper、2.9inch e-Paper (D)
void EPD_xxx_Init(UBYTE Mode); // Mode = 0 全局刷新初始化、Mode = 1 局部刷新初始化
//其他型号
void EPD_xxx_Init(void);

其中xxx表示,墨水屏型号。如是是2.13D,全屏初始化那么是EPD_2IN13D_Init(0),局部刷新初始化EPD_2IN13D_Init(1);如果是1.54 V2,那么EPD_1IN54_V2_Init();如果是7.5B,那就是EPD_7IN5BC_Init(),因为7.5B与7.5C公用驱动代码,只是显示的颜色不一样

  • 清屏,把墨水屏刷成白色
void EPD_xxx_Clear(void); 

其中xxx表示,墨水屏型号。如是是2.13D,那么是EPD_2IN9D_Clear();如果是7.5B,那就是EPD_7IN5_Clear(),因为7.5B与7.5C公用驱动代码,只是显示的颜色不一样

  • 传输一帧的图片数据并打开显示
//黑白双色墨水屏
void EPD_xxx_Display(UBYTE *Image);
//黑白红或黑白黄墨水屏
void EPD_xxx_Display(const UBYTE *blackimage, const UBYTE *ryimage);

需要注意以下的几个是特例:

//对于2.13inch e-paper (D)、2.9inch e-paper (D)两款柔性屏幕,局部刷新
void EPD_2IN13D_DisplayPart(UBYTE *Image);
void EPD_2IN9D_DisplayPart(UBYTE *Image);
//对于1.54inch e-paper V2、2.13inch e-paper V2由于控制芯片升级,对于局部刷新,需要调用EPD_xxx_DisplayPartBaseImage显示静态的背景图片,也就是以这个图片为基础进行局部刷新,然后调用动态的EPD_xxx_DisplayPart()
void EPD_1IN54_V2_DisplayPartBaseImage(UBYTE *Image);
void EPD_1IN54_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image);
  • 进入睡眠模式
void EPD_xxx_Sleep(void);

注意进入了睡眠模式,只有两个方式能够重新工作:第一种硬件复位,第二种重新调用初始化函数
其中xxx表示,墨水屏型号。如是是2.13D,那么是EPD_2IN13D_Sleep();如果是7.5B,那就是EPD_7IN5BC_Sleep(),因为7.5B与7.5C公用驱动代码,只是显示的颜色不一样

上层应用

对于屏幕而言,如果需要进行画图、显示中英文字符、显示图片等怎么办,这些都是上层应用做的。这有很多小伙伴有问到一些图形的处理,我们这里提供了一些基本的功能 在如下的目录中可以找到GUI,在目录:RaspberryPi_JetsonNano\c\lib\GUI\GUI_Paint.c(.h)
E-paper Driver HAT GUI.png
在如下目录下是GUI依赖的字符字体,在目录:RaspberryPi_JetsonNano\c\lib\Fonts
E-paper Driver HAT Fonts.png

  • 新建图像属性:新建一个图像属性,这个属性包括图像缓存的名称、宽度、高度、翻转角度、颜色
void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color)
参数:
 	image : 图像缓存的名称,实际上是一个指向图像缓存首地址的指针;
 	Width : 图像缓存的宽度;
 	Height: 图像缓存的高度;
 	Rotate:图像的翻转的角度
 	Color :图像的初始颜色;
  • 选择图像缓存:选择图像缓存,选择的目的是你可以创建多个图像属性,图像缓存可以存在多个,你可以选择你所创建的每一张图像
void Paint_SelectImage(UBYTE *image)
参数:
 	image: 图像缓存的名称,实际上是一个指向图像缓存首地址的指针;
  • 图像旋转:设置选择好的图像的旋转角度,最好使用在Paint_SelectImage()后,可以选择旋转0、90、180、270
void Paint_SetRotate(UWORD Rotate)
参数:
 	Rotate: 图像选择角度,可以选择ROTATE_0、ROTATE_90、ROTATE_180、ROTATE_270分别对应0、90、180、270度
【说明】不同选择角度下,坐标对应起始像素点不同,这里以1.54B为例,四张图,按顺序为0°, 90°, 180°, 270°。仅做为参考
SPI-epaper-C-0.png SPI-epaper-C-90.png SPI-epaper-C-180.pngSPI-epaper-C-270.png
  • 图像镜像翻转:设置选择好的图像的镜像翻转,可以选择不镜像、关于水平镜像、关于垂直镜像、关于图像中心镜像。
void Paint_SetMirroring(UBYTE mirror)
参数:
 	mirror: 图像的镜像方式,可以选择MIRROR_NONE、MIRROR_HORIZONTAL、MIRROR_VERTICAL、MIRROR_ORIGIN分别对应不镜像、关于水平镜像、关于垂直镜像、关于图像中心镜像
  • 设置点在缓存中显示位置和颜色:这里是GUI最核心的一个函数、处理点在缓存中显示位置和颜色;
void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color)
参数:
 	Xpoint: 点在图像缓存中X位置
 	Ypoint: 点在图像缓存中Y位置
 	Color : 点显示的颜色
  • 图像缓存填充颜色:把图像缓存填充为某颜色,一般作为屏幕刷白的作用
void Paint_Clear(UWORD Color)
参数:
 	Color: 填充的颜色
  • 图像缓存部分窗口填充颜色:把图像缓存的某部分窗口填充为某颜色,一般作为窗口刷白的作用,常用于时间的显示,刷白上一秒
void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color)
参数:
 	Xstart: 窗口的X起点坐标
 	Ystart: 窗口的Y起点坐标
 	Xend: 窗口的X终点坐标
 	Yend: 窗口的Y终点坐标
 	Color: 填充的颜色
  • 画点:在图像缓存中,在(Xpoint, Ypoint)上画点,可以选择颜色,点的大小,点的风格
void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style)
参数:
 	Xpoint: 点的X坐标
 	Ypoint: 点的Y坐标
 	Color: 填充的颜色
 	Dot_Pixel: 点的大小,提供默认的8种大小点
 	 	 typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  , 	 	// 3 X 3
 	 	 	 DOT_PIXEL_4X4  , 	 	// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	Dot_Style: 点的风格,大小扩充方式是以点为中心扩大还是以点为左下角往右上扩大
 	 	typedef enum {
 	 	   DOT_FILL_AROUND  = 1,		
 	 	   DOT_FILL_RIGHTUP,
 	 	} DOT_STYLE;
  • 画线:在图像缓存中,从 (Xstart, Ystart) 到 (Xend, Yend) 画线,可以选择颜色,线的宽度,线的风格
void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, LINE_STYLE Line_Style , LINE_STYLE Line_Style)
参数:
 	Xstart: 线的X起点坐标
 	Ystart: 线的Y起点坐标
 	Xend: 线的X终点坐标
 	Yend: 线的Y终点坐标
 	Color: 填充的颜色
 	Line_width: 线的宽度,提供默认的8种宽度
 	 	typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  ,		// 3 X 3
 	 	 	 DOT_PIXEL_4X4  ,		// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	 Line_Style: 线的风格,选择线是以直线连接还是以虚线的方式连接
 	 	typedef enum {
 	 	 	 LINE_STYLE_SOLID = 0,
 	 	 	 LINE_STYLE_DOTTED,
 	 	} LINE_STYLE;
  • 画矩形:在图像缓存中,从 (Xstart, Ystart) 到 (Xend, Yend) 画一个矩形,可以选择颜色,线的宽度,是否填充矩形内部
void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
参数:
 	Xstart: 矩形的X起点坐标
 	Ystart: 矩形的Y起点坐标
 	Xend: 矩形的X终点坐标
 	Yend: 矩形的Y终点坐标
 	Color: 填充的颜色
 	Line_width: 矩形四边的宽度,提供默认的8种宽度
 	 	typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  ,		// 3 X 3
 	 	 	 DOT_PIXEL_4X4  ,		// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	Draw_Fill: 填充,是否填充矩形的内部
 	 	typedef enum {
 	 	 	 DRAW_FILL_EMPTY = 0,
 	 	 	 DRAW_FILL_FULL,
 	 	} DRAW_FILL;
  • 画圆:在图像缓存中,以 (X_Center Y_Center) 为圆心,画一个半径为Radius的圆,可以选择颜色,线的宽度,是否填充圆内部
void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
参数:
 	X_Center: 圆心的X坐标
 	Y_Center: 圆心的Y坐标
 	Radius:圆的半径
 	Color: 填充的颜色
 	Line_width: 圆弧的宽度,提供默认的8种宽度
 	 	typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  ,		// 3 X 3
 	 	 	 DOT_PIXEL_4X4  ,		// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	Draw_Fill: 填充,是否填充圆的内部
 	 	typedef enum {
 	 	 	 DRAW_FILL_EMPTY = 0,
 	 	 	 DRAW_FILL_FULL,
 	 	} DRAW_FILL;
  • 写Ascii字符:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一个Ascii字符,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Ascii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	Ascii_Char:Ascii字符
 	Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
 	 	font8:5*8的字体
 	 	font12:7*12的字体
 	 	font16:11*16的字体
 	 	font20:14*20的字体
 	 	font24:17*24的字体
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 写英文字符串:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串英文字符,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	pString:字符串,字符串是一个指针
 	Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
 	 	font8:5*8的字体
 	 	font12:7*12的字体
 	 	font16:11*16的字体
 	 	font20:14*20的字体
 	 	font24:17*24的字体
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 写中文字符串:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串中文字符,可以选择GB2312编码字符字库、字体前景色、字体背景色;
void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	pString:字符串,字符串是一个指针
 	Font: GB2312编码字符字库,在Fonts文件夹中提供了以下字体:
 	 	font12CN:ascii字符字体11*21,中文字体16*21
 	 	font24CN:ascii字符字体24*41,中文字体32*41
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 写数字:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串数字,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	Nummber:显示的数字,这里使用的是32位长的int型保存,可以最大显示到2147483647
 	Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
 	 	font8:5*8的字体
 	 	font12:7*12的字体
 	 	font16:11*16的字体
 	 	font20:14*20的字体
 	 	font24:17*24的字体
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 显示时间:在图像缓存中,在 (Xstart Ystart) 为左顶点,显示一段时间,可以选择Ascii码可视字符字库、字体前景色、字体背景色;这里是方便测试局部刷新而写的,因为局部刷新需要的时间为0.3S,整体显示少于1S加上数据的传输,可以做到1S刷新一次
void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Background, UWORD Color_Foreground)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	pTime:显示的时间,这里定义好了一个时间的结构体,只要把时分秒各位数传给参数;
 	Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
 	 	font8:5*8的字体
 	 	font12:7*12的字体
 	 	font16:11*16的字体
 	 	font20:14*20的字体
 	 	font24:17*24的字体
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 写图片:把一个位图写入图像缓存中
void Paint_DrawBitMap(const unsigned char* image_buffer)
参数:
 	image_buffer: 图像数据的缓存中的首地址
  • 读取本地的bmp图片并写到缓存中

对于Jetson Nano, Raspberry Pi这些Linux操作系统的,可以读写图片
对于Raspberry Pi和Jetson Nano,在目录:RaspberryPi_JetsonNano\c\lib\GUI\GUI_BMPfile.c(.h)

UBYTE GUI_ReadBmp(const char *path, UWORD Xstart, UWORD Ystart)
参数:
	path:BMP图片的相对路径
 	Xstart: 图片的左顶点X坐标,一般默认传0
 	Ystart: 图片的左顶点Y坐标,一般默认传0

用户测试代码

前三个章节介绍了经典的linux三层代码结构,这里稍微讲解一下用户测试代码
对于Raspberry Pi和Jetson Nano,在目录:RaspberryPi_JetsonNano\c\examples,为全部的测试代码,在本目录下的main.c中可以多个屏蔽;
E-Paper Shield c test.png
如果需要运行7.5inch e-paper测试程序,你需要把42行的屏蔽去掉

// EPD_7in5_test();

改成

EPD_7in5_test();

在linux命令模式下重新执行如下:

make clean
make
sudo ./epd

Python

适用于Jetson Nano\Raspberry Pi,基于python2.7和python3
对于python而言他的调用没有C复杂
Raspberry Pi和Jetson Nano:RaspberryPi_JetsonNano\python\lib\
E-paper Driver python lib.png

底层接口

epdconfig.py 文件封装了底层接口

  • 模块初始化与退出的处理:
def module_init()
def module_exit()
 注意:
 1.这里是处理使用墨水屏前与使用完之后一些GPIO的处理。
 2.对于PCB带有Rev2.1的,module_exit()之后整个模块会进入低功耗,经过测试这个功耗基本为0;
  • GPIO读写:
def  digital_write(pin, value)
def  digital_read(pin)
  • SPI写数据
def spi_writebyte(data)

驱动接口

epdxxx.py (xxx表示尺寸,若是2.13inch e-paper,则为epd2in13.py,依此类推)

  • 墨水屏初始化,再屏幕开始工作时和退出睡眠模式之后调用
对于1.54inch e-Paper、1.54inch e-Paper V2、2.13inch e-Paper、2.13inch e-Paper  V2、2.13inch e-Paper (D)、2.9inch e-Paper、2.9inch e-Paper (D)
def init(self, update) # 选择lut_full_update或lut_partial_update
其他型号
def init(self)
  • 清屏,把墨水屏刷成白色
def Clear(self)
def Clear(self, color) # 对于某几个屏幕需要调用这个
  • 把图片转换成数组
def getbuffer(self, image)
  • 传输一帧的图片数据并打开显示
黑白双色墨水屏
def display(self, image)
黑白红或黑白黄墨水屏
def display(self, blackimage, redimage)

需要注意以下的几个是特例:<br />
对于2.13inch e-paper (D)、2.9inch e-paper (D)两款柔性屏幕,局部刷新
def DisplayPartial(self, image)

对于1.54inch e-paper V2、2.13inch e-paper V2由于控制芯片升级,对于局部刷新,需要调用displayPartBaseImage()显示静态的背景图片,也就是以这个图片为基础进行局部刷新,然后调用动态的displayPart()
def displayPartBaseImage(self, image)
def displayPart(self, image)
  • 进入睡眠模式
def sleep(self)

测试函数

epd_xxx_test.py(xxx表示尺寸,若是2.13inch e-paper,则为epd_2in13_test.py,依此类推)
python在如下目录:
Raspberry Pi和Jetson Nano:RaspberryPi_JetsonNano\python\examples\
E-paper Driver python examples.png
如果你的python版本是python2,且需要运行7.5inch e-paper测试程序,在linux命令模式下重新执行如下:

sudo python epd_7in5_test.py

如果你的python版本是python3,且需要运行7.5inch e-paper测试程序,在linux命令模式下重新执行如下:

sudo python3 epd_7in5_test.py

关于旋转设置

如果在python程序中你需要设置屏幕旋转,可以通过语句blackimage = blackimage.transpose(Image.ROTATE_270)设置,注意要在绘制完图片且刷新前调用此语句。

blackimage = blackimage.transpose(Image.ROTATE_270) 
redimage = redimage.transpose(Image.ROTATE_270)
#支持ROTATE_90, ROTATE_180, ROTATE_270三个参数
旋转效果,以1.54B为例, 按顺序分别为0°, 90°,180°, 270°
SPI-epaper-Python-0.pngSPI-epaper-Python-90.pngSPI-epaper-Python-180.pngSPI-epaper-Python-270.png

画图GUI

由于python有一个image库pil官方库链接,他十分的强大,不需要像C从逻辑层出发编写代码,可以直接引用image库进行图像处理,以下将以1.54inch e-paper为例,对程序中使用了的进行简要说明

  • 需要使用image库,需要安装库
sudo apt-get install python3-pil  安装库

然后导入库

from PIL import Image,ImageDraw,ImageFont

其中Image为基本库、ImageDraw为画图功能、ImageFont为文字

  • 定义一个图像缓存,以方便在图片上进行画图、写字等功能
image = Image.new('1', (epd.width, epd.height), 255)  # 255: clear the frame

第一个参数定义图片的颜色深度,定义为1说明是2位图,第二个参数是一个元组,定义好图片的宽度和高度,第三个参数是定义缓存的默认颜色,0为黑色,255为白色。

  • 创建一个基于image的画图对象,所有的画图操作都在这个对象上
draw = ImageDraw.Draw(image)
  • 画框
draw.rectangle((0, 10, 200, 34), fill = 0)

第一个参数为一个4个元素的元组,(0,10)矩形左上角坐标值,(200,34)为矩形右下角坐标值,fill=0表示内部填充黑色。

  • 画线
draw.line((16, 60, 56, 60), fill = 0)

第一个参数为一个4个元素的元组,以(16,60)为起始点,(200,34)为终止点,画一条直线,fill=0表示线为黑色。

  • 画圆
draw.arc((90, 60, 150, 120), 0, 360, fill = 0)

在正方形内画一个内切圆,第一个参数为一个4个元素的元组,以(90,60)为正方形的左上角顶点,(150,120)为正方形右下角顶点,规定矩形框的水平中位线为0度角,角度顺时针变大,第二个参数表示开始角度,第三个参数标识结束角度,fill=0线为黑色
如果不是正方形,画出来的就是椭圆,这个实际上是圆弧的绘制。

除了arc可以话圆之外,还有chord可以画实心圆

draw.chord((90, 130, 150, 190), 0, 360, fill = 0)

实质是弦的绘制,第一个参数指定弦的圆外切矩形,第二、三两个参数分别是弦的起始和终止角度, 第四个参数是填充颜色,将弦从0度到360度连接并填充就变成了填充的圆了。

  • 写字符

写字符往往需要写不同大小的字符,需要导入ImageFont模块,并实例化:

font = ImageFont.truetype(os.path.join(picdir, 'Font.ttc'), 24)

为了丰富字体库,这里使用的是windows目录下的字符文件,如果是其他的ttc结尾的字符文件也是支持的。

写英文字符直接使用即可,写中文,由于编码是GB2312所以需要在前面加个u:

draw.text((8, 12), 'hello world', font = font, fill = 255)
draw.text((8, 36), u'微雪电子', font = font, fill = 0)

第一个参数为一个2个元素的元组,以(8,12)为左顶点,字体为font,点,fill为字体颜色,第一句fill=255所以看上去是不会显示的,第二句显示微雪电子。

  • 读取本地图片
image = Image.open(os.path.join(picdir, '1in54.bmp'))

参数为图片路径。

  • 其他功能

python的image库十分强大,如果需要实现其他的更多功能,可以上官网学习http://effbot.org/imagingbook pil,官方的是英文的,如果感觉对你不友好,当然我们国内也有很多的优秀的博客都有讲解。

STM32

我们提供的例程是基于STM32F103ZET6的,提供的连接方式也是对应的STM32F103ZET6的引脚,如果有需要移植程序,请按实际引脚连接

硬件连接

STM32F103ZET连接引脚对应关系
e-Paper STM32
VCC 3.3V
GND GND
DIN PA7
CLK PA5
CS PA4
DC PA2
RST PA1
BUSY PA3
PWR PA6

以我们的open103Z为例,连接如下图:
E-paper driver hat to stm32 connet.png
如果你的是STM32F103RBT6可以参考E-Paper Shield

软件说明

例程是基于HAL库进行开发的。 下载程序,找到STM32程序文件目录,打开STM32\STM32-F103ZET6\MDK-ARM目录下的epd-demo.uvprojx,即可看到程序。
E-paper stm32 code1.png

打开main.c,可以看到所有的测试程序,把对应的屏幕的测试程序前面的注释去掉,重新编译下载即可。
E-paper stm32 code2.png

可以查看到所有的屏幕尺寸的测试程序,按照尺寸分类:
1.02寸(128×80):
EPD_1in02d_test():对应1.02inch e-paper测试程序;

1.54寸(1.54inch e-paper c:152×152,其他:200×200):
EPD_1in54_test(): 对应1.54inch e-paper V1(黑)版本测试程序,目前已停产;
EPD_1in54_V2_test():对应1.54inch e-paper V2(黑)版本测试程序,购买日期晚于2019年11月为V2版本,目前出货版本,背面贴有V2标识;
EPD_1in54b_test(): 对应1.54inch e-paper B(黑)测试程序,目前已停产;
EPD_1in54b_V2_test(): 对应1.54inch e-paper B V2(黑)测试程序,购买日期晚于2020年4月为V2版本,目前出货版本,背面贴有V2标识;
EPD_1in54c_test(): 对应1.54inch e-paper C(黑)测试程序;

1.64寸(168*168):
EPD_1in64g_test(): 对应1.64inch e-paper G(黑)测试程序;

2.7寸(264×176):
EPD_2in7_test(): 对应2.7inch e-paper(黑)测试程序;
EPD_2in7b_test(): 对应2.7inch e-paper B(黑)测试程序;
EPD_2in7b_V2_test(): 对应2.7inch e-paper B V2(黑)测试程序,购买日期晚于2021年2月为V2版本,目前出货版本,背面贴有V2标识;

2.9寸(296×128):
EPD_2in9_test(): 对应2.9inch e-paper(黑)测试程序,目前已停产;
EPD_2in9_V2_test(): 对应2.9inch e-paper V2(黑)测试程序,购买日期晚于2020年12月为V2版本,目前出货版本,背面贴有V2标识;
EPD_2in9bc_test(): 对应2.9inch e-paper B(黑)和2.9inch e-paper C(黑)测试程序;
EPD_2in9b_V3_test(): 对应2.9inch e-paper B V3(黑)测试程序,购买日期晚于2020年7月为V3版本,目前出货版本,背面贴有V3标识;
EPD_2in9d_test(): 对应2.9inch e-paper D(黑)测试程序;

2.13寸(2.13inch e-Paper:250×122,其他:212×104):
EPD_2in13_test(): 对应2.13inch e-paper V1(黑)版本测试程序,目前已停产;
EPD_2in13_V2_test():对应2.13inch e-paper V2(黑)版本测试程序,购买日期晚于2019年5月为V2版本,目前已停产,背面贴有V2标识;
EPD_2in13_V3_test():对应2.13inch e-paper V3(黑)版本测试程序,购买日期晚于2022年2月为V3版本,目前出货版本,背面贴有V3标识;
EPD_2in13bc_test():对应2.13inch e-paper B(黑)和2.13inch e-paper C(黑)测试程序;
EPD_2in13b_V3_test(): 对应2.13inch e-paper B V3(黑)测试程序,购买日期晚于2020年4月为V3版本,目前出货版本,背面贴有V3标识;
EPD_2in13d_test(): 对应2.13inch e-paper D(黑)测试程序;

2.66寸(152×296):
EPD_2in66_test():对应2.66inch e-paper(黑)测试程序;
EPD_2in66b_test():对应2.66inch e-paper B(黑)测试程序;

3寸(400*168):
EPD_3in0g_test(): 对应3inch e-paper G(黑)测试程序;

3.52寸(360×240):
EPD_3in52_test():对应3.52inch e-paper(黑)测试程序;

3.7寸(280×480):
EPD_3in7_test():对应3.7inch e-paper(黑)测试程序;

4.01寸(640×400):
EPD_4in01f_test():对应4.01inch e-paper F(黑绿)测试程序;

4.2寸(400×300):
EPD_4in2_test(): 对应4.2inch e-paper(黑)测试程序;
EPD_4in2bc_test(): 对应4.2inch e-paper B(黑)测试程序;
EPD_4in2b_V2_test(): 对应4.2inch e-paper B V2(黑)测试程序,购买日期晚于2020年11月为V2版本,目前出货版本,背面贴有V2标识;

5.65寸(600×558):
EPD_5in65f_test():对应5.65inch e-paper F(黑绿)测试程序;

5.83寸(600×448):
EPD_5in83_test(): 对应5.83inch e-paper(黑)测试程序,目前已停产;
EPD_5in83_V2_test(): 对应5.83inch e-paper V2(黑)测试程序,购买日期晚于2020年12月为V2版本,目前出货版本,背面贴有V2标识;
EPD_5in83bc_test(): 对应5.83inch e-paper B(黑)和5.83inch e-paper C(黑)测试程序;
EPD_5in83b_V2_test(): 对应5.83inch e-paper B V2(黑)测试程序,购买日期晚于2020年8月为V2版本,目前出货版本,背面贴有V2标识;

7.5寸(V1:640×384,V2:800×480):
EPD_7in5_test(): 对应7.5inch e-paper(黑)测试程序,购买日期早于2019-12-07为V1版本,目前已停产;
EPD_7in5_V2_test(): 对应7.5inch e-paper V2(黑)测试程序,购买日期晚于2019-12-07为V2版本,目前出货版本,背面贴有V2标识;
EPD_7in5bc_test(): 对应7.5inch e-paper B(黑)和7.5inch e-paper C(黑)测试程序,7.5inch e-paper B购买日期早于2019-12-07为V1版本,目前已停产,7.5inch e-paper C正常供货;
EPD_7in5b_V2_test():对应7.5inch e-paper B V2(黑)测试程序,购买日期晚于2019-12-07为V2版本,背面贴有V2标识;购买日期晚于2021年3月为V3版本,目前7.5inch e-paper B出货版本,背面贴有V3标识,同样使用本程序

7.3寸(800*480):
EPD_7in3g_test(): 对应7.3inch e-paper G(黑)测试程序;

7.5寸(HD:880×528):
EPD_7in5_HD_test():对应7.5inch e-paper HD(黑)测试程序;
EPD_7in5b_HD_test():对应7.5inch e-paper B HD(黑)测试程序;

  • 注意:以上时间仅供参考,具体版本请看屏幕标识

程序说明

底层硬件接口

我们进行了底层的封装,由于硬件平台不一样,内部的实现是不一样的,如果需要了解内部实现可以去对应的目录中查看
在DEV_Config.c(.h)可以看到很多定义,在目录:\STM32\STM32-F103ZET6\User\Config

  • 数据类型:
#define UBYTE   uint8_t
#define UWORD   uint16_t
#define UDOUBLE uint32_t
  • 模块初始化与退出的处理:
void DEV_Module_Init(void);
void DEV_Module_Exit(void);
注意:
1.这里是处理使用墨水屏前与使用完之后一些GPIO的处理。
2.对于PCB带有Rev2.1的,DEV_Module_Exit()之后整个模块会进入低功耗,经过测试这个功耗基本为0;
  • GPIO读写:
void DEV_Digital_Write(UWORD Pin, UBYTE Value);
UBYTE DEV_Digital_Read(UWORD Pin);
  • SPI写数据
void DEV_SPI_WriteByte(UBYTE Value);

中间层墨水屏驱动

e-paper驱动代码文件,在目录:\STM32\STM32-F103ZET6\User\e-Paper
如下图:
E-paper Driver HAT RPI epd.png
打开.h可以看到如下的函数

  • 墨水屏初始化,再屏幕开始工作时和退出睡眠模式之后调用
//1.54inch e-Paper、1.54inch e-Paper V2、2.13inch e-Paper、2.13inch e-Paper  V2、2.13inch e-Paper (D)、2.9inch e-Paper、2.9inch e-Paper (D)
void EPD_xxx_Init(UBYTE Mode); // Mode = 0 全局刷新初始化、Mode = 1 局部刷新初始化
//其他型号
void EPD_xxx_Init(void);

其中xxx表示,墨水屏型号。如是是2.13D,全屏初始化那么是EPD_2IN13D_Init(0),局部刷新初始化EPD_2IN13D_Init(1);如果是1.54 V2,那么EPD_1IN54_V2_Init();如果是7.5B,那就是EPD_7IN5BC_Init(),因为7.5B与7.5C公用驱动代码,只是显示的颜色不一样

  • 清屏,把墨水屏刷成白色
void EPD_xxx_Clear(void); 

其中xxx表示,墨水屏型号。如是是2.13D,那么是EPD_2IN9D_Clear();如果是7.5B,那就是EPD_7IN5_Clear(),因为7.5B与7.5C公用驱动代码,只是显示的颜色不一样

  • 传输一帧的图片数据并打开显示
//黑白双色墨水屏
void EPD_xxx_Display(UBYTE *Image);
//黑白红或黑白黄墨水屏
void EPD_xxx_Display(const UBYTE *blackimage, const UBYTE *ryimage);

需要注意以下的几个是特例:

//对于2.13inch e-paper (D)、2.9inch e-paper (D)两款柔性屏幕,局部刷新
void EPD_2IN13D_DisplayPart(UBYTE *Image);
void EPD_2IN9D_DisplayPart(UBYTE *Image);
//对于1.54inch e-paper V2、2.13inch e-paper V2由于控制芯片升级,对于局部刷新,需要调用EPD_xxx_DisplayPartBaseImage显示静态的背景图片,也就是以这个图片为基础进行局部刷新,然后调用动态的EPD_xxx_DisplayPart()
void EPD_1IN54_V2_DisplayPartBaseImage(UBYTE *Image);
void EPD_1IN54_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image);
  • 进入睡眠模式
void EPD_xxx_Sleep(void);

注意进入了睡眠模式,只有两个方式能够重新工作:第一种硬件复位,第二种重新调用初始化函数
其中xxx表示,墨水屏型号。如是是2.13D,那么是EPD_2IN13D_Sleep();如果是7.5B,那就是EPD_7IN5BC_Sleep(),因为7.5B与7.5C共用驱动代码,只是显示的颜色不一样

上层应用

对于屏幕而言,如果需要进行画图、显示中英文字符、显示图片等怎么办,这些都是上层应用做的。这有很多小伙伴有问到一些图形的处理,我们这里提供了一些基本的功能 在如下的目录中可以找到GUI,在目录:\STM32\STM32-F103ZET6\User\GUI\GUI_Paint.c(.h)
E-paper Driver HAT GUI.png
在如下目录下是GUI依赖的字符字体,在目录:\STM32\STM32-F103ZET6\User\Fonts
E-paper Driver HAT Fonts.png

  • 新建图像属性:新建一个图像属性,这个属性包括图像缓存的名称、宽度、高度、翻转角度、颜色
void Paint_NewImage(UBYTE *image, UWORD Width, UWORD Height, UWORD Rotate, UWORD Color)
参数:
 	image : 图像缓存的名称,实际上是一个指向图像缓存首地址的指针;
 	Width : 图像缓存的宽度;
 	Height: 图像缓存的高度;
 	Rotate:图像的翻转的角度
 	Color :图像的初始颜色;
  • 选择图像缓存:选择图像缓存,选择的目的是你可以创建多个图像属性,图像缓存可以存在多个,你可以选择你所创建的每一张图像
void Paint_SelectImage(UBYTE *image)
参数:
 	image: 图像缓存的名称,实际上是一个指向图像缓存首地址的指针;
  • 图像旋转:设置选择好的图像的旋转角度,最好使用在Paint_SelectImage()后,可以选择旋转0、90、180、270
void Paint_SetRotate(UWORD Rotate)
参数:
 	Rotate: 图像选择角度,可以选择ROTATE_0、ROTATE_90、ROTATE_180、ROTATE_270分别对应0、90、180、270度
【说明】不同选择角度下,坐标对应起始像素点不同,这里以1.54B为例,四张图,按顺序为0°, 90°, 180°, 270°。仅做为参考
SPI-epaper-C-0.png SPI-epaper-C-90.png SPI-epaper-C-180.pngSPI-epaper-C-270.png
  • 图像镜像翻转:设置选择好的图像的镜像翻转,可以选择不镜像、关于水平镜像、关于垂直镜像、关于图像中心镜像。
void Paint_SetMirroring(UBYTE mirror)
参数:
 	mirror: 图像的镜像方式,可以选择MIRROR_NONE、MIRROR_HORIZONTAL、MIRROR_VERTICAL、MIRROR_ORIGIN分别对应不镜像、关于水平镜像、关于垂直镜像、关于图像中心镜像
  • 设置点在缓存中显示位置和颜色:这里是GUI最核心的一个函数、处理点在缓存中显示位置和颜色;
void Paint_SetPixel(UWORD Xpoint, UWORD Ypoint, UWORD Color)
参数:
 	Xpoint: 点在图像缓存中X位置
 	Ypoint: 点在图像缓存中Y位置
 	Color : 点显示的颜色
  • 图像缓存填充颜色:把图像缓存填充为某颜色,一般作为屏幕刷白的作用
void Paint_Clear(UWORD Color)
参数:
 	Color: 填充的颜色
  • 图像缓存部分窗口填充颜色:把图像缓存的某部分窗口填充为某颜色,一般作为窗口刷白的作用,常用于时间的显示,刷白上一秒
void Paint_ClearWindows(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color)
参数:
 	Xstart: 窗口的X起点坐标
 	Ystart: 窗口的Y起点坐标
 	Xend: 窗口的X终点坐标
 	Yend: 窗口的Y终点坐标
 	Color: 填充的颜色
  • 画点:在图像缓存中,在(Xpoint, Ypoint)上画点,可以选择颜色,点的大小,点的风格
void Paint_DrawPoint(UWORD Xpoint, UWORD Ypoint, UWORD Color, DOT_PIXEL Dot_Pixel, DOT_STYLE Dot_Style)
参数:
 	Xpoint: 点的X坐标
 	Ypoint: 点的Y坐标
 	Color: 填充的颜色
 	Dot_Pixel: 点的大小,提供默认的8种大小点
 	 	 typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  , 	 	// 3 X 3
 	 	 	 DOT_PIXEL_4X4  , 	 	// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	Dot_Style: 点的风格,大小扩充方式是以点为中心扩大还是以点为左下角往右上扩大
 	 	typedef enum {
 	 	   DOT_FILL_AROUND  = 1,		
 	 	   DOT_FILL_RIGHTUP,
 	 	} DOT_STYLE;
  • 画线:在图像缓存中,从 (Xstart, Ystart) 到 (Xend, Yend) 画线,可以选择颜色,线的宽度,线的风格
void Paint_DrawLine(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, LINE_STYLE Line_Style , LINE_STYLE Line_Style)
参数:
 	Xstart: 线的X起点坐标
 	Ystart: 线的Y起点坐标
 	Xend: 线的X终点坐标
 	Yend: 线的Y终点坐标
 	Color: 填充的颜色
 	Line_width: 线的宽度,提供默认的8种宽度
 	 	typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  ,		// 3 X 3
 	 	 	 DOT_PIXEL_4X4  ,		// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	 Line_Style: 线的风格,选择线是以直线连接还是以虚线的方式连接
 	 	typedef enum {
 	 	 	 LINE_STYLE_SOLID = 0,
 	 	 	 LINE_STYLE_DOTTED,
 	 	} LINE_STYLE;
  • 画矩形:在图像缓存中,从 (Xstart, Ystart) 到 (Xend, Yend) 画一个矩形,可以选择颜色,线的宽度,是否填充矩形内部
void Paint_DrawRectangle(UWORD Xstart, UWORD Ystart, UWORD Xend, UWORD Yend, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
参数:
 	Xstart: 矩形的X起点坐标
 	Ystart: 矩形的Y起点坐标
 	Xend: 矩形的X终点坐标
 	Yend: 矩形的Y终点坐标
 	Color: 填充的颜色
 	Line_width: 矩形四边的宽度,提供默认的8种宽度
 	 	typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  ,		// 3 X 3
 	 	 	 DOT_PIXEL_4X4  ,		// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	Draw_Fill: 填充,是否填充矩形的内部
 	 	typedef enum {
 	 	 	 DRAW_FILL_EMPTY = 0,
 	 	 	 DRAW_FILL_FULL,
 	 	} DRAW_FILL;
  • 画圆:在图像缓存中,以 (X_Center Y_Center) 为圆心,画一个半径为Radius的圆,可以选择颜色,线的宽度,是否填充圆内部
void Paint_DrawCircle(UWORD X_Center, UWORD Y_Center, UWORD Radius, UWORD Color, DOT_PIXEL Line_width, DRAW_FILL Draw_Fill)
参数:
 	X_Center: 圆心的X坐标
 	Y_Center: 圆心的Y坐标
 	Radius:圆的半径
 	Color: 填充的颜色
 	Line_width: 圆弧的宽度,提供默认的8种宽度
 	 	typedef enum {
 	 	 	 DOT_PIXEL_1X1  = 1,	// 1 x 1
 	 	 	 DOT_PIXEL_2X2  , 		// 2 X 2
 	 	 	 DOT_PIXEL_3X3  ,		// 3 X 3
 	 	 	 DOT_PIXEL_4X4  ,		// 4 X 4
 	 	 	 DOT_PIXEL_5X5  , 		// 5 X 5
 	 	 	 DOT_PIXEL_6X6  , 		// 6 X 6
 	 	 	 DOT_PIXEL_7X7  , 		// 7 X 7
 	 	 	 DOT_PIXEL_8X8  , 		// 8 X 8
 	 	} DOT_PIXEL;
 	Draw_Fill: 填充,是否填充圆的内部
 	 	typedef enum {
 	 	 	 DRAW_FILL_EMPTY = 0,
 	 	 	 DRAW_FILL_FULL,
 	 	} DRAW_FILL;
  • 写Ascii字符:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一个Ascii字符,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawChar(UWORD Xstart, UWORD Ystart, const char Ascii_Char, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	Ascii_Char:Ascii字符
 	Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
 	 	font8:5*8的字体
 	 	font12:7*12的字体
 	 	font16:11*16的字体
 	 	font20:14*20的字体
 	 	font24:17*24的字体
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 写英文字符串:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串英文字符,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawString_EN(UWORD Xstart, UWORD Ystart, const char * pString, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	pString:字符串,字符串是一个指针
 	Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
 	 	font8:5*8的字体
 	 	font12:7*12的字体
 	 	font16:11*16的字体
 	 	font20:14*20的字体
 	 	font24:17*24的字体
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 写中文字符串:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串中文字符,可以选择GB2312编码字符字库、字体前景色、字体背景色;
void Paint_DrawString_CN(UWORD Xstart, UWORD Ystart, const char * pString, cFONT* font, UWORD Color_Foreground, UWORD Color_Background)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	pString:字符串,字符串是一个指针
 	Font: GB2312编码字符字库,在Fonts文件夹中提供了以下字体:
 	 	font12CN:ascii字符字体11*21,中文字体16*21
 	 	font24CN:ascii字符字体24*41,中文字体32*41
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 写数字:在图像缓存中,在 (Xstart Ystart) 为左顶点,写一串数字,可以选择Ascii码可视字符字库、字体前景色、字体背景色
void Paint_DrawNum(UWORD Xpoint, UWORD Ypoint, int32_t Nummber, sFONT* Font, UWORD Color_Foreground, UWORD Color_Background)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	Nummber:显示的数字,这里使用的是32位长的int型保存,可以最大显示到2147483647
 	Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
 	 	font8:5*8的字体
 	 	font12:7*12的字体
 	 	font16:11*16的字体
 	 	font20:14*20的字体
 	 	font24:17*24的字体
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 显示时间:在图像缓存中,在 (Xstart Ystart) 为左顶点,显示一段时间,可以选择Ascii码可视字符字库、字体前景色、字体背景色;这里是方便测试局部刷新而写的,因为局部刷新需要的时间为0.3S,整体显示少于1S加上数据的传输,可以做到1S刷新一次
void Paint_DrawTime(UWORD Xstart, UWORD Ystart, PAINT_TIME *pTime, sFONT* Font, UWORD Color_Background, UWORD Color_Foreground)
参数:
 	Xstart: 字符的左顶点X坐标
 	Ystart: 字体的左顶点Y坐标
 	pTime:显示的时间,这里定义好了一个时间的结构体,只要把时分秒各位数传给参数;
 	Font: Ascii码可视字符字库,在Fonts文件夹中提供了以下字体:
 	 	font8:5*8的字体
 	 	font12:7*12的字体
 	 	font16:11*16的字体
 	 	font20:14*20的字体
 	 	font24:17*24的字体
 	Color_Foreground: 字体颜色
 	Color_Background: 背景颜色
  • 写图片:把一个位图写入图像缓存中
void Paint_DrawBitMap(const unsigned char* image_buffer)
参数:
 	image_buffer: 图像数据的缓存中的首地址

Arduino

例程均在Arduino uno上进行了测试,如果需要是其他型号的Arduino需要自己确定连接的管脚是否正确。
需要注意的是:由于Arduino UNO的RAM小的可怜,无法分配过大的内存用于处理画图等功能,所以部分大尺寸的屏幕例程只演示刷新图片,这个图片是存储在flash中,我们建议Arduino UNO控制请使用e-paper Shiled体验更佳。

硬件连接

Arduino连接引脚对应关系
e-Paper Arduino UNO Mega2560
Vcc 5V 5V
GND GND GND
DIN D11 D51
CLK D13 D52
CS D10 D10
DC D9 D9
RST D8 D8
BUSY D7 D7
PWR D6 D6

连接图如下(点击可放大):
E-paper driver hat to arduino connet.png

安装编译软件(windows教程)

arduino IDE 安装教程

运行程序

在产品百科界面下载程序,然后解压。Arduino程序位于 ~/Arduino/…
E-paper arduino cede1.png

请根据墨水屏型号选择对应的程序打开
E-paper arduino cede2.png

可以查看到所有的屏幕尺寸的测试程序,按照尺寸分类:
1.02寸(128×80):
epd1in02d:对应1.02inch e-paper测试程序;

1.54寸(1.54inch e-paper c:152×152,其他:200×200):
epd1in54: 对应1.54inch e-paper V1(黑)版本测试程序,目前已停产;
epd1in54_V2:对应1.54inch e-paper V2(黑)版本测试程序,购买日期晚于2019年11月为V2版本,目前出货版本,背面贴有V2标识;
epd1in54b: 对应1.54inch e-paper B(黑)测试程序,目前已停产;
epd1in54b_V2: 对应1.54inch e-paper B V2(黑)测试程序,购买日期晚于2020年4月为V2版本,目前出货版本,背面贴有V2标识;
epd1in54c: 对应1.54inch e-paper C(黑)测试程序;

1.64寸(168*168):
EPD_1in64g_test(): 对应1.64inch e-paper G(黑)测试程序;

2.7寸(264×176):
epd2in7: 对应2.7inch e-paper(黑)测试程序;
epd2in7b: 对应2.7inch e-paper B(黑)测试程序;
epd2in7b_V2: 对应2.7inch e-paper B V2(黑)测试程序,购买日期晚于2021年2月为V2版本,目前出货版本,背面贴有V2标识;

2.9寸(296×128):
epd2in9: 对应2.9inch e-paper(黑)测试程序,目前已停产;
epd2in9_V2: 对应2.9inch e-paper V2(黑)测试程序,购买日期晚于2020年12月为V2版本,目前出货版本,背面贴有V2标识;
epd2in9bc: 对应2.9inch e-paper B(黑)和2.9inch e-paper C(黑)测试程序;
epd2in9b_V3: 对应2.9inch e-paper B V3(黑)测试程序,购买日期晚于2020年7月为V3版本,目前出货版本,背面贴有V3标识;
epd2in9d: 对应2.9inch e-paper D(黑)测试程序;

2.13寸(2.13inch e-Paper:250×122,其他:212×104):
epd2in13: 对应2.13inch e-paper V1(黑)版本测试程序,目前已停产;
epd2in13_V2:对应2.13inch e-paper V2(黑)版本测试程序,购买日期晚于2019年5月为V2版本,目前已停产,背面贴有V2标识;
epd2in13_V3:对应2.13inch e-paper V3(黑)版本测试程序,购买日期晚于2022年2月为V3版本,目前出货版本,背面贴有V3标识;
epd2in13bc:对应2.13inch e-paper B(黑)和2.13inch e-paper C(黑)测试程序;
epd2in13b_V3:对应2.13inch e-paper B V3(黑)测试程序,购买日期晚于2020年4月为V3版本,目前出货版本,背面贴有V3标识;
epd2in13d:对应2.13inch e-paper D(黑)测试程序;

2.66寸(152×296):
epd2in66:对应2.66inch e-paper(黑)测试程序;
epd2in66b:对应2.66inch e-paper B(黑)测试程序;

3寸(400*168):
EPD_3in0g_test(): 对应3inch e-paper G(黑)测试程序;

3.52寸(360×240):
EPD_3in52_test():对应3.52inch e-paper(黑)测试程序;

3.7寸(280×480):
epd3in7:对应3.7inch e-paper(黑)测试程序;

4.01寸(640×400):
epd4in01f:对应4.01inch e-paper F(黑绿)测试程序;

4.2寸(400×300):
epd4in2:对应4.2inch e-paper(黑)测试程序;
epd4in2bc:对应4.2inch e-paper B(黑)测试程序;
epd4in2b_V2: 对应4.2inch e-paper B V2(黑)测试程序,购买日期晚于2020年11月为V2版本,目前出货版本,背面贴有V2标识;

5.65寸(600×558):
epd5in65:对应5.65inch e-paper F(黑绿)测试程序;

5.83寸(600×448):
epd5in83: 对应5.83inch e-paper(黑)测试程序,目前已停产;
epd5in83_V2: 对应5.83inch e-paper V2(黑)测试程序,购买日期晚于2020年12月为V2版本,目前出货版本,背面贴有V2标识;
epd5in83bc: 对应5.83inch e-paper B(黑)和5.83inch e-paper C(黑)测试程序;
epd5in83b_V2: 对应5.83inch e-paper B V2(黑)测试程序,购买日期晚于2020年8月为V2版本,目前出货版本,背面贴有V2标识;

7.3寸(800*480):
EPD_7in3g_test(): 对应7.3inch e-paper G(黑)测试程序;

7.5寸(V1:640×384,V2:800×480):
epd7in5: 对应7.5inch e-paper(黑)测试程序,购买日期早于2019-12-07为V1版本,目前已停产;
epd7in5_V2: 对应7.5inch e-paper V2(黑)测试程序,购买日期晚于2019-12-07为V2版本,目前出货版本,背面贴有V2标识;
epd7in5bc: 对应7.5inch e-paper B(黑)和7.5inch e-paper C(黑)测试程序,7.5inch e-paper B购买日期早于2019-12-07为V1版本,目前已停产,7.5inch e-paper C正常供货;
epd7in5b_V2:对应7.5inch e-paper B V2(黑)测试程序,购买日期晚于2019-12-07为V2版本,背面贴有V2标识;购买日期晚于2021年3月为V3版本,目前7.5inch e-paper B出货版本,背面贴有V3标识,同样使用本程序

7.5寸(HD:880×528):
epd7in5_HD:对应7.5inch e-paper HD(黑)测试程序;
epd7in5b_HD:对应7.5inch e-paper B HD(黑)测试程序;

  • 注意:以上时间仅供参考,具体版本请看屏幕标识

比如1.54inch e-Paper Module. 打开epd1in54文件夹,并运行epd1in54.ino文件。
打开程序,选择开发板型号Arduino UNO
E-paper arduino cede4.png
选择对应COM口
E-paper arduino cede5.png
然后点击编译并下载即可
E-paper arduino cede6.png
由于arduino UNO的flash十分小,几款大尺寸的屏幕使用MEGA2560效果更佳:
E-paper arduino cede3.png

程序说明

文件介绍

以Arduino UNO控制1.54寸墨水屏为例,打开epd1in54目录:
E-paper arduino ide codeDescription1.png
其中:
epd1in54.ino:使用Arduino IDE打开即可;
epd1in54.cpp(.h):是墨水屏的驱动程序;
epdif.cpp(.h):是硬件接口定义,里面封装了读写管脚电平,SPI传输数据,以及管脚初始化;
font8.cpp、font12.cpp、font16.cpp、font20.cpp、font24.cpp、fonts.h:为不同大小字符的模;
imagedata.cpp(.h):是图片数据,这个可以通过Img2Lcd(在开发资料中可下载)把2位深度的BMP图片转换成数组。
程序分为底层硬件接口、中间层墨水屏驱动、上层应用;

底层硬件接口

在epdif.cpp(.h)两个文件中定义了硬件接口,并封装好读写管脚电平、延时、SPI传输等函数。

  • 写管脚电平
void DigitalWrite(int pin, int value)

第一个参数为管脚、第二个为高低电平。

  • 读管脚电平
int DigitalRead(int pin)

参数为管脚,返回值为读取管脚的电平。

  • 延时
DelayMs(unsigned int delaytime)

毫秒级别延时。

  • SPI输出数据
SpiTransfer(unsigned char data)

参数为char型,占8位。

  • 硬件初始化
int IfInit(void)

里面已经封装好了各管脚的输入输出,以及SPI的初始化。

中间层墨水屏驱动

  • 实例化墨水屏

由于Arduino是C++开发,需要把墨水屏实例化:

Epd epd;
  • 墨水屏初始化,再屏幕开始工作时和退出睡眠模式之后调用
  • 1.54inch e-Paper、1.54inch e-Paper V2、2.13inch e-Paper、2.13inch e-Paper V2、2.13inch e-Paper (D)、2.9inch e-Paper、2.9inch e-Paper (D)
epd.Init(lut_full_update); //全刷初始化
epd.Init(lut_partial_update); //局刷初始化
  • 其他型号
epd.Init();
  • 清屏,把墨水屏刷成白色
epd.clear();

可能某些程序里面会被拆分成两句,但是他们最终的效果都是一样的:

epd.ClearFrameMemory(0xFF); 
epd.DisplayFrame();//打开显示
  • 传输一帧的图片数据并显示
void Display(const unsigned char* frame_buffer);
void DisplayFrame(const unsigned char* frame_buffer_black, const unsigned char* frame_buffer_red); //三色屏幕
  • 睡眠
epd.Sleep();

进入睡眠模式,墨水屏讲进入超低耗电,如果长时间不用需要刷白保存,否则长时间会有残影。

上层应用

上层应用也就是我们的需要用墨水屏实现的功能,一般就是画图、字符等功能,也就是epdpaint.cpp里面定义的功能
首先需要讲解一下缓存的坐标系,为了传输方便通常吧坐上定位原点,往右X轴增加,往下Y轴增加:
E-paper arduino pic1.png

打开epdpaint.h可以看到如下:
E-paper arduino ide codeDescription2.png
只需要看public下函数即可:

  • 初始化图片缓存
Paint(unsigned char* image, int width, int height);

第一个参数是图片缓存,第二个参数是定义图片长度,第三个参数定义图片高度,你可能会在程序中看到如下

Paint paint(image, 0, 0);    // width should be the multiple of 8

第二、三个参数这里设置成0,是因为下面还可以设置。

  • 设置高宽、获取高宽、设置翻转角度、获取翻转角度
int  GetWidth(void); //得到宽度
void SetWidth(int width);//设置宽度
int  GetHeight(void);//得到高度
void SetHeight(int height);//设置高度
int  GetRotate(void);//得到翻转角度
void SetRotate(int rotate);//设置翻转角度
  • 获取图像缓存
unsigned char* GetImage(void);
  • 画点
void DrawPixel(int x, int y, int colored);

在坐标(x,y)

  • 写字符
void DrawCharAt(int x, int y, char ascii_char, sFONT* font, int colored);

在(x,y)这一点为左顶点写字符ascii_char,字体大小为font,颜色为colored

  • 写字符串
void DrawStringAt(int x, int y, const char* text, sFONT* font, int colored);

在(x,y)这一点为左顶点写字符串text,字体大小为font,颜色为colored

  • 画线
void DrawLine(int x0, int y0, int x1, int y1, int colored);

以(x0,y0)为起点,(x1,y1)为终点画一条线,斜率任意;

  • 画横线
void DrawHorizontalLine(int x, int y, int width, int colored);

以(x0,y0)为起点,(x1,y1)为终点画一条横线,速度比DrawLine()快

  • 画竖线
void DrawVerticalLine(int x, int y, int height, int colored);

以(x0,y0)为起点,(x1,y1)为终点画一条竖线,速度比DrawLine()快

  • 矩形,画空心框
void DrawRectangle(int x0, int y0, int x1, int y1, int colored);

以(x0,y0)为起点,(x1,y1)为终点画一个框,边的颜色为colored

  • 填充矩形,画实心框
void DrawFilledRectangle(int x0, int y0, int x1, int y1, int colored);

以(x0,y0)为起点,(x1,y1)为终点画一个框,并且内部填充,颜色为colored

  • 画空心圆
void DrawCircle(int x, int y, int radius, int colored);

以(x,y)为圆心,radius为半斤画一个空心圆,颜色为colored

  • 画实心圆
void DrawFilledCircle(int x, int y, int radius, int colored);

以(x,y)为圆心,radius为半斤画一个实心心圆,颜色为colored

资料

资料

提供文档、程序、数据手册等全套资料

文档

程序

数据手册

开发资料

相关链接

树莓派入门教程(新)
树莓派入门教程
树莓派OpenCV教程
树莓派littleGL系列教程
树莓派QT教程
树莓派OpenWrt教程

STM32cubeMX系列教程


FAQ


  • 【工作条件】温度范围:0~40°C ;湿度范围:35%~65%RH
  • 【存储条件】:温度范围:30°C以下; 湿度范围:55%RH以下;存储最长时间:3个月
  • 【运输条件】:温度范围:-25~60°C ;运输最长时间:10天
  • 【拆包后】:温度范围:20°C±5°C ; 湿度范围:50±5%RH;存储最长时间:72小时内完成组装

三色电子墨水屏在存储的时候,显示画面需要保持白屏状态,显示面朝上放置,并且至少三个月内做一次刷新操作


  • 是的,e-Paper在批量时,会有一些色差,这属于正常现象。把e-paper正面朝上存放,可在一定程度上减小偏红/黄的现象。


  • 三色e-Paper作为单色屏使用,需要加载外部波形的方式实现。


FAQ

软件问题

  • 输入命令: ls /dev/spi*
  • 出现结果可能如图 RPI FAQ 1.jpg
  • 这是因为在 /boot/config.txt 文件中对SPI接口进行了占用 RPI FAQ 2.jpg
  • 解决方法如下:
    • 删除 /boot/config.txt 文件中对 spi0-0 的占用
    • 修改 /e-Paper/RaspberryPi_JetsonNano/lib/waveshare_epd/epdconfig.py 文件中图片所示位置,将其改为0,1
    • RPI FAQ 3.jpg


  • 我们例程使用的是 STM32f103ZET6,如果客户在 MDK 中修改其他的型号,例如 STM32F103RBT6,RAM 空间变小了,需要在原基础上修改启动文件中的 stack size 和 heap size。


  • 如果是三色屏,在需要传输 B/W 数据时,使用 Data Start Transmission 1;在传输 RED 数据时,使用 Data Start Transmission 2
  • 如果是双色屏,只能显示黑白两色。在 Data Start Transmission 1 时,发送上一次的数据,即所谓的“OLD”数据,一般在程序中就直接发送 0x00;在 Data Start Transmission 2 时,就发送需要刷新的数据,即所谓的“NEW”数据。


  • 我们的例程的中文字库是使用 GB2312 的编码方式,请将您的 xxx_test.c 文件改成 GB2312 编码格式编译下载后即可正常显示。


  • 可以通过 Border Waveform Control 寄存器或者 VCOM AND DATA INTERVAL SETTING 寄存器设置边框显示颜色。


  • 这种情况需要客户减少局刷位置并且在局刷5次后进行一次清屏。


  • 电子墨水屏重新唤醒的过程,实际是重新上电的过程,所以 EPD 在 wake up 时,要先进行清屏的动作,这样才能最大程度地避免残影现象。


  • 可能是 SPI 驱动不成功导致的:
    • 1.先检查接线是否正确。
    • 2.在检查 SPI 是否开启,参数是否配置正确。(波特率、模式等参数)


  • 墨水屏从局刷切换为全刷时需要加入全刷初始化函数。


  • 可能是之前运行过C语言的基于 BCM2835 库的例程,此时需要重启树莓派再运行 python 例程。


  • 使用指令 "sudo apt-get install python-imaging" 安装一下 imaging 函数库。


硬件问题

  • 可以,现在已经板载了电平转换芯片,支持 5V 驱动。


  • 墨水屏额定输入电压是 2.3~3.6V,如果是 5V 系统需要做电平转换,另外电压最好不要低于 2.5V,以免影响墨水屏显示效果。
  • 器件选型可以使用我们提供的原理图中的型号或者根据数据手册选择都是可以的。


  • 可以,注意需要时序正确。


  • 确认 SPI 通信是否正常。
  • 确认 BUSY 引脚是否正常初始化为输入模式。
  • 可能是没有正常复位,尝试缩短复位时低电平的持续时间。(因为驱动电路加入了断电开关,复位低电平过长会导致驱动板断电导致复位失败)
  • 如果判忙函数有发送 0x71 命令,可以尝试注释掉。


  • 1.64inch、2.36inch、3inch,为0.5mm 间距,26Pin
  • 1.02inch,为0.5mm 间距,30Pin
  • 4.37inch、7.3inch,为0.5mm 间距,50Pin
  • 其余(非并口),为0.5mm 间距,24Pin。


  • 排线插座 0.5-XXpin 后翻盖式 2.0H(FPC连接器)。


屏幕问题

  • 【工作条件】温度范围:0~50°C;湿度范围:35%~65%RH。
  • 【存储条件】:温度范围:30°C以下; 湿度范围:55%RH 以下;存储最长时间:6个月。
  • 【运输条件】:温度范围:-25~70°C;运输最长时间:10天。
  • 【拆包后】:温度范围:20°C±5°C; 湿度范围:50±5%RH;存储最长时间:72小时内完成组装。


  • 刷新模式:
    • 全刷:电子墨水屏在刷新过程中会闪烁多次(闪烁次数取决于刷新时长),闪烁是为了清除残影达到最佳的显示效果。
    • 局刷:电子墨水屏在刷新过程中无闪烁效果。使用局刷功能的用户注意在刷新几次之后,要进行一次全刷操作清除残影,否则残影问题会越来越严重,甚至损坏屏幕。(目前只有部分黑白电子墨水屏支持局刷,具体参考产品页面说明)
  • 刷新频率:
    • 使用过程中,建议客户设置电子墨水屏的刷新间隔至少为180秒。(支持局刷功能的产品除外)
    • 待机过程(即刷新操作后)建议客户将电子墨水屏设置为睡眠模式,或者断电操作(可以将墨水屏供电部分用模拟开关断开), 降低功耗并且延长电子墨水屏寿命。(部分电子墨水屏如果长时间处于上电状态的话,会出现屏幕损坏无法修复的情况
    • 三色电子墨水屏在使用的过程中,建议客户至少每24小时更新一次显示画面。(如果屏幕长时间保持同一个画面,会出现烧屏情况难以修复)
  • 使用场所:
    • 电子墨水屏建议是在室内使用。如果在户外使用,需要避免电子墨水屏受阳光直射,同时要做好紫外线防护措施,因为带电粒子长时间在强光的照射下会发干,导致失去活性无法刷新,这种情况是不可逆的。在设计电子墨水屏产品的时候,客户注意要确定好使用环境是否满足电子墨水屏的要求。


  • 理想情况下,正常使用,可以刷新 1000000次(100万次)。


  • 长时间上电开发板,在每次刷新操作之后,建议将屏幕设置为睡眠模式或者直接断电处理,否则屏幕长时间处于高电压状态下可能烧坏屏幕。


  • 可以,但是需要用软件重新做电子纸初始化操作。


  • 可能 SPI 速率过高,导致数据丢失,尝试降低 SPI 速率。
  • 供电不足或者电源不稳定导致数据丢失。
  • 数据线过长导致数据丢失,延长线最好不要超过20cm。


  • 电泳电子纸的显示灰阶由粒子在微胶囊或者微杯的空间位置所决定,黑色粒子与白色粒子在电压的作用下发生电泳现象,这种促使粒子发生电泳运动的电压时序就是电子纸的驱动波形。驱动波形为电子纸显示器的核心部分,对驱动波形的优化将直接影响显示器的显示效果。而驱动波形文件是用来说明促使粒子发生电泳运动的电压时序而形成的参数,在电子纸刷新时需要定期被调用。
  • 不同批次的电子纸膜片,电泳矩阵因为材料、制作工艺等原因,在驱动显示时所需电压值会有所差异,反映在灰度与电压、温度关系的就是电子墨水屏的波形。一般来说,每一批次的电泳矩阵生成后,会有相应的波形文件,以 .wbf 文件形式存在,由膜片生产商将波形文件和电泳矩阵提供给生产电子纸屏的厂家,再由生产电子纸屏厂家集成保护板、基板和驱动器以后提供给客户;如果波形文件和屏幕不对应,很可能造成无法显示或者显示效果不理想。一般出厂时波形文件已经 OTP 内置于墨水屏的驱动 IC 内,并且我们提供的部分程序也有调用外部的波形文件来驱动电子墨水屏。


  • LUT 是 LOOK UP TABLE 的缩写,OTP 是 ONE TIME PROGRAM 的缩写,LUT 本意就是加载波形文件,而波形文件分 OTP 和 REGISTER 两种,其中 OTP 为内置波形存储方式,REGISTER 为外置波形存储方式。


  • 主要有两种类型的墨水屏:
    • 一种是先刷背景图。
    • 另外一种是交替刷新旧数据和新数据。


  • 在不同位置同时局刷需要在程序设计进行操作,即先把不同位置的数据刷到电子纸 IC 内,最后统一做好 Updata/TurnOnDisplay。


  • 是的,e-Paper 在批量时,会有一些色差,这属于正常现象。把 e-Paper 正面朝上存放,可在一定程度上减小偏红/黄的现象。



  • 目前所有屏幕都有内置温度传感器,也可以使用 IIC 管脚外置 LM75 温度传感器。


售后

联系人:张工
邮箱:3004637648@qq.com
QQ:3004637648
微信:扫下方二维码添加
QRCode SiminZhang.png

说明:进行售后服务前,请准备好客户信息(定货单位、定货人等),以供验证