ESP8266基于Lua开发U8g2 + ssd1306 i2c oled+DHT11网页动态更新
- ✨类似的DS18B20传感器数据在网页上显示,可以参考官方资料库中的相关案例:
https://github.com/nodemcu\nodemcu-firmware\lua_modules\ds18b20


- 🌻网页显示:

- 🍁目录架构:

📝程序部分
-- 连接到指定的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)
-- 定义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)
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()