NodeMCU学习系列(六) ---- 连接本地服务器(下)

在上一篇章中,实现了使用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的库。

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的显示屏上。

 可以看到上报的信息:

 NodeMCU可以显示PC发送的信息:

5.总结

 使用NodeMCU实现的物联网显示屏已经做完了,虽然只是比较简单的功能,整体上还是学到的NodeMCU的功能,学习了MQTT协议并且自己实现了一个MQTT broker,收获很多。

Github: https://github.com/songdaw/node_mcu_study
码云:https://gitee.com/songdaw/node_mcu_study

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值