EPD-Station基于电子墨水屏的迷你气象站

【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并多层叠堆实现灰阶_墨水屏 lut-CSDN博客

树莓派 java 驱动 微雪 墨水屏 16灰阶 LUT_墨水屏 lut-CSDN博客

前期我也用了其他的二手屏幕(不知道驱动芯片的,所以没办法去改变LUT)走了一些弯路。介于能力和时间有限,也没有继续就这块屏幕研究下去。

6.2开放接口

https://apifox.com/apihub

可以看看这个网站,收集了很多开放api,看看能不能在里面找一些可以显示的东西


这篇文章主要还是自己做完之后的知识点整理总结,远没有达到各位大佬级别。各位墨水屏DIY爱好者遇到什么问题都可以留言交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值