ESP8266基于Lua开发U8g2 + ssd1306 i2c oled+DHT11网页动态更新

该文介绍了一个使用ESP8266微控制器,基于Lua编程语言,结合U8g2库和SSD1306OLED显示器以及DHT11温湿度传感器的项目。通过建立简单的HTTP服务器,实现了DHT11传感器数据在网页上的动态更新,同时数据也在OLED屏幕上显示。程序包括了WiFi连接、HTTP服务器设置和温湿度数据的获取与显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ESP8266基于Lua开发U8g2 + ssd1306 i2c oled+DHT11网页动态更新


  • ✨类似的DS18B20传感器数据在网页上显示,可以参考官方资料库中的相关案例:https://github.com/nodemcu\nodemcu-firmware\lua_modules\ds18b20
  • 📺功能演示:

在这里插入图片描述

  • 🌼SSD1306 OLED显示:

在这里插入图片描述

  • 🌻网页显示:
    在这里插入图片描述
  • 🍁目录架构:
    在这里插入图片描述

📝程序部分

  • 🌿connect_wifi.lua
-- 连接到指定的wifi (这里不将配置保存到flash)
print("Connecting WIFI...")
wifi.setmode(wifi.STATION)        -- 设置wifi模式为客户端模式
station_cfg={}
station_cfg.ssid = "MERCURY_D268G"        -- 设置wifi名
station_cfg.pwd  = "pba5ayzk"    -- 设置wifi密码
station_cfg.save = false            -- 不将配置保存到flash
wifi.sta.config(station_cfg)        -- 开始配置wifi
wifi.sta.connect()                    -- 连接wifi
mytimer = tmr.create()                -- 创建一个定时器,检测连接wifi是否成功
  -- 让页面每1.5秒自动刷新一次
mytimer:alarm(1500, tmr.ALARM_AUTO, function() 
    if wifi.sta.getip() == nil then -- 没有获取到IP,连接失败,1s后继续检测
        print("IP unavaiable, Waiting...") 
    else
        mytimer:stop()               -- 连接成功,停止定时器
        print("Config done, IP is "..wifi.sta.getip())  -- 打印IP地址
    end 
end)
  • 🌿dht-web.lua
-- 定义DHT11通信引脚。
pin = 4
-- 实现一个简单地 HTTP服务器
srv = net.createServer(net.TCP)
-- 监听80端口
srv:listen(80, function(conn)
    conn:on("receive", function(sck, payload)
        print(payload)
        -- 获取温湿度信息
        local status, temp, humi, temp_dec, humi_dec = dht.read11(pin)
        -- 创建一个buf,用于存放web端的代码
      
       local  buf = "HTTP/1.1 200 OK\nContent-Type: text/html\nRefresh: 5\n\n" ..
    "<!DOCTYPE HTML>" ..
    "<html><body>" ..
    "<h1>ESP8266 Web DHT11 Data Display</h1></br>"
        -- 设置页面编码,防止中文乱码
       -- buf = buf.."<meta charset=\"utf-8\">";
     --   buf = buf.."<h2>HELLO DHT11</h2>";  
        buf = buf .. 
        "<p>当前温度: " ..
        DHT11Temp ..
  --      "." ..
        DHT11TempDec ..
        "°C</p>" ..  
        "<p>当前湿度: "..
        DHT11Hum ..
        "." ..
        DHT11HumDec ..
        "%</p>" 
        sck:send(buf)
    end)
    conn:on("sent", function(sck) sck:close() end)
end)

  • 🌿OLED_DHH11.lua
DHT11pin     = 4  -- D4, GPIO2
DHT11Temp    = 0
DHT11TempDec = 0
DHT11Hum     = 0
DHT11HumDec  = 0
ErrChk       = true
ErrTimeOut   = true
DHT11Status  = dht.ERROR_TIMEOUT
-- OLED初始化
function init_oled()
    -- IIC管脚和OLED地址定义
    local sda = 5     -- D5, GPIO14
    local scl = 6     -- D6, GPIO12
    local sla = 0x3c
    -- IIC总线初始化
    i2c.setup(0, sda, scl, i2c.SLOW)
    -- OLED初始化
    disp = u8g2.ssd1306_i2c_128x64_noname(0, sla)
    -- 设置OLED字体
    disp:setFont(u8g2.font_unifont_t_symbols)
    disp:setFontRefHeightExtendedText()
    --disp:setDrawColor(1)
    disp:setFontPosTop()
    --disp:setFontDirection(0)
    -- 画边框
    disp:drawFrame(0, 16, 128, 63)
    disp:drawFrame(0, 0, 128, 16)
    disp:drawHLine(0,63,128)
end
-- 获取DHT11数据
function getDHT11Info()
    DHT11Status, DHT11Temp, DHT11Hum, DHT11TempDec, DHT11HumDec = dht.read11(DHT11pin)
    if DHT11Status == dht.OK then
        ErrChk     = false;
        ErrTimeOut = false;
        print(string.format("DHT Temperature:%d.%01d°C;  Humidity:%d.%01d%%\r\n",
              DHT11Temp,
              DHT11TempDec,
              DHT11Hum,
              DHT11HumDec))
    elseif DHT11Status == dht.ERROR_CHECKSUM then
        ErrChk = true
        print( "DHT Checksum error." )
    elseif DHT11Status == dht.ERROR_TIMEOUT then
        ErrTimeOut = true
        print( "DHT TimeOut." )
    end
end
-- 显示温湿度
function oled_show_msg()
    getDHT11Info()
    -- 判断通讯无误,就将数据就显示在OLED上    
    if not(ErrChk or ErrTimeOut) then
 --       disp:drawStr(15, 26,  "Temp: " .. DHT11Temp .. "C")
        disp:drawUTF8(15, 24,  "Temp: " .. DHT11Temp .. "C")
        disp:drawStr(15, 40, "Hum : " .. DHT11Hum .. "%")
        disp:sendBuffer()
    end
end
-- main
function main()
    init_oled()    
    disp:drawStr(8, 0,  "  DHT11 DATA")
    disp:sendBuffer()
    -- 定时器,每2.5秒刷新一次数据
    local dht_timer = tmr.create()
    dht_timer:alarm(2500, tmr.ALARM_AUTO, function() oled_show_msg() end)
end
main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值