小言_互联网的博客

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

408人阅读  评论(0)

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

大家好~ 合宙发起的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,开启行业嵌入式开发新生态!

LuatOS是运行在嵌入式硬件的实时操作系统,深度整合Lua语言,只需少量内存和Flash空间就能运行,用户编写Lua代码即可实现各种功能。

LuatOS聚焦嵌入式应用生态,具备源码小巧、简洁易用、性能高效以及强扩展性等特色。大大降低嵌入式开发的入门门槛,并且可有效缩短物联网产品开发周期,降低企业开发成本。

软件架构

项目使用LuatOS在W640上运行,注意:U8G2在固件层移植,所以要编译最新固件下载后才能使用。

底板图示

实物演示

LuatOS天气时钟

注:屏幕及手机拍摄原因,演示视频中频闪比较明显,演示效果受影响。实际上在正常环境中的实物演示,人眼是察看不出频闪的。

功能代码展示及下载

本项目仅运用了简易版时钟功能演示,实际应用开发可根据需求增加更多功能。主要功能代码如下所示:

使用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

项目相关更多功能
Dozingfiretruck / LuatOS天气时钟
上海合宙通信模块 - 合宙Luat,让万物互联更简单


转载:https://blog.csdn.net/weixin_54248548/article/details/114147359
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场