Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1217|回复: 0

blinker物联网教程——20、语音氛围灯

[复制链接]
发表于 2022-4-14 17:57 | 显示全部楼层 |阅读模式
本帖最后由 海神 于 2022-5-17 16:16 编辑

简介

Wifiduino接入云服务器后,我们可以通过已经联网的智能音箱发送指令来控制接入在服务器上的wifiduino发出相应动作,我们可以通过智能音箱控制接在wifiduino上的RGB灯条模块显示任何想要的颜色。

器材准备:


灯条模块*2
3P连接线*1


步骤一:小度音箱配置联网


参考以上章节,将小度音箱配置联网。

步骤二:将wifiduino作为智能家居氛围灯设备通过blinker连接入网



首先将找到示例程序(文件——示例——blinker——blinkerDuerOS——DuerOS_LIGHT)下载到主板wifiduino中,
上传程序前确认修改程序中的 auth[]值和要连接的wifi的ssid及密码
  1. char auth[] = "d8bxxxxxxxx"; //blinker app钟添加阿里云后生成的key值
  2. char ssid[] = "moxxun";  //wifiduino要连接的热点
  3. char pswd[] = "1803808xxxx"; //热点的密码
复制代码
注意程序中的定义连接RGB灯条模块的IN接口为D13
#define PIN   D13
示例中灯条模块上只有3颗灯,这里我们可以利用灯条模块的级联来添加更多的灯(模块的OUT接口用连接线连接下个模块的IN接口),这里我们使用的RGB灯为6颗,程序需设置RGB灯的数量为6
#define NUMPIXELS      6
完整示例程序
  1. #define BLINKER_WIFI
  2. #define BLINKER_DUEROS_LIGHT

  3. #include <Blinker.h>
  4. char auth[] = "329b1ece56f5";
  5. char ssid[] = "mostfun";
  6. char pswd[] = "1803808xxxx";


  7. // Download Adafruit_NeoPixel library here:
  8. // https://github.com/adafruit/Adafruit_NeoPixel
  9. #include <Adafruit_NeoPixel.h>

  10. #define PIN            D13
  11. #define NUMPIXELS      6
  12. Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

  13. #define RGB_1 "RGBKey"

  14. BlinkerRGB WS2812(RGB_1);

  15. uint8_t colorR, colorG, colorB, colorW;
  16. bool wsState;
  17. String wsMode = BLINKER_CMD_COMMON;

  18. void pixelShow()
  19. {
  20.     pixels.setBrightness(colorW);

  21.     for(int i = 0; i < NUMPIXELS; i++){
  22.         pixels.setPixelColor(i, colorR, colorG, colorB);
  23.     }
  24.     pixels.show();
  25. }

  26. void ws2812_callback(uint8_t r_value, uint8_t g_value, uint8_t b_value, uint8_t bright_value)
  27. {
  28.     digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  29.     BLINKER_LOG("R value: ", r_value);

  30.     BLINKER_LOG("G value: ", g_value);
  31.     BLINKER_LOG("B value: ", b_value);
  32.     BLINKER_LOG("Rrightness value: ", bright_value);

  33.     colorR = r_value;
  34.     colorG = g_value;
  35.     colorB = b_value;
  36.     colorW = bright_value;

  37.     pixelShow();
  38. }
  39. String getColor()
  40. {
  41.     uint32_t color = colorR << 16 | colorG << 8 | colorB;

  42.     switch (color)
  43.     {
  44.         case 0xFF0000 :
  45.             return "Red";
  46.         case 0xFFFF00 :
  47.             return "Yellow";
  48.         case 0x0000FF :
  49.             return "Blue";
  50.         case 0x00FF00 :
  51.             return "Green";
  52.         case 0xFFFFFF :
  53.             return "White";
  54.         case 0x000000 :
  55.             return "Black";
  56.         case 0x00FFFF :
  57.             return "Cyan";
  58.         case 0x800080 :
  59.             return "Purple";
  60.         case 0xFFA500 :
  61.             return "Orange";
  62.         default :
  63.             return "White";
  64.     }
  65. }

  66. void duerPowerState(const String & state)
  67. {
  68.     BLINKER_LOG("need set power state: ", state);

  69.     if (state == BLINKER_CMD_ON) {
  70.         digitalWrite(LED_BUILTIN, HIGH);

  71.         BlinkerDuerOS.powerState("on");
  72.         BlinkerDuerOS.print();

  73.         wsState = true;

  74.         if (colorW == 0) colorW = 255;
  75.     }
  76.     else if (state == BLINKER_CMD_OFF) {
  77.         digitalWrite(LED_BUILTIN, LOW);

  78.         BlinkerDuerOS.powerState("off");
  79.         BlinkerDuerOS.print();

  80.         wsState = false;
  81.     }

  82.     pixelShow();
  83. }

  84. void duerColor(int32_t color)
  85. {
  86.   
  87.     BLINKER_LOG("need set color: ", color);

  88.     colorR = color >> 16 & 0xFF;
  89.     colorG = color >>  8 & 0xFF;
  90.     colorB = color       & 0xFF;

  91.     BLINKER_LOG("colorR: ", colorR, ", colorG: ", colorG, ", colorB: ", colorB);

  92.     pixelShow();

  93.     BlinkerDuerOS.color(color);
  94.     BlinkerDuerOS.print();
  95. }

  96. void duerMode(const String & mode)
  97. {
  98.     BLINKER_LOG("need set mode: ", mode);

  99.     if (mode == BLINKER_CMD_DUEROS_READING) {
  100.         // Your mode function
  101.     }
  102.     else if (mode == BLINKER_CMD_DUEROS_SLEEP) {
  103.         // Your mode function
  104.     }
  105.     else if (mode == BLINKER_CMD_DUEROS_ALARM) {
  106.         // Your mode function
  107.     }
  108.     else if (mode == BLINKER_CMD_DUEROS_NIGHT_LIGHT) {
  109.         // Your mode function
  110.     }
  111.     else if (mode == BLINKER_CMD_DUEROS_ROMANTIC) {
  112.         // Your mode function
  113.     }
  114.     else if (mode == BLINKER_CMD_DUEROS_READING) {
  115.         // Your mode function
  116.     }

  117.     wsMode = mode;

  118.     BlinkerDuerOS.mode(mode);
  119.     BlinkerDuerOS.print();
  120. }

  121. void duercMode(const String & cmode)
  122. {
  123.     BLINKER_LOG("need cancel mode: ", cmode);

  124.     if (cmode == BLINKER_CMD_DUEROS_READING) {
  125.         // Your mode function
  126.     }
  127.     else if (cmode == BLINKER_CMD_DUEROS_SLEEP) {
  128.         // Your mode function
  129.     }
  130.     else if (cmode == BLINKER_CMD_DUEROS_ALARM) {
  131.         // Your mode function
  132.     }
  133.     else if (cmode == BLINKER_CMD_DUEROS_NIGHT_LIGHT) {
  134.         // Your mode function
  135.     }
  136.     else if (cmode == BLINKER_CMD_DUEROS_ROMANTIC) {
  137.         // Your mode function
  138.     }
  139.     else if (cmode == BLINKER_CMD_DUEROS_READING) {
  140.         // Your mode function
  141.     }

  142.     wsMode = BLINKER_CMD_COMMON; // new mode

  143.     BlinkerDuerOS.mode(wsMode); // must response
  144.     BlinkerDuerOS.print();
  145. }

  146. void duerBright(const String & bright)
  147. {
  148.     BLINKER_LOG("need set brightness: ", bright);

  149.     if (bright == BLINKER_CMD_MAX) {
  150.         colorW = 255;
  151.     }
  152.     else if (bright == BLINKER_CMD_MIN) {
  153.         colorW = 0;
  154.     }
  155.     else {
  156.         colorW = bright.toInt();
  157.     }

  158.     BLINKER_LOG("now set brightness: ", colorW);

  159.     pixelShow();

  160.     BlinkerDuerOS.brightness(colorW);
  161.     BlinkerDuerOS.print();
  162. }

  163. void duerRelativeBright(int32_t bright)
  164. {
  165.     BLINKER_LOG("need set relative brightness: ", bright);

  166.     if (colorW + bright < 255 && colorW + bright >= 0) {
  167.         colorW += bright;
  168.     }

  169.     BLINKER_LOG("now set brightness: ", colorW);

  170.     pixelShow();

  171.     BlinkerDuerOS.brightness(bright);
  172.     BlinkerDuerOS.print();
  173. }

  174. void duerQuery(int32_t queryCode)
  175. {
  176.     BLINKER_LOG("DuerOS Query codes: ", queryCode);

  177.     switch (queryCode)
  178.     {
  179.         case BLINKER_CMD_QUERY_TIME_NUMBER :
  180.             BLINKER_LOG("DuerOS Query time");
  181.             BlinkerDuerOS.time(millis());
  182.             BlinkerDuerOS.print();
  183.             break;
  184.         default :
  185.             BlinkerDuerOS.time(millis());
  186.             BlinkerDuerOS.print();
  187.             break;
  188.     }
  189. }

  190. void dataRead(const String & data)
  191. {
  192.     BLINKER_LOG("Blinker readString: ", data);

  193.     Blinker.vibrate();
  194.    
  195.     uint32_t BlinkerTime = millis();
  196.     Blinker.print(BlinkerTime);
  197.     Blinker.print("millis", BlinkerTime);
  198. }

  199. void setup()
  200. {
  201.     Serial.begin(115200);
  202.     BLINKER_DEBUG.stream(Serial);
  203. BLINKER_DEBUG.debugAll();
  204.     pinMode(LED_BUILTIN, OUTPUT);
  205.     digitalWrite(LED_BUILTIN, LOW);

  206.     Blinker.begin(auth, ssid, pswd);
  207.     Blinker.attachData(dataRead);
  208.    
  209.     BlinkerDuerOS.attachPowerState(duerPowerState);
  210.     BlinkerDuerOS.attachColor(duerColor);
  211.     BlinkerDuerOS.attachMode(duerMode);
  212.     BlinkerDuerOS.attachCancelMode(duercMode);
  213.     BlinkerDuerOS.attachBrightness(duerBright);
  214.     BlinkerDuerOS.attachRelativeBrightness(duerRelativeBright);
  215.     BlinkerDuerOS.attachQuery(duerQuery);

  216.     pinMode(14, OUTPUT);
  217.     digitalWrite(14, HIGH);
  218.     pinMode(15, OUTPUT);
  219.     digitalWrite(15, HIGH);

  220.     colorR = 255;
  221.     colorG = 255;
  222.     colorB = 255;
  223.     colorW = 0;
  224.     wsState = true;

  225.     pixels.begin();
  226.     pixels.setBrightness(colorW);
  227.     WS2812.attach(ws2812_callback);
  228.     pixelShow();
  229. }

  230. void loop()
  231. {
  232.     Blinker.run();

  233.     for(int i = 0; i < NUMPIXELS; i++){
  234.         pixels.setPixelColor(i, colorR, colorG, colorB);
  235.     }
  236.     pixels.show();
  237. }
复制代码
硬件连接:
语音氛围灯接线.png

步骤三:将blinker授权给小度语音助手,通过语音助手来控制氛围灯设备



1、在手机界面中找到“智能家居”,选择“添加智能家居设备”。找到blinker点击授权。

这样就将blinker软件中的绑定的设备,授权给“小度音箱”使用。
点击“账号授权”,填写blinker的账号和密码,完成登录绑定。
这时候,在智能家居一栏中就会出现刚添加的智能设备(灯wifiduino)

注意:这里显示的智能设备会根据wifiduino中程序的定义自动判别添加的是插座、灯或者传感器 (这里是“灯”)
可以修改添加设备的属性,将其取名为XX位置的XX设备。(例如 设备名称:灯  设备分组:卧室)
语音控制
对着小度音箱说“小度 小度 打开卧室的灯”就会执行接通灯的指令
“小度 小度 关掉卧室的灯”就会执行关闭灯的指令。
“小度小度 把卧室灯调成蓝色”并观观察灯的颜色变化状态。
常见问题
F:一张wifiduino主板被绑定过一种设备(例如:插座),现在想把它当成空气检测仪来使用可以吗?
Q:一个设备同一时间内只能被当成一种设备类型。
如果wifiduino之前被绑定过插座,你的设备还会被检查是插座,而不是空气检测仪。这时候需要采用下面办法进行重新绑定。
一、wifiduino上传灯控制的程序后,通电保证wifiduino在线。我们直接对小度音箱说“小度小度 发现设备”。小度会自动搜索附近的设备,然后添加新出现的设备(灯)
二、在手机界面中找到“智能家居”,直接点击右上角的“+”添加智能设备,找到blinker,点击“解除授权”,将之前绑定的设备解除。再重新添加新的设备。

系列教程

blinker物联网教程——1、物联网及blinker介绍
blinker物联网教程——2、搭建编程环境
blinker物联网教程——3、主控硬件wifiduino
blinker物联网教程——4、控制开关灯
blinker物联网教程——5、认识传感器
blinker物联网教程——6、wifi智能插座
blinker物联网教程——7、室内温湿度计
blinker物联网教程——8、定时任务-定时震动器
blinker物联网教程——9、blinker语音识别-芝麻开门
blinker物联网教程——10、日照时间分析
blinker物联网教程——11、自动灌溉
blinker物联网教程——12、调色盘
blinker物联网教程——13、公园噪音监测
blinker物联网教程——14、智能停车场
blinker物联网教程——15、智能家居
blinker物联网教程——16、遥控机械臂
blinker物联网教程——17、防疫隔离门磁
blinker物联网教程——18、手机控制空调
blinker物联网教程——19、接入小度智能音箱
blinker物联网教程——20、语音氛围灯
blinker物联网教程——23、wifi智能小车
blinker物联网教程——24、智能宠物喂食器


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

本版积分规则

小黑屋|Archiver|Arduino中文社区

GMT+8, 2022-10-7 20:58 , Processed in 0.027549 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表