驴友花雕
发表于 2021-11-16 11:15:51
实验场景动态图
驴友花雕
发表于 2021-11-16 12:44:49
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十七:EPD Eink 电子墨水显示器 SUNY 2.9 英寸 EPD 屏幕无线数字电子纸显示器模块DEPG0290RWS800F6黑白红三色墨水屏(珠海三一科技)
实验说明:使用傲雪驱动库e-Paper
项目之二:傲雪黑白色电子计时器(测试2.9寸彩色屏)
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十七:EPD Eink 电子墨水显示器 SUNY 2.9 英寸 EPD 屏幕无线数字电子纸显示器模块DEPG0290RWS800F6黑白红三色墨水屏(珠海三一科技)
实验说明:使用傲雪驱动库e-Paper
项目之二:傲雪黑白色电子计时器(测试2.9寸彩色屏)
*/
#include <SPI.h>
#include "epd2in9_V2.h"
#include "epdpaint.h"
#include "imagedata.h"
#define COLORED 0
#define UNCOLORED 1
unsigned char image;
Paint paint(image, 0, 0);
Epd epd;
unsigned long time_start_ms;
unsigned long time_now_s;
void setup() {
Serial.begin(115200);
if (epd.Init() != 0) {
Serial.print("e-Paper init failed");
return;
}
epd.ClearFrameMemory(0xFF);
epd.DisplayFrame();
paint.SetRotate(ROTATE_0);
paint.SetWidth(128);
paint.SetHeight(24);
paint.Clear(COLORED);
paint.DrawStringAt(0, 4, "Hello world!", &Font12, UNCOLORED);
epd.SetFrameMemory(paint.GetImage(), 0, 10, paint.GetWidth(), paint.GetHeight());
paint.Clear(UNCOLORED);
paint.DrawStringAt(0, 4, "e-Paper Demo", &Font12, COLORED);
epd.SetFrameMemory(paint.GetImage(), 0, 30, paint.GetWidth(), paint.GetHeight());
paint.SetWidth(64);
paint.SetHeight(64);
paint.Clear(UNCOLORED);
paint.DrawRectangle(0, 0, 40, 50, COLORED);
paint.DrawLine(0, 0, 40, 50, COLORED);
paint.DrawLine(40, 0, 0, 50, COLORED);
epd.SetFrameMemory(paint.GetImage(), 8, 60, paint.GetWidth(), paint.GetHeight());
paint.Clear(UNCOLORED);
paint.DrawCircle(32, 32, 30, COLORED);
epd.SetFrameMemory(paint.GetImage(), 56, 60, paint.GetWidth(), paint.GetHeight());
paint.Clear(UNCOLORED);
paint.DrawFilledRectangle(0, 0, 40, 50, COLORED);
epd.SetFrameMemory(paint.GetImage(), 8, 130, paint.GetWidth(), paint.GetHeight());
paint.Clear(UNCOLORED);
paint.DrawFilledCircle(32, 32, 30, COLORED);
epd.SetFrameMemory(paint.GetImage(), 56, 130, paint.GetWidth(), paint.GetHeight());
epd.DisplayFrame();
delay(2000);
if (epd.Init() != 0) {
Serial.print("e-Paper init failed ");
return;
}
epd.SetFrameMemory_Base(IMAGE_DATA);
epd.DisplayFrame();
time_start_ms = millis();
}
void loop() {
time_now_s = (millis() - time_start_ms) / 1000;
char time_string[] = {'0', '0', ':', '0', '0', '\0'};
time_string = time_now_s / 60 / 10 + '0';
time_string = time_now_s / 60 % 10 + '0';
time_string = time_now_s % 60 / 10 + '0';
time_string = time_now_s % 60 % 10 + '0';
paint.SetWidth(32);
paint.SetHeight(96);
paint.SetRotate(ROTATE_90);
paint.Clear(UNCOLORED);
paint.DrawStringAt(0, 4, time_string, &Font24, COLORED);
epd.SetFrameMemory_Partial(paint.GetImage(), 80, 72, paint.GetWidth(), paint.GetHeight());
epd.DisplayFrame_Partial();
// delay(300);
}
驴友花雕
发表于 2021-11-16 12:46:41
实验场景图
驴友花雕
发表于 2021-11-16 12:48:10
驴友花雕
发表于 2021-11-16 12:49:16
实验场景动态图
驴友花雕
发表于 2021-11-16 19:20:50
驴友花雕
发表于 2021-11-17 06:24:24
程序说明
以Arduino UNO控制2.9寸墨水屏为例,打开epd2in9_V2目录:
其中:
epd2in9_V2.ino:使用Arduino IDE打开即可;
epd2in9_V2.cpp(.h): 是2.9寸墨水屏的驱动程序;
epdif.cpp(.h): 是硬件接口定义,里面封装了读写管脚电平,SPI传输数据,以及管脚初始化;
font8.cpp、font12.cpp、font16.cpp、font20.cpp、font24.cpp、fonts.h:为不同大小字符的模;
imagedata.cpp(.h):是图片数据,这个可以通过Img2Lcd软件把2位深度的BMP图片转换成数组。
驴友花雕
发表于 2021-11-17 06:35:47
程序分为底层硬件接口、中间层墨水屏驱动、上层应用三部分。
1、底层硬件接口
在epdif.cpp(.h)两个文件中定义了硬件接口,并封装好读写管脚电平、延时、SPI传输等函数。
(1)写管脚电平
void DigitalWrite(int pin, int value)第一个参数为管脚、第二个为高低电平。
(2)读管脚电平
int DigitalRead(int pin)参数为管脚,返回值为读取管脚的电平。
(3)延时
DelayMs(unsigned int delaytime)毫秒级别延时。
(4)SPI输出数据
SpiTransfer(unsigned char data)参数为char型,占8位。
(5)硬件初始化
int IfInit(void)里面已经封装好了各管脚的输入输出,以及SPI的初始化。
驴友花雕
发表于 2021-11-17 06:40:46
2、中间层墨水屏驱动
(1)实例化墨水屏
由于Arduino是C++开发,需要把墨水屏实例化:
Epd epd;
(2)墨水屏初始化,再屏幕开始工作时和退出睡眠模式之后调用
主要型号
epd.Init(lut_full_update); //全刷初始化
epd.Init(lut_partial_update); //局刷初始化
其他型号
epd.Init();
(3)清屏,把墨水屏刷成白色
epd.clear();可能某些程序里面会被拆分成两句,但是他们最终的效果都是一样的:
epd.ClearFrameMemory(0xFF);
epd.DisplayFrame();//打开显示
(4)传输一帧的图片数据并显示
void Display(const unsigned char* frame_buffer);
void DisplayFrame(const unsigned char* frame_buffer_black, const unsigned char* frame_buffer_red); //三色屏幕
(5)睡眠
epd.Sleep();进入睡眠模式,墨水屏讲进入超低耗电,如果长时间不用需要刷白保存,否则长时间会有残影。
驴友花雕
发表于 2021-11-17 06:50:39
3、上层应用上层应用也就是我们的需要用墨水屏实现的功能,一般就是画图、字符等功能,也就是epdpaint.cpp里面定义的功能首先需要讲解一下缓存的坐标系,为了传输方便通常吧坐上定位原点,往右X轴增加,往下Y轴增加:
打开epdpaint.h可以看到如下:
只需要看public下函数即可:(1)初始化图片缓存Paint(unsigned char* image, int width, int height);第一个参数是图片缓存,第二个参数是定义图片长度,第三个参数定义图片高度,你可能会在程序中看到如下Paint paint(image, 0, 0); // width should be the multiple of 8第二、三个参数这里设置成0,是因为下面还可以设置。
驴友花雕
发表于 2021-11-17 06:56:35
(2)设置高宽、获取高宽、设置翻转角度、获取翻转角度
intGetWidth(void); //得到宽度
void SetWidth(int width);//设置宽度
intGetHeight(void);//得到高度
void SetHeight(int height);//设置高度
intGetRotate(void);//得到翻转角度
void SetRotate(int rotate);//设置翻转角度
(3)获取图像缓存
unsigned char* GetImage(void);
(4)画点
void DrawPixel(int x, int y, int colored);在坐标(x,y)
(5)写字符
void DrawCharAt(int x, int y, char ascii_char, sFONT* font, int colored);在(x,y)这一点为左顶点写字符ascii_char,字体大小为font,颜色为colored
(6)写字符串
void DrawStringAt(int x, int y, const char* text, sFONT* font, int colored);在(x,y)这一点为左顶点写字符串text,字体大小为font,颜色为colored
(7)画线
void DrawLine(int x0, int y0, int x1, int y1, int colored);以(x0,y0)为起点,(x1,y1)为终点画一条线,斜率任意;
(8)画横线
void DrawHorizontalLine(int x, int y, int width, int colored);以(x0,y0)为起点,(x1,y1)为终点画一条横线,速度比DrawLine()快
(9)画竖线
void DrawVerticalLine(int x, int y, int height, int colored);以(x0,y0)为起点,(x1,y1)为终点画一条竖线,速度比DrawLine()快
(10)矩形,画空心框
void DrawRectangle(int x0, int y0, int x1, int y1, int colored);以(x0,y0)为起点,(x1,y1)为终点画一个框,边的颜色为colored
(11)填充矩形,画实心框
void DrawFilledRectangle(int x0, int y0, int x1, int y1, int colored);以(x0,y0)为起点,(x1,y1)为终点画一个框,并且内部填充,颜色为colored
(12)画空心圆
void DrawCircle(int x, int y, int radius, int colored);以(x,y)为圆心,radius为半斤画一个空心圆,颜色为colored
(13)画实心圆
void DrawFilledCircle(int x, int y, int radius, int colored);以(x,y)为圆心,radius为半斤画一个实心心圆,颜色为colored
驴友花雕
发表于 2021-11-17 14:03:28
本帖最后由 驴友花雕 于 2021-11-17 14:49 编辑
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十七:EPD Eink 电子墨水显示器 SUNY 2.9 英寸 EPD 屏幕无线数字电子纸显示器模块DEPG0290RWS800F6黑白红三色墨水屏(珠海三一科技)
实验说明:使用傲雪驱动库e-Paper
项目之三:简单的清屏程序
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十七:EPD Eink 电子墨水显示器 SUNY 2.9 英寸 EPD 屏幕无线数字电子纸显示器模块DEPG0290RWS800F6黑白红三色墨水屏(珠海三一科技)
实验说明:使用傲雪驱动库e-Paper
项目之三:简单的清屏程序
*/
#include <SPI.h>
#include "epd2in9_V2.h"
#include "epdpaint.h"
#include "imagedata.h"
#define COLORED 0
#define UNCOLORED 1
unsigned char image;
Paint paint(image, 0, 0);
Epd epd;
void setup() {
Serial.begin(115200);
if (epd.Init() != 0) {
Serial.print("e-Paper init failed");
return;
}
epd.ClearFrameMemory(0xFF);
epd.DisplayFrame();
epd.ClearFrameMemory(0xFF);
epd.DisplayFrame();
}
void loop() {
}
驴友花雕
发表于 2021-11-17 14:25:23
本帖最后由 驴友花雕 于 2021-11-17 14:52 编辑
实验场景图
驴友花雕
发表于 2021-11-17 14:58:21
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十七:EPD Eink 电子墨水显示器 SUNY 2.9 英寸 EPD 屏幕无线数字电子纸显示器模块DEPG0290RWS800F6黑白红三色墨水屏(珠海三一科技)
实验说明:使用傲雪驱动库e-Paper
项目之四:清屏并显示傲雪电子的LOGO(测试最简程序)
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十七:EPD Eink 电子墨水显示器 SUNY 2.9 英寸 EPD 屏幕无线数字电子纸显示器模块DEPG0290RWS800F6黑白红三色墨水屏(珠海三一科技)
实验说明:使用傲雪驱动库e-Paper
项目之四:清屏并显示傲雪电子的LOGO(测试最简程序)
*/
#include <SPI.h>
#include "epd2in9_V2.h"
#include "epdpaint.h"
#include "imagedata.h"
#define COLORED 0
#define UNCOLORED 1
unsigned char image;
Paint paint(image, 0, 0);
Epd epd;
void setup() {
Serial.begin(115200);
if (epd.Init() != 0) {
Serial.print("e-Paper init failed");
return;
}
epd.ClearFrameMemory(0xFF);
epd.DisplayFrame();
epd.SetFrameMemory_Base(IMAGE_DATA);
epd.DisplayFrame();
}
void loop() {
}
驴友花雕
发表于 2021-11-17 14:59:50
实验场景动态图
驴友花雕
发表于 2021-11-17 19:11:06
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十七:EPD Eink 电子墨水显示器 SUNY 2.9 英寸 EPD 屏幕无线数字电子纸显示器模块DEPG0290RWS800F6黑白红三色墨水屏(珠海三一科技)
实验说明:使用傲雪驱动库e-Paper
项目之五:画八个空心与实心圆
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十七:EPD Eink 电子墨水显示器 SUNY 2.9 英寸 EPD 屏幕无线数字电子纸显示器模块DEPG0290RWS800F6黑白红三色墨水屏(珠海三一科技)
实验说明:使用傲雪驱动库e-Paper
项目之五:画八个空心与实心圆
*/
#include <SPI.h>
#include "epd2in9_V2.h"
#include "epdpaint.h"
#include "imagedata.h"
#define COLORED 0
#define UNCOLORED 1
unsigned char image;
Paint paint(image, 0, 0);
Epd epd;
void setup() {
Serial.begin(115200);
if (epd.Init() != 0) {
Serial.print("e-Paper init failed");
return;
}
epd.ClearFrameMemory(0xFF);
epd.DisplayFrame();
epd.ClearFrameMemory(0xFF);
epd.DisplayFrame();
paint.SetWidth(64);
paint.SetHeight(64);
paint.Clear(UNCOLORED);
paint.DrawCircle(32, 32, 30, COLORED);
epd.SetFrameMemory(paint.GetImage(), 5, 220, paint.GetWidth(), paint.GetHeight());
paint.Clear(UNCOLORED);
paint.DrawCircle(32, 32, 30, COLORED);
epd.SetFrameMemory(paint.GetImage(), 65, 10, paint.GetWidth(), paint.GetHeight());
paint.Clear(UNCOLORED);
paint.DrawFilledCircle(32, 32, 30, COLORED);
epd.SetFrameMemory(paint.GetImage(), 65, 80, paint.GetWidth(), paint.GetHeight());
epd.DisplayFrame();
paint.Clear(UNCOLORED);
paint.DrawCircle(32, 32, 30, COLORED);
epd.SetFrameMemory(paint.GetImage(), 65, 150, paint.GetWidth(), paint.GetHeight());
paint.Clear(UNCOLORED);
paint.DrawFilledCircle(32, 32, 30, COLORED);
epd.SetFrameMemory(paint.GetImage(), 65, 220, paint.GetWidth(), paint.GetHeight());
epd.DisplayFrame();
paint.Clear(UNCOLORED);
paint.DrawFilledCircle(32, 32, 30, COLORED);
epd.SetFrameMemory(paint.GetImage(), 5, 10, paint.GetWidth(), paint.GetHeight());
epd.DisplayFrame();
paint.Clear(UNCOLORED);
paint.DrawCircle(32, 32, 30, COLORED);
epd.SetFrameMemory(paint.GetImage(), 5, 80, paint.GetWidth(), paint.GetHeight());
paint.Clear(UNCOLORED);
paint.DrawFilledCircle(32, 32, 30, COLORED);
epd.SetFrameMemory(paint.GetImage(), 5, 150, paint.GetWidth(), paint.GetHeight());
epd.DisplayFrame();
//delay(2000);
if (epd.Init() != 0) {
Serial.print("e-Paper init failed ");
return;
}
}
void loop() {
}
驴友花雕
发表于 2021-11-17 19:13:58
实验场景图
驴友花雕
发表于 2021-11-18 09:06:46
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十七:EPD Eink 电子墨水显示器 SUNY 2.9 英寸 EPD 屏幕无线数字电子纸显示器模块DEPG0290RWS800F6黑白红三色墨水屏(珠海三一科技)
实验说明:使用傲雪驱动库e-Paper
项目之六:不同字号,写字符"Hello world!"
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十七:EPD Eink 电子墨水显示器 SUNY 2.9 英寸 EPD 屏幕无线数字电子纸显示器模块DEPG0290RWS800F6黑白红三色墨水屏(珠海三一科技)
实验说明:使用傲雪驱动库e-Paper
项目之六:不同字号,写字符"Hello world!"
*/
#include <SPI.h>
#include "epd2in9_V2.h"
#include "epdpaint.h"
#include "imagedata.h"
#define COLORED 0
#define UNCOLORED 1
unsigned char image;
Paint paint(image, 0, 0);
Epd epd;
unsigned long time_start_ms;
unsigned long time_now_s;
void setup() {
Serial.begin(115200);
if (epd.Init() != 0) {
Serial.print("e-Paper init failed");
return;
}
epd.ClearFrameMemory(0xFF);
epd.DisplayFrame();
epd.ClearFrameMemory(0xFF);
epd.DisplayFrame();
paint.SetRotate(ROTATE_90);
paint.SetWidth(30);
paint.SetHeight(200);
paint.Clear(COLORED);
paint.DrawStringAt(0, 8, "Hello world!", &Font24, UNCOLORED);
epd.SetFrameMemory(paint.GetImage(),8, 50, paint.GetWidth(), paint.GetHeight());
paint.Clear(UNCOLORED);
paint.DrawStringAt(0, 7, "e-Paper Demo", &Font20, COLORED);
epd.SetFrameMemory(paint.GetImage(), 40, 65, paint.GetWidth(), paint.GetHeight());
epd.DisplayFrame();
paint.Clear(UNCOLORED);
paint.DrawStringAt(0, 8, "Hello world!", &Font16, COLORED);
epd.SetFrameMemory(paint.GetImage(), 65, 85, paint.GetWidth(), paint.GetHeight());
paint.Clear(UNCOLORED);
paint.DrawStringAt(0, 6, "e-Paper Demo", &Font12, COLORED);
epd.SetFrameMemory(paint.GetImage(), 95, 100, paint.GetWidth(), paint.GetHeight());
epd.DisplayFrame();
paint.Clear(COLORED);
paint.DrawStringAt(0, 4, "Hello world!", &Font8, UNCOLORED);
epd.SetFrameMemory(paint.GetImage(), 100, 110, paint.GetWidth(), paint.GetHeight());
}
void loop() {
}
驴友花雕
发表于 2021-11-18 09:19:08
实验场景图
驴友花雕
发表于 2021-11-18 11:04:45
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十七:EPD Eink 电子墨水显示器 SUNY 2.9 英寸 EPD 屏幕无线数字电子纸显示器模块DEPG0290RWS800F6黑白红三色墨水屏(珠海三一科技)
实验说明:使用傲雪驱动库e-Paper
项目之七:秒动电子计时器
实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百一十七:EPD Eink 电子墨水显示器 SUNY 2.9 英寸 EPD 屏幕无线数字电子纸显示器模块DEPG0290RWS800F6黑白红三色墨水屏(珠海三一科技)
实验说明:使用傲雪驱动库e-Paper
项目之七:秒动电子计时器
*/
#include <SPI.h>
#include "epd2in9_V2.h"
#include "epdpaint.h"
#include "imagedata.h"
#define COLORED 0
#define UNCOLORED 1
unsigned char image;
Paint paint(image, 0, 0);
Epd epd;
unsigned long time_start_ms;
unsigned long time_now_s;
void setup() {
Serial.begin(115200);
if (epd.Init() != 0) {
Serial.print("e-Paper init failed");
return;
}
epd.ClearFrameMemory(0xFF);
epd.DisplayFrame();
epd.ClearFrameMemory(0xFF);
epd.DisplayFrame();
paint.SetRotate(ROTATE_90);
paint.SetWidth(30);
paint.SetHeight(200);
paint.Clear(COLORED);
paint.DrawStringAt(0, 8, "Hello world!", &Font24, UNCOLORED);
epd.SetFrameMemory(paint.GetImage(), 20, 50, paint.GetWidth(), paint.GetHeight());
time_start_ms = millis();
}
void loop() {
time_now_s = (millis() - time_start_ms) / 1000;
char time_string[] = {'0', '0', ':', '0', '0', '\0'};
time_string = time_now_s / 60 / 10 + '0';
time_string = time_now_s / 60 % 10 + '0';
time_string = time_now_s % 60 / 10 + '0';
time_string = time_now_s % 60 % 10 + '0';
paint.SetWidth(30);
paint.SetHeight(90);
paint.SetRotate(ROTATE_90);
paint.Clear(UNCOLORED);
paint.DrawStringAt(0, 6, time_string, &Font24, COLORED);
epd.SetFrameMemory_Partial(paint.GetImage(), 70, 105, paint.GetWidth(), paint.GetHeight());
epd.DisplayFrame_Partial();
//delay(300);
}
驴友花雕
发表于 2021-11-18 11:17:25
实验场景动态图