ESP8266基于Lua开发U8g2 + ssd1306 i2c oled+DHT11/DS18B20数据

ESP8266基于Lua开发U8g2 + ssd1306 i2c oled+DHT11/DS18B20数据


在这里插入图片描述

📝DHT11数据显示驱动代码

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()

📝驱动DS18B20数据显示代码

local t = require("ds18b20")
local pin = 4 -- gpio2 = 4
Temp    = 0
function readout(temp)
  if t.sens then
    print("Total number of DS18B20 sensors: ".. #t.sens)
    for i, s in ipairs(t.sens) do
      print(string.format("  sensor #%d address: %s%s",  i, ('%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X'):format(s:byte(1,8)), s:byte(9) == 1 and " (parasite)" or ""))
    end
  end
  for addr, temp in pairs(temp) do
    print(string.format("Sensor[%s] Temp: %3.1f°C", ('%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X'):format(addr:byte(1,8)), temp))
    Temp = string.format("%3.1f", temp) 
  end
  
end

local cross_block_width = 16
local cross_block_height = 16
local cross_block_bits = string.char(
-- 取模方式:阴码-逆向、逐行、C51
    0x00,0x00,0x0C,0x00,0x12,0x00,0xD2,0x2F,0x2C,0x30,0x10,0x20,0x10,0x20,0x10,0x00,
    0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x20,0x20,0x10,0xC0,0x0F,0x00,0x00,0x00,0x00)--/*"℃",0*/
-- 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

-- 显示温湿度
function oled_show_msg()
    
   t:read_temp(readout, pin, t.C)
    -- 判断通讯无误,就将数据就显示在OLED上    
       disp:drawUTF8(15, 24,  "Temp: " .. Temp)
--       disp:drawUTF8(15, 40,  "°C")
--        disp:drawStr(15, 40, "Hum : " .. DHT11Hum .. "%")
        disp:sendBuffer() 
    disp:drawXBM(98, 22, cross_block_width, cross_block_height, cross_block_bits)
end
-- main
function main()
    init_oled()    
    disp:drawStr(8, 0,  " DS18B20 DATA")
    disp:sendBuffer()
    -- 定时器,每2.5秒刷新一次数据
    local dht_timer = tmr.create()
    dht_timer:alarm(2500, tmr.ALARM_AUTO, function() oled_show_msg() end)
end
main()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值