• 欢迎大家分享资料!前往留言板评论即可!

合宙训练营结营作品-桌面天气助手

合宙 模组资料网 2年前 (2021-05-15) 303次浏览 0个评论 扫描二维码
文章目录[隐藏]

luatos-Desktop weather station 基于合宙Air640w的天气桌面

介绍

使用合宙Air640w搭建的桌面天气助手,屏幕使用的是迪文科技的串口屏。
先放上渲染图。
合宙训练营结营作品-桌面天气助手

今日天气获取

通过http.get向百度地图开放平台获取天气情况,将返回的json数据进行解析,获得天气情况、温湿度,将天气情况与预存的对照表进行对比,获取天气的编码,通过串口屏编码函数进行数据编码,使用串口发送给串口屏。

http.get(
    "http://api.map.baidu.com/weather/v1/?district_id=130111&data_type=now&ak=**************************",
    nil,
    function(code, headers, body)
        local WeatherIdi = 1 -- 天气索引值
        local MyJson,result = json.decode(body)
        if result then
            Temp = MyJson.result.now.temp -- 温度
            Hum = MyJson.result.now.rh -- 相对湿度
            IconNumShow(0x5001,Temp) -- 发送温度
            IconNumShow(0x5003,Hum) -- 发送湿度
            while MyJson.result.now.text ~= WeatherId[WeatherIdi] do --检索当前天气
                WeatherIdi = WeatherIdi + 1
            end
            WeatherIdi = WeatherSwitch(WeatherIdi) -- 获取串口屏天气序号
            IconNumShow(0x5000,WeatherIdi) -- 串口屏显示天气图标
        else
        end
    end
)

预报天气获取

通过http.get向百度地图开放平台获取天气情况,将返回的json数据进行解析,获得天气情况、最高低温度,将天气情况与预存的对照表进行对比,获取天气的编码,通过串口屏编码函数进行数据编码,使用串口发送给串口屏。

http.get(
    "http://api.map.baidu.com/weather/v1/?district_id=130111&data_type=fc&ak=**************************",
    --获取预报天气
    nil,
    function(code, headers, body)
        local WeatherIdFCi = 1
        local FCJson,result = json.decode(body)
        if result then
            HTemp = FCJson.result.forecasts[1].high -- 最高温
            LTemp = FCJson.result.forecasts[1].low -- 最低温
            IconNumShow(0x500A,HTemp) -- 发送最高温
            IconNumShow(0x500C,LTemp) -- 发送最低温
            while FCJson.result.forecasts[1].text_day ~= WeatherId[WeatherIdFCi] do --检索当前天气
                WeatherIdFCi = WeatherIdFCi + 1
            end
            WeatherIdFCi = WeatherSwitch(WeatherIdFCi) -- 获取串口屏天气序号
            IconNumShow(0x5009,WeatherIdFCi) -- 串口屏显示天气图标
        else
        end
    end
)

时间获取

通过http.get向苏宁时间接口发起请求获取时间,并通过串口屏时间设置函数发送到串口屏上。

http.get(
    "http://quan.suning.com/getSysTime.do",
    nil,
    function(code, headers, body)
        local TMJson,result = json.decode(body)
        if result then
            local TIME = TMJson.sysTime1 -- 时间
            local t_year = string.sub(TIME,1,4)--取出年份
            local t_month = string.sub(TIME,5,6)--取出月份
            local t_day = string.sub(TIME,7,8)--取出日
            local t_hour = string.sub(TIME,9,10)--取出时
            local t_min = string.sub(TIME,11,12)--取出分
            t_sec = string.sub(TIME,13,14)--取出秒
            RTCShow(t_year,t_month,t_day,t_hour,t_min,t_sec) -- 时间发送
        end
    end
)

设备控制

设备控制主要依赖于MQTT,通过解析串口屏按键按下后的反馈,将预先设置好的数据发送到MQTT服务器上,再通过其他设备订阅即可实现。

被控设备

控制设备:NODEMCU
编程环境:arduino

上报设备

数据上报设备:air800
编程环境:luat

相关函数

--MQTT发送函数
function MQTTSend(status,device)
    if _G.mqttc and _G.mqttc.stat == 1 then
        if device == 0 then --灯控制
            if status == 1 then
                sys.taskInit(function()
                    _G.mqttc:pub("Ldevice", 0, "{\"status\":1}")--开灯
            end) 
            else
                sys.taskInit(function()
                _G.mqttc:pub("Ldevice", 0, "{\"status\":0}")--关灯
                end)
            end
        elseif device == 1 then --风扇控制
            if status == 1 then
                sys.taskInit(function()
                    _G.mqttc:pub("Fdevice", 0, "{\"status\":1}")--开灯
            end) 
            else
                sys.taskInit(function()
                _G.mqttc:pub("Fdevice", 0, "{\"status\":0}")--关灯
                end)
            end
        end
    end
end

串口屏驱动

串口屏采用的是迪文科技串口屏,需要根据驱动手册编写串口屏的发送和接受。

图标更改驱动代码:

--更换图标函数 Add图标地址 ID显示序号
function IconNumShow(Add,ID)
    local Data = {0,0,0,0,0,0,0,0}
    Data[1] = 0x5A
    Data[2] = 0xA5
    Data[3] = 0x05    --长度
    Data[4] = 0x82
    Data[5] = (Add & 0xFF00) >> 8
    Data[6] = Add & 0xFF
    Data[7] = (ID & 0xFF00) >> 8
    Data[8] = ID & 0xFF
    local Str = string.char(Data[1],Data[2],Data[3],Data[4],Data[5],Data[6],Data[7],Data[8])
    uart.write(uartid,Str)
end

串口数据解析代码:

--处理串口数据
local function proc(data)
    if not data then return end    
    --寻找帧头0xAA
    local head = string.find(data,string.char(0x5A))
    if not head then return false,data end    

    local len,states,Add_H,Add_L,D_len,Data_H,Data_L = string.byte(data,head+2,-1) --从帧头到末尾分割
    -- 进行地址 键值的判断操作

end

主界面

合宙训练营结营作品-桌面天气助手

视频地址

bilibili视频地址
开源地址

改进方案

  • 增加电池充放电路,可摆脱数据线。
  • 可通过立创EDA进行PCB设计,将整块板子固定在屏幕上。

注:主界面设计来源慕客,相关素材来源iconfont,请勿用于商业用途。


喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址