【雕爷学编程】Arduino动手做(206)---尝试傲雪黑白色电子计时器(测试2.9寸彩色墨水屏)

在这里插入图片描述

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备逐一做做实验,不管能否成功,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验二百零六:2.9寸epd电子纸屏模块 spi电纸屏 汉朔黑白红三色eink墨水屏QYEG0290BNS800F6

在这里插入图片描述
这里要非常感谢aladdincp提供了四块电子标价签模块,才有了这次的学习与尝试的机会。

在这里插入图片描述

九天之后,终于收到做实验用的四张驱动板实物

在这里插入图片描述
【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[1024];
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[0] = time_now_s / 60 / 10 + '0';
  time_string[1] = time_now_s / 60 % 10 + '0';
  time_string[3] = time_now_s % 60 / 10 + '0';
  time_string[4] = 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);
}

实验场景图

在这里插入图片描述

在这里插入图片描述

实验场景动态图
在这里插入图片描述

在这里插入图片描述
程序说明
以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图片转换成数组。

在这里插入图片描述

程序分为底层硬件接口、中间层墨水屏驱动、上层应用三部分。

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的初始化。

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();

进入睡眠模式,墨水屏讲进入超低耗电,如果长时间不用需要刷白保存,否则长时间会有残影。

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,是因为下面还可以设置。

(2)设置高宽、获取高宽、设置翻转角度、获取翻转角度

int  GetWidth(void); //得到宽度
void SetWidth(int width);//设置宽度
int  GetHeight(void);//得到高度
void SetHeight(int height);//设置高度
int  GetRotate(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

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
雕爷学编程Arduino动手做寻迹的实验可以使用TCRT5000红外反射光电开关寻迹传感器模块。这个传感器模块可以通过检测周围的光反射来进行寻迹操作。你可以将这个模块连接到mBot的主控板mCore V1.5的RJ25接口上,因为mBot的主控板兼容Arduino系统,所以你可以使用Arduino编程语言来控制mBot进行寻迹操作。请参考【Arduino】168种传感器模块系列实验中的实验六十六,该实验详细介绍了如何使用TCRT5000红外反射光电开关寻迹传感器模块进行寻迹。祝你成功完成实验!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【雕爷学编程Arduino动手做(194)---makeblock mbot 主控板2](https://blog.csdn.net/weixin_41659040/article/details/132141677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [【雕爷学编程Arduino动手做(65)---红外寻迹传感器](https://blog.csdn.net/weixin_41659040/article/details/106604080)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值