lua编程入门教程,用NodeMCU在OLED上显示温湿度

时间:2021-01-13来源:佚名

OLED模块介绍

OLED显示屏是指有机电激发光二极管(Organic Light-Emitting Diode,OLED),具备自发光,所以不需背光源,对比度高,厚度薄,视角广,反应速度快等特性,被认为是下一代的平面显示器新兴应用技术。

笔者使用的是0.96寸,白色,I2C总线的OLED模块显示屏,分辨率128x64,OLED常用接口有I2C和SPI。转接板自己画的,和某宝的上购买的模块接口基本一致。模块有5V转3.3V电路,可以兼容外接3.3V和5V电压。硬件部分这里就不多说了,购买oled模块后客服都会给模块相关资料。

lua编程入门教程,用NodeMCU在OLED上显示温湿度

注: 在购买OLED模块时,要查看该模块是否被 u8g2库 所支持,只有被 u8g2库 支持的OELD屏才能使用该库。

启用I2C和OLED模块

在往期文章《 ESP8266之NodeMCU固件编译 》中,其实已经介绍了如何启用NodeMCU所支持的各种模块,启用对应的模块后,需要重新编译固件,烧录到ESP8266才能使用,一般根据自己的需求开启对应的模块,以减少固件的大小。

1)启用I2C模块,需要打开 user_modules.h 文件中的 LUA_USE_MODULES_I2C ,使用笔者之前编译的固件,默认是已经开启了。

ESP8266芯片没有硬件I2C接口,所以模块使用软件接口驱动程序。可包括GPIO16在内的任何GPIO引脚上设置。模块支持主模式,每条总线上可具有不同速度,最多10条总线。
速度标准:

慢速:100kHz;

快速:400kHz;

FastPlus:1MHz
也可设置任意时钟。GPIO16引脚可以作为SCL引脚使用,但所选的总线将被限制为不超过FAST速度。
模块不支持高速模式(3.5MHz时钟)和10位寻址方案。

2)启用OLED模块,需要打开 user_modules.h 文件中的 LUA_USE_MODULES_U8G2 ,u8g2模块 已经将常见的OLED屏驱动都写好了,源码是开源的,可上GitHub查看。模块如下:

#define LUA_USE_MODULES_I2C #define LUA_USE_MODULES_U8G2I2C相关接口

由于使用了u8g2库,这里就只需要了解 i2c.setup() 接口。

i2c.setup(id, pinSDA, pinSCL, speed)

参数:

id:0~9,总线编号,NodeMCU支持10个I2C总线。

pinSDA:1~12,SDA的IO口编号

pinSCL:1~12, SCL的IO口编号

speed:i2c.SLOW (100kHz), i2c.FAST (400kHz), i2c.FASTPLUS (1MHz)或者在25000 ~ 1000000Hz之间的任意时钟频率。FASTPLUS模式在默认80MHz的CPU频率下产生600kHz的I2C时钟速度,要得到1MHz的I2C时钟速度,要使用接口 node.setcpufreq(node.CPU160MHZ) 改变CPU频率到160MHz。

返回值:

speed:成功则返回设置的speed;失败则返回0。

想了解其他接口,可见NodeMCU官方文档。

U8G2库相关接口SSD1306驱动的初始化

使用I2C接口,调用以下代码初始化:

sla = 0x3c -- oled的I2C地址 -- id:I2C初始化时的id disp = u8g2.ssd1306_i2c_128x64_noname(id, sla)

其他驱动类型的OLED初始化,见NodeMCU官方文档。

u8g2.disp:drawStr(x, y, *str)

x:x轴坐标

y:y轴坐标

str:要显示的字符串

u8g2.disp:sendBuffer(void)

将内存帧缓冲区的内容发送到显示器,执行该函数,OLED才会显示设置的内容。

OLED字体设置

字体设置在 app/include 目录下的 u8g2_fonts.h 文件,需要什么字体,只需在 U8G2_FONT_TABLE_ENTRY(font_wqy16_t_chinese3) 后面加入对应的字体宏即可,由于全中文字库很大,编译出的固件大小将会很大,可能会导致烧录失败或者ESP8266启动不了。笔者就直接使用默认的字体了。u8g2的字体设计又是一门技术,网上也有大佬出教程,有兴趣的可以搜搜。

// Add a U8G2_FONT_TABLE_ENTRY for each font you want to compile into the image // See https://github.com/olikraus/u8g2/wiki/fntlistall for a complete list of // available fonts. Drop the 'u8g2_' prefix when you add them here. #define U8G2_FONT_TABLE U8G2_FONT_TABLE_ENTRY(font_6x10_tf) U8G2_FONT_TABLE_ENTRY(font_unifont_t_symbols) U8G2_FONT_TABLE_ENTRY(font_wqy16_t_chinese3)

u8g2支持的字体见u8g2官网。

点亮OLED模块

首先要搞清楚ESP8266和NodeMCU引脚之间的关系,很多新手容易搞混。ESP8266和NodeMCU对应引脚关系如下图:

lua编程入门教程,用NodeMCU在OLED上显示温湿度

对应关系,比如下表:

NodeMCU PinESP8266 PinD0GPIO16D1GPIO5D2GPIO4D3GPIO0D4GPIO2D5GPIO14……

笔者的OLED模块引出脚是4个(有的是IIC和SPI兼容模块可能是7个引脚),OLED模块和NodeMCU之间连接关系如下:

OLED模块NodeMCU PinESP8266VCC(带3.3V稳压)VCC(3.3V或5V)VCCGNDGNDGNDSCLD6GPIO12SDAD5GPIO14

注:

ESP8266单模块的VCC是3.3V的。

若OLED模块还有RES,DC,CS引脚,可按照说明在程序中控制,或直接在硬件上配置好,具体看oled模块资料。

若OLED模块不带3.3V稳压,则OLED的VCC连接到NodeMCU的3.3V引脚上,因为0.96寸OLED屏大多是3.3V电源,具体以OLED屏规格书为准。

DHT11模块和NodeMCU之间连接关系:

DHT11 PinNodeMCU PinESP8266VCC3.3VVCCGNDGNDGNDDATAD4GPIO2

先将OLED和NodeMCU开发板连接好,然后接上将usb接到电脑端,上传点亮oled的lua代码。

代码如下:

-- 管脚定义 local sda = 5 -- GPIO14 local scl = 6 -- GPIO12 local sla = 0x3c -- oled的地址,一般为0x3c -- 初始化 function init_oled() -- iic总线 和 oled初始化 i2c.setup(0, sda, scl, i2c.SLOW) disp = u8g2.ssd1306_i2c_128x64_noname(0, sla) -- 设置字体 disp:setFont(u8g2.font_unifont_t_symbols) disp:setFontRefHeightExtendedText() --disp:setDrawColor(1) disp:setFontPosTop() --disp:setFontDirection(0) -- 画边框 --disp:drawFrame(0, 0, 128, 64) end -- 显示函数 function oled_show_msg() -- 设置显示内容 disp:drawStr(0, 0, "1 Hello OLED") disp:drawStr(0, 16, "2234567890ABCDEF") disp:drawStr(0, 32, "3234567890ABCDEF") disp:drawStr(0, 48, "4234567890ABCDEF") -- 将内容发送到oled disp:sendBuffer() end -- 主函数 function main() init_oled() oled_show_msg() end -- 运行程序 main()

将代码保存到 oled.lua 文件,通过 ESPlorer工具 上传到ESP8266模块,刷新ESPlorer文件列表,点击 oled.lua 就可以看到oled屏显示信息了。如下图:

lua编程入门教程,用NodeMCU在OLED上显示温湿度

实际显示效果:

lua编程入门教程,用NodeMCU在OLED上显示温湿度

将温湿度动态的显示在OLED上

温湿度模块使用的是DHT11模块,关于DHT11模块的使用,之前写过一篇文章。这里就直接使用了

    相关阅读

    触控一体机显示屏出现闪烁是什么原因导致?该怎么解决?

    当触控一体机使用一段时间之后,很多用户发现使用过程中经常会出现触控一体机屏幕闪烁的状况,遇到这种现象不要慌,找到故障的原因然后针对性地消除导致显示屏闪烁的因素,就...
    2022-06-19
    触控一体机显示屏出现闪烁是什么原因导致?该怎么解决?

    家庭用LED防爆灯的双控开关是怎么进行接线的

    随着城镇居民生活水平的提高,居民们选择家具的标准就不再只是实用了,简单便捷的智能操作,这也成为了人们选择家具的重要依据之一。LED防爆灯 的双控开关的流行就是一个很典型...
    2022-05-21
    家庭用LED防爆灯的双控开关是怎么进行接线的

    触控一体机触控没反应或者反应迟钝的原因跟解决办法

    触控一体机在平日里使用当中,因为种种原因造成的触摸一体机出现花屏、显示响应时间太长、触控不精准、触控无反应或者反映迟钝恐怕很多用户都有类似体验,这些故障的解决,需...
    2022-06-19
    触控一体机触控没反应或者反应迟钝的原因跟解决办法

    触控一体机如果突然没有声音了该怎么办?

    有时候用户可能会遇到触控一体机处于非正常状态,比方说本来运行得好好的,突然之间就没有声音了,或者是在关机再开机之后就再也没有声音了,这是怎么一回事呢?如果遇到这样...
    2022-06-19
    触控一体机如果突然没有声音了该怎么办?

    怎么样使用虚拟鼠标在触控一体机上面建立文件夹?

    我们平常都习惯使用键盘跟鼠标来操控电脑,对于触控一体机这个设备,很多用户在操作上面还比较陌生,一般情况下触控一体机都不会配备物理鼠标跟键盘,基本上都是使用虚拟鼠标...
    2022-06-19
    怎么样使用虚拟鼠标在触控一体机上面建立文件夹?

    led灯开关次数会影响寿命吗?

    在日常生活中,有时频频运用灯的话,容易使灯泡烧掉。那led灯寿数和开关次数有联系吗? LED灯寿数和开关次数基本没有太大联系,能够频频开关的。 Led灯寿数和开关次数无关,主要...
    2021-09-11
    led灯开关次数会影响寿命吗?

    选择性价比高的室内小间距LED显示屏?

    小间距产品,具有高刷新、高灰阶、高亮度利用率、无残影、低功耗、低EMI的特点,室内应用不反光,其轻便超薄、精度高,占用运输及使用空间小、静音且高效散热的特点。 小间距...
    2023-02-28
    选择性价比高的室内小间距LED显示屏?

    LED显示屏坏点维修

    LED显示屏在现代社会中扮演着重要的角色,广泛应用于商业、娱乐和信息传播等领域。然而,由于各种原因,LED显示屏上可能会出现坏点,给用户带来不便和困扰。因此,了解和掌握...
    2023-09-09
    LED显示屏坏点维修

    网站栏目