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上
ifnot(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)doprint(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)doprint(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()