天气墨水屏-添加时钟芯片
简介
天气、TXT阅读器、时钟、配网、前置光,多款炫酷外壳
简介:天气、TXT阅读器、时钟、配网、前置光,多款炫酷外壳开源协议
:GPL 3.0
描述
- 此工程为旧版本,新版本含SD卡https://oshwhub.com/jie326513988/SDka-mo-shui-ping-yue-du-qi
- 多款炫酷外壳(背壳透明、背壳磨砂、背壳实心、可贴水贴纸,电池可隐藏)
- 新增天数倒计时、B粉、图片随机播放、阅读模式时钟等多项功能,文件管理器已修复 点击下载
- 时钟芯片兼容BL8025T和RX8025T,TB买拆机几毛钱,适配固件V013-12,向下兼容
- 16MB已试验成功(B站动态),安信可的烧录工具可以烧录,需要勾选 DoNotChgBin 选项
- 平民级PCB彩印教程
- ESD需换成SMS05C,ch340不再费电,休眠电流降至0.02ma
- 如出现串口不断连接断开,磁珠改为0R电阻
- 测量电池电压电路有点缺陷
-
适配的硬件
-
1.本工程
- 由于是从KICAD导入的,或许会有疏漏使用立创EDA导出的话要检查清楚,最好是使用我提供的打板文件打板。
- 兼容前置光墨水屏-大连佳显T5D,使用普通墨水屏不焊前置光驱动电路即可(前置光外壳已上传)
- 添加透明亚克力后盖(已上传,含亚克力尺寸)
- 优化CH340漏电现象(ESD芯片问题),整机休眠低至0.02ma
- 温湿度芯片-SHT30
- ESD芯片-SMS05C
- SRV05-4为双向不适合此电路,其他双向ESD芯片也不行
- 因为双向ESD芯片在不插USB时会有电漏到ch340的开关MOS,导致ch340工作浪费电
- 性能更佳封装更小的LDO-ME6210A33M3G
- MLCC电容阵列
- 加长焊盘,物件间距合理,不再手残
- 必须插电池并打开拨动开关进行烧录程序,不支持USB&锂电池切换电源
- 前置光亮度调到最亮时对屏幕刷新有少许干扰,其他时候正常,不需要前置光不焊不影响
- 适配本工程的3D打印外壳-普通版已放出
- 适配本工程的3D打印外壳-普通版-背壳透明已放出
- 部分硬件有参考HalfSweet和DUCK,感谢!
2.HalfSweet(有温湿度芯片)
3.DUCK (无温湿度芯片)
介绍
-
- 默认支持2.9寸墨水屏,代号029A01。支持前置光墨水屏029T5D
- 码云连接,内含旧版本源码和新版固件(新版本源码暂不开源)
- 观看演示视频:https://www.bilibili.com/video/BV1e64y1Q7mA
- 仅支持GXEPD2库内的屏幕
- 使用Arduino开发
- 使用心知天气个人免费版KEY
- 提供适合3D打印的外壳文件
- 休眠电流0.026-0.04ma,工作电流120-70ma,瞬态电流500ma
功能简介
- 天气模式
- 天气实况、未来2天天气
- 紫外线强度、室外环境湿度、风力等级
- 中间显示一句话,网络获取或自定义
- 电量显示,电压或百分比
- 室内温湿度显示(需硬件支持sht30芯片)
- 自定义夜间不更新/更新
- 阅读模式
- 多达2.8mb的使用空间,最多可存3本书
- 使用索引方式,准确计算页数,可任意跳转,无限上一页
- 记忆功能,自动恢复上一次看的书籍和页数
- 电量显示
- 显示时间
- 快速换页
- 时钟模式
- 超大数字显示,不再眼瞎
- 自定义显示模式,日期/简洁
- 自定义校准间隔
- 自定义是否开启强制校准
- 自定义离线校准补偿
- 配网模式
- 自动、手动选择配置网络
- 配置天气KEY和城市
- 文件管理器
- 丰富的设置项
- 屏幕实时消息回传提示
- 预留OTA接口
- 上传大小判断
- 自定义图片模式
- 显示自定义的bmp图片,需到配网-文件管理器启用
- 天数倒计时
- B站粉丝显示
按键操作逻辑
- 正视图从左到右依次为 按键1 按键2 按键3 (按键3-GPIO5 按键2-GPIO0)
- 按住按键3不放,再按复位按键(按键1),即可进入模式选择界面
- 所有界面的按键操作逻辑为:
- 单独短按为切换选项
- 组合按键为确认操作或调出菜单:先按着按键3不放,再短按一下按键2,此时要释放按键3才会生效
- 新版已改成长按按键3为确认操作
- 按键2不可按得太快,不能在屏幕刷新的时候按,会导致屏幕死机,原因是按键2与屏幕刷新共用一个io口
注意事项,请耐心看完
- 天气获取需要心知天气私钥(20次/分钟),需要自己去申请,然后在配网界面输入即可。
- 原版U8g2_for_Adafruit_GFX库无法使用大字库,故我对该库做了修改,码云或群里下载
- 其他库均可在库管理器下载的到
- 无法连接wifi可能是被路由器拉黑或网络差,天线附近需要净空不能有飞线,电池挡住天线也可能会有影响
- 无法获取天气信息请检查城市名是否填对,免费用户只能查看到地级市
- 误低压休眠的请检查电池测量电路是否正常,电池电压是否大于3.2V(搭板的玩家自己给A0加上分压电路接上5V,分压后不能超过1V,否则烧ADC)
- 非本工程的MOS管(排线附近)使用起来发热严重可用cj3400代替,LDO使用ME6210A33PG、ME6209A33PG代替(压降越低越好)
- 如无法连接8266的热点或无法打开配网页,请检查手机是否开启了智能选网模式
- 电压低于3.45V的时候上传文件和需要扫描周边网络模式的有机会卡死(我的硬件电压低至3.3V仍然可以进行网络操作)
- 电池可以用:303450-500mah(适配本项目隐藏电池的背透外壳),602650-650mah(适配本项目外壳),601550-450mah(适配本项目的背透外壳),902030-500mah(DUCK&半糖的外壳)
使用到的库
- 电量较低时进入配网模式有几率重启,多试几次就好
- 电量较低时会导致上传文件、扫描周边网络时卡死。 (我的硬件电压低至3.3V仍然可以进行网络操作)
- 天气模式载入数据有极小几率会重启系统,EXCCAUSE Code(3),加载或存储期间的处理器内部物理地址或数据错误?
- 在配网页面连接无效的的WIFI会卡顿一段时间,有相应提示。可能是硬件问题,无法同时进行STA和AP的收发?等待提示连接失败即可操作其他
- 无法建立索引检查TXT文本结尾不能有换行
- 16MB的固件最大只支持9.9MB的TXT文本
- 在配网界面更换城市后无法即时刷新天气数据,不影响天气模式正常使用,https get数据失败,暂无能力解决。(已解决)
一些数据来源注明
请勿用于大规模商业用途
~~~~~~~~~~~~~~~~~~~~~~~~~~ 分割,可以不看 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8266如何读取TXT文件
比较多的人问我的墨水屏看小说是怎么做到的
这里仅简单的讲一下怎么用8266读取FLASH内的TXT文件(只限UTF-8),不做墨水屏测试
需要的前置知识
ASCIⅡ编码、UTF-8编码、Arduino 8266开发基础、文件系统基础
需要的硬件
带串口、带FLASH的8266模块,容量不限。
原理
首先我们需要弄明白编码知识,和文件使用的编码类型,知道这些我们才能对文件进行相应的处理,这里以UTF-8(3字节)的TXT文本为例
一个字节由8个二进制位组成的
ASCIⅡ,范围0-127,即00000000 到 01111111
ASCIⅡ 扩展, 范围128-255,即1000000 到 11111111
UTF-8编码规则:
如果为一个字节,那么这个8位字节的第一位就为0,即是ASCIⅡ的全部,0000 0000 到 0111 1111 (0-127)
如果为两个字节,那么第一个字节的前4位为1100
如果为三个字节,那么第一个字节的前4位为1110
从Unicode字符集中规定0x4E00代表汉字一,4E00的十进制是19968,二进制是100 1110 0000 0000,根据UTF-8的编码规则,中文需要三个字节才能存储,转化结果为11100100 10111000 10000000。
中文为三字节1110XXXX XXXXXXXX XXXXXXXX ,即1110 XXXX开头
ASCIⅡ扩展等二字节的为1100XXXX XXXXXXXX,即1100 XXXX开头
ASCIⅡ就是0-127了,直接判断 >=0&&<=127
就行了
所以只要判断读取的首字节是什么开头就能知道它是否是中文或是ASCIⅡ
所以我们使用文件系统读取文件的每个字符的首字节,然后进行判读该字节是什么类型,中文?ASCIⅡ扩展或其他两字节?ASCIⅡ?
核心代码如下,最后有附件完整示例代码
Serial.println("********* 单个字符输出 ********* ");
String zf = ""; //输出的单个字符
uint16_t zf_count = 0; //统计字符个数
txtFile = LittleFS.open("txt_test.txt", "r"); //打开txt文件
if (txtFile != 1) Serial.println("txt_test.txt 文件不存在");
while (txtFile.available())//开始读取
{
zf_count++;
char c = txtFile.read();//读取一个字节
byte a = B11100000;
byte b = c & a;
if (b == B11100000)//中文等 3个字节字符
{
zf += c; //第一个字节
zf += txtFile.read(); //第二个字节
zf += txtFile.read(); //第三个字节
}
else if (b == B11000000) //ascii扩展或其他2个字节字符
{
zf += c; //第一个字节
zf += txtFile.read(); //第二个字节
}
else if (c >= 0 && c <= 127) //ascii字符
{
zf += c; //第一个字节
}
Serial.print("第" + String(zf_count) + "个字符:");
Serial.println(zf);
zf = "";
}
txtFile.close(); //关闭文件
扩展
再讲一下显示到墨水屏的原理吧,因每个库的操作方法都不相同,这里以GXEPD2库和U8g2_for_Adafruit_GFX为例。
我们从上面的代码知道了怎么去处理UTF-8的字符了,只需要吧每个字符加起来,加够一行就换行
具体能分多少行就由屏幕的宽度决定
一行显示多少字就由屏幕的长度决定
比如2.9寸横屏模式下,长度为296,宽度为128
使用14*14的字体的话,就能分128/14,取整就是9行 ,每行296/14,取整就是21个中文
如果都是中文的话就可以每获取21个字符就换行,使用String[ ]存着就行,存够9行了就开始显示
要是有数字、英文、符号等其他非14个像素的字符还得另做判断
具体操作方法就是每获取一个字符就计算这个字符的长度,将长度进行累积,若即将到来的字符加入累积长度后会超过296就可以换行了,该字符就置入下一行
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
评论