9 Commits
test ... main

Author SHA1 Message Date
HalfSweet
6a97489d8a Merge pull request #7 from mofcandy/patch-1
错别字(
2022-08-22 19:51:09 +08:00
堆糖
ba80034bf9 错别字( 2022-08-22 19:46:33 +08:00
HalfSweet
668b0c6309 Merge pull request #6 from HalfSweetStudio/test
增加了三色屏显示第三种颜色的例程
2022-04-20 15:49:52 +08:00
HalfSweet
1a620073f8 Merge pull request #5 from HalfSweetStudio/test
佛系修bug
2022-02-14 17:58:10 +08:00
HalfSweet
50b7dfebe6 Merge pull request #4 from HalfSweetStudio/test
随缘更新
2022-02-13 23:35:40 +08:00
HalfSweet
18022510b2 Merge pull request #3 from miwyf/main
Update EPaperDrive.cpp
2022-02-10 10:14:30 +08:00
miwyf
ba30859408 Update EPaperDrive.cpp
getIcon()函数增加天气索引注释
2022-02-10 09:30:57 +08:00
HalfSweet
7dfd29370a Merge pull request #2 from HalfSweetStudio/test
Test
2022-02-03 00:05:55 +08:00
HalfSweet
322307fe45 Merge pull request #1 from HalfSweetStudio/test
Test
2022-02-02 21:54:04 +08:00
5 changed files with 66 additions and 113 deletions

View File

@@ -5,7 +5,7 @@
请着重参考[例程](https://github.com/HalfSweetStudio/EPaperDrive/tree/main/examples)、[API手册](docs/API手册.md)以及[用户手册](docs/用户手册.md)如果您遇到了例程不能使用的情况请提交issue说明详细情况。
## 我应该采用什么样的驱动电路?
事实上几乎所有的串口SPI的墨水屏驱动电路以及引脚定义都是相同的如果您有微雪或者大连佳显等厂商提供的驱动板开源直接使用它。如果您是裸屏,那么我建议您采用这款[驱动板](https://oshwhub.com/ludas/mo-shui-ping-qu-dong)。需要注意的是请您采用4-wire模式来驱动墨水屏我们暂不支持3-wire模式。
事实上几乎所有的串口SPI的墨水屏驱动电路以及引脚定义都是相同的如果您有微雪或者大连佳显等厂商提供的驱动板可以直接使用它。如果您是裸屏,那么我建议您采用这款[驱动板](https://oshwhub.com/ludas/mo-shui-ping-qu-dong)。需要注意的是请您采用4-wire模式来驱动墨水屏我们暂不支持3-wire模式。
## 这个驱动库支持什么MCU
很遗憾目前为止该驱动库仅支持ESP8266/ESP32或者别的带文件系统的MCU我们会在之后重构整个驱动库来达到更好的兼容性。
@@ -35,4 +35,4 @@
## 致谢
非常感谢Duck大佬的支持这个驱动库最开始的架构也是出自于他这是他的[个人主页](https://github.com/duck531a98)以及最开始的[开源链接](https://github.com/duck531a98/esp8266-weather-station-epaper),我入坑于电子便是受到了他的影响,同时也非常感谢他教会了我很多编程以及电子的知识,同时在我成长的道路上也一直支持鼓励着我。
同时也非常感谢在我学习的路上支持着我的各位大佬是你们的存在让我在漫天的bug中找到继续学习下去的动力。
同时也非常感谢在我学习的路上支持着我的各位大佬是你们的存在让我在漫天的bug中找到继续学习下去的动力。

View File

@@ -17,7 +17,4 @@
## 如何显示图片?
想要在墨水屏上显示一些图片也许是个不错的主意。令人兴奋的是我们提供了一系列的API供您完成您绝妙的创意。您可以调用`drawXbm``DrawXbm_P`函数来向缓存中绘入您所期望的图片。这两个函数的区别在于`DrawXbm_P`绘制的是您采用PROGMEM类型存储的图像这会将数据存储在flash而不是RAM相信您会喜欢上这一点。
也许您会有这样的疑问,如何将.jpg等拓展名的图像转换为可识别的数据呢非常简单只需要使用任意一款图像取模软件我喜欢用Image2lcd虽然它很古老但是依旧能完美地完成任务使用单色模式垂直扫描将其转换为一连串的c数组即可。
## 制作自己的字体
您可以使用[FontMaker](https://gitee.com/kerndev/FontMaker)软件来生成自己的字库使用该软件生成垂直扫描、高位在前标准字库为ASCII或者Unicode的bin文件字库并调用`SetFont()`函数进行定义文件路径和宽高。
也许您会有这样的疑问,如何将.jpg等拓展名的图像转换为可识别的数据呢非常简单只需要使用任意一款图像取模软件我喜欢用Image2lcd虽然它很古老但是依旧能完美地完成任务使用单色模式垂直扫描将其转换为一连串的c数组即可。

View File

@@ -87,4 +87,4 @@ void setup()
void loop()
{
delay(1); //防止看门狗咬
}
}

View File

@@ -1,5 +1,5 @@
#include "EPaperDrive.h"
// #include "EPD_drive_gpio.h"
//#include "EPD_drive_gpio.h"
uint8_t UNICODEbuffer[200];
String fontname;
@@ -42,7 +42,7 @@ void EPaperDrive::driver_delay_xms(unsigned long xms)
delay(xms);
}
void EPaperDrive::SetFS(fs::FS *FSType)
void EPaperDrive::SetFS(fs::FS* FSType)
{
UserFS = FSType;
}
@@ -64,23 +64,23 @@ void EPaperDrive::SPI_Write(uint8_t value)
// delayMicroseconds(1);
for (int i = 0; i < 8; i++)
{
// 高位在前发送方式 根据升级器件特性定
//高位在前发送方式 根据升级器件特性定
if ((value & 0x80) == 0x80)
EPD_DIN_1;
else
EPD_DIN_0;
// delayMicroseconds(1); //等待数据稳定 根据实际时钟调整
EPD_CLK_1; // 上升沿发送数据
EPD_CLK_1; //上升沿发送数据
// delayMicroseconds(1);//CLK高电平保持一段时间 这个可以不需要 根据具体的spi时钟来确定
EPD_CLK_0; // 把时钟拉低实现为下一次上升沿发送数据做准备
value = value << 1; // 发送数据的位向前移动一位
EPD_CLK_0; //把时钟拉低实现为下一次上升沿发送数据做准备
value = value << 1; //发送数据的位向前移动一位
}
}
}
void EPaperDrive::SetFont(FONT fontindex)
{
// FontIndex = fontindex;
FontIndex = fontindex;
switch (fontindex)
{
case 0:
@@ -150,14 +150,6 @@ void EPaperDrive::SetFont(FONT fontindex)
break;
}
}
void EPaperDrive::SetFont(const char *dir, uint16_t hight, uint16_t width)
{
fontname = String(dir);
fontwidth = width;
fontheight = hight;
}
void EPaperDrive::DrawCircle(int x, int y, int r, bool fill)
{
if (fill == 0)
@@ -322,32 +314,32 @@ void EPaperDrive::DrawCircleChart(int x, int y, int r, int w, int c1, int c2, in
int EPaperDrive::getIcon(int weathercodeindex)
{
if (weathercodeindex == 0)
return 12;
return 12; //晴
if (weathercodeindex == 1)
return 58;
return 58; //多云
if (weathercodeindex == 2)
return 58;
return 58; //少云
if (weathercodeindex == 3)
return 58;
return 58; //晴间多云
if (weathercodeindex == 4)
return 54;
return 54; //阴
if (weathercodeindex >= 5 && weathercodeindex <= 18)
return 0;
if (weathercodeindex >= 19 && weathercodeindex <= 32)
return 19;
return 19; //雨
if (weathercodeindex >= 33 && weathercodeindex <= 36)
return 16;
return 16; //雪
if (weathercodeindex >= 37 && weathercodeindex <= 40)
return 16;
return 16; //雪(雨夹雪)
if (weathercodeindex == 41)
return 37;
return 37; //雾(薄雾)
if (weathercodeindex == 42)
return 37;
return 37; //雾
if (weathercodeindex == 43)
return 37;
return 17;
return 37; //雾(霾)
return 17; //阵雨夹雪
}
void EPaperDrive::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) // 绘制天气温度变化曲线
void EPaperDrive::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) //绘制天气温度变化曲线
{
if (tmax == ",,,,,")
{
@@ -363,14 +355,14 @@ void EPaperDrive::DrawWeatherChart(int xmin, int xmax, int ymin, int ymax, int p
String code_d_a[point_n], code_n_a[point_n], text_d_a[point_n], text_n_a[point_n], date_a[point_n], week_a[point_n];
int tmax_a[point_n], tmin_a[point_n];
int min_data = 999, max_data = -999;
int tmin_x_cord[point_n], tmax_x_cord[point_n]; // 将数值转成屏幕坐标
int tmin_x_cord[point_n], tmax_x_cord[point_n]; //将数值转成屏幕坐标
String temp_min[point_n];
String temp_max[point_n];
int j = 0, k = 0, l = 0;
// 分割tmax和tmin
// Serial.println(tmax); Serial.println(tmin);
// Serial.println(code_d);
//分割tmax和tmin
// Serial.println(tmax); Serial.println(tmin);
// Serial.println(code_d);
for (int i = 0; i < tmin.length(); i++)
{
temp_min[j] += tmin[i];
@@ -387,14 +379,14 @@ void EPaperDrive::DrawWeatherChart(int xmin, int xmax, int ymin, int ymax, int p
k++;
}
j = 0;
// 分割code_d
//分割code_d
for (int i = 0; i < code_d.length(); i++)
{
code_d_a[j] += code_d[i];
if (code_d.charAt(i) == char(','))
j++;
}
// 分割code_n
//分割code_n
j = 0;
for (int i = 0; i < code_n.length(); i++)
{
@@ -402,7 +394,7 @@ void EPaperDrive::DrawWeatherChart(int xmin, int xmax, int ymin, int ymax, int p
if (code_n.charAt(i) == char(','))
j++;
}
// 分割text_d
//分割text_d
j = 0;
for (int i = 0; i < text_d.length(); i++)
{
@@ -411,7 +403,7 @@ void EPaperDrive::DrawWeatherChart(int xmin, int xmax, int ymin, int ymax, int p
else
text_d_a[j] += text_d[i];
}
// 分割text_n
//分割text_n
j = 0;
for (int i = 0; i < text_n.length(); i++)
{
@@ -420,7 +412,7 @@ void EPaperDrive::DrawWeatherChart(int xmin, int xmax, int ymin, int ymax, int p
else
text_n_a[j] += text_n[i];
}
// 分割week_n
//分割week_n
j = 0;
for (int i = 0; i < week.length(); i++)
{
@@ -442,7 +434,7 @@ void EPaperDrive::DrawWeatherChart(int xmin, int xmax, int ymin, int ymax, int p
tmax_a[i] = temp_max[i].toInt(); // Serial.printf("max:%d\n",tmax_a[i]);
tmin_a[i] = temp_min[i].toInt(); // Serial.printf("min:%d\n",tmin_a[i]);
}
// 找出计算最大最小值
//找出计算最大最小值
for (int i = 0; i < show_n; i++)
{
if (tmax_a[i] > max_data)
@@ -454,7 +446,7 @@ void EPaperDrive::DrawWeatherChart(int xmin, int xmax, int ymin, int ymax, int p
if (tmin_a[i] < min_data)
min_data = tmin_a[i];
}
// 转换坐标
//转换坐标
if ((max_data - min_data) != 0)
{
for (int i = 0; i < show_n; i++)
@@ -482,7 +474,7 @@ void EPaperDrive::DrawWeatherChart(int xmin, int xmax, int ymin, int ymax, int p
}
*/
// 画折线
//画折线
for (int i = 0; i < show_n - 1; i++)
{
DrawLine(tmin_x_cord[i], ymin + dy * i, tmin_x_cord[i + 1], ymin + dy * (i + 1));
@@ -491,7 +483,7 @@ void EPaperDrive::DrawWeatherChart(int xmin, int xmax, int ymin, int ymax, int p
// DrawLine(tmin_x_cord[i]-1,ymin+dy*i,tmin_x_cord[i+1]-1,ymin+dy*(i+1));
// DrawLine(tmax_x_cord[i]-1,ymin+dy*i,tmax_x_cord[i+1]-1,ymin+dy*(i+1));
}
// 画圆圈,添加标注
//画圆圈,添加标注
for (int i = 0; i < show_n; i++)
{
DrawCircle(tmin_x_cord[i], ymin + dy * i, 3, 1);
@@ -671,11 +663,11 @@ void EPaperDrive::DrawUnicodeChar(int16_t x, int16_t y, uint8_t width, uint8_t h
else
sizeofsinglechar = (height / 8 + 1) * width;
offset = (code[0] * 0x100 + code[1]) * sizeofsinglechar;
Serial.printf("offset:%d", offset);
Serial.printf("offset:%d",offset);
// Serial.println("code[1]");
// Serial.println(code[1]);
// Serial.println("sizeofsinglechar");
// Serial.println(sizeofsinglechar);
//Serial.println("sizeofsinglechar");
//Serial.println(sizeofsinglechar);
// File f = UserFS->open(fontname, "r");
File f = UserFS->open(fontname, "r");
f.seek(offset, SeekSet);
@@ -688,16 +680,15 @@ void EPaperDrive::DrawUnicodeChar(int16_t x, int16_t y, uint8_t width, uint8_t h
}*/
// Serial.println("offset");
// Serial.println(offset);
/* if (offset < 0xff * sizeofsinglechar && FontIndex < 10)
{
drawXbm(x, y, width, height, (uint8_t *)zi);
}
else
{
drawXbm(x, y, width, height, (uint8_t *)zi);
} */
// 上面这坨代码我也不知道是干啥的,看着好像没用就注释了
drawXbm(x, y, width, height, (uint8_t *)zi); // 上面注释里面需要的东西
if (offset < 0xff * sizeofsinglechar && FontIndex < 10)
{
drawXbm(x, y, width, height, (uint8_t *)zi);
}
else
{
drawXbm(x, y, width, height, (uint8_t *)zi);
}
// SPIFFS.end();
}
@@ -876,7 +867,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");
File f = UserFS->open("/pic.xbm", "r");
int16_t heightInXbm = (height + 1) / 2;
@@ -1874,7 +1865,7 @@ void EPaperDrive::EPD_Init(void)
{
// Serial.printf("开始全刷初始化 \n");
driver_delay_xms(10);
ReadBusy(); // 读busy信号
ReadBusy(); //读busy信号
EPD_WriteCMD(0x12); // 软件复位 soft reset
ReadBusy();
@@ -2098,13 +2089,13 @@ void EPaperDrive::EPD_init_Full(void)
// Serial.printf("即将写入全刷波形 \n");
EPD_Write((uint8_t *)LUTDefault_full_GDEY042Z98, sizeof(LUTDefault_full_GDEY042Z98));
// EPD_WriteCMD(0x3F);
// EPD_WriteData(*(LUTDefault_full_GDEY042Z98 + 227 + 1));
//EPD_WriteCMD(0x3F);
//EPD_WriteData(*(LUTDefault_full_GDEY042Z98 + 227 + 1));
EPD_WriteCMD(0x03); // 门电压 gate voltage
EPD_WriteCMD(0x03); //门电压 gate voltage
EPD_WriteData(*(LUTDefault_full_GDEY042Z98 + 228 + 1));
EPD_WriteCMD(0x04); // 源电压 source voltage
EPD_WriteCMD(0x04); //源电压 source voltage
EPD_WriteData(*(LUTDefault_full_GDEY042Z98 + 229 + 1));
EPD_WriteData(*(LUTDefault_full_GDEY042Z98 + 230 + 1));
EPD_WriteData(*(LUTDefault_full_GDEY042Z98 + 231 + 1));
@@ -2250,10 +2241,10 @@ void EPaperDrive::EPD_init_Part(void)
EPD_WriteCMD(0x3F);
EPD_WriteData(*(LUTDefault_part_GDEY042Z98 + 227 + 1));
EPD_WriteCMD(0x03); // 门电压 gate voltage
EPD_WriteCMD(0x03); //门电压 gate voltage
EPD_WriteData(*(LUTDefault_part_GDEY042Z98 + 228 + 1));
EPD_WriteCMD(0x04); // 源电压 source voltage
EPD_WriteCMD(0x04); //源电压 source voltage
EPD_WriteData(*(LUTDefault_part_GDEY042Z98 + 229 + 1));
EPD_WriteData(*(LUTDefault_part_GDEY042Z98 + 230 + 1));
EPD_WriteData(*(LUTDefault_part_GDEY042Z98 + 231 + 1));
@@ -2452,7 +2443,7 @@ void EPaperDrive::EPD_Dis_Full(uint8_t *DisBuffer, uint8_t Label)
else if (EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
{
EPD_SetRamPointer(xStart / 8, yEnd % 256, yEnd / 256);
EPD_WriteDispRam_Old(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1); // 我也不知道啥情况,但是如果你不对这个寄存器写两遍一样的数据局刷无效
EPD_WriteDispRam_Old(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1); //我也不知道啥情况,但是如果你不对这个寄存器写两遍一样的数据局刷无效
// EPD_WriteDispRam_Old(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 1);
}
else
@@ -2464,7 +2455,7 @@ void EPaperDrive::EPD_Dis_Full(uint8_t *DisBuffer, uint8_t Label)
else if (EPD_Type == WF29 || EPD_Type == WF58 || EPD_Type == WF29BZ03 || EPD_Type == C154 || EPD_Type == WF42 || EPD_Type == WFT0290CZ10)
{
if (EPD_Type == WFT0290CZ10)
if(EPD_Type == WFT0290CZ10)
{
EPD_WriteDispRam_Old(xDot / 8, yDot, (uint8_t *)DisBuffer, 0, 0xff);
}
@@ -2511,38 +2502,12 @@ void EPaperDrive::EPD_Dis_Part(int xStart, int xEnd, int yStart, int yEnd, uint8
yEnd = yDot - temp1 - 2;
yStart = yDot - temp2 - 3;
}
switch (EPD_Type)
{
case WX29:
case WFT0290CZ10:
case DKE29_3COLOR:
case WF29:
if (xStart % 8 != 0)
{
xStart -= (xStart % 8);
}
if (xEnd % 8 != 0)
{
xEnd += (8 - xEnd % 8);
}
break;
default:
if (yStart % 8 != 0)
{
yStart -= (yStart % 8);
}
if (yEnd % 8 != 0)
{
yEnd += (8 - yEnd % 8);
}
break;
}
unsigned int Xsize = xEnd - xStart;
unsigned int Ysize = yEnd - yStart + 1;
if (Xsize % 8 != 0)
{
Xsize = Xsize + (8 - Xsize % 8);
}
Xsize = Xsize / 8;
unsigned int offset = yStart * xDot / 8 + xStart / 8;
if (EPD_Type == WX29 || EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR || EPD_Type == DKE29_3COLOR || EPD_Type == GDEY042Z98 || EPD_Type == HINKE0266A15A0)
@@ -2568,7 +2533,7 @@ void EPaperDrive::EPD_Dis_Part(int xStart, int xEnd, int yStart, int yEnd, uint8
// Serial.printf("即将写入的是局刷的的0x26数据 \n");
EPD_WriteDispRam_Old(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);
}
else if (EPD_Type == GDEY042Z98)
else if (EPD_Type == GDEY042Z98 )
{
EPD_WriteDispRam_Old(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);
@@ -2579,11 +2544,11 @@ void EPaperDrive::EPD_Dis_Part(int xStart, int xEnd, int yStart, int yEnd, uint8
EPD_SetRamPointer(xStart / 8, yEnd % 256, yEnd / 256);
EPD_WriteDispRam_Old(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);
}
else if (EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR)
else if(EPD_Type == OPM42 || EPD_Type == DKE42_3COLOR)
{
EPD_WriteDispRam(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);
}
else if (EPD_Type == WX29)
else if(EPD_Type == WX29)
{
EPD_SetRamPointer(xStart / 8, yEnd % 256, yEnd / 256);
EPD_WriteDispRam(Xsize, Ysize, (uint8_t *)DisBuffer, offset, 1);

View File

@@ -209,15 +209,6 @@ public:
*/
void SetFont(FONT fontindex);
/**
* @brief 设置字体,使用自定义的路径以及尺寸
*
* @param dir 字体文件的路径
* @param hight 字体高度
* @param width 字体宽度
*/
void SetFont(const char *dir, uint16_t hight, uint16_t width);
/**
* @brief 在图像缓存中画字符串
*