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

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

作者: Luat物联网通信模块 | 来源:发表于2021-02-27 10:54 被阅读0次

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

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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/vwdvfltx.html