NodeMCU 和 oled 制作桌面显示器

技术文章请注意时效!原理才是根本。

想做一个显示网站访问次数的显示器,使用 NodeMCU 和 0.96 寸 oled。由于以前使用过 NodeMCU,估计一天就能完成了,再用 3d 打印个盒子。做的过程中出现很多新问题,就没有时间设计盒子了,买来的电池也没用上,直接 usb 供电了。

项目地址:GitHub

固件

克隆 nodemcu 固件仓库

检出相应版本

拉取 docker 镜像

选择需要的 module

nodemcu-firmware/app/include/user_modules.h

打开智能配网

nodemcu-firmware/app/include/user_config.h

添加字体(u8g2 使用)

nodemcu-firmware/app/include/u8g2_fonts.h

编译固件

拷贝固件

进入固件目录 nodemcu-firmware/bin 中,得到编译完成后的固件。

坑 – not enough memory

购买的时候,写的是 32M 的内存,理论上不会出现内存不足的情况,然而二三百行的 lua 就出现”not enough memory” 的错误。

查阅网络,发现 github 上一个 issue 说:

It doesn’t really matter who makes a board since the chip is designed by espressif, and espressif’s datasheet says it supports only up to 16MB (128Mbits).My opinion: I think sellers intentionally write it is 32MB (which is wrong should be 32Mb or 4MB) just to sell those boards to people that don’t pay much attention.
The Chinaman either doesn’t know or doesn’t care about the difference between MB and Mb – always keep this in mind when buying stuff like this.

板子芯片最大支持 16MB,那个公司制造的都是不会到 32MB。淘宝上说的 32M 指的是 32Mbits。为的是故意夸大,和家里宽带一个套路,实际下载速率需要带宽除以 8。

u8g2 的简单使用

nodemcu-firmware\lua_examples\u8g2 下面有例子。

初始化屏幕

显示字

添加字体

nodemcu-firmware/app/include/u8g2_fonts.h 添加字体,编译固件的时候就给编译进去了。

绘制字体中的图形

查找 nodemcu 的文档 u8g2,一步步的可以找到字体中的字符图片,但是并没有可以复制的字符。

看一下 u8g2 的 api,这个实心的点是 UTF-8 encoded text,怎么从字体中得到呢?

下载字体文件:unifont-12.1.02.ttf
下载字体软件:BabelPad Ver12.1.0.4 简体中文版
把字体拖入字体软件,点击工具,字符映射表

在跳至编码处输入字符图片中字符的编码,即可找到可以复制的字符。比如闹钟字符,编码 23f0。

背景色的设置

oled 显示菜单,选择的菜单是背景有色,字符无色。没有选中的是字符有色,背景无色。
这是由两个 api 控制的
disp:setDrawColor() disp:setFontMode()

智能配网

需要在 user_config.h 打开智能配网设置:
SmartConfig is disabled by default and can be enabled by setting WIFI_SMART_ENABLE in user_config.h before you build the firmware.

手机商店搜索相关软件(Esptouch 等),即可配网。

硬件设计

NodeMCU 连接一个 dht11,一个声音传感器,一个按钮。声音传感器可以唤醒屏幕,按钮可以唤醒屏幕和配网。

软件设计

服务器后台每一个小时,爬取当前网站访问量和天气数据,并缓存。NodeMCU 访问时候拿到的是这个小时缓存的数据,速度就非常快了。

显示时间,并没有使用 NodeMCU 的 SNTP Module,而是通过服务器返回的时间戳和 rtctime Module 完成的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注