[官方案例教程]阿里云IoT灯光控制 精华

2019-3-14 16:21:44 [显示全部楼层]
32453浏览
查看: 32453|回复: 41

[官方案例教程] 阿里云IoT灯光控制

[复制链接]
阿里云IoT之灯光控制


截图201903141454298043.png

       寒冷的冬季,你躺在床上,睡意正浓,突然门缝传来一丝丝灯光,你才发现客厅灯没关,此时你是否想要一个意念就能让灯关。随着物联网概念的提出,万物联网,万物通信成了必然趋势,它虽不能实现意念控制灯的亮灭,但可以辅助我们,通过移动物体(如手机等)远程控制灯的亮灭,监控灯的工作状态,这样你就可以随时随地检测灯工作状态,并根据情况操作灯,而无需走到客厅的开关的位置来关灯了。怎么样,是不是很方便,那如何搭建这样能随时随地监测和控制灯的系统呢?
       上述内容提到了一个很重要的概念“物联网”,那么,什么是物联网呢?简而言之,就是万物联网,万物之间建立通信,实现物与物之间的交流,这个物不是指物体,而是包括物体,生命体在内的世界上各式各样的能具体化的事物个体,如一个人,一只鸟,一条鱼,一个杯子,一本书……。说到这里,估计大家都明白了,要实现随时随地监测和控制灯,就要解决3个关键点:
    a. 能上网的移动控制设备;
    b.灯设备连接到网络上;
    c.灯设备与手机建立网络通信连接。
一看到这3个关键点,相信有的小伙伴已经想到了,那就是可以通过手机App WiFi控制灯的亮灭。但是,对于非专业开发人员的小伙伴来说,不论是开发一个手机App,还是通过WiFi搭建手机与灯的连接,都是令人头痛甚至望而生畏的问题。不过现在不用担心了,DFRobot和阿里云IoT为我们解决了这个难题。
       DFRobot是中国领先从事开源硬件、机器人产品和创客教育的高科技企业。旨在通过提供创新的工具和内容,让全球创客们能更容易将创意变成现实。我们可以借助DFRobot的FireBettle系列ESP32主控,扩展板以及Gravity传感器系列的LED灯等工具以及Arduino软件来搭建软硬件平台。
       阿里云IoT致力于实现万物互联的美好世界,为生态合作伙伴提供基于云端一体化、安全物联网基础平台等,在通过该平台高效连接,管理设备的同时,其开放能力使合作伙伴更高效、低成本地构建各种创新的物联网应用场景。通过它用户可以自己搭建简单的移动APP,再通过手机微信扫描该App的二维码,就可搭建简单的移动应用App,而无需开发技巧。
       此篇重点来了,该应用教程主要介绍了,如何用DFRobot的FireBettle系列的ESP32主控和Gravity系列的LED灯,搭配阿里云IoT平台实现用手机App随时随地远程地控制LED灯亮灭的操作。
好了,废话不多说了,下面就介绍智能灯光的应用教程吧!

所需材料
FireBeetle Gravity扩展板 x1
数字食人鱼红色LED发光模块 x1
智能手机 x1


制作步骤
在制作之前,先下载并安装下列依赖库:
DFRobot_Aliyun.rar (10.99 KB, 下载次数: 26, 售价: 10 创造力)

senghu  初级技师

发表于 2019-3-25 19:54:13

这些参数我用MQTT.fx现在连接成功了,但是套件还是提示一样的错误
回复

使用道具 举报

senghu  初级技师

发表于 2019-3-24 10:11:46

按照说明修改好三元组后,运行提示无法接入,一会儿提示RC=2,一会儿提示RC=-4,何解???
回复

使用道具 举报

kevin_wk  学徒

发表于 2023-2-1 15:40:49

这套代码在新版的阿里云Iot(现在的时间是2023-02-01)会有问题了,问题如下:
LED灯会一直被关闭

问题原因:
新版的阿里云Iot,在添加完设备后,会为设备自动定义如下主题,如下图所示:
https://mc.dfrobot.com.cn/forum.php?mod=attachment&aid=MTU0Mjc3fDI3OGU0Y2U2NDk5ODIyYWY3NjMyMmI5OWU3ODhhM2VifDE2ODYzMTk0MzE%3D&request=yes&_f=.png
出现问题的地方是,当设备订阅这个主题:
/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply

调用如下方法
  1. /*需要操作的产品标识符*/
  2. String Identifier = "LightStatus";
  3. /*需要上报和订阅的两个TOPIC*/
  4. const char * subTopic = "/sys/a17x7FncZl0/DPR-LED/thing/service/property/set";//****set
  5. const char * pubTopic = "/sys/a17x7FncZl0/DPR-LED/thing/event/property/post";//******post
  6. ...
  7. void callback(char * topic, byte * payload, unsigned int len){
  8.   Serial.print("Recevice [");
  9.   Serial.print(topic);
  10.   Serial.print("] ");
  11.   for (int i = 0; i < len; i++){
  12.     Serial.print((char)payload[i]);
  13.   }
  14.   Serial.println();
  15.   StaticJsonBuffer<300> jsonBuffer;
  16.   JsonObject& root = jsonBuffer.parseObject((const char *)payload);
  17.   if(!root.success()){
  18.     Serial.println("parseObject() failed");
  19.     return;
  20.   }
  21.   const uint16_t LightStatus = root["params"][Identifier];
  22.   if(LightStatus == 1){
  23.     openLight();
  24.   }else{
  25.     closeLight();
  26.   }
  27.   String tempMseg = "{"id":"+ClientId+","params":{""+Identifier+"":"+(String)LightStatus+"},"method":"thing.event.property.post"}";
  28.   char sendMseg[tempMseg.length()];
  29.   strcpy(sendMseg,tempMseg.c_str());
  30.   client.publish(pubTopic,sendMseg);
  31. }
  32. void setup(){
  33.   ...
  34.   /*开机先关灯*/
  35.   closeLight();
  36.   
  37.   /*上报关灯信息*/
  38.   client.publish(pubTopic,("{"id":"+ClientId+","params":{""+Identifier+"":0},"method":"thing.event.property.post"}").c_str());
  39. }
复制代码



在函数setup()中调用:
  1.   client.publish(pubTopic,("{"id":"+ClientId+","params":{""+Identifier+"":0},"method":"thing.event.property.post"}").c_str());
复制代码


阿里云收到消息后,在这个主题“/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply” 发送消息,在串口窗口,可以看到返回的参数是:
  1. 15:00:16.777 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
复制代码

可以看到,返回Json对象,根本没有属性
  1. const uint16_t LightStatus = root["params"][Identifier];
复制代码

故这里得到 LightStatus 最终为0,根据下面的代码,回关闭LED。
  1.   if(LightStatus == 1){
  2.     openLight();
  3.   }else{
  4.     closeLight();
  5. ;
复制代码



跟离谱的是,接着下面的代码
  1. }
  2.   String tempMseg = "{"id":"+ClientId+","params":{""+Identifier+"":"+(String)LightStatus+"},"method":"thing.event.property.post"}";
  3.   char sendMseg[tempMseg.length()];
  4.   strcpy(sendMseg,tempMseg.c_str());
  5.   client.publish(pubTopic,sendMseg)
复制代码


又会在这个主题
  1. const char * pubTopic = "/sys/a17x7FncZl0/DPR-LED/thing/event/property/post";//******post
复制代码

上发送消息,又引发回调函数 callback() 响应主题
  1. /sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply
复制代码

然后造成一些循环,串口将一直输出:
  1. 15:00:12.029 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  2. 15:00:12.236 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  3. 15:00:12.338 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  4. 15:00:12.476 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  5. 15:00:12.649 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  6. 15:00:12.853 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  7. 15:00:13.060 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  8. 15:00:13.161 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  9. 15:00:13.369 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  10. 15:00:13.506 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  11. 15:00:13.677 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  12. 15:00:13.882 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  13. 15:00:13.985 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
  14. 15:00:14.090 -> Recevice [/sys/a17x7FncZl0/DPR-LED/thing/event/property/post_reply] {"code":200,"data":{},"id":"12345","message":"success","method":"thing.event.property.post","version":"1.0"}
复制代码


灯将一直被关闭。

在这里,希望官方看看是否更新先示例代码。




WedFebruary-202302014937..png
回复

使用道具 举报

senghu  初级技师

发表于 2019-3-24 20:19:00

serName=OMji93q1h08z4sG8eaVu&a1E7SXomX7L
Attempting MQTT connection...failed, rc=2 try again in 5 seconds
Attempting MQTT connection...failed, rc=2 try again in 5 seconds
Attempting MQTT connection...failed, rc=2 try again in 5 seconds
回复

使用道具 举报

wuji  中级技师
 楼主|

发表于 2019-3-25 10:26:57

senghu 发表于 2019-3-24 20:19
serName=OMji93q1h08z4sG8eaVu&a1E7SXomX7L
Attempting MQTT connection...failed, rc=2 try again in 5 se ...

MQtt连接失败,两种情况,一种是那些连接参数填错了。一种是PubSubClient.h的没更改过 66.png
回复

使用道具 举报

wuji  中级技师
 楼主|

发表于 2019-3-25 10:32:23

senghu 发表于 2019-3-24 10:11
按照说明修改好三元组后,运行提示无法接入,一会儿提示RC=2,一会儿提示RC=-4,何解??? ...

Mqtt连接失败,两种情况,一种是那些连接参数填错了。一种是PubSubClient.h的没更改过。
检查一下产品连接参数是否填错,不行就换个产品的参数试试
回复

使用道具 举报

senghu  初级技师

发表于 2019-3-25 20:41:21

好了,问题解决掉了,用论坛上提供的库文件就可以了;估计套件提供的库文件有点问题
回复

使用道具 举报

wuji  中级技师
 楼主|

发表于 2019-3-27 14:41:40

senghu 发表于 2019-3-25 20:41
好了,问题解决掉了,用论坛上提供的库文件就可以了;估计套件提供的库文件有点问题 ...

。。。。。。。
这就尴尬了!!
论坛上的库和阿里云套件的库文件是一样的呀,除了ArduinoJson-master库因为套件的太大,就在网上随便找了个,其他库都是从那套件中的库取出来的。
回复

使用道具 举报

DFrkjrpHu_E  学徒

发表于 2019-3-30 10:16:56

senghu 发表于 2019-3-25 19:54
这些参数我用MQTT.fx现在连接成功了,但是套件还是提示一样的错误

是的,我也是一样的问题,你有解决吗?
回复

使用道具 举报

hnyzcj  版主

发表于 2019-4-16 06:53:08

设备没有激活什么鬼
回复

使用道具 举报

wuji  中级技师
 楼主|

发表于 2019-4-16 13:48:08

本帖最后由 wuji 于 2019-4-16 13:51 编辑
hnyzcj 发表于 2019-4-16 06:53
设备没有激活什么鬼

具体什么情况,刚创建设备,从未使用时,会有这个情况,没什么影响啊,是不是你把它禁用了

7.png
8.png
回复

使用道具 举报

hnyzcj  版主

发表于 2019-4-16 14:10:30

wuji 发表于 2019-4-16 13:48
具体什么情况,刚创建设备,从未使用时,会有这个情况,没什么影响啊,是不是你把它禁用了

像知道如果挂多个LED
回复

使用道具 举报

wuji  中级技师
 楼主|

发表于 2019-4-16 15:11:14

hnyzcj 发表于 2019-4-16 14:10
像知道如果挂多个LED

不太清楚你想表达的意思。一个产品下可以挂载多个LED设备,但是一个ESP32主控在同一时刻只能连接一个LED设备,不过如果是直接用手机端同虚拟设备LED通信,多加几个控件就可以了。实际设备要同时同阿里云IoT平台上的多个虚拟设备通信,需要增加ESP32的数量
回复

使用道具 举报

hnyzcj  版主

发表于 2019-4-16 17:35:48

wuji 发表于 2019-4-16 15:11
不太清楚你想表达的意思。一个产品下可以挂载多个LED设备,但是一个ESP32主控在同一时刻只能连接一个LED ...

也就是说一块ESP32上只能挂一个LED
回复

使用道具 举报

hnyzcj  版主

发表于 2019-4-16 17:37:08

wuji 发表于 2019-4-16 15:11
不太清楚你想表达的意思。一个产品下可以挂载多个LED设备,但是一个ESP32主控在同一时刻只能连接一个LED ...

ESP32的数量是指什么?主控数量吗
回复

使用道具 举报

wuji  中级技师
 楼主|

发表于 2019-4-17 14:04:09

hnyzcj 发表于 2019-4-16 17:37
ESP32的数量是指什么?主控数量吗

是的,如果是用 实际设备 关联阿里云平台上的设备,一个ESP32主控同一时刻只能关联一个设备,2个ESP32可以关联2个设备
回复

使用道具 举报

hnyzcj  版主

发表于 2019-4-17 18:40:38

wuji 发表于 2019-4-17 14:04
是的,如果是用 实际设备 关联阿里云平台上的设备,一个ESP32主控同一时刻只能关联一个设备,2个ESP32可 ...

那这套件不是很坑
回复

使用道具 举报

wuji  中级技师
 楼主|

发表于 2019-4-18 08:51:10

hnyzcj 发表于 2019-4-17 18:40
那这套件不是很坑

这个跟套件没得关系,教程也只是简单的初级应用,不过你可以研究下然后通过代码优化,实现用手机控制ESP32上连接的多个设备,阿里云平台只是个中间桥梁,ESP32确实只能同一时刻连接一个虚拟设备,但是你可以把ESP32上连接的其他模块都作为这个ESP32的功能,变相实现控制多个物理设备。
回复

使用道具 举报

wuji  中级技师
 楼主|

发表于 2019-4-18 09:05:32

wuji 发表于 2019-4-18 08:51
这个跟套件没得关系,教程也只是简单的初级应用,不过你可以研究下然后通过代码优化,实现用手机控制ESP3 ...

控制一个主控上的多个模块:
将主控看做一个设备,将连接在主控上的LED,按钮或其他模组看成该设备的功能;
阿里云IoT平台上,一个产品可以有多个功能属性,该产品下的设备会继承该产品的所有功能。
就可以通过服务去控制ESP32上的所有设备了
回复

使用道具 举报

wuji  中级技师
 楼主|

发表于 2019-4-18 09:24:01

hnyzcj 发表于 2019-4-16 17:35
也就是说一块ESP32上只能挂一个LED

不是呀,ESP32主控上可以连接多个LED物理设备和其他设备,只要引脚够用就可,一个ESP32主控在同一时刻只能通过MQTT协议连接阿里云IoT平台上的一个虚拟设备
回复

使用道具 举报

hnyzcj  版主

发表于 2019-4-18 09:52:59

wuji 发表于 2019-4-18 09:24
不是呀,ESP32主控上可以连接多个LED物理设备和其他设备,只要引脚够用就可,一个ESP32主控在同一时刻只 ...

可能是我表达不够清晰,我想做一下事情:一个主控上挂LED3个(D2,D3,D4),人体D5,温湿度D6,土壤A2,蜂鸣器D7,做一个这样的物联能否实现,请指导。
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2023 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail