STM32
直播中

蒲泛粟

7年用户 930经验值
私信 关注
[问答]

如何实现Air800接收STM32发送的温湿度并上传阿里云物联网云平台呢

如何实现Air800接收STM32发送的温湿度并上传阿里云物联网云平台呢?阿里云物联网云平台是如何控制LED亮灭的指令和定时开关LED的指令呢?

回帖(1)

陈莉

2021-12-17 13:39:03
最终要实现的功能:

1、STM32采集温湿度通过串口1发送至AIR800,然后通过AIR800将温湿度上传至阿里云
2、阿里云物联网云平台下发命令通过AIR800控制STM32的LED亮灭(打开或关闭功能,或者定时 自动打开和自动关闭)
3、通过nrf24l01实现点对点通信,阿里云下发数据至air800,STM32(A)串口2接收数据之后进行判断,如果需要控制另一个STM32的LED灯,则会将数据发送至另外一个STM32(B),STM32(B)通过数据判断执行相应的功能
本部分要实现的功能:
(1)Air800接收STM32发送的温湿度并上传至阿里云物联网云平台
(2)阿里云物联网云平台下发控制LED亮灭的指令,和定时开关LED的指令
一、首先进行云端部署

阿里云云端部署前面已经介绍过,这里不再介绍,在阿里云上创建自己的产品和设备,云端创建物模型进行显示云下设备上传数据,以及Air800如何订阅并解析云端数据等请依次打开
在自己的设备下创建四个属性,温湿度,开关值,定时时间





二、修改云下设备代码

1、首先移植串口部分的程序到所编写的程序中





2、打开上面的程序代码后,仿照串口例程把需要的东西进行赋值粘贴到程序中去





3、在顶部添加变量





4、把串口发送函数和接收函数全部复制过来,串口接收函数最后用完注释掉即可





5、编写向云端发布函数
图中串口部接收部分是串口接收函数中的代码,复制过来后,串口接收函数删掉即可





整个发布函数如下

--发布一条QOS为1的消息
function publishTest()
if sConnected then
    --注意:在此处自己去控制payload的内容编码,aLiYun库中不会对payload的内容做任何编码转换


    while true do        
    data = uart.read(UART_ID,"*l")
    --这一部分放在前面是为字符串搜索和转化提供点时间
    local hum1=string.match(data,"%d+",8)
    local hum=tonumber(hum1)--这是将字符串转化为数值
    basedata["params"]["hum"]=hum        --这是赋值湿度数值


    if not data or string.len(data) == 0 then break end


    if true then
        local temp1=string.match(data,"%d+ ")
        local temp_data=tonumber(temp1)--这是转化为数值
        print(type(temp_data))--打印转换后的数据类型用于判断是否转化成功
        basedata["params"]["temp"]=temp_data --上传温度数值
        print("temp1",temp1)
        print("---------------")
    end
    jsondata=json.encode(basedata)--进行编码传输
   aLiYun.publish("/sys/"..PRODUCT_KEY.."/"..getDeviceName().."/thing/event/property/post",jsondata,1,publishTestCb,"publishTest_"..publishCnt)
  end  

end
end
6、订阅函数,进行数据解析
将解析到的数据发送至串口1(串口1是连接STM32的串口2的—比特率一定要一致)





数据订阅并解析函数

---数据接收的处理函数
-- @string topic,UTF8编码的消息主题
-- @number qos,消息质量等级
-- @string payload,原始编码的消息负载
local function rcvCbFnc(topic,qos,payload)
log.info("testALiYun.rcvCbFnc",topic,qos,payload)


print("-----------------------------------------")
local tjsondata,result,errinfo = json.decode(payload)
--以下为解析数据
if result then
    local switch_rcv=0
    switch_rcv=tjsondata["params"]["switch"]--把对应的开关属性值取出来
           local time=0
        time=tjsondata["params"]["set_time"]--把对应的定时信息数值取出来
    print("switch_value",type(switch_rcv),switch_rcv)
        print("set_time",type(time),time)


    if switch_rcv == 1 then
                write("led on")
                basedata["params"]["switch"]=1 --上传开关数值
        elseif switch_rcv == 0 then
                write("ledoff")
                basedata["params"]["switch"]=0 --上传开关数值
        else
                write(time)
                basedata["params"]["set_time"]=time--上传定时时间
                write(time)
        end


else
    print("json.decode error",errinfo)
end
print("--------------------------")
end
7、烧写程序进行调试即可,
STM32通过串口1发送温湿度至AIR800接收端
AIR800通过串口发送至STM32串口2接收端

下为air800订阅云端数据解析结果








开关值和定时是通过阿里云产品下的在线调试功能,调试真实设备对设置下达指令后所返回的值,温湿度则是云下设备上传的值





再次调试设备效果如下














这样云端和设备就打通了,设备上报数据至阿里云,阿里云下发指令简单的控制STM32的LED
下一步是在设备端添加nrf24l01,和另外一个STM32点对点通信。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分