2019-10-24 15:40:05 [显示全部楼层]
2034浏览
查看: 2034|回复: 1

[官方案例教程] 如何将阿里云iot套件的传感器组合起来

[复制链接]
本帖最后由 QAQ 于 2019-10-24 16:07 编辑

在体验了阿里云iot套件,跟着教程做了几个应用后。我不禁想如何将几个传感器合并起来做一个东西呢?于是我做了一个传感器的组合应用。

需要注意的是:我们需要使用多个传感器做应用的时候,不需要在阿里云iot平台上创建多个设备。因为一块主板同时只能够连接阿里云iot平台上的一个设备。我们需要做的只是给需要进行数据交互的传感器创建对应的属性即可。

工作流程:
1,在阿里云iot平台上生成安卓app应用对传感器进行控制以及数据的展示。
2,点击开灯按钮,数字食人鱼红色LED发光模块就亮。
3,将DHT11温湿度传感器检测到的温度和湿度数据以每分钟两次的频率传递到阿里云iot,然后阿里云iot下发数据到手机APP进行展示。
4,将土壤湿度传感器检测到数据以每分钟两次的频率传递到阿里云iot,然后阿里云iot下发数据到手机APP进行展示。
5,当红外热释电模块检测到有人时,驱动带功放喇叭模块播放天空之城音乐。同时将有人的数据发送到阿里云iot,然后阿里云iot下发数据,使手机APP中的灯变为红色。
制作步骤:

提示:在开始制作之前,请确保已经学会了教程文档的应用制作:http://www.dfrobot.com.cn/images/upload/File/2019102213190463p0dw.pdf

一、制作阿里云APP应用:
1,首先到阿里云平台新建一个叫做组合应用的项目
201910249927.png
2,在该项目下新建一个叫做组合传感器的产品
201910242760.png


3,在上一步创建的产品下新建一个设备
201910247509.png
4,在第三步创建的产品中定义属性,与教程中的定义方式一致。这里我们定义5个属性分别对应,工作流程中的5个参数。
201910243605.png
全部参数定义完毕如下所示:
201910248410.png
5,调试参数,如下图所示,输入参数后点击推送即可:
201910245540.png
6,新建一个可视化应用如下:
201910242661.png
7,配置首页的入口模块,点击确认即可:
201910241661.png
8,构建安卓app:
201910243272.png

201910246867.png

201910244008.png
等待打包完毕下载APP到移动设备。

二、连接硬件:
1,数字食人鱼红色LED发光模块接到D2口。
2,DHT11温湿度传感器接到D3口。
3,红外热释电模块接到D4口。
4,土壤湿度传感器接到A0口。
5,带功放喇叭模块接到A4口。

三、上传代码:


示例代码:
[mw_shl_code=c,true]#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include "DFRobot_Aliyun.h"
#include "DFRobot_DHT11.h"
#include "Tone32.h"
#include "music_joy.h"

#define BEDROOD_LIGHT D2
#define DHT11_PIN  D3
#define SOIL_SENSOR_PIN  A0
#define SPEARKER_PIN  A4
#define MOTION_SENSOR_PIN  D4

/*配置WIFI名和密码*/
const char * WIFI_SSID     = "wifi账号";
const char * WIFI_PASSWORD = "wifi密码 ";

/*配置设备证书信息*/
String ProductKey = "productKey";
String ClientId = "12345";/*自定义ID*/
String DeviceName = "deviceName";
String DeviceSecret = "deviceSecret";

/*配置域名和端口号*/
String ALIYUN_SERVER = "iot-as-mqtt.cn-shanghai.aliyuncs.com";
uint16_t PORT = 1883;

/*需要操作的产品标识符*/
String Identifier = "light";
/*需要操作的产品标识符(温度和湿度两个标识符)*/
String TempIdentifier = "tem";
String HumiIdentifier = "hum";
/*土壤*/
String SoilIdentifier = "soilHum";
/*防盗*/
String WarnIdentifier = "warn";

/*需要上报和订阅的两个TOPIC*/
const char * subTopic = "订阅的topic";//****set
const char * pubTopic = "发送的topic";//******post

DFRobot_Aliyun myAliyun;
WiFiClient espClient;
PubSubClient client(espClient);
DFRobot_DHT11 DHT;

static void openLight(){
  digitalWrite(BEDROOD_LIGHT, HIGH);
}

static void closeLight(){
  digitalWrite(BEDROOD_LIGHT, LOW);
}

/*播放天空之城*/
static void playCastleInTheSky(){
  for (int i = 0; i < sizeof(CastleInTheSkyData)/sizeof(CastleInTheSkyData[0]); i++) {
    int noteDuration = CastleInTheSkyDurations *600;
    tone(SPEARKER_PIN, CastleInTheSkyData,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 LightStatus = root["params"][Identifier];
  if(LightStatus == 1){
    openLight();
  }else{
    closeLight();
  }
}

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);
  pinMode(BEDROOD_LIGHT,OUTPUT);

  pinMode(MOTION_SENSOR_PIN,INPUT);
  /*连接WIFI*/
  connectWiFi();
  
  /*初始化Alinyun的配置,可自动计算用户名和密码*/
  myAliyun.init(ALIYUN_SERVER,ProductKey,ClientId,DeviceName,DeviceSecret);
  
  client.setServer(myAliyun.mqtt_server,PORT);
  
  /*设置回调函数,当收到订阅信息时会执行回调函数*/
  client.setCallback(callback);
  
  /*连接到Aliyun*/
  ConnectAliyun();
  
  /*开机先关灯*/
  closeLight();
  
}

uint8_t tempTime = 0;

void loop(){

  if(!client.connected()){
    ConnectAliyun();
  }
  // 防盗
  if(digitalRead(MOTION_SENSOR_PIN) == 1){
    /*上报防盗警告*/
    client.publish(pubTopic,("{\"id\":"+ClientId+",\"params\":{\""+WarnIdentifier+"\":1},\"method\":\"thing.event.property.post\"}").c_str());
    /*播放音乐*/
    playCastleInTheSky();
  }else{
  }
    /*一分钟上报两次温湿度和土壤湿度信息*/
  if(tempTime > 60){
    tempTime = 0;
    DHT.read(DHT11_PIN);
    Serial.print("DHT.temperature=");
    Serial.println(DHT.temperature);
    Serial.print("DHT.humidity");
    Serial.println(DHT.humidity);
    client.publish(pubTopic,("{\"id\":"+ClientId+",\"params\":{\""+TempIdentifier+"\":"+DHT.temperature+",\""+HumiIdentifier+"\":"+DHT.humidity+",\""+SoilIdentifier+"\":"+analogRead(SOIL_SENSOR_PIN)+"},\"method\":\"thing.event.property.post\"}").c_str());
  }else{
    tempTime++;
    delay(500);
  }
  client.loop();
}
[/mw_shl_code]

将示例代码中的必要参数修改为自己的:
201910245128.png

201910248987.png

运行效果

当上面的步骤都执行完毕以后,我们就可以开始查看效果了,在arduino IDE中上传程序到板子中:
可以看到APP中的参数已经改变了,并且开始播放音乐
201910245820.png




rzyzzxw  版主

发表于 2019-10-24 18:46:22

赞啊,好教程。
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

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

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

mail