5230| 0
|
[官方案例教程] 智能家居——智能门铃(两块ESP32) |
本帖最后由 螺丝钉yy 于 2019-7-16 14:20 编辑 以我们常规的通信方式就是将程序烧入主板,各设备通过主板上的引脚执行功能。在阿里云loT上进行通信的是阿里云平台和ESP32,往常我们都是用的一块ESP32来进行通信,之前我们也做过智能门铃这篇教程,不过是基于一块ESP32上的。今天就来用两块ESP32看两者如何通信。在今后就可以用很多块ESP32相互通信,完成一些比较复杂有趣实用的项目。 所需材料: ESP32主控板 x2 ESP32扩展版 x2 功放喇叭 x1 按钮 x1 智能手机 x1 一、创建产品、设备 进入并登录阿里云:https://iot.aliyun.com。 创建产品:名为智能门铃,添加两个自定义功能。一个为:门铃工作状态,一个为:按钮状态,各属性如下: 接下来就是添加设备。我们用两块ESP32所以就得创建两个设备。两个设备都是从属于智能门铃这个产品下的。一个名为:speak2,一个名为:Button 二、构建开发服务 将智能门铃导入到智能家居项目中,选择开发服务,然后新建服务,完成后就会出现服务开发页面。 点击左侧导航栏的节点,选择设备->设备触发,并将其拖动到服务画布内,把这个设备触发节点改为按钮状态;右侧栏配置项分别选择“智能门铃”产品,选择“Button”设备,并选择监听“属性或事件上报”上报。 “按钮状态”节点配置完成后,选中左侧节点列表的功能->HTTP返回,输出“选择上一节点”+“BottonStatus”,点击部署->启动->调试。 在弹出的“在线调试”页面中选择某个参数,点击推送,回到服务开发页面,点击节点日志查看,如图。 添加一个“条件判断”节点,条件节点相当于一个if-else判断。选中左侧节点列表的功能->条件节点,将其改为“按下按钮”,将其配置为同时满足所有条件,“上一个节点”+“props.ButtonStatus.value”;>,静态数据,数值型,0 将“HTTP返回”节点删除。添加设备->智能门铃,添加两个,一个与满足接口连接,将其进行配置,智能门铃0,控制设备选择Speak2,设备动作执行,门铃工作状态选择静态数据,布尔值,true,按钮状态选择静态数据,布尔值true.,另一个与不满足接口连接。将其进行配置,智能门铃1,控制设备选择Speak2,设备动作执行,门铃工作状态选择静态数据,布尔值,false,按钮状态选择静态数据,布尔值,false.并将按钮状态、按下按钮、智能门铃连接起来 最后我们还需要将门铃响的信息推送至钉钉。 在前面的几篇教程中我也提过开发服务如何添加钉钉机器人,不会的可以翻前面的。 上一个钉钉机器人,选择自定义,“text”作为消息类型,并在content的双引号内填入信息“hello,门铃响了”。 下一个钉钉机器人,选择自定义,“text”作为消息类型,并在content的双引号内填入信息“hello”。 点击设备触发节点的部署按钮,点击启动, 三、修改程序 首先是硬件连接:把ESP32扩展板直插在ESP32主板上,再把按钮接在扩展板的D2数字引脚上,把功放喇叭接在另一扩展板的A4引脚,确保电源引脚、接地引脚和信号引脚都连接正确。 程序例程位置在 文件->示例->DFRobot_Aliyun->SmartDoorBell_Button,将修改的部分改好后烧入到连接按钮的那块ESP32板上。 例程如下: [mw_shl_code=applescript,true]#include <WiFi.h> #include <PubSubClient.h> #include <ArduinoJson.h> #include "DFRobot_Aliyun.h" #include "Tone32.h" #define BUTTON_PIN D2 /*配置WIFI名和密码*/ const char * WIFI_SSID = "WIFI_SSID"; const char * WIFI_PASSWORD = "WIFI_PASSWORD"; /*配置设备证书信息*/ String ProductKey = "you Product Key"; String ClientId = "12345"; String DeviceName = "you Device Name"; String DeviceSecret = "you Device Secret"; /*配置域名和端口号*/ String ALIYUN_SERVER = "iot-as-mqtt.cn-shanghai.aliyuncs.com"; uint16_t PORT = 1883; /*需要操作的产品标识符*/ String Identifier = "you Identifier"; /*需要上报的TOPIC*/ const char * pubTopic = "you pub Topic";//******post DFRobot_Aliyun myAliyun; WiFiClient espClient; PubSubClient client(espClient); 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("Recevice ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < len; i++){ Serial.print((char)payload); } Serial.println(); } void ConnectAliyun(){ while(!client.connected()){ Serial.print("Attempting MQTT connection..."); /*根据自动计算的用户名和密码连接到Alinyun的设备,不需要更改*/ if(client.connect(myAliyun.client_id,myAliyun.username,myAliyun.password)){ Serial.println("connected"); }else{ Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup(){ Serial.begin(115200); pinMode(BUTTON_PIN,INPUT); /*连接WIFI*/ connectWiFi(); /*初始化Alinyun的配置,可自动计算用户名和密码*/ myAliyun.init(ALIYUN_SERVER,ProductKey,ClientId,DeviceName,DeviceSecret); client.setServer(myAliyun.mqtt_server,PORT); /*设置回调函数,当收到订阅信息时会执行回调函数*/ client.setCallback(callback); /*连接到Aliyun*/ ConnectAliyun(); } void loop(){ if(!client.connected()){ ConnectAliyun(); } if(digitalRead(BUTTON_PIN) == 1){ /*上报按钮的状态*/ client.publish(pubTopic,("{\"id\":"+ClientId+",\"params\":{\""+Identifier+"\":1},\"method\":\"thing.event.property.post\"}").c_str()); delay(1000); }else{ } client.loop(); }[/mw_shl_code] 文件->示例->DFRobot_Aliyun->SmartDoorBell_Speaker,将修改的部分改好后烧入到连接喇叭的那块ESP32板上。 例程如下: [mw_shl_code=applescript,true]#include <WiFi.h> #include <PubSubClient.h> #include <ArduinoJson.h> #include "DFRobot_Aliyun.h" #include "Tone32.h" #include "music_joy.h" #define SPEARKER_PIN A4 /*配置WIFI名和密码*/ const char * WIFI_SSID = "WIFI_SSID"; const char * WIFI_PASSWORD = "WIFI_PASSWORD"; /*配置设备证书信息*/ String ProductKey = "you Product Key"; String ClientId = "12345";/*自定义ID*/ String DeviceName = "you Device Name"; String DeviceSecret = "you Device Secret"; /*配置域名和端口号*/ String ALIYUN_SERVER = "iot-as-mqtt.cn-shanghai.aliyuncs.com"; uint16_t PORT = 1883; /*需要操作的产品标识符*/ String Identifier = "you Identifier"; /*需要上报和订 /*需要订阅的TOPIC*/ const char * subTopic = "you sub Topic";//****set uint8_t beginPlay = 0; DFRobot_Aliyun myAliyun; WiFiClient espClient; PubSubClient client(espClient); static void playlittleStars(){ for (int i = 0; i < sizeof(littleStarsData)/sizeof(littleStarsData[0]); i++) { int noteDuration = littleStarsDurations *600; tone(SPEARKER_PIN, littleStarsData,noteDuration); } noTone(SPEARKER_PIN); } 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("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 DoorbellStatus = root["params"][Identifier]; Serial.print("DoorbellStatus="); Serial.println(DoorbellStatus); if(DoorbellStatus == 1){ beginPlay = 1; } } 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); /*连接WIFI*/ connectWiFi(); /*初始化Alinyun的配置,可自动计算用户名和密码*/ myAliyun.init(ALIYUN_SERVER,ProductKey,ClientId,DeviceName,DeviceSecret); client.setServer(myAliyun.mqtt_server,PORT); /*设置回调函数,当收到订阅信息时会执行回调函数*/ client.setCallback(callback); /*连接到Aliyun*/ ConnectAliyun(); } void loop(){ if(!client.connected()){ ConnectAliyun(); } if(beginPlay == 1){ playlittleStars(); beginPlay =0; } client.loop(); } [/mw_shl_code] 现在就试下你的两块板子能不能相互通信吧。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed