2.13inch Touch e-Paper HAT

2.13inch Touch e-Paper HAT
2.13inch Touch e-Paper HAT
2.13inch Touch e-Paper HAT (with case)
{{{name2}}}
{{{name3}}}
基本信息
分类: 树莓派模块
{{{userDefinedInfo1}}}: {{{userdefinedvalue1}}}
{{{userDefinedInfo2}}}: {{{userdefinedvalue2}}}
{{{userDefinedInfo3}}}: {{{userdefinedvalue3}}}
品牌: Waveshare
功能简介
特性 树莓派2.13英寸触控墨水屏 可局部刷新
显示(触控)分辨率 250x122
显示颜色 黑、白
' 无特性,不解释
' 无特性,不解释
接口 I2C RPi SPI
相关产品
1.54inch e-Paper Module

1.54inch e-Paper Module (B)
1.54inch e-Paper Module (C)
2.13inch e-Paper HAT
2.13inch e-Paper HAT (B)
2.13inch e-Paper HAT (C)
2.13inch e-Paper HAT (D)
2.13inch Touch e-Paper HAT
2.66inch e-Paper Module
2.66inch e-Paper Module (B)
2.7inch e-Paper HAT
2.7inch e-Paper HAT (B)
2.9inch e-Paper Module
2.9inch e-Paper Module (B)
2.9inch e-Paper Module (C)
2.9inch e-Paper HAT (D)
2.9inch Touch e-Paper HAT
3.7inch e-Paper HAT
4.01inch e-Paper HAT (F)
4.2inch e-Paper Module
4.2inch e-Paper Module (B)
4.2inch e-Paper Module (C)
4.3inch e-Paper UART Module
5.65inch e-Paper Module (F)
5.83inch e-Paper HAT
5.83inch e-Paper HAT (B)
5.83inch e-Paper HAT (C)
6inch e-Paper HAT
6inch HD e-Paper HAT
7.5inch e-Paper HAT
7.5inch e-Paper HAT (B)
7.5inch e-Paper HAT (C)
7.5inch HD e-Paper HAT
7.5inch HD e-Paper HAT (B)
7.8inch e-Paper HAT
9.7inch e-Paper HAT
10.3inch e-Paper HAT
10.3inch e-Paper HAT (D)
12.48inch e-Paper Module
12.48inch e-Paper Module (B)
13.3inch e-Paper HAT

驱动板:
E-Paper ESP32 Driver Board
E-Paper ESP8266 Driver Board
E-Paper Driver HAT
E-Paper Shield

♦ {{{Product2}}}
♦ {{{Product3}}}
♦ {{{Product4}}}
♦ {{{Product5}}}
—— 类目1 ——
♦ 类目1

列表1

♦ 类目2

列表2

♦ 类目3

列表3

♦ 类目4

列表4

♦ 类目5

列表5

目录

说明

2.13inch触控墨水屏模块

特点

  • 尺寸: 2.13 inch
  • 外形尺寸(模块):69.15mm × 38.9mm
  • 外形尺寸(驱动板):59.51mm × 34.00mm
  • 显示尺寸:48.55mm × 23.71mm
  • 工作电压:3.3V(V1.1版本支持5V)
  • 通信接口:SPI
  • 点距:0.194* 0.194
  • 分辨率:250*122
  • 显示颜色:黑、白
  • 灰度等级:2
  • 局部刷新 :0.3s
  • 全局刷新 :2s
  • 刷新功耗 : 26.4mW(typ.)
  • 触控点数 :5(MAX)
  • 触摸类型 :电容触摸
  • 触摸接口 :I2C
  • 触摸面板 :钢化玻璃面板

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

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个像素点了。

打击盗版声明

敬告:本产品已获相关专利,仿造必追究其法律责任!

市面上存在不少抄袭微雪产品的不法商户,这些不法商户的一般特点是:

①抄袭网页说明、产品图片及产品资料,没能力应对技术问题和产品售后。

②不重视产品质量,采用劣质材料,裁减配置。


如果你对这个行业有所了解,你应该很清楚微雪在这个行业是什么角色。(我们不用极限词)

微雪的价值观是创新,我们致力于推动科学技术的发展。

我们有一支技术团队在专门从事墨水屏相关的设计与研发工作,并且我们将相关的研发成果都发布在网络上。

如果你购买了我们的产品,我们会很感激,因为这可以让我们养得起家、让我们可以更加坚定我们的理想。

如果你没有购买我们的产品,也没有关系,我们所有资料都是公开的。


但有些不法商户,使用着微雪提供的技术资料,使用劣质材料山寨出相关产品后,打着微雪的旗号在招摇撞骗,严重影响了我们的品牌声誉。

甚至让购买了他们山寨产品的用户来找我们做技术支持!

这无疑损坏了那些支持我们、购买我们产品的用户利益。


在这里我们奉劝各位,不要购买价格异常、打着兼容微雪旗号的产品。

那些山寨产品之所以可以做到很低的价格,主要是以下几方面:

1. 物料方面。

山寨产品使用了质量有问题的墨水屏。

墨水屏有很多种规格,A规、B规和C规等等。

微雪使用的墨水屏是行业最高标准的屏,而山寨使用的可能是B规、C规或者更差的屏。

这些屏大多是垃圾,是其他客户挑剩的屏!

如果你运气好,买到B规的,可能是多几个坏点,还能用,也可能发现显示会偏色(但你没对比,也发现不了。不良商家就这么想)。

如果你运气差一点买到拆机屏或者维修屏?那我希望你还没把它用到项目中,这是你项目的定时炸弹。

那些屏说不准哪天就不能显示了。

2. 生产/质检方面。

显示屏生产出来后,都是需要老化测试的。

通常经过12小时的老化,有质量问题的都会被检出,而如果一个产品无故障出现,那么它大概率不会有质量问题。

据我们了解,很多不法商户仅仅是通电能显示就算通过。

因为做老化测试,是需要时间的,时间就是成本。

3. 研发方面。

这方面怎么节约成本的?最简单的方式就是抄袭了。

抄来的作业,你还认为他们真懂?

4. 服务方面。

山寨产品技术服务为0。

而使用微雪产品,我们在服务方面有以下优势:

不断更新的线上资料(微雪百科

资源丰富的线上课堂(微雪课堂

靠谱的售后服务方式(电话/email/QQ

Raspberry Pi

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

硬件连接

连接树莓派的时候,可以直接插到树莓派的40PIN排针上去,注意对好引脚。如果是选择用12PIN排线连接的话,请参考下方的引脚对应表格

树莓派连接引脚对应关系
Touch 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
ERST 17 11
BUSY 24 18
INT 27 13
SCL SCL1 5
SDA SDA1 3
TRST 22 15

以2.13inch Touch e-Paper HAT为例,直接插在树莓派上即可:
Touch ePaper HAT con.jpg

树莓派软件说明

开启SPI接口

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

RPI open spi.png
然后重启树莓派:

sudo reboot

请确保SPI没有被其他的设备占用,你可以在/boot/config.txt中间检查

树莓派软件说明

打开I2C接口

  • 打开树莓派终端,输入以下指令进入配置界面
sudo raspi-config 
选择 Interfacing Options -> I2C ->yes 启动 i2C 内核驱动

RPI open i2c.png
然后重启树莓派:

sudo reboot

安装库

  • 安装BCM2835, 打开树莓派终端,并运行以下指令
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.68.tar.gz
tar zxvf bcm2835-1.68.tar.gz 
cd bcm2835-1.68/
sudo ./configure && sudo make && sudo make check && sudo make install
# 更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/
  • 安装wiringPi
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版本,如果没有出现说明安装出错
  • 安装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

下载测试程序

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

cd ~
wget https://www.waveshare.net/w/upload/3/3e/Touch_e-Paper_Code.zip
unzip Touch_e-Paper_Code.zip -d Touch_e-Paper_Code

如果unzip解压遇到问题可使用7z解压:
sudo apt-get install p7zip-full
7z x Touch_e-Paper_Code.zip -o./Touch_e-Paper_Code

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

cd ~
git clone https://github.com/waveshare/Touch_e-Paper_HAT

运行测试程序

C语言

  • 进入C语言例程目录
cd ~/Touch_e-Paper_Code/c
  • (可选)修改Makefile的14-16行切换依赖库,程序默认使用BCM2835,速度最快。(使用过BCM2835后再用别的库需要重启才能正常运行)

如下图,切换注释即可:
Touch ePaper HAT makefile.jpg

  • 修改 main.c 文件选择相应的测试程序:将对应的函数取消注释即可
  • 重新编译,然后运行程序,编译过程可能需要几秒
在c目录下,运行以下指令
sudo make clean
sudo make -j4
sudo ./main

python

  • 进入python程序目录
cd ~/Touch_e-Paper_Code/python/examples
  • 运行对应屏幕的例程,程序支持python2/3

以2.13inch Touch e-Paper HAT为例,输入

# python2
sudo python2 TP2in13_test.py
# python3
sudo python3 TP2in13_test.py

API 解析

程序分为底层硬件接口、中间层墨水屏驱动和触摸驱动、上层应用;

C

底层硬件接口

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

C语言使用了3种方式进行驱动:分别是BCM2835库、WiringPi库和文件IO
默认使用BCM2835库进行操作,如果你需要使用其他库来驱动的话,可以打开Touch_e-Paper_Code\c\Makefile,修改14-16行,如下:

Touch ePaper HAT makefile.jpg

  • 数据类型:
#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.DEV_Module_Exit()之后整个模块会进入低功耗,经过测试这个功耗基本为0;
  • GPIO读写:

UBYTE DEV_Digital_Read(UWORD Pin); void DEV_Digital_Write(UWORD Pin, UBYTE Value);

  • SPI写数据

void DEV_SPI_WriteByte(UBYTE Value); void DEV_SPI_Write_nByte(uint8_t *pData, uint32_t Len);

  • I2C读写数据

UBYTE I2C_Read_Byte(UWORD Reg, char *Data, UBYTE len); UBYTE I2C_Write_Byte(UWORD Reg, char *Data, UBYTE len);

中间层墨水屏驱动

e-paper驱动代码文件,在目录:Touch_e-Paper_Code\c\lib\e-paper
打开.h可以看到如下的函数

  • 墨水屏初始化,在屏幕开始工作时和退出睡眠模式之后调用
void EPD_xxx_Init(void);

其中xxx表示,墨水屏型号。如是是2.13_V2,全屏初始化那么是EPD_2IN13_V2_Init(),

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

其中xxx表示,墨水屏型号。如是是2.13_V2,那么是EPD_2IN13_V2_Clear()

  • 传输一帧的图片数据并打开显示
//黑白双色墨水屏
void EPD_xxx_Display(UBYTE *Image);
//黑白红或黑白黄墨水屏
void EPD_xxx_Display(const UBYTE *blackimage, const UBYTE *ryimage);
//2.13inch e-paper V2由于控制芯片升级,对于局部刷新,需要调用EPD_xxx_DisplayPartBaseImage显示静态的背景图片,也就是以这个图片为基础进行局部刷新,然后调用动态的EPD_xxx_DisplayPart()
void EPD_2IN13_V2_DisplayPart(UBYTE *Image);
void EPD_2IN13_V2_DisplayPartBaseImage(UBYTE *Image);
  • 进入睡眠模式
void EPD_xxx_Sleep(void);

注意进入了睡眠模式,只有两个方式能够重新工作:第一种硬件复位,第二种重新调用初始化函数
其中xxx表示,墨水屏型号。如是是2.13_V2,那么是EPD_2IN13_V2_Sleep()

中间层触控驱动

触摸控制驱动代码,在目录:Touch_e-Paper_Code\c\lib\Driver
打开.h文件可以看到函数列表(以GT1151为例)

  • 触控初始化及其相关函数:
void GT_Init(void); // 初始化
void GT_Reset(void); // 复位
void GT_ReadVersion(void); // 读取版本信息

其中,复位函数和读取版本信息在初始化时被调用

  • 触控芯片读写数据
void GT_Read(UWORD Reg, char *Data, UBYTE len); // 触控读数据
void GT_Write(UWORD Reg, char *Data, UBYTE len); // 触控写数据

Reg为寄存器地址,Data为数据缓冲区的地址,len为要读写的长度

  • 扫描触摸信号
UBYTE GT_Scan(void); // 扫描触摸信号

返回的数据存在结构体GT1151_Dev中

上层应用

对于屏幕而言,如果需要进行画图、显示中英文字符、显示图片等怎么办,这些都是上层应用做的。这有很多小伙伴有问到一些图形的处理,我们这里提供了一些基本的功能 在如下的目录中可以找到GUI,在目录:Touch_e-Paper_Code\c\lib\GUI\GUI_Paint.c(.h)
E-paper Driver HAT GUI.png
在如下目录下是GUI依赖的字符字体,在目录:Touch_e-Paper_Code\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三层代码结构,这里稍微讲解一下用户测试代码
在目录:Touch_e-Paper_Code\c\examples,为全部的测试代码
示例程序展示了画板和相册功能,用户可以按照已有的图片名字和尺寸自行替换图片以在该程序的基础上进行二次开发

Python(适用于Raspberry Pi)

适用于python2.7和python3
对于python而言他的调用没有C复杂
库文件都在:Touch_e-Paper_Code\python\lib\TP_lib\

epdconfig.py

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

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

  • 墨水屏初始化,再屏幕开始工作时和退出睡眠模式之后调用
def init(self)
  • 清屏,把墨水屏刷成白色
def Clear(self)
  • 把图片转换成数组
def getbuffer(self, image)
  • 传输一帧的图片数据并打开显示
def display(self, image)

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

def displayPartBaseImage(self, image)
def displayPart(self, image)
  • 进入睡眠模式
def sleep(self)

main.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,官方的是英文的,如果感觉对你不友好,当然我们国内也有很多的优秀的博客都有讲解。

资料

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

文档

程序

数据手册

开发资料

相关资料

相关链接

树莓派入门教程
树莓派OpenCV教程
树莓派littleGL系列教程
树莓派QT教程
树莓派OpenWrt教程
教程名6
  • 列表6

STM32cubeMX系列教程

问题:电子墨水屏的使用环境?
答复:
  • 【工作条件】温度范围: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小时更新一次显示画面(如果屏幕长时间保持同一个画面,会出现烧屏情况难以修复)
  • 使用场所
    • 电子墨水屏建议是在室内使用。如果在户外使用,需要避免电子墨水屏受阳光直射,同时要做好紫外线防护措施。在设计电子墨水屏产品的时候,客户注意要确定好使用环境是否满足电子墨水屏的温湿度要求


问题:Arduino3.3V能不能驱动墨水屏?
答复:
  • 可以,现在已经板载了电平转换芯片,支持3.3V驱动


问题:使用一段时间之后屏幕刷新(全刷)出现严重残影问题无法修复?
答复:
  • 长时间上电开发板,在每次刷新操作之后,建议将屏幕设置为睡眠模式或者直接断电处理,否则屏幕长时间处于高电压状态下可能烧坏屏幕


问题:e-Paper显示偏黑或者颜色偏浅?
答复:
  • 可以调节程序中Vcom的值改变显示对比度,带局刷的屏幕改善效果特别明显。


问题:e-Paper显示黑边框?
答复:
  • 可以通过Border Waveform Control寄存器 或者VCOM AND DATA INTERVAL SETTING寄存器设置边框显示颜色。


问题:屏幕排线接口是什么规格?
答复:
  • 0.5mm间距,24Pin。


问题: 运行python程序的时候报错ImportError: No module named Image?
答复:
  • 使用指令sudo apt-get install python-imaging 安装一下imaging函数库


问题: 多个位置局刷,局刷几次后字体偏浅?
答复:
  • 这种情况需要客户减少局刷位置并且在局刷5次后进行一次清屏(提高VCOM的电压可以改善颜色,但是带来是残影加重)。


问题: 墨水屏进入深入睡眠模式后,是否可以再次刷新?
答复:
  • 可以,但是需要用软件重新做电子纸初始化操作。


问题: 2.9寸的EPD 在deep sleep mode时,第一次唤醒画面刷新会有不干净的问题,请问如何解决?
答复:
  • 电子墨水屏重新唤醒的过程,实际是重新上电的过程,所以EPD在wake up时,要先进行清屏的动作,这样才能最大程度地避免残影现象。


问题: 关于datasheet的问题。客户问字库什么时候传输Data Start Transmission 1,什么时候用 Data Start Transmission 2.在KW mode 下,什么是“OLD”数据,什么是"NEW"数据。
答复:
  • 如果是三色屏,在需要传输B/W数据时,使Data Start Transmission 1,在传输RED数据时,使用Data Start Transmission 2,因为2.13inch e-Paper HAT (D)只能显示黑白两色,所以工作在KW模式Data Start Transmission 1时,发送上一次的数据,即所谓的old,在程序中就直接发送0x00,在Data Start Transmission 2时,就发送需要刷新的数据,即所谓的“NEW”数据。


问题: 墨水屏使用的是什么型号的连接器?
答复:
  • 排线插座 0.5-24pin 后翻盖式 2.0H(FPC连接器)


问题: 裸屏产品出货时是否有表面覆膜?
答复:
  • 有覆膜


问题: 请问e-Paper内置温度传感器吗?
答复:
  • 是的,也可以使用IIC管脚外置LM75温度传感器


问题: 测试程序时,程序一直卡在e-Paper busy
答复:
  • 可能是spi驱动不成功导致的1.先检查接线是否正确2.在检查spi是否开启,参数是否配置正确(spi的波特率,spi模式等参数)


问题: 这款电子墨水屏的刷新次数是多少/使用寿命是多少?
答复:
  • 理想情况下,正常使用,可以刷新1000000次(100万次)


问题: stm32驱动墨水屏,MDK编译显示空间不够?
答复:
  • 我们例程使用的是stm32f103zet6,如果客户在MDK中修改其他的型号,例如stm32f103rbt6,ram空间变小了,需要在原基础上修改启动文件中的stack size和heap size


EMAIL:2355742828@qq.com
电话:0755-83040712
QQ:2355742828
微信:扫下方二维码添加
Chz.png
* 企业微信添加好友时软件无提示,我们无法及时通过客户好友申请。如长时间无响应,请用其他联系方式。

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

Call-of-duty-V2.jpg