[讨论交流]智能家居——LED灯控 精华

查看: 489|回复: 9

[讨论交流] 智能家居——LED灯控

[复制链接]
本帖最后由 螺丝钉yy 于 2019-5-30 12:54 编辑

哈哈,小可爱们!发现阿里云这个套件后我就深深被吸引了,我看了一篇讲述了如何通过阿里云平台与ESP32进行通信,实现了通过在阿里云平台上的在线调试,来控制实物LED的亮灭。忍不住动手自己试了试。那这篇就讲述如何通过阿里云平台创建一个移动设备来控制LED,例如我们常用的手机APP,通过这个,我们就可以远程方便快捷的操作我们的产品,想一想我们出门了,但是不确定家里的灯关了没有,通过手机查看并开关灯,是不是很惬意呢。话不多说,下面就开始本篇的教程吧。
所需材料:
智能手机x1

1.进入阿里云平台
阿里云网址:https://iot.aliyun.com,进行登录。开始创建的产品和设备。创建产品:智能家居,定义功能为一个名为LED,输入标识符LightSwitch,类型为布尔型0表示关灯,1表示开灯。创建设备:ESP32
图片1.png

2. 程序更改
LED灯接入ESP32D2,按钮接入A4口。
[C++] 纯文本查看 复制代码
#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[i]);
  }
  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();
}

3.创建移动设备
点击开发服务>loT Studio
图片2.png
选择创建项目
图片3.png
然后弹出一个窗口,填写项目名称,可选填为:智能家居
图片4.png
接下来我们就要导入产品了,单击导入产品,勾选智能家居产品,点击导入。一顿操作如下:
图片5.png 图片6.png

导入成功后,我们可以看到该项目下的关联产品和设备数量都发生了变化。

图片7.png
接着,单击移动应用开发,然后点击新增可视化应用

图片8.png

然后填写应用名称,这里因为实现的功能是控制LED灯,可选填为:LED灯控。它默认的所属项目是智能家居,默认模板是智能设备,也可以选择基础模板,然后单击完成

图片9.png
接着,弹出编辑移动设备的页面窗口。
图片10.png
我们现在来认识一下这个菜单栏:
编辑栏:自定义新增页:就是我们所编辑的每个项目功能的页面显示
账号模块:就是我们所下的APP账号登陆页,你们可根据个人爱好编辑页面。
首页模式:这个模式编辑是必不可少的,要关联到我们编辑的每一个自定义新增页,这样才会控制到设备。
UI组件、APP功能:这两个所属的图案标识都可以表示我们所用的产品设备,然后关联到我们所创建的产品,需要使用就把它拖拽到中间的编辑框。
设置:这是对我们项目的名称进行修改。
账号:在这里我们要注册移动设备上的登录账号及密码,移动设备上只认定在阿里云平台上账号。必要时可以添加用户。

现在开始编辑我们自创的APP页面吧。
点击自定义新增页,更名为智能LED(选填)。
为了排版好看,我们可以借助横向工具,将横向图案拖拽到编辑框,点击其中的某一个,进行删除,留下两个格子。
图片11.png
添加指示灯开关到格子中:
图片12.png
配置数据:选中开关,单击页面右边顶上角的配置数据,选择产品,选择设备,选择属性,点击确定。
图片13.png


这时,如果你是第一次配置该项目下的数据,就会弹出这样的一个指示框。
图片14.png

别担心,根据提示,我们选择在线模拟,点击推送,然后进行调试,就ok
图片15.png
接着对指示灯进行同样的配置数据。也可以对指示灯的颜色进行更改。操作完成后,一定要记得点击保存啊,小可爱们。
然后我们就要编辑列表页,点击首页模式>列表页>新增页面入口
图片16.png

然后填写标题:智能灯控(选填),跳转链接,关联到我们的新增页面的名称:智能LED.记得保存
图片17.png

接下来就要构建APP了,阿里云可以构建Androidios系统。你们可自行选择。然后就开始构建,选择我只想自己使用
图片18.png
然后点击随机生成安装包,点击下一步,等待构建,之后就会出现下载的二维码。

图片19.png
4.移动设备控制
安装好软件后,登录账号,点进去,现在来试试效果吧

截图201905301250033376.png

小米创客+  见习技师

发表于 2019-5-30 17:00:18

操作很详细,非常赞
回复 支持 反对

使用道具 举报

ASH腻  管理员

发表于 2019-5-31 10:59:58

教程写得很详细
回复 支持 反对

使用道具 举报

螺丝钉yy  初级技师
 楼主|

发表于 2019-6-3 08:39:32

小米创客+ 发表于 2019-5-30 17:00
操作很详细,非常赞

嘿嘿, 我自己都还在学习阶段,所以写得细
回复 支持 反对

使用道具 举报

螺丝钉yy  初级技师
 楼主|

发表于 2019-6-3 08:43:37

ASH腻 发表于 2019-5-31 10:59
教程写得很详细

嗯嗯。。
回复 支持 反对

使用道具 举报

威威猫  学徒

发表于 2019-6-4 17:37:23

那个代码可以直接使用吗?我这里怎么会编译报错!!!
回复 支持 反对

使用道具 举报

威威猫  学徒

发表于 2019-6-4 17:37:30

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 编译时出错。

在文件 -> 首选项开启
“编译过程中显示详细输出”选项
这份报告会包含更多信息。
回复 支持 反对

使用道具 举报

螺丝钉yy  初级技师
 楼主|

发表于 2019-6-5 17:24:10

威威猫 发表于 2019-6-4 17:37
那个代码可以直接使用吗?我这里怎么会编译报错!!!

你是不是没添加库
回复 支持 反对

使用道具 举报

zfson  学徒

发表于 2019-6-28 13:43:33

板子要怎么接,我是插在D2上面的,我的灯就是不亮,后台调试显示能写入1/0.
回复 支持 反对

使用道具 举报

螺丝钉yy  初级技师
 楼主|

发表于 2019-7-2 13:32:05

zfson 发表于 2019-6-28 13:43
板子要怎么接,我是插在D2上面的,我的灯就是不亮,后台调试显示能写入1/0. ...

你要看下你的wifi连上没有
回复 支持 反对

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

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

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

mail