<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://www.ingcool.com/w/index.php?action=history&amp;feed=atom&amp;title=E-paper_for_Arduino_Use</id>
	<title>E-paper for Arduino Use - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://www.ingcool.com/w/index.php?action=history&amp;feed=atom&amp;title=E-paper_for_Arduino_Use"/>
	<link rel="alternate" type="text/html" href="http://www.ingcool.com/w/index.php?title=E-paper_for_Arduino_Use&amp;action=history"/>
	<updated>2026-04-03T18:56:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.7</generator>
	<entry>
		<id>http://www.ingcool.com/w/index.php?title=E-paper_for_Arduino_Use&amp;diff=314&amp;oldid=prev</id>
		<title>INKU-admin123 at 07:39, 8 June 2020</title>
		<link rel="alternate" type="text/html" href="http://www.ingcool.com/w/index.php?title=E-paper_for_Arduino_Use&amp;diff=314&amp;oldid=prev"/>
		<updated>2020-06-08T07:39:10Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://www.ingcool.com/w/index.php?title=E-paper_for_Arduino_Use&amp;amp;diff=314&amp;amp;oldid=186&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>INKU-admin123</name></author>
		
	</entry>
	<entry>
		<id>http://www.ingcool.com/w/index.php?title=E-paper_for_Arduino_Use&amp;diff=186&amp;oldid=prev</id>
		<title>INKU-admin123: 创建页面，内容为“==Arduino使用例程== 例程均在Arduino uno上进行了测试，如果需要是其他型号的Arduino需要自己确定连接的管脚是否正确。&lt;br /&gt; ===…”</title>
		<link rel="alternate" type="text/html" href="http://www.ingcool.com/w/index.php?title=E-paper_for_Arduino_Use&amp;diff=186&amp;oldid=prev"/>
		<updated>2020-04-21T06:40:16Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“==Arduino使用例程== 例程均在Arduino uno上进行了测试，如果需要是其他型号的Arduino需要自己确定连接的管脚是否正确。&amp;lt;br /&amp;gt; ===…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Arduino使用例程==&lt;br /&gt;
例程均在Arduino uno上进行了测试，如果需要是其他型号的Arduino需要自己确定连接的管脚是否正确。&amp;lt;br /&amp;gt;&lt;br /&gt;
===硬件连接===&lt;br /&gt;
{|border=1; style=&amp;quot;width:700px;&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|+Arduino UNO连接引脚对应关系&lt;br /&gt;
|-style=&amp;quot;background:#2D6FDF; color:white;&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|e-Paper||Arduino&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Vcc||5V&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|GND||GND&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|DIN||D11&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|CLK||D13&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|CS||D10&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|DC||D9&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RST||D8&lt;br /&gt;
|-align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BUSY||D7&lt;br /&gt;
|}&lt;br /&gt;
===安装编译软件（windows教程）===&lt;br /&gt;
*打开浏览器，访问[https://www.arduino.cc/en/Main/Software arduinoIDE的官方下载页面]，不熟练英文没关系，可以切换到中文(点击可放大)：&amp;lt;br /&amp;gt;&lt;br /&gt;
*点击此处下载软件&amp;lt;br /&amp;gt;&lt;br /&gt;
[[file:e-paper_arduino_ide_software2.png]]&amp;lt;br /&amp;gt;&lt;br /&gt;
*打开刚刚的下载的安装软件，双击安装，一路点击next即可：&amp;lt;br /&amp;gt;&lt;br /&gt;
*快安装完成的时候，会弹出安装USB驱动，点击安装&amp;lt;br /&amp;gt;&lt;br /&gt;
*安装完成，桌面生成了快捷打开方式，双击打开之后弹出arduino IDE软件&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==运行程序==&lt;br /&gt;
*在资料下载示例程序，然后解压。Arduino程序位于	~/Arduino/… &amp;lt;br /&amp;gt;&lt;br /&gt;
*打开2.13inch的程序&amp;lt;br /&amp;gt;&lt;br /&gt;
*打开程序，选择开发板型号Arduino  UNO&amp;lt;br /&amp;gt;&lt;br /&gt;
*选择对应COM口&amp;lt;br /&amp;gt;&lt;br /&gt;
*然后点击编译并下载即可&amp;lt;br /&amp;gt;&lt;br /&gt;
【注意】由于arduino UNO的flash十分小，几款大尺寸的屏幕使用MEGA2560效果更佳：&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==程序说明==&lt;br /&gt;
===文件说明===&lt;br /&gt;
以Arduino UNO控制2.13寸墨水屏为例，打开epd2in13 v2目录：&amp;lt;br /&amp;gt;&lt;br /&gt;
[[file:e-paper_arduino_ide_codeDescription1.png]]&amp;lt;br /&amp;gt;&lt;br /&gt;
其中：&amp;lt;br /&amp;gt;&lt;br /&gt;
epd2in13.ino：使用Arduino IDE打开即可；&amp;lt;br /&amp;gt;&lt;br /&gt;
epd2in13.cpp(.h):是墨水屏的驱动程序；&amp;lt;br /&amp;gt;&lt;br /&gt;
epdif.cpp(.h):是硬件接口定义，里面封装了读写管脚电平，SPI传输数据，以及管脚初始化；&amp;lt;br /&amp;gt;&lt;br /&gt;
font8.cpp、font12.cpp、font16.cpp、font20.cpp、font24.cpp、fonts.h：为不同大小字符的模；&amp;lt;br /&amp;gt;&lt;br /&gt;
imagedata.cpp(.h)：是图片数据，这个可以通过Img2Lcd(在开发资料中可下载)把2位深度的BMP图片转换成数组。&amp;lt;br /&amp;gt;&lt;br /&gt;
程序分为底层硬件接口、中间层墨水屏驱动、上层应用；&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===底层硬件接口===&lt;br /&gt;
在epdif.cpp(.h)两个文件中定义了硬件接口，并封装好读写管脚电平、延时、SPI传输等函数。&amp;lt;br /&amp;gt;&lt;br /&gt;
;写管脚电平 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void DigitalWrite(int pin, int value)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
第一个参数为管脚、第二个为高低电平。&amp;lt;br /&amp;gt;&lt;br /&gt;
;读管脚电平 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int DigitalRead(int pin)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
参数为管脚，返回值为读取管脚的电平。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;延时 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DelayMs(unsigned int delaytime)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
毫秒级别延时。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;SPI输出数据 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SpiTransfer(unsigned char data)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
参数为char型，占8位。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;硬件初始化 &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int IfInit(void)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
里面已经封装好了各管脚的输入输出，以及SPI的初始化。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===中间层墨水屏驱动===&lt;br /&gt;
;实例化墨水屏&lt;br /&gt;
由于Arduino是C++开发，需要把墨水屏实例化：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Epd epd;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;墨水屏初始化，再屏幕开始工作时和退出睡眠模式之后调用&lt;br /&gt;
*2.13inch e-Paper，2.9inch e-Paper&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
epd.Init(lut_full_update); //全刷初始化&lt;br /&gt;
epd.Init(lut_partial_update); //局刷初始化&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*4.2inch e-Paper&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
epd.Init();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;清屏，把墨水屏刷成白色&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
epd.clear();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
可能某些程序里面会被拆分成两句，但是他们最终的效果都是一样的：&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
epd.ClearFrameMemory(0xFF); &lt;br /&gt;
epd.DisplayFrame();//打开显示&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;传输一帧的图片数据并显示&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void Display(const unsigned char* frame_buffer);&lt;br /&gt;
void DisplayFrame(const unsigned char* frame_buffer_black, const unsigned char* frame_buffer_red); //三色屏幕&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;睡眠&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
epd.Sleep();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
进入睡眠模式，墨水屏讲进入超低耗电，如果长时间不用需要刷白保存，否则长时间会有残影。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===上层应用===&lt;br /&gt;
上层应用也就是我们的需要用墨水屏实现的功能，一般就是画图、字符等功能，也就是epdpaint.cpp里面定义的功能&amp;lt;br /&amp;gt;&lt;br /&gt;
首先需要讲解一下缓存的坐标系，为了传输方便通常吧坐上定位原点，往右X轴增加，往下Y轴增加：&amp;lt;br /&amp;gt;&lt;br /&gt;
[[file:e-paper_arduino_pic1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
打开epdpaint.h可以看到如下：&amp;lt;br /&amp;gt;&lt;br /&gt;
[[file:e-paper_arduino_ide_codeDescription2.png]]&amp;lt;br /&amp;gt;&lt;br /&gt;
只需要看public下函数即可：&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;初始化图片缓存&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Paint(unsigned char* image, int width, int height);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
第一个参数是图片缓存，第二个参数是定义图片长度，第三个参数定义图片高度，你可能会在程序中看到如下&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Paint paint(image, 0, 0);    // width should be the multiple of 8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
第二、三个参数这里设置成0，是因为下面还可以设置。&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;设置高宽、获取高宽、设置翻转角度、获取翻转角度&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int  GetWidth(void); //得到宽度&lt;br /&gt;
void SetWidth(int width);//设置宽度&lt;br /&gt;
int  GetHeight(void);//得到高度&lt;br /&gt;
void SetHeight(int height);//设置高度&lt;br /&gt;
int  GetRotate(void);//得到翻转角度&lt;br /&gt;
void SetRotate(int rotate);//设置翻转角度&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;获取图像缓存&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
unsigned char* GetImage(void);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;画点&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void DrawPixel(int x, int y, int colored);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
在坐标（x,y）&lt;br /&gt;
&lt;br /&gt;
;写字符&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void DrawCharAt(int x, int y, char ascii_char, sFONT* font, int colored);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
在（x,y）这一点为左顶点写字符ascii_char，字体大小为font，颜色为colored&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;写字符串&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void DrawStringAt(int x, int y, const char* text, sFONT* font, int colored);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
在（x,y）这一点为左顶点写字符串text，字体大小为font，颜色为colored&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;画线&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void DrawLine(int x0, int y0, int x1, int y1, int colored);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以（x0,y0）为起点，（x1,y1）为终点画一条线，斜率任意；&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;画横线&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void DrawHorizontalLine(int x, int y, int width, int colored);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以（x0,y0）为起点，（x1,y1）为终点画一条横线，速度比DrawLine()快&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;画竖线&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void DrawVerticalLine(int x, int y, int height, int colored);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以（x0,y0）为起点，（x1,y1）为终点画一条竖线，速度比DrawLine()快&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;矩形，画空心框&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void DrawRectangle(int x0, int y0, int x1, int y1, int colored);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以（x0,y0）为起点，（x1,y1）为终点画一个框，边的颜色为colored&amp;lt;br &amp;gt;&lt;br /&gt;
&lt;br /&gt;
;填充矩形，画实心框&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void DrawFilledRectangle(int x0, int y0, int x1, int y1, int colored);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以（x0,y0）为起点，（x1,y1）为终点画一个框，并且内部填充，颜色为colored&amp;lt;br &amp;gt;&lt;br /&gt;
&lt;br /&gt;
;画空心圆&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void DrawCircle(int x, int y, int radius, int colored);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以（x,y）为圆心，radius为半斤画一个空心圆，颜色为colored&amp;lt;br &amp;gt;&lt;br /&gt;
&lt;br /&gt;
;画实心圆&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void DrawFilledCircle(int x, int y, int radius, int colored);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
以（x,y）为圆心，radius为半斤画一个实心心圆，颜色为colored&amp;lt;br &amp;gt;&lt;/div&gt;</summary>
		<author><name>INKU-admin123</name></author>
		
	</entry>
</feed>