智能家居——LED灯控
本帖最后由 螺丝钉yy 于 2019-5-30 12:54 编辑哈哈,小可爱们{:5_132:}!发现阿里云这个套件后我就深深被吸引了,我看了一篇讲述了如何通过阿里云平台与ESP32进行通信,实现了通过在阿里云平台上的在线调试,来控制实物LED的亮灭。忍不住动手自己试了试。那这篇就讲述如何通过阿里云平台创建一个移动设备来控制LED灯,例如我们常用的手机APP,通过这个,我们就可以远程方便快捷的操作我们的产品,想一想我们出门了,但是不确定家里的灯关了没有,通过手机查看并开关灯,是不是很惬意呢。话不多说,下面就开始本篇的教程吧。所需材料:阿里云IoT 入门套件x1智能手机x1
1.进入阿里云平台阿里云网址:https://iot.aliyun.com,进行登录。开始创建的产品和设备。创建产品:智能家居,定义功能为一个名为LED灯,输入标识符LightSwitch,类型为布尔型,0表示关灯,1表示开灯。创建设备:ESP32。
2. 程序更改将LED灯接入ESP32的D2口,按钮接入A4口。#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "DFRobot_Aliyun.h"
#define LEDD2
#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"];
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;
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;
strcpy(sendMseg,tempMseg.c_str());
client.publish(pubTopic,sendMseg);
delay(1000);
}
client.loop();
}
3.创建移动设备点击开发服务>loT Studio 选择创建项目然后弹出一个窗口,填写项目名称,可选填为:智能家居接下来我们就要导入产品了,单击导入产品,勾选智能家居产品,点击导入。一顿操作如下:
导入成功后,我们可以看到该项目下的关联产品和设备数量都发生了变化。
接着,单击移动应用开发,然后点击新增可视化应用。
然后填写应用名称,这里因为实现的功能是控制LED灯,可选填为:LED灯控。它默认的所属项目是智能家居,默认模板是智能设备,也可以选择基础模板,然后单击完成。
接着,弹出编辑移动设备的页面窗口。我们现在来认识一下这个菜单栏:编辑栏:自定义新增页:就是我们所编辑的每个项目功能的页面显示账号模块:就是我们所下的APP账号登陆页,你们可根据个人爱好编辑页面。首页模式:这个模式编辑是必不可少的,要关联到我们编辑的每一个自定义新增页,这样才会控制到设备。UI组件、APP功能:这两个所属的图案标识都可以表示我们所用的产品设备,然后关联到我们所创建的产品,需要使用就把它拖拽到中间的编辑框。设置:这是对我们项目的名称进行修改。账号:在这里我们要注册移动设备上的登录账号及密码,移动设备上只认定在阿里云平台上账号。必要时可以添加用户。
现在开始编辑我们自创的APP页面吧。点击自定义新增页,更名为智能LED(选填)。为了排版好看,我们可以借助横向工具,将横向图案拖拽到编辑框,点击其中的某一个,进行删除,留下两个格子。添加指示灯和开关到格子中:配置数据:选中开关,单击页面右边顶上角的配置数据,选择产品,选择设备,选择属性,点击确定。
这时,如果你是第一次配置该项目下的数据,就会弹出这样的一个指示框。
别担心,根据提示,我们选择在线模拟,点击推送,然后进行调试,就ok了。接着对指示灯进行同样的配置数据。也可以对指示灯的颜色进行更改。操作完成后,一定要记得点击保存啊,小可爱们。然后我们就要编辑列表页,点击首页模式>列表页>新增页面入口
然后填写标题:智能灯控(选填),跳转链接,关联到我们的新增页面的名称:智能LED.记得保存。
接下来就要构建到APP了,阿里云可以构建Android和ios系统。你们可自行选择。然后就开始构建,选择我只想自己使用。然后点击随机生成安装包,点击下一步,等待构建,之后就会出现下载的二维码。
4.移动设备控制安装好软件后,登录账号,点进去,现在来试试效果吧
操作很详细,非常赞 教程写得很详细 小米创客+ 发表于 2019-5-30 17:00
操作很详细,非常赞
嘿嘿, 我自己都还在学习阶段,所以写得细 ASH腻 发表于 2019-5-31 10:59
教程写得很详细
嗯嗯。。{:5_157:} 那个代码可以直接使用吗?我这里怎么会编译报错!!! 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 编译时出错。
在文件 -> 首选项开启
“编译过程中显示详细输出”选项
这份报告会包含更多信息。
威威猫 发表于 2019-6-4 17:37
那个代码可以直接使用吗?我这里怎么会编译报错!!!
你是不是没添加库 板子要怎么接,我是插在D2上面的,我的灯就是不亮,后台调试显示能写入1/0. zfson 发表于 2019-6-28 13:43
板子要怎么接,我是插在D2上面的,我的灯就是不亮,后台调试显示能写入1/0. ...
你要看下你的wifi连上没有
页:
[1]