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查看。模块如下:
#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对应引脚关系如下图:
对应关系,比如下表:
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屏显示信息了。如下图:
实际显示效果:
将温湿度动态的显示在oled上
温湿度模块使用的是dht11模块,关于dht11模块的使用,之前写过一篇文章。这里就直接使用了

电子垃圾的来源与分类
ChatGPT的朋友们:大语言模型经典论文
电机轴磨损怎么形成的?如何修复?
“示波器带宽”与“网络带宽”有什么区别?
深度学习:什么是IoU?
lua编程入门教程,用NodeMCU在OLED上显示温湿度
4680电池技术引领 核心设备企业诚捷智能实现跨越式发展
共基极放大电路的设计与实现(二)
为什么工业软件的发展如此困难?
GTX1050游戏本普及,惠普暗影精灵II代Pro仅5499!
英伟达发布最新AI芯片H200:性能提升2倍,成本下降50%
Talkase 推新款T3卡片手机,售价仅99美元
越用越卡的安卓系统 还能够自我救赎战胜苹果系统吗?
未使用端接的低电压差分信号总线输入方案
ARM-Linux开发有什么不一样的地方
阿里云成功打破Google纪录 可提供全球最快AI计算服务
电控系统中常见的开关电源类型及直流电压等级
漏电开关测试仪型号那么多怎么选?教你设计ATmega32智能测试仪
伟创力继续看好上网本扩张代工版图
传感器应用领域有哪些?