大家好~ 合宙发起的Luat免费训练营第一期,目前已划上小小句号啦!初次开营虽说经验不足,却是大家共同的努力与坚持。期间汇聚了600+热爱学习、热爱物联网开发的朋友,特别感谢大家的支持与参与。
有趣的灵魂在这里碰撞,可谓学无止境欢乐常伴。这里有宝藏老师们的讲解,这里有技术大神们的指导,这里有最给力的学友们共同奋进,这里有惊喜礼品相赠,这里还有新版功能内测及新品体验机会……
本期我们将和大家分享训练营@打盹的消防车的作品——LuatOS天气时钟,也期待大家更多的作品交流与呈现。
LuatOS天气时钟
项目简介
本项目是使用LuatOS开发的简易天气时钟,使用了U8G2单色屏驱动库,Http获取天气显示出来。
W640+0.96寸OLED屏幕,低成本,非常适合入门,大家使用U8G2如发现Bug也欢迎反馈交流。
U8G2在固件层移植对接Lua接口,尽量还原U8G2的API,使Lua层使用U8G2可以做到无缝衔接,就像Python上运行一样。
目前LuatOS已实现U8G2基本的20多个API,可直接进行基础功能使用,如配合硬件I2C或SPI可以做出很多好看又流畅的动画;本项目使用硬件I2C驱动OLED。
软件架构
项目使用LuatOS在W640上运行,注意:U8G2在固件层移植,所以要编译最新固件下载后才能使用。
底板图示
功能代码展示及下载
本项目仅运用了简易版时钟功能演示,实际应用开发可根据需求增加更多功能。主要功能代码如下所示:
使用U8G2初始化屏幕功能代码
--初始化显示屏
log.info(TAG,"init ssd1306")
u8g2.begin({mode="i2c_hw",i2c_id=0})
其中配置表中设置配置参数,请根据具体情况调整:
硬件I2C:{mode="i2c_hw",i2c_id=0}
软件I2C:{mode="i2c_sw", pin0=18, pin1=19}
SPI:{mode="spi_hw_4pin",spi_id=0,OLED_SPI_PIN_RES=20,OLED_SPI_PIN_DC=21,OLED_SPI_PIN_CS=22}
字体设置与显示功能代码
u8g2.SetFontMode(1)
u8g2.ClearBuffer()
u8g2.SetFont("u8g2_font_ncenB08_tr")
u8g2.DrawUTF8("U8g2+LuatOS", 32, 28)
u8g2.SendBuffer()
for i=0,30,5 do
u8g2.ClearBuffer()
u8g2.SetFont("u8g2_font_ncenB08_tr")
u8g2.DrawUTF8("U8g2+LuatOS", 32, i)
u8g2.SendBuffer()
end
for i=128,34,-6 do
u8g2.ClearBuffer()
u8g2.SetFont("u8g2_font_ncenB08_tr")
u8g2.DrawUTF8("U8g2+LuatOS", 32, 28)
u8g2.SetFont("u8g2_font_wqy12_t_gb2312")
u8g2.DrawUTF8("by 打盹的消防车", i, 55)
u8g2.SendBuffer()
end
时间同步功能代码
socket.ntpSync()
u8g2.ClearBuffer()
u8g2.DrawUTF8("时间同步中", (u8g2.GetDisplayWidth()-5*12)/2, 28)
u8g2.DrawUTF8("请稍后...", (u8g2.GetDisplayWidth()-4*12)/2, 45)
u8g2.SendBuffer()
sys.waitUntil("NTP_UPDATE", 50000)
Http方式获取天气并进行解析
--天气HTTP回调函数
local function weather_cbfnc(code,headers,body)
if body then
local jsondata,ret,errinfo = json.decode(body)
if ret and type(jsondata)=="table" then
local city = jsondata["city"]
weather_now = jsondata["live"]["weather"]
temperature_now = jsondata["live"]["temperature"]
local weather_data = "城市:"..city.." 天气:"..weather_now.." 温度:"..temperature_now
print("weather",weather_data)
weather_now = jsondata["forecasts"][2]["dayweather"]
temperature_now = jsondata["forecasts"][2]["daytemp"]
weather_2 = jsondata["forecasts"][2]["dayweather"]
temperature_2 = jsondata["forecasts"][2]["daytemp"]
print("weather2",weather_2..temperature_2)
weather_3 = jsondata["forecasts"][2]["dayweather"]
temperature_3 = jsondata["forecasts"][2]["daytemp"]
print("weather3",weather_3..temperature_3)
sys.publish("WEATHER_OK")
else
print("estJson.decode error",errinfo)
end
end
end
http.get(weather_host..weather_location.."&imei="..wlan.getMac(), nil, weather_cbfnc)
sys.waitUntil("WEATHER_OK", 6000)
使用U8G2显示图形功能代码
local function drawWeatherSymbol(x, y,symbol)
if symbol=="多云" then
u8g2.SetFont("u8g2_font_open_iconic_weather_6x_t")
u8g2.DrawGlyph(x, y, 64)
elseif symbol=="霾" then
u8g2.SetFont("u8g2_font_open_iconic_weather_6x_t")
u8g2.DrawGlyph(x, y, 65)
-- elseif symbol=="月亮" then
-- u8g2.SetFont("u8g2_font_open_iconic_weather_6x_t")
-- u8g2.DrawGlyph(x, y, 66)
elseif symbol=="雨"or symbol=="雪" then
u8g2.SetFont("u8g2_font_open_iconic_weather_6x_t")
u8g2.DrawGlyph(x, y, 67)
-- elseif symbol=="星星" then
-- u8g2.SetFont("u8g2_font_open_iconic_weather_6x_t")
-- u8g2.DrawGlyph(x, y, 68)
elseif symbol=="晴" then
u8g2.SetFont("u8g2_font_open_iconic_weather_6x_t")
u8g2.DrawGlyph(x, y, 69)
end
end
网友评论