mirror of
https://github.com/HalfSweetStudio/EPaperDrive.git
synced 2026-03-15 05:13:16 +08:00
38
README.md
38
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|<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
262
docs/API手册.md
Normal 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还是软件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 数据的值
|
||||
20
docs/用户手册.md
Normal file
20
docs/用户手册.md
Normal 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数组即可。
|
||||
91
examples/HardSPIHelloWorld/HardSPIHelloWorld.ino
Normal file
91
examples/HardSPIHelloWorld/HardSPIHelloWorld.ino
Normal 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); //防止看门狗咬
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user