LuatOS | 轻松DIY简易天气时钟,训练营资料福利全开放

2021-02-27  本文已影响0人  Luat物联网通信模块

大家好~ 合宙发起的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

项目相关的更多功能,请参见完整代码

上一篇 下一篇

猜你喜欢

热点阅读