diff --git a/README.md b/README.md index ed26d2b..07debe5 100644 --- a/README.md +++ b/README.md @@ -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|| +|WF29||| +|OPM42|SSD1619|| +|WF58||| +|WF29BZ03||| +|C154||| +|DKE42_3COLOR|SSD1619|| +|DKE29_3COLOR|SSD1680|| +|WF42|UC8176|| +|WFT0290CZ10|UC8151C|| +|GDEY042Z98|SSD1683|| +|HINKE0266A15A0|SSD1675|| + +## 致谢 +非常感谢Duck大佬的支持,这个驱动库最开始的架构也是出自于他,这是他的[个人主页](https://github.com/duck531a98)以及最开始的[开源链接](https://github.com/duck531a98/esp8266-weather-station-epaper),我入坑于电子便是受到了他的影响,同时也非常感谢他教会了我很多编程以及电子的知识,同时在我成长的道路上也一直支持鼓励着我。 +同时也非常感谢在我学习的路上支持着我的各位大佬,是你们的存在让我在漫天的bug中找到继续学习下去的动力。 \ No newline at end of file diff --git a/docs/API手册.md b/docs/API手册.md new file mode 100644 index 0000000..8b5e159 --- /dev/null +++ b/docs/API手册.md @@ -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还是软件SPI,0为软件,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 数据的值 \ No newline at end of file diff --git a/docs/用户手册.md b/docs/用户手册.md new file mode 100644 index 0000000..7b3ac6c --- /dev/null +++ b/docs/用户手册.md @@ -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数组即可。 \ No newline at end of file diff --git a/examples/HardSPIHelloWorld/HardSPIHelloWorld.ino b/examples/HardSPIHelloWorld/HardSPIHelloWorld.ino new file mode 100644 index 0000000..2d662d9 --- /dev/null +++ b/examples/HardSPIHelloWorld/HardSPIHelloWorld.ino @@ -0,0 +1,91 @@ +#include +#include +//包含你需要使用的文件系统,例如: +#include + +#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); //防止看门狗咬 +} diff --git a/examples/HelloWorld/HelloWorld.ino b/examples/HelloWorld/HelloWorld.ino index 6380025..15d3c3d 100644 --- a/examples/HelloWorld/HelloWorld.ino +++ b/examples/HelloWorld/HelloWorld.ino @@ -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() diff --git a/src/EPaperDrive.cpp b/src/EPaperDrive.cpp index 9bcc7f8..1410563 100644 --- a/src/EPaperDrive.cpp +++ b/src/EPaperDrive.cpp @@ -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); diff --git a/src/EPaperDrive.h b/src/EPaperDrive.h index 70516f3..cba4116 100644 --- a/src/EPaperDrive.h +++ b/src/EPaperDrive.h @@ -4,7 +4,16 @@ #include #include +#if defined(ESP8266) #include "FS.h" +#else +#if defined(ESP32) +#include "FS.h" +#include +#include +#include +#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); + + };