文章目录
【DIY】基于电子墨水屏的迷你气象站
最近好像电子墨水屏的diy特别多,我想应该是墨水屏的纸面质感比较吸引人吧。。
1.需求分析
任何DIY第一步都要想清楚自己要做一个什么样的东西,实现什么样的功能。
如果这个想不好,那么后面的学习和制作过程就会摸不着头脑,东学学、西看看,没有方向,浪费时间。我自己也走过这个弯路,想了下还是思路不够开阔、视野比较狭窄,做过的、看过的东西少了,这个时候就会空有想法但是不知道怎么去实现它。
办公室里缺少一个时间显示摆件,就想着用电子墨水屏实时显示时间,再利用esp32联网功能可以加上点天气预报。至于还能显示什么,的确是没有想到特别的,网上的别人做的无非就是时间、天气、温湿度。
2.材料准备
主控: ESP32-S3。前期用过stm32f1,发现内存不太够,特别是4.2寸屏幕,用esp32轻松解决这个问题。
电子墨水屏: 闲鱼【冰凌玛特】 处购买,黑白双色2.9寸,应该是库存全新货,也不贵,型号为E029A01。内部驱动芯片通过询问商家确定是ssd1608,芯片手册在佳显官网可以免费下载。因为要显示时间,所以带局部刷新功能的屏幕比较合适,三色屏幕不能局刷。
墨水屏驱动板: 驱动电路其实是公开的,可以自己参照微雪官网画PCB。我直接在同一家买的驱动板。
3.硬件连接
- 一般墨水屏都是24pin的fpc软排接口,注意插入驱动板上时要看清楚空脚是哪一边,不要插反。
驱动板上一般都有电阻设置,注意电阻档位。我这边设置的是0.47R档位。
-
墨水屏控制原理可以自行百度,网上资料一大堆,简而言之就是通过电压控制显色元素上浮或者下沉,来变现出想要的颜色。
-
控制上都是通过SPI总线,硬件SPI or 软件SPI,我自己测试感觉差别不大。
-
总共用到6个IO+vcc+gnd。
- BUSY、RES、DC、CS、SCL、SDI
- vcc接3.3v
4.软件编写
开发采用Arduino+VS Code。一开始编辑器用的source insight,但是后来写Vue用了VS Code之后觉得真香啊。。SI要license太坑了,Arduino的代码编辑功能也很烂。。
关于Arduino Esp32的配置网上也有教程,这里不再赘述。这里想说的是, 想要快速熟悉硬件板子或者开源模块库的话,看Arduino上的例程是个很好的路子,会找到很多特性例子(如httpclient、wifi连接、fastled),可能比网上找到的例子还要管用。
4.0坐标系
首先要确定屏幕坐标系,这是后面显示任何东西的基础。
从测试结果来看,墨水屏的坐标原点和xy轴是固定的(有错误麻烦请指正),但是xy增长方向是可以靠配置的。
商家给的驱动例程配置得出的坐标系如下,摆放位置是横着,并且排线在左边。
// (0,296)----->----Y----->-------(0,0)
排 |
线 X
插 |
口 (128,296)
配置后的初始化坐标原点是在左上角(0,296)。
但是在如上的坐标系配置下,paint操作函数默认显示的坐标系如下左图:
// 0----->----Y----->-------296 0----->----X----->-------296
// | |
// X ===> Y
// | |
// 128 128
按照常用扫描方式的习惯性显示方式,即 逐行(y增加方向)右向(x增加方向) 扫描显示的话,左图坐标系图像显示是倒置的,且左右翻转了。
所以要在Paint_NewImage()
中设置旋转,和Paint_SetMirroring()
中设置镜像,从而调整坐标系到右图所示,也就是把常用扫描方式调整到自己的屏幕方向。
下面是我用的代码设置。
Paint_NewImage(BlackImage, area_height, area_width, ROTATE_270, WHITE);
Paint_Clear(WHITE);
Paint_SetMirroring(MIRROR_VERTICAL);
这样在图片和字体取模的时候就使用软件的默认扫描设置即可,不会出现颠倒等情况。
4.1软件模块
墨水屏显示最佳实践非微雪莫属。但是他家屏幕太贵,只能白嫖软件了。。另外还有GxEPD库,时间原因还没研究,看上去也是非常不错的。
微雪提供了各种平台的墨水屏显示库,包括stm32、esp8266/esp32、Arduino、树莓派等。
个人感觉这个库亮点在于paint操作封装,以及对于中文字库的处理。特别是paint操作比较方便,所以才想着要移植它。
微雪例程针对屏幕尺寸和色彩数进行了分类,在找适合自己屏幕的例程的时候,要注意最好不要一个个试过去。因为不同的屏幕刷进不同的配置参数和LUT时可能会把屏幕烧坏(我第一块2.9就是这样烧坏的)。后来我先用商家提供的驱动例程先点亮,然后再这个驱动例程之上再移植微雪的paint。
4.2主体逻辑
void EPD_2in9_station()
{
EPD_2IN9_Init(&epd_gpio_2); // Electronic paper initialization
EPD_WhiteScreen_ALL(); // Full screen refresh picture 1
delay(500);
uint32_t cnt=0;
uint32_t header_y=0;
while(1){
if ((cnt%(REFRESH_ALL_INTERVAL/REFRESH_TIME_INTERVAL)==0)) {// 定期强制全局刷新,否则显示会有残影和黑幕
EPD_SetRAMValue_BaseMap(nullptr);
}
EPD_Part_Init();
if (cnt%(REFRESH_WEATHER_INTERVAL/REFRESH_TIME_INTERVAL)==0){
weather_info_t w = getForecastWeather("hangzhou");
EPD_2in9_draw_weather(&w);
delay(100);
}
EPD_2in9_draw_time_once();
if (header_y <= EPD_2IN9_HEIGHT-gImage_header_cloud_width) {
EPD_2in9_draw_header(header_y);
header_y+=10;
}else {
header_y=0;
}
delay(100);
EPD_DeepSleep(); // Enter deep sleep,Sleep instruction is necessary, please do not delete!!!
delay(REFRESH_TIME_INTERVAL * 1000);
cnt++;
}
}
显示内容分为时间显示、天气显示、header动画。按照各自的频率局部刷新显示。
4.2.1 时间显示
利用esp32联网功能,定期同步网络时间。不同步的时候就本地每秒或者每分钟显示。
可以选择自己喜欢的数字字体,这里我直接在PCtoLCD2002
软件中选了个圆胖的字体。关于生成英文字体见后文。
提醒下,最好不要每秒钟刷新显示,因为墨水屏刷新寿命是有限的,最小显示分钟感觉就够了。
4.2.2 天气显示
网上DIY常用的天气获取接口有2个
1.https://e.weather.com.cn/mweather/101210101.shtml
2.https://api.seniverse.com/v3/weather/now.json(当天)
https://api.seniverse.com/v3/weather/daily.json(免费用户未来三天)
我用的第二个,教程直接看官网即可。
获取的数据是json格式的,要用<ArduinoJson.h>
解码。
获取之后,我是编写了和天气图片的映射关系,这样可以直接用图片表示天气。
4.2.3 header动画
实在想不到还能显示什么,就在屏幕最上面一块位置定期移动一朵长条云,然后随机出现一个太阳脸,晚上就是月亮脸。
4.3图片显示
最重要的就是前面说的坐标系及扫描方式。
图片取模软件用的是Image2Lcd 2.9
。
我的屏幕颜色总是反的,头像图不包含,输出图像大小要注意,程序中会用到width和height。
4.4英文显示
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~
这是ascii码表,用PCtoLCD2002
软件生成的时候复制上去,然后选择相应字体即可。
注意第一个字符是空格,要严格按照上面的顺序生成,否则微雪库paint时会寻址不到相应字符。
4.5中文显示
和英文用同样取模软件,懒得显示中文显示就省去了这步。
微雪例程中的所谓中文字库是每个字都分别取模粘贴进去的,在显示中文内容不确定时比较麻烦。
得到的.h文件在粘贴进去的时候要注意格式。
4.6页面UI设计
外壳是找朋友画的cad,tb找个亚克力商家做下只要10几块。
6.写在最后
6.0 自己的代码链接
https://github.com/CharlesPu/EPD-station
没有继续优化重构,能看懂就行,各位轻喷。
6.1 墨水屏的驱动芯片比较重要,一定要确认,这样还可以自行对墨水屏显示参数进行调优。
比较重要的参数就是LUT值,可以控制显示的鲜艳明显程度。
如果遇到屏幕显示颜色不明显,比如红色变糊,可能是屏幕老化不可逆转,也可能是LUT值没有设置对。
关于LUT值设置可以参考:
墨水屏电子标签通过修改lut并多层叠堆实现灰阶_墨水屏 lut-CSDN博客
树莓派 java 驱动 微雪 墨水屏 16灰阶 LUT_墨水屏 lut-CSDN博客
前期我也用了其他的二手屏幕(不知道驱动芯片的,所以没办法去改变LUT)走了一些弯路。介于能力和时间有限,也没有继续就这块屏幕研究下去。
6.2开放接口
可以看看这个网站,收集了很多开放api,看看能不能在里面找一些可以显示的东西
这篇文章主要还是自己做完之后的知识点整理总结,远没有达到各位大佬级别。各位墨水屏DIY爱好者遇到什么问题都可以留言交流~