Revert "Revert "更新例程,更新文档""

This reverts commit 048d88586f.
This commit is contained in:
HalfSweet
2022-02-02 21:49:46 +08:00
parent 048d88586f
commit 081e3f5a6f
7 changed files with 445 additions and 14 deletions

View File

@@ -1,2 +1,38 @@
# EPaperDrive
一个简单好用性能强大的Arduino墨水屏驱动库支持目前市面上较常见的多种墨水屏。
这是一个简单好用性能强大的Arduino墨水屏驱动库支持目前市面上较常见的多种墨水屏。
## 我应该如何使用它?
请着重参考[例程](https://github.com/HalfSweetStudio/EPaperDrive/tree/main/examples)与[API手册](docs/API手册.md)如果您遇到了例程不能使用的情况请提交issue说明详细情况。
## 我应该采用什么样的驱动电路?
事实上几乎所有的串口SPI的墨水屏驱动电路以及引脚定义都是相同的如果您有微雪或者大连佳显等厂商提供的驱动板您开源直接使用它。如果您是裸屏那么我建议您采用这款[驱动板](https://oshwhub.com/ludas/mo-shui-ping-qu-dong)。需要注意的是请您采用4-wire模式来驱动墨水屏我们暂不支持3-wire模式。
## 这个驱动库支持什么MCU
很遗憾目前为止该驱动库仅支持ESP8266/ESP32或者别的带文件系统的MCU我们会在之后重构整个驱动库来达到更好的兼容性。
## 有什么联系方式吗?
您可以发送邮件HalfSweet@HalfSweet.cn给我或者加我的QQ好友2522182733当然您也可以加入QQ群聊735507661与我们进行讨论。
## 你会适配新的屏幕吗?
当然可以!我们会逐渐适配一些常见的以及我们拥有的屏幕,当然,如果您想要适配您手上的屏幕,请您与我取得联系并邮寄相应的屏幕进行测试,
## 目前支持的屏幕?
下表即为目前支持的屏幕的名称(即`EPD_Set_Model`函数内填的内容,留空即为我暂不知道)
|屏幕名称|驱动芯片型号|参考链接|
|:---:|:---:|:---:|
|WX29|SSD1608|<https://www.waveshare.net/wiki/2.9inch_e-Paper_Module>|
|WF29|||
|OPM42|SSD1619||
|WF58|||
|WF29BZ03|||
|C154|||
|DKE42_3COLOR|SSD1619|<https://www.good-display.cn/product/214.html>|
|DKE29_3COLOR|SSD1680|<https://www.good-display.cn/product/391.html>|
|WF42|UC8176|<https://www.waveshare.net/wiki/4.2inch_e-Paper_Module#myresources>|
|WFT0290CZ10|UC8151C|<https://www.good-display.cn/product/210.html>|
|GDEY042Z98|SSD1683|<https://www.good-display.cn/product/378.html>|
|HINKE0266A15A0|SSD1675||
## 致谢
非常感谢Duck大佬的支持这个驱动库最开始的架构也是出自于他这是他的[个人主页](https://github.com/duck531a98)以及最开始的[开源链接](https://github.com/duck531a98/esp8266-weather-station-epaper),我入坑于电子便是受到了他的影响,同时也非常感谢他教会了我很多编程以及电子的知识,同时在我成长的道路上也一直支持鼓励着我。
同时也非常感谢在我学习的路上支持着我的各位大佬是你们的存在让我在漫天的bug中找到继续学习下去的动力。

262
docs/API手册.md Normal file
View File

@@ -0,0 +1,262 @@
# EPaperDrive API手册
该手册的标题为函数声明,在正文部分会以此介绍函数的用法、参数和返回值。
## EPaperDrive(bool SPIMode, uint8_t CS, uint8_t RST, uint8_t DC, uint8_t BUSY, uint8_t CLK, uint8_t DIN)
* @brief 构造函数初始化软硬SPI及引脚定义
* @param SPIMode 选择是硬件SPI还是软件SPI0为软件1为硬件不采用硬件CS
* @param CS CS脚
* @param RST RST脚
* @param DC DC脚
* @param BUSY BUSY脚
* @param CLK 时钟线如果是硬件SPI可以不填
* @param DIN 数据线如果是硬件SPI可以不填
## void EPD_Set_Model(uint8_t model)
* @brief 设置墨水屏的型号
* @param model 墨水屏的型号目前支持的屏幕可在README里面查看
## void EPD_init_Full(void)
* @brief 墨水屏全刷的初始化
## void EPD_init_Part(void)
* @brief 墨水屏局刷的初始化
## void deepsleep(void)
* @brief 让墨水屏进入睡眠模式,节省功耗
## void EPD_Dis_Full(uint8_t *DisBuffer, uint8_t Label)
* @brief 全刷传入的图像
* @param DisBuffer 传入的图像缓存指针
* @param Label 应该刷的图像1为传入的缓存2为全白3为全黑
## EPD_Dis_Part(int xStart, int xEnd, int yStart, int yEnd, uint8_t *DisBuffer, uint8_t Label)
* @brief 局刷传入的图像
* xStart 局刷区域x开始的坐标
* @param xEnd 局刷区域x结束的坐标
* @param yStart 局刷区域y开始的坐标
* @param yEnd 局刷区域y结束的坐标
* @param DisBuffer 传入的图像缓存指针
* @param Label 应该刷的图像1为传入的缓存2为全白3为全黑
## void EPD_Transfer_Full_BW(uint8_t *DisBuffer, uint8_t Label)
* @brief 直接向RAM中写全刷的黑白图片
* @param DisBuffer 应当写入的图像缓存指针
* @param Label 应该刷的图像1为传入的缓存2为全白3为全黑4为向“OLD”RAM中写全黑
## void EPD_Transfer_Full_RED(uint8_t *DisBuffer, uint8_t Label)
* @brief 直接向RAM中写全刷的红色图片
* @param DisBuffer 应当写入的图像缓存指针
* @param Label 应该刷的图像1为传入的缓存2为全白3为全红
## void EPD_Transfer_Part(int xStart, int xEnd, int yStart, int yEnd, uint8_t *DisBuffer, uint8_t Label)
@brief 直接向RAM中写局刷的图像
* @param xStart 局刷区域x开始的坐标
* @param xEnd 局刷区域x结束的坐标
* @param yStart 局刷区域y开始的坐标
* @param yEnd 局刷区域y结束的坐标
* @param DisBuffer 传入的图像缓存指针
* @param Label 应该刷的图像1为传入的缓存2为全白3为全黑
## void SetFS(FS *userFS)
* @brief 设置采用什么文件系统
* @param userFS 应当传入的文件系统的指针
## void SetHardSPI(SPIClass *spi)
* @brief 设置采用硬件spi的通道用户请先初始化SPI之后再传入对应SPI的指针
* @param spi 应当传入的SPI的指针
## void clearbuffer()
* @brief 清除之前所绘的图像缓存
## void SetFont(FONT fontindex)
* @brief 设置字体样式
* @param fontindex 字体样式,目前仅支持如下字体:
|字体|
|:----:|
|FONT12|
|FONT16|
|FONT32|
|FONT10|
|FONT70|
|FONT12_NUM|
|FONT24|
|FONT8|
|DIGI_NUM_100|
|ICON32|
|ICON80|
|ICON50|
如果对字体的效果并不满意,可以参考[用户手册]()自行修改
## void DrawUTF(int16_t x, int16_t y, String code)
@brief 在图像缓存中画字符串
*
* @param x 字符串图像开始的x坐标
* @param y 字符串图像开始的y坐标
* @param code 字符串内容
## DrawUnicodeChar(int16_t x, int16_t y, uint8_t width, uint8_t height, uint8_t *code)
@brief 在图像缓存中画字符(可以忽略,采用`DrawUTF`函数即可)
*
* @param x 开始的x坐标
* @param y 开始的y坐标
* @param width 字符的宽度
* @param height 字符的高度
* @param code 字符的指针
## DrawUnicodeStr(int16_t x, int16_t y, uint8_t width, uint8_t height, uint8_t strlength, uint8_t *code)
* @brief 在图像缓存中画指定长度的字符串(可以忽略,采用`DrawUTF`函数即可)
* @param x 开始的x坐标
* @param y 开始的y坐标
* @param width 字符的宽度
* @param height 字符的高度
* @param strlength 字符串的长度
* @param code 字符串指针
## void DrawYline(int start, int end, int y)
* @brief 在图像缓存中画竖线(一个像素)
* @param start 线开始的x坐标
* @param end 线结束的x坐标
* @param y 线的y坐标
## void DrawXline(int start, int end, int x)
* @brief 在图像缓存中画横线(一个像素)
* @param start 线开始的y坐标
* @param end 线结束的y坐标
* @param x 线的x坐标
## void DrawLine(int xstart, int ystart, int xend, int yend)
* @brief 在图像缓存中画直线
* @param xstart 线开始的x坐标
* @param ystart 线开始的y坐标
* @param xend 线结束的x坐标
* @param yend 线结束的y坐标
## void Inverse(int xStart, int xEnd, int yStart, int yEnd)
* @brief 反向一个区域的图像(黑变白,白变黑)
* @param xStart 这个区域开始的x坐标
* @param xEnd 这个区域结束的x坐标
* @param yStart 这个区域开始的y坐标
* @param yEnd 这个区域结束的y坐标
## void DrawWeatherChart(int xmin, int xmax, int ymin, int ymax, int point_n, int show_n, String tmax, String tmin, String code_d, String code_n, String text_d, String text_n, String date, String week)
* @brief 绘制天气温度变化曲线
* @param xmin 绘制区域中开始的x坐标
* @param xmax 绘制区域中结束的x坐标
* @param ymin 绘制区域中开始的y坐标
* @param ymax 绘制区域中结束的y坐标
* @param point_n 传入的天气数据的数量
* @param show_n 需要显示的天气数据的数量
* @param tmax 需要显示的这几天每天温度的最大值如12,13,14,15
* @param tmin 需要显示的这几天每天温度的最小值如2,3,4,5
* @param code_d 需要显示的这几天每天温度最大值的图标对应的字符
* @param code_n 需要显示的这几天每天温度最小值的图标对应的字符
* @param text_d 需要显示的这几天每天温度最大值对应的天气状况
* @param text_n 需要显示的这几天每天温度最小值对应的天气状况
* @param date 我也不知道这是啥,看函数定义里面好像没啥用
* @param week 需要显示的这几天每天是星期几例如1,2,3,4
## void DrawCircle(int x, int y, int r, bool fill)
* @brief 在图像缓存中画圆
* @param x 圆心的x坐标
* @param y 圆心的y坐标
* @param r 半径长度
* @param fill 0为空心圆1为实心圆
## void DrawBox(uint8_t x, int y, int w, int h)
* @brief 在图像缓存中画实心矩形
* @param x 开始的x坐标
* @param y 开始的y坐标
* @param w 矩形的宽度
* @param h 矩形的高度
## void DrawEmptyBox(int x, int y, int w, int h
* @brief 在图像缓存中画空心矩形
* @param x 开始的x坐标
* @param y 开始的y坐标
* @param w 矩形的宽度
* @param h 矩形的高度
## void DrawChart(int x, int y, int w, int c1, int c2, int c3, int c4, int c5, int c6)
* @brief 在图像缓存中画水平方向的柱状图(显示空气质量数据的,不建议使用)
* @param x 开始的x坐标
* @param y 开始的y坐标
* @param w 图表的宽度
* @param c1 第1个数据
* @param c2 第2个数据
* @param c3 第3个数据
* @param c4 第4个数据
* @param c5 第5个数据
* @param c6 第6个数据
## void DrawCircleChart(int x, int y, int r, int w, int c1, int c2, int c3)
* @brief 在图像缓存中画圆环图表(显示空气质量数据的,不建议使用)
* @param x 开始的x坐标
* @param y 开始的y坐标
* @param r 圆环的半径
* @param w 圆环的宽度
* @param c1 第1个数据
* @param c2 第2个数据
* @param c3 第3个数据
## void drawXbm(int16_t xMove, int16_t yMove, int16_t width, int16_t height, uint8_t *xbm);
* @brief 在图像缓存中绘制图像
* @param xMove 开始的x坐标
* @param yMove 开始的y坐标
* @param width 图像的宽度
* @param height 图像的高度
* @param xbm 图像的指针
## void DrawXbm_P(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *xbm)
* @brief 在图像缓存中画以PROGMEM类型储存图片
* @param xMove 开始的x坐标
* @param yMove 开始的y坐标
* @param width 图像的宽度
* @param height 图像的高度
* @param xbm 图像的指针
## void DrawXbm_p_gray(int16_t xMove, int16_t yMove, int16_t width, int16_t height, const uint8_t *xbm, uint8_t level)
* @brief 在图像缓存中画以PROGMEM类型储存的灰度图片
* @param xMove 开始的x坐标
* @param yMove 开始的y坐标
* @param width 图像的宽度
* @param height 图像的高度
* @param xbm 图像的指针
* @param level 灰度的等级
## void DrawXbm_spiff_gray(int16_t xMove, int16_t yMove, int16_t width, int16_t height, uint8_t level)
* @brief 在图像缓存中画以文件系统储存的灰度图片
* @param xMove 开始的x坐标
* @param yMove 开始的y坐标
* @param width 图像的宽度
* @param height 图像的高度
* @param level 灰度的等级
## void EPD_Set_Contrast(uint8_t vcom)
* @brief 设置vcom仅有OPM42这块屏需要在意别的屏幕不用管
* @param vcom vcom的等级
## void EPD_Update(void)
* @brief 墨水屏全刷更新(一般用户不需要关心)
## void EPD_Update_Part(void)
* @brief 墨水屏局刷更新(一般用户不需要关心)
## bool ReadBusy(void)
* @brief 等待BUSY信号变为空闲最大200ms超时(一般用户不需要关心)
* @return bool 1代表成功0代表超时
## bool ReadBusy_long(void)
* @brief 等待BUSY信号变为空闲最大2000ms超时(一般用户不需要关心)
* @return bool 1代表成功0代表超时
## void EPD_WriteCMD(uint8_t command)
* @brief 向墨水屏驱动芯片写入命令(一般用户不需要关心)
* @param command 命令的值
## void EPD_WriteData(uint8_t data)
* @brief 向墨水屏驱动芯片写入数据(一般用户不需要关心)
* @param data 数据的值

20
docs/用户手册.md Normal file
View File

@@ -0,0 +1,20 @@
# 用户手册
本手册为该驱动库的用户手册,让用户对如何使用该驱动库有个大概的了解。
## 将驱动库进行实例化并进行一些初始化操作
将该驱动库进行实例化的时候,其构造函数有如下几个构造参数:`SPIMode` `CS` `RST` `DC` `BUSY` `CLK` `DIN` 。其中SPIMode用于选择使用硬件SPI还是软件SPI当其为0的时候为软件SPI当其为1的时候为硬件SPI。其余的参数均为对应连接的引脚值得注意的是如果您打算采用硬件SPI的方式驱动您可以不用填`CLK``DIN`的参数,留空即可。
## 选择硬件SPI还是软件SPI
当您看到构造函数中可选硬件SPI以及软件SPI的时候您也许会有些困惑不知道应当如何选择。实际上除了引脚冲突或者是别的原因导致您无法使用硬件SPI之外我都诚恳地建议您采用硬件SPI来驱动。以常见的ESP8266为例如果采用软件SPI不仅频率难以控制并且其最大速率并不会超过500kHz。但是如果您采用硬件SPI那您可以轻松达到大部分驱动芯片的速率上限20MHz这样可以大大为您节省不少本不应该被浪费的时间。
不过需要注意的是如果您采用的硬件SPI请您先主动初始化SPI并调用`SetHardSPI`函数来将实际的硬件SPI指针传入以便驱动库进行下一步操作。如果您没有看懂这一步请参阅[HardSPIHelloWorld](../examples/HardSPIHelloWorld/HardSPIHelloWorld.ino)例程来查看
## 传入对应的文件系统指针以使用字库
您可以在例程中注意到,在我们对墨水屏进行任何操作之前,往往都会调用一个名为`SetFS`的函数,这个函数的作用便是将您喜欢的文件系统传入。需要注意的是,您在传入之前请先将您使用的文件系统初始化,例如`LittleFS.begin()`并将对应的字库文件上传字库文件在每个例程及驱动库的根目录下的data文件夹中
## 墨水屏的驱动步骤
首先,当您是第一次上电的时候,您需要至少进行一次全刷,之后才可以继续进行全刷或者是局刷的操作。
想要全刷的话,您仅仅需要调用`EPD_init_Full()`函数进行全刷的初始化,然后利用别的绘图函数在图像缓存中进行绘图。当您绘图结束之后,您可以调用`EPD_Dis_Full(uint8_t *DisBuffer, uint8_t Label)`函数来将绘图完成的缓存传入驱动芯片并且开始全刷。别忘了,在刷屏结束之后调用`deepsleep()`函数来使墨水屏进入休眠模式,这不仅利于您降低功耗,同时也可以避免墨水屏出现颜色逐渐变浅的情况。
## 如何显示图片?
想要在墨水屏上显示一些图片也许是个不错的主意。令人兴奋的是我们提供了一系列的API供您完成您绝妙的创意。您可以调用`drawXbm``DrawXbm_P`函数来向缓存中绘入您所期望的图片。这两个函数的区别在于`DrawXbm_P`绘制的是您采用PROGMEM类型存储的图像这会将数据存储在flash而不是RAM相信您会喜欢上这一点。
也许您会有这样的疑问,如何将.jpg等拓展名的图像转换为可识别的数据呢非常简单只需要使用任意一款图像取模软件我喜欢用Image2lcd虽然它很古老但是依旧能完美地完成任务使用单色模式垂直扫描将其转换为一连串的c数组即可。

View File

@@ -0,0 +1,91 @@
#include <Arduino.h>
#include <EPaperDrive.h>
//包含你需要使用的文件系统,例如:
#include <LittleFS.h>
#define BAUD_SPEED 74880 //串口调试的波特率,可自行修改
#define CS 15
#define RST 2
#define DC 0
#define BUSY 4
EPaperDrive EPD(1, CS, RST, DC, BUSY); //驱动库的实例化此处为使用硬件SPI
const uint8_t city_icon[24] = {
/* 0X01,0X01,0X0C,0X00,0X0C,0X00, */
0X00,
0X00,
0X1C,
0X00,
0X77,
0X00,
0X41,
0X80,
0X9C,
0X60,
0XA2,
0X30,
0XA2,
0X30,
0X9C,
0XC0,
0X41,
0X80,
0X77,
0X00,
0X1C,
0X00,
0X00,
0X00,
};
void setup()
{
Serial.begin(BAUD_SPEED);
#if defined(ESP8266)
SPI.begin();
SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
#else
#if defined(ESP32)
SPIClass SPI(HSPI); //可自行更换SPI通道
SPI.begin();
SPI.beginTransaction(SPISettings(20000000, MSBFIRST, SPI_MODE0));
#else
#error 不支持您的MCU
#endif
#endif
EPD.SetHardSPI(&SPI);
EPD.SetFS(&LittleFS); //设置存放字体的文件系统,传入的为该文件系统的操作指针,可自行修改
EPD.EPD_Set_Model(HINKE0266A15A0); //设置屏幕类型,具体型号可以参考文档
EPD.EPD_init_Full(); //全刷初始化,使用全刷波形
EPD.clearbuffer(); //清空缓存(全白)
EPD.fontscale = 2; //字体缩放系数(支持1和2,对图片也有效用完记得重新改成1)
EPD.SetFont(FONT12); //选择字体,具体支持的字体见文档
EPD.DrawUTF(0, 0, "Hello World"); //绘制字符串
EPD.DrawUTF(26, 0, "我喜欢墨水屏"); //绘制字符串
EPD.fontscale = 1; //字体缩放系数改回1
EPD.DrawXbm_P(60, 0, 12, 12, (uint8_t *)city_icon); //绘制图片
Serial.printf("缓存图像绘制完毕,准备全刷 \n");
EPD.EPD_Dis_Full((uint8_t *)EPD.EPDbuffer, 1); //将缓存中的图像传给屏幕控制芯片全刷屏幕
EPD.deepsleep(); //让屏幕进入休眠模式
Serial.println("全刷完毕");
delay(5000);
EPD.EPD_init_Part(); //局刷的初始化
EPD.clearbuffer();
EPD.fontscale = 2;
EPD.SetFont(FONT12);
EPD.DrawUTF(0, 0, "现在是局刷");
Serial.printf("开始局刷 \n");
EPD.EPD_Dis_Part(0, 23, 0, 199, (uint8_t *)EPD.EPDbuffer, 1); //将缓存中的图像传给屏幕控制芯片局新屏幕
Serial.printf("局刷结束 \n");
EPD.deepsleep();
}
void loop()
{
delay(1); //防止看门狗咬
}

View File

@@ -54,6 +54,7 @@ const uint8_t city_icon[24] = {
void setup()
{
Serial.begin(BAUD_SPEED);
LittleFS.begin(); //请务必先手动初始化一遍文件系统再将指针传入
EPD.SetFS(&LittleFS); //设置存放字体的文件系统,传入的为该文件系统的操作指针,可自行修改
EPD.EPD_Set_Model(HINKE0266A15A0); //设置屏幕类型,具体型号可以参考文档
@@ -80,7 +81,7 @@ void setup()
Serial.printf("开始局刷 \n");
EPD.EPD_Dis_Part(0, 23, 0, 199, (uint8_t *)EPD.EPDbuffer, 1); //将缓存中的图像传给屏幕控制芯片局新屏幕
Serial.printf("局刷结束 \n");
EPD.deepsleep();
EPD.deepsleep();
}
void loop()

View File

@@ -4,7 +4,7 @@
uint8_t UNICODEbuffer[200];
String fontname;
EPaperDrive::EPaperDrive(bool SPIMode,uint8_t CS, uint8_t RST, uint8_t DC, uint8_t BUSY, uint8_t CLK, uint8_t DIN)
EPaperDrive::EPaperDrive(bool SPIMode, uint8_t CS, uint8_t RST, uint8_t DC, uint8_t BUSY, uint8_t CLK, uint8_t DIN)
{
_CS = CS;
_RST = RST;
@@ -40,13 +40,12 @@ void EPaperDrive::driver_delay_xms(unsigned long xms)
delay(xms);
}
void EPaperDrive::SetFS(FS* userFS)
void EPaperDrive::SetFS(fs::FS* FSType)
{
UserFS = userFS;
UserFS->begin();
UserFS = FSType;
}
void EPaperDrive::SetHardSPI(SPIClass* spi)
void EPaperDrive::SetHardSPI(SPIClass *spi)
{
MySPI = spi;
}
@@ -666,6 +665,7 @@ void EPaperDrive::DrawUnicodeChar(int16_t x, int16_t y, uint8_t width, uint8_t h
// Serial.println(code[1]);
// Serial.println("sizeofsinglechar");
// Serial.println(sizeofsinglechar);
// File f = UserFS->open(fontname, "r");
File f = UserFS->open(fontname, "r");
f.seek(offset, SeekSet);
char zi[sizeofsinglechar];
@@ -864,6 +864,7 @@ void EPaperDrive::DrawXbm_p_gray(int16_t xMove, int16_t yMove, int16_t width, in
}
void EPaperDrive::DrawXbm_spiff_gray(int16_t xMove, int16_t yMove, int16_t width, int16_t height, uint8_t level)
{
// File f = UserFS->open("/pic.xbm", "r");
File f = UserFS->open("/pic.xbm", "r");
int16_t heightInXbm = (height + 1) / 2;
@@ -1414,7 +1415,7 @@ void EPaperDrive::EPD_WriteDispRam_Old(unsigned int XSize, unsigned int YSize, u
}
void EPaperDrive::EPD_SetRamArea(uint16_t Xstart, uint16_t Xend,
uint8_t Ystart, uint8_t Ystart1, uint8_t Yend, uint8_t Yend1)
uint8_t Ystart, uint8_t Ystart1, uint8_t Yend, uint8_t Yend1)
{
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
@@ -2421,13 +2422,13 @@ void EPaperDrive::EPD_Dis_Full(uint8_t *DisBuffer, uint8_t Label)
nowtime = millis() - nowtime;
int updatatime = nowtime;
//Serial.printf("开始全刷 \n");
// Serial.printf("开始全刷 \n");
ReadBusy_long();
ReadBusy_long();
ReadBusy_long();
ReadBusy_long();
nowtime = millis() - nowtime;
//Serial.printf("全刷结束,耗时%dms", nowtime - updatatime);
// Serial.printf("全刷结束,耗时%dms", nowtime - updatatime);
if (EPD_Type == DKE29_3COLOR)
{
// EPD_Transfer_Full_RED((uint8_t *)EPDbuffer,1);
@@ -2603,7 +2604,7 @@ void EPaperDrive::EPD_Transfer_Part(int xStart, int xEnd, int yStart, int yEnd,
// EPD_WriteDispRam(Xsize, Ysize,(uint8_t *)DisBuffer,offset,1);
}
else if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF42 || EPD_Type == WF29BZ03 || EPD_Type == WFT0290CZ10)
else if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF42 || EPD_Type == WF29BZ03 || EPD_Type == WFT0290CZ10)
{
EPD_SetRamArea(xStart, xEnd, yStart / 256, yStart % 256, yEnd / 256, yEnd % 256);

View File

@@ -4,7 +4,16 @@
#include <Arduino.h>
#include <SPI.h>
#if defined(ESP8266)
#include "FS.h"
#else
#if defined(ESP32)
#include "FS.h"
#include <LittleFS.h>
#include <SPIFFS.h>
#include <FFat.h>
#endif
#endif
#include "WAVEFORM_SETTING_LUT.h"
extern uint8_t UNICODEbuffer[200];
@@ -60,6 +69,13 @@ enum epd_type
GDEY042Z98 = 11, // SSD1683
HINKE0266A15A0 = 12, // SSD1675
};
enum EPDFS
{
littlefs = 0,
spiffs = 1,
fatfs = 2,
};
/*
* 典型使用流程
* 1.EPD_init_Full/EPD_init_Part初始化
@@ -110,7 +126,7 @@ public:
*
* @param userFS 应当传入的文件系统的指针
*/
void SetFS(FS *userFS);
void SetFS(fs::FS* FSType);
/**
* @brief 设置采用硬件spi的通道用户请先初始化SPI之后再传入对应SPI的指针
@@ -170,7 +186,7 @@ public:
* @brief 直接向RAM中写全刷的红色图片
*
* @param DisBuffer 应当写入的图像缓存指针
* @param Label 应该刷的图像1为传入的缓存2为全白3为全
* @param Label 应该刷的图像1为传入的缓存2为全白3为全
*/
void EPD_Transfer_Full_RED(uint8_t *DisBuffer, uint8_t Label);
@@ -456,7 +472,9 @@ private:
uint8_t _DIN;
bool _SPIMode;
FS *UserFS;
fs::FS *UserFS;
SPIClass *MySPI;
uint8_t FontIndex;
@@ -486,4 +504,6 @@ private:
void InversePixel(int16_t x, int16_t y);
void DrawUTF(int16_t x, int16_t y, uint8_t width, uint8_t height, uint8_t *code);
int UTFtoUNICODE(uint8_t *code);
};