4540| 9
|
[官方案例教程] 智能家居——LED灯控 |
本帖最后由 螺丝钉yy 于 2019-5-30 12:54 编辑 哈哈,小可爱们!发现阿里云这个套件后我就深深被吸引了,我看了一篇讲述了如何通过阿里云平台与ESP32进行通信,实现了通过在阿里云平台上的在线调试,来控制实物LED的亮灭。忍不住动手自己试了试。那这篇就讲述如何通过阿里云平台创建一个移动设备来控制LED灯,例如我们常用的手机APP,通过这个,我们就可以远程方便快捷的操作我们的产品,想一想我们出门了,但是不确定家里的灯关了没有,通过手机查看并开关灯,是不是很惬意呢。话不多说,下面就开始本篇的教程吧。 所需材料: 智能手机x1 1.进入阿里云平台 阿里云网址:https://iot.aliyun.com,进行登录。开始创建的产品和设备。创建产品:智能家居,定义功能为一个名为LED灯,输入标识符LightSwitch,类型为布尔型,0表示关灯,1表示开灯。创建设备:ESP32。 2. 程序更改 将LED灯接入ESP32的D2口,按钮接入A4口。 [mw_shl_code=cpp,true]#include <WiFi.h> #include <PubSubClient.h> #include <ArduinoJson.h> #include "DFRobot_Aliyun.h" #define LED D2 #define BUTTON D3 /*配置WIFI名和密码*/ const char * WIFI_SSID = "Honor 8"; const char * WIFI_PASSWORD = "11223344"; /*配置设备证书信息*/ String ProductKey = "a1buZ1qlehZ"; String ClientId = "12345";/*自定义ID*/ String DeviceName = "ESP32"; String DeviceSecret = "SHdoo5qew9kGAtpe231eIMsGCGdlu8Rn"; /*配置域名和端口号*/ String ALIYUN_SERVER = "iot-as-mqtt.cn-shanghai.aliyuncs.com"; uint16_t PORT = 1883; /*需要操作的产品标识符*/ String Identifier = "LightSwitch"; /*需要上报和订阅的两个TOPIC*/ const char * subTopic = "/sys/a1D8cWYC9Wp/ESP32/thing/service/property/set";//****set const char * pubTopic = "/sys/a1D8cWYC9Wp/ESP32/thing/event/property/post";//******post DFRobot_Aliyun myAliyun; WiFiClient espClient; PubSubClient client(espClient); /*ButtonState、LEDState用来存储LED灯同BUTTON按钮的当前值*/ uint8_t ButtonState = 0; uint16_t LEDState = 0; static void openLight(){ digitalWrite(LED, HIGH); } static void closeLight(){ digitalWrite(LED, LOW); } void connectWiFi(){ Serial.print("Connecting to "); Serial.println(WIFI_SSID); WiFi.begin(WIFI_SSID,WIFI_PASSWORD); while(WiFi.status() != WL_CONNECTED){ delay(500); Serial.print("."); } Serial.println(); Serial.println("WiFi connected"); Serial.print("IP Adderss: "); Serial.println(WiFi.localIP()); } void callback(char * topic, byte * payload, unsigned int len){ Serial.print("123"); Serial.print("Recevice ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < len; i++){ Serial.print((char)payload); } Serial.println(); StaticJsonBuffer<300> jsonBuffer; JsonObject& root = jsonBuffer.parseObject((const char *)payload); if(!root.success()){ Serial.println("parseObject() failed"); return; } const uint16_t LightStatus = root["params"][Identifier]; if(LightStatus == 1){ openLight(); }else{ closeLight(); } /*当LED灯的状态发生改变后,则上报LED灯的当前状态*/ if(LightStatus != LEDState) { LEDState = LightStatus; String tempMseg = "{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":"+(String)LightStatus+"},\"method\":\"thing.event.property.post\"}"; char sendMseg[tempMseg.length()]; strcpy(sendMseg,tempMseg.c_str()); client.publish(pubTopic,sendMseg); } } void ConnectAliyun(){ while(!client.connected()){ Serial.print("Attempting MQTT connection..."); /*根据自动计算的用户名和密码连接到Alinyun的设备,不需要更改*/ if(client.connect(myAliyun.client_id,myAliyun.username,myAliyun.password)){ Serial.println("connected"); client.subscribe(subTopic); }else{ Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup(){ Serial.begin(115200); /*将LED(D2)设置为IO输出,BUTTON(D3)设置为IO输入*/ pinMode(LED,OUTPUT); pinMode(BUTTON,INPUT); /*连接WIFI*/ connectWiFi(); /*初始化Alinyun的配置,可自动计算用户名和密码*/ myAliyun.init(ALIYUN_SERVER,ProductKey,ClientId,DeviceName,DeviceSecret); client.setServer(myAliyun.mqtt_server,PORT); /*设置回调函数,当收到订阅信息时会执行回调函数*/ client.setCallback(callback); /*连接到Aliyun*/ ConnectAliyun(); /*开机先关灯*/ closeLight(); /*保存BUTTON按钮的初始值状态*/ ButtonState =digitalRead(BUTTON); //Serial.print("ButtonState:"); //Serial.println(ButtonState); /*上报关灯信息*/ client.publish(pubTopic,("{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":0},\"method\":\"thing.event.property.post\"}").c_str()); } void loop(){ if(!client.connected()){ ConnectAliyun(); } uint8_t ButtonValue = digitalRead(BUTTON); /*如果检测到按钮的状态发生了改变,则发送指令到阿里云平台以更新设备信息*/ if (ButtonValue != ButtonState) { /*保存按钮的当前状态*/ ButtonState = ButtonValue; /*按下:发送开灯指令,阿里云IoT上的相应设备状态变为1;松开:发送关灯指令,阿里云IoT上的相应设备状态值变为0,只需改变Identifier后的值*/ String tempMseg = "{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":"+(String)ButtonState+"},\"method\":\"thing.event.property.post\"}"; char sendMseg[tempMseg.length()]; strcpy(sendMseg,tempMseg.c_str()); client.publish(pubTopic,sendMseg); delay(1000); } client.loop(); }[/mw_shl_code] 3.创建移动设备 点击开发服务>loT Studio 选择创建项目 然后弹出一个窗口,填写项目名称,可选填为:智能家居 接下来我们就要导入产品了,单击导入产品,勾选智能家居产品,点击导入。一顿操作如下: 导入成功后,我们可以看到该项目下的关联产品和设备数量都发生了变化。 接着,单击移动应用开发,然后点击新增可视化应用。 然后填写应用名称,这里因为实现的功能是控制LED灯,可选填为:LED灯控。它默认的所属项目是智能家居,默认模板是智能设备,也可以选择基础模板,然后单击完成。 接着,弹出编辑移动设备的页面窗口。 我们现在来认识一下这个菜单栏: 编辑栏:自定义新增页:就是我们所编辑的每个项目功能的页面显示 账号模块:就是我们所下的APP账号登陆页,你们可根据个人爱好编辑页面。 首页模式:这个模式编辑是必不可少的,要关联到我们编辑的每一个自定义新增页,这样才会控制到设备。 UI组件、APP功能:这两个所属的图案标识都可以表示我们所用的产品设备,然后关联到我们所创建的产品,需要使用就把它拖拽到中间的编辑框。 设置:这是对我们项目的名称进行修改。 账号:在这里我们要注册移动设备上的登录账号及密码,移动设备上只认定在阿里云平台上账号。必要时可以添加用户。 现在开始编辑我们自创的APP页面吧。 点击自定义新增页,更名为智能LED(选填)。 为了排版好看,我们可以借助横向工具,将横向图案拖拽到编辑框,点击其中的某一个,进行删除,留下两个格子。 添加指示灯和开关到格子中: 配置数据:选中开关,单击页面右边顶上角的配置数据,选择产品,选择设备,选择属性,点击确定。 这时,如果你是第一次配置该项目下的数据,就会弹出这样的一个指示框。 别担心,根据提示,我们选择在线模拟,点击推送,然后进行调试,就ok了。 接着对指示灯进行同样的配置数据。也可以对指示灯的颜色进行更改。操作完成后,一定要记得点击保存啊,小可爱们。 然后我们就要编辑列表页,点击首页模式>列表页>新增页面入口 然后填写标题:智能灯控(选填),跳转链接,关联到我们的新增页面的名称:智能LED.记得保存。 接下来就要构建到APP了,阿里云可以构建Android和ios系统。你们可自行选择。然后就开始构建,选择我只想自己使用。 然后点击随机生成安装包,点击下一步,等待构建,之后就会出现下载的二维码。 4.移动设备控制 安装好软件后,登录账号,点进去,现在来试试效果吧 |
Arduino:1.8.9 (Windows 10), 开发板:"FireBeetle-ESP32, 80MHz, 921600, None" sketch\sketch_jun04a.ino.cpp.o:(.literal._Z5setupv+0x44): undefined reference to `DFRobot_Aliyun::init(String, String, String, String, String, unsigned short)' sketch\sketch_jun04a.ino.cpp.o:(.literal.startup._GLOBAL__sub_I_WIFI_SSID+0x20): undefined reference to `DFRobot_Aliyun::DFRobot_Aliyun()' sketch\sketch_jun04a.ino.cpp.o:(.literal.exit._GLOBAL__sub_D_WIFI_SSID+0x8): undefined reference to `DFRobot_Aliyun::~DFRobot_Aliyun()' sketch\sketch_jun04a.ino.cpp.o: In function `setup()': C:\Users\SJ_Developer\Documents\Arduino\sketch_jun04a/sketch_jun04a.ino:116: undefined reference to `DFRobot_Aliyun::init(String, String, String, String, String, unsigned short)' sketch\sketch_jun04a.ino.cpp.o: In function `_GLOBAL__sub_I_WIFI_SSID': C:\Users\SJ_Developer\Documents\Arduino\sketch_jun04a/sketch_jun04a.ino:20: undefined reference to `DFRobot_Aliyun::DFRobot_Aliyun()' sketch\sketch_jun04a.ino.cpp.o: In function `_GLOBAL__sub_D_WIFI_SSID': C:\Users\SJ_Developer\Documents\Arduino\sketch_jun04a/sketch_jun04a.ino:31: undefined reference to `DFRobot_Aliyun::~DFRobot_Aliyun()' collect2.exe: error: ld returned 1 exit status "WiFi.h" 对应多个库 已使用: C:\Users\SJ_Developer\AppData\Local\Arduino15\packages\esp32\hardware\DFRobot_FireBeetle-ESP32\0.0.9\libraries\WiFi 未使用:C:\Program Files (x86)\Arduino\libraries\WiFi exit status 1 为开发板 FireBeetle-ESP32 编译时出错。 在文件 -> 首选项开启 “编译过程中显示详细输出”选项 这份报告会包含更多信息。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed