5202| 4
|
[官方案例教程] 智能家居——智能提示音(云市场) |
经过前面几节的介绍和实际操作,大家对阿里云的平台和阿里云入门套件也有一定的熟悉了。这节就来认识一下云市场,并购买我们所需要的产品,然后连结到阿里云入门套件,看看会产生什么样的效果。 本节我们需要在云市场中购买墨迹天气这个服务,通过墨迹天气,我们可以获得当前的天气情况和天气预报,当下雨或者是烈日,墨迹天气通过阿里云平台上报到我们的主控板esp32,然后通过开发服务联系到喇叭来播放音乐,以此来通知我们,我们可根据播放的音乐及时做好防雨防晒的准备。 所需材料:阿里云入门套件 x1 智能手机 x1 一、搭建阿里云平台 进入阿里云平台:https://iot.aliyun.com 1.创建产品,名为智能提示音,增加自定义功能,具体如图所示 2.创建设备,从属于智能提示音产品,命名为SmartSound,获得设备三元组 3.将智能提示音产品导入智能家居项目中。 创建开发服务,名为:智能提示音 进入开发服务页面,点击左侧的节点,在节点列表中选择功能->HTPP请求,并将其拖动到服务画布内,把这个设备触发节点改为城市ID输入 添加一个新增参数。由于后面查询天气的时候需要用到所在城市,因此API参数设定为字符“cityId”,配置如图所示。 添加一个云市场API节点。选中功能->API->云市场API。并将其改为墨迹天气 4.购买墨迹天气服务。 打开新页面前往阿里云市场选择API,购买墨迹天气服务,该服务是免费的. a.获取AppCode。墨迹天气购买成功后,回到物联网平台,选中左侧导航栏的产品与服务,搜索“云市场”即可找到AppCode。 复制该AppCode值到墨迹天气的配置栏“AppCode”即完成了AppCode的配置 b.获取精简实况的调用地址和请求方式。回到刚才的云市场页面,点击“免费版气象服务(cityid)-墨迹天气”,进入购买页面,下拉点击精简实况,即可获取精简实况的调用地址和请求方式 复制该调用地址即可配置“墨迹天气”的调用地址,并将该请求方式改为“POST”, c.获取成都温江的cityid参数。在刚才的购买页面上点击产品详情->cityid对照表,即可获取各个城市的城市ID,通过它我们可以指定获取某个城市的天气信息 下载后,可得到各城市的Id,如温江为2637 d.获取token参数。回到物联网平台,选择左侧的产品与服务,搜索API 网关,点击API网关,选择“华北2(北京)”,选择左侧导航栏的调用API->已购买API。点击查看->精简实况。下拉网页即可找到token信息,如下图所示: e.配置“墨迹天气”的编码方式和参数。 如此即可获取成都温江的天气信息了。由此“墨迹天气”节点则配置完成。 5.获取墨迹天气节点的输出信息。选择左侧导航栏的功能->HTTP返回,点击部署->调试,输入城市ID:2637(温江),点击开始调试。 鼠标选中墨迹天气节点,点击右侧栏节点日志,即可获取墨迹天气节点的输出信息 添加条件判断节点信息。选择功能->条件判断节点,并将其节点名称改为“温江温度”,选择任意一个满足条件,配置为:上一个节点+ data.condition.temp,<;静态数据,数值型,20 添加2个智能提示音设备。选中设备->智能提示音,一个连接到“温江温度”的满足条件接口,并将设备节点名改为“提示音0”,将控制设备配置好,播放提示音为数值型,1;另一个连接到“温江温度”的不满足接口,并将歌曲改为“提示音1”,将控制设备配置好,播放提示音为数值型,1, 添加HTTP返回节点。配置为上一节点。将城市ID输入、墨迹天气、温江温度、提示音0/1、HTTP返回连接起来,再点击部署->调试,即可播放相应的提示音 二、程序编译 将喇叭插入A4口。 源程序如下: [mw_shl_code=applescript,true]#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 *600; tone(SPEARKER_PIN, liangliangData,noteDuration); } noTone(SPEARKER_PIN); } /*播放天空之城*/ 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); } 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); } 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(); } }[/mw_shl_code] 将这部分内容改为自己的环境和设备 下载编译。执行程序。 现在你可以测试在你的环境下,能不能通过阿里云平台获取温度,并提示到我们。 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed