在上一篇章中,实现了使用Golang开发的MQTT broker,并部署到本地网络中。本篇继续将NodeMCU接入本地MQTT服务器,并通过外接的OLED显示屏来显示其他设备发送来的消息。
在一年前接触NodeMCU后陆续写了几篇学习的博文,中间由于各种原因间隔比较久,本篇将会是这个系列的最后一篇。通过学习以后有需要用到wifi联网的简单功能可以直接通过NodeMCU来快速demo,简单的几行代码就可以实现功能。但是,正如一开始就提到的,NodeMCU使用Lua开发的这种模式并不安全并且跑起来也不是很稳定,正式项目中不建议使用。
本篇将加上显示功能,通过0.96寸的OLED屏幕显示log信息,及从其他设备发送来的MQTT消息。加上屏幕后NodeMCU的可玩性大大增加,可以做成一个无线的显示屏,接收其他设备的消息并显示。或者自动从网络上抓取天气等信息,做成一个小的天气预报站。
1. 编译固件
通过在线build的网页,增加勾选U8G2选项,在固件中添加OLED显示屏的图形库。这里用的屏幕是I2C接口的,所以I2C选项也要勾选。然后选择好字体和显示器类型就可以build了。
这里使用的0.96寸OLED屏幕是128x64分辨率,所以选择的是6x10大小的字体及ssd1306_i2c_128x64_noname的库。
![](https://i-blog.csdnimg.cn/blog_migrate/722816252e95c8e45fb5a6a65be988fa.png)
2.屏幕显示
按照原理图连接显示屏及NodeMCU,用的是I2C接口,所以只要连接GND、VCC、SCL、SDA四根线。
U8G2的库使用也比较简单,设置好引脚及I2C地址然后调用ssd1306_i2c_128x64_noname配置显示模式。使用setFont设置字体,这些与build时候选择的一致即可。
id = 0
sda = 2 -- GPIO4
scl = 1 -- GPIO5
sla = 0x3c
function init_display()
i2c.setup(id, sda, scl, i2c.FAST)
disp = u8g2.ssd1306_i2c_128x64_noname(id, sla)
disp:setFont(u8g2.font_6x10_tf)
disp:setFontPosTop()
disp:clearBuffer()
end
这个屏幕分辨率是128x6,使用6x10的字体只能显示6行文字,所以显示log的时候需要滚动屏幕。很多显示屏控制芯片都自带滚屏功能,不过这个OLED屏幕看起来不支持,这里实现了一个简单的滚屏函数。思路比较简单:定义一个数组保存屏幕当前的内容,并保存下一次要写的位置,每次写入新的内容都保存到数组中。先清除屏幕内容,再从当前的下一行开始显示整个数组,这样就实现了滚屏显示。不过由于I2C接口速度比较慢,刷新的时候会有闪烁。
Note:Lua脚本的数组下标从1开始,需要注意。
max_line = 6
address = {0, 10, 20, 30, 40, 50}
lines = {"", "", "", "", "", ""}
current_line = 1
need_scroll = 0
function display_log(str)
lines[current_line] = str --save to buffer
if(need_scroll == 0) then
print_str(0, address[current_line], str)
current_line = current_line + 1
if(current_line > max_line) then
need_scroll = 1
current_line = 1
end
else
disp:clearBuffer()
j = 1
if current_line < max_line then
for i=current_line+1, max_line do --draw from next index
print_str(0, address[j], lines[i])
j = j + 1
end
end
for i=1,current_line do ----draw from index 1
print_str(0, address[j], lines[i])
j = j + 1
end
current_line = current_line + 1
if(current_line > max_line) then
current_line = 1
end
end
refresh()
end
3.连接MQTT服务器
有了之前连接公有云的基础,NodeMCU连接到本地MQTT服务器就很容易,直接将之前的username、password参数去掉,改成本地host ip地址就可以了。
myMQTThost = "192.168.2.100" --host
myMQTTport = 1883
--------MQTT------------------
myMQTTClientId = "esp"..connid
myMQTT=mqtt.Client(myMQTTClientId, 120)
myMQTT:connect(myMQTThost, myMQTTport, 0, MQTTSuccess, MQTTFailed)
4.组合测试
最终将所有的模块组合起来进行测试,NodeMCU连接到服务器向topic:"home/esp/event"上报数据,同时自己订阅topic:“home/esp/user/mydata”。这样从PC上MQTT客户端向topic:"home/esp/user/mydata"发送数据就可以显示到NodeMCU的显示屏上。
可以看到上报的信息:
![](https://i-blog.csdnimg.cn/blog_migrate/d142253b63fa1a479bba4988c59dea75.png)
NodeMCU可以显示PC发送的信息:
![](https://i-blog.csdnimg.cn/blog_migrate/5d9bf4195ee0771b803be15182d2f8d4.gif)
5.总结
使用NodeMCU实现的物联网显示屏已经做完了,虽然只是比较简单的功能,整体上还是学到的NodeMCU的功能,学习了MQTT协议并且自己实现了一个MQTT broker,收获很多。
Github: https://github.com/songdaw/node_mcu_study
码云:https://gitee.com/songdaw/node_mcu_study