lua编程简单实用入门教程,用NodeMCU在OLED上显示温湿度
Posted DLGG创客DIY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua编程简单实用入门教程,用NodeMCU在OLED上显示温湿度相关的知识,希望对你有一定的参考价值。
OLED模块介绍
OLED显示屏是指有机电激发光二极管(Organic Light-Emitting Diode,OLED),具备自发光,所以不需背光源,对比度高,厚度薄,视角广,反应速度快等特性,被认为是下一代的平面显示器新兴应用技术。
笔者使用的是0.96寸,白色,I2C总线的OLED模块显示屏,分辨率128x64,OLED常用接口有I2C和SPI。转接板自己画的,和某宝的上购买的模块接口基本一致。模块有5V转3.3V电路,可以兼容外接3.3V和5V电压。硬件部分这里就不多说了,购买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查看。模块如下:
I2C相关接口
由于使用了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.
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对应引脚关系如下图:
对应关系,比如下表:
NodeMCU Pin | ESP8266 Pin |
---|---|
D0 | GPIO16 |
D1 | GPIO5 |
D2 | GPIO4 |
D3 | GPIO0 |
D4 | GPIO2 |
D5 | GPIO14 |
… | … |
笔者的OLED模块引出脚是4个(有的是IIC和SPI兼容模块可能是7个引脚),OLED模块和NodeMCU之间连接关系如下:
OLED模块 | NodeMCU Pin | ESP8266 |
---|---|---|
VCC(带3.3V稳压) | VCC(3.3V或5V) | VCC |
GND | GND | GND |
SCL | D6 | GPIO12 |
SDA | D5 | GPIO14 |
注:
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 Pin | NodeMCU Pin | ESP8266 |
---|---|---|
VCC | 3.3V | VCC |
GND | GND | GND |
DATA | D4 | GPIO2 |
先将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屏显示信息了。如下图:
实际显示效果:
将温湿度动态的显示在OLED上
温湿度模块使用的是DHT11模块,关于DHT11模块的使用,之前写过一篇文章。这里就直接使用了
以上是关于lua编程简单实用入门教程,用NodeMCU在OLED上显示温湿度的主要内容,如果未能解决你的问题,请参考以下文章
[ESP8266系列] NodeMCU之在OLED上显示温湿度(lua编程)