驴友花雕 发表于 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

   实验场景动态图


页: 1 2 [3] 4 5
查看完整版本: 【Arduino】168种传感器系列实验(217)---2.9寸红黑三色墨水屏