智能家居——智能门铃(两块ESP32)
本帖最后由 螺丝钉yy 于 2019-7-16 14:20 编辑以我们常规的通信方式就是将程序烧入主板,各设备通过主板上的引脚执行功能。在阿里云loT上进行通信的是阿里云平台和ESP32,往常我们都是用的一块ESP32来进行通信,之前我们也做过智能门铃这篇教程,不过是基于一块ESP32上的。今天就来用两块ESP32看两者如何通信。在今后就可以用很多块ESP32相互通信,完成一些比较复杂有趣实用的项目。{:5_141:}
所需材料: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板上。例程如下:#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "DFRobot_Aliyun.h"
#include "Tone32.h"
#define BUTTON_PIND2
/*配置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();
}文件->示例->DFRobot_Aliyun->SmartDoorBell_Speaker,将修改的部分改好后烧入到连接喇叭的那块ESP32板上。例程如下:#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "DFRobot_Aliyun.h"
#include "Tone32.h"
#include "music_joy.h"
#define SPEARKER_PINA4
/*配置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); 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"];
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();
}
现在就试下你的两块板子能不能相互通信吧。
页:
[1]