查看: 115|回复: 0

[项目教程] 智能家居——智能提示音(云市场)

[复制链接]
本帖最后由 螺丝钉yy 于 2019-7-9 10:08 编辑

  经过前面几节的介绍和实际操作,大家对阿里云的平台和阿里云入门套件也有一定的熟悉了。这节就来认识一下云市场,并购买我们所需要的产品,然后连结到阿里云入门套件,看看会产生什么样的效果。  本节我们需要在云市场中购买墨迹天气这个服务,通过墨迹天气,我们可以获得当前的天气情况和天气预报,当下雨或者是烈日,墨迹天气通过阿里云平台上报到我们的主控板esp32,然后通过开发服务联系到喇叭来播放音乐,以此来通知我们,我们可根据播放的音乐及时做好防雨防晒的准备。

   所需材料:阿里云入门套件   x1
                  智能手机    x1
一、搭建阿里云平台
    进入阿里云平台:https://iot.aliyun.com   1.创建产品,名为智能提示音,增加自定义功能,具体如图所示

2.png
  2.创建设备,从属于智能提示音产品,命名为SmartSound,获得设备三元组
   3.png
3.将智能提示音产品导入智能家居项目中。
    创建开发服务,名为:智能提示音
  进入开发服务页面,点击左侧的节点,在节点列表中选择功能->HTPP请求,并将其拖动到服务画布内,把这个设备触发节点改为城市ID输入
4.png
添加一个新增参数。由于后面查询天气的时候需要用到所在城市,因此API参数设定为字符cityId,配置如图所示。
5.png
添加一个云市场API节点。选中功能->API->云市场API。并将其改为墨迹天气
6.png
4.购买墨迹天气服务。
打开新页面前往阿里云市场选择API,购买墨迹天气服务,该服务是免费的.
7.png 8.png

a.获取AppCode。墨迹天气购买成功后,回到物联网平台,选中左侧导航栏的产品与服务,搜索云市场”即可找到AppCode

9.png
10.png
复制该AppCode值到墨迹天气的配置栏“AppCode”即完成了AppCode的配置

11.png
b.获取精简实况的调用地址和请求方式。回到刚才的云市场页面,点击免费版气象服务(cityid)-墨迹天气”,进入购买页面,下拉点击精简实况,即可获取精简实况的调用地址和请求方式
12.png 图片1.png
复制该调用地址即可配置“墨迹天气”的调用地址,并将该请求方式改为“POST”,
14.png
  c.获取成都温江的cityid参数。在刚才的购买页面上点击产品详情->cityid对照表,即可获取各个城市的城市ID,通过它我们可以指定获取某个城市的天气信息
15.png
下载后,可得到各城市的Id,如温江为2637
16.png
  d.获取token参数。回到物联网平台,选择左侧的产品与服务,搜索API 网关,点击API网关,选择华北2(北京)”,选择左侧导航栏的调用API->已购买API。点击查看->精简实况。下拉网页即可找到token信息,如下图所示:
17.png 18.png 19.png
20.png
  e.配置“墨迹天气”的编码方式和参数。
图片1.png
  如此即可获取成都温江的天气信息了。由此“墨迹天气”节点则配置完成。
  5.获取墨迹天气节点的输出信息。选择左侧导航栏的功能->HTTP返回,点击部署->调试,输入城市ID:2637(温江),点击开始调试
21.png
鼠标选中墨迹天气节点,点击右侧栏节点日志,即可获取墨迹天气节点的输出信息
22.png
  添加条件判断节点信息。选择功能->条件判断节点,并将其节点名称改为温江温度”,选择任意一个满足条件,配置为:个节点+ data.condition.temp<静态数据数值型20
23.png
  添加2个智能提示音设备。选中设备->智能提示音,一个连接到“温江温度”的满足条件接口,并将设备节点名改为提示音0”,将控制设备配置好,播放提示音为数值型1;另一个连接到温江温度”的不满足接口,并将歌曲改为提示音1”,将控制设备配置好,播放提示音为数值型1
24.png
添加HTTP返回节点。配置为上一节点。将城市ID输入、墨迹天气、温江温度、提示音0/1、HTTP返回连接起来,再点击部署->调试,即可播放相应的提示音
25.png
二、程序编译
将喇叭插入A4口。
  源程序如下:
[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";
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

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

uint8_t beginPlay = 0;
uint8_t playWitchOne = 0;

/*播放凉凉*/
static void playLiangLiang(){
  for (int i = 0; i < sizeof(liangliangData)/sizeof(liangliangData[0]); i++) { 
    int noteDuration = liangliangDurations[i] *600;
    tone(SPEARKER_PIN, liangliangData[i],noteDuration); 
  }
  noTone(SPEARKER_PIN);
} 

/*播放天空之城*/
static void playCastleInTheSky(){
  for (int i = 0; i < sizeof(CastleInTheSkyData)/sizeof(CastleInTheSkyData[0]); i++) { 
    int noteDuration = CastleInTheSkyDurations[i] *600;
    tone(SPEARKER_PIN, CastleInTheSkyData[i],noteDuration); 
  }
  noTone(SPEARKER_PIN);
}

static void playMusic(){
  if(playWitchOne == 0){
    playLiangLiang();
  }else{
    playCastleInTheSky();
  }
}

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;
  }
  playWitchOne = root["params"][Identifier];
  Serial.print("playWitchOne=");
  Serial.println(playWitchOne);
  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){
    playMusic();
    beginPlay =0;
  }
  client.loop();
}
}
将这部分内容改为自己的环境和设备
27.png
下载编译。执行程序。
  现在你可以测试在你的环境下,能不能通过阿里云平台获取温度,并提示到我们。
3.png
20.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

硬件清单

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

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

mail