螺丝钉yy 发表于 2019-7-16 14:20:35

智能家居——智能门铃(两块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]
查看完整版本: 智能家居——智能门铃(两块ESP32)