查看: 197|回复: 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
    创建产品:名为智能门铃,添加两个自定义功能。一个为:门铃工作状态,一个为:按钮状态,各属性如下:
   1.png
接下来就是添加设备。我们用两块ESP32所以就得创建两个设备。两个设备都是从属于智能门铃这个产品下的。一个名为:speak2,一个名为:Button
2.png

二、构建开发服务

     将智能门铃导入到智能家居项目中,选择开发服务,然后新建服务,完成后就会出现服务开发页面。

3.png
  点击左侧导航栏的节点,选择设备->设备触发,并将其拖动到服务画布内,把这个设备触发节点改为按钮状态;右侧栏配置项分别选择“智能门铃”产品,选择“Button”设备,并选择监听“属性或事件上报”上报。
   4.png
“按钮状态”节点配置完成后,选中左侧节点列表的功能->HTTP返回,输出“选择上一节点”+BottonStatus”,点击部署->启动->调试
5.png
  在弹出的“在线调试”页面中选择某个参数,点击推送,回到服务开发页面,点击节点日志查看,如图。
6.png
7.png
添加一个“条件判断”节点,条件节点相当于一个if-else判断。选中左侧节点列表的功能->条件节点,将其改为“按下按钮”,将其配置为同时满足所有条件,“上一个节点”+“props.ButtonStatus.value”;>,静态数据,数值型,0
8.png
将“HTTP返回”节点删除。添加设备->智能门铃,添加两个,一个与满足接口连接,将其进行配置,智能门铃0,控制设备选择Speak2,设备动作执行,门铃工作状态选择静态数据,布尔值,true,按钮状态选择静态数据,布尔值true.,另一个与不满足接口连接。将其进行配置,智能门铃1,控制设备选择Speak2,设备动作执行,门铃工作状态选择静态数据,布尔值,false,按钮状态选择静态数据,布尔值,false.并将按钮状态、按下按钮、智能门铃连接起来
9.png
最后我们还需要将门铃响的信息推送至钉钉。
在前面的几篇教程中我也提过开发服务如何添加钉钉机器人,不会的可以翻前面的。
上一个钉钉机器人,选择自定义,text”作为消息类型,并在content的双引号内填入信息“hello,门铃响了”。
下一个钉钉机器人,选择自定义,“text”作为消息类型,并在content的双引号内填入信息“hello”。
10.png
点击设备触发节点的部署按钮,点击启动
11.png
三、修改程序
  首先是硬件连接:把ESP32扩展板直插在ESP32主板上,再把按钮接在扩展板的D2数字引脚上,把功放喇叭接在另一扩展板的A4引脚,确保电源引脚、接地引脚和信号引脚都连接正确。
程序例程位置在
文件->示例->DFRobot_Aliyun->SmartDoorBell_Button,将修改的部分改好后烧入到连接按钮的那块ESP32板上。
例程如下:
[AppleScript] 纯文本查看 复制代码
#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[i]);
  }
  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板上。
例程如下:
[AppleScript] 纯文本查看 复制代码
#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[i] *600;
    tone(SPEARKER_PIN, littleStarsData[i],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[i]);
  }
  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();
}[/i][/i][/i][/i][/align][align=left][i][i][i][i]

现在就试下你的两块板子能不能相互通信吧。
12.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

硬件清单

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

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

mail