E-paper for Arduino Use

来自ingcool
INKU-admin123讨论 | 贡献2020年4月21日 (二) 14:40的版本 (创建页面,内容为“==Arduino使用例程== 例程均在Arduino uno上进行了测试,如果需要是其他型号的Arduino需要自己确定连接的管脚是否正确。<br /> ===…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

Arduino使用例程

例程均在Arduino uno上进行了测试,如果需要是其他型号的Arduino需要自己确定连接的管脚是否正确。

硬件连接

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

安装编译软件(windows教程)

E-paper arduino ide software2.png

  • 打开刚刚的下载的安装软件,双击安装,一路点击next即可:
  • 快安装完成的时候,会弹出安装USB驱动,点击安装
  • 安装完成,桌面生成了快捷打开方式,双击打开之后弹出arduino IDE软件

运行程序

  • 在资料下载示例程序,然后解压。Arduino程序位于 ~/Arduino/…
  • 打开2.13inch的程序
  • 打开程序,选择开发板型号Arduino UNO
  • 选择对应COM口
  • 然后点击编译并下载即可

【注意】由于arduino UNO的flash十分小,几款大尺寸的屏幕使用MEGA2560效果更佳:

程序说明

文件说明

以Arduino UNO控制2.13寸墨水屏为例,打开epd2in13 v2目录:
E-paper arduino ide codeDescription1.png
其中:
epd2in13.ino:使用Arduino IDE打开即可;
epd2in13.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;
墨水屏初始化,再屏幕开始工作时和退出睡眠模式之后调用
  • 2.13inch e-Paper,2.9inch e-Paper
epd.Init(lut_full_update); //全刷初始化
epd.Init(lut_partial_update); //局刷初始化
  • 4.2inch e-Paper
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轴增加:
300px

打开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