智能家居应用教程10——语音氛围灯-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1594|回复: 0

智能家居应用教程10——语音氛围灯

[复制链接]
发表于 2022-1-21 16:29 | 显示全部楼层 |阅读模式
[md]## 简介

Wifiduino接入云服务器后,我们可以通过已经联网的智能音箱发送指令来控制接入在服务器上的wifiduino发出相应动作,我们可以通过智能音箱控制接在wifiduino上的RGB灯条模块显示任何想要的颜色。
01.jpg
RGB颜色对照表:<http://tool.oschina.net/commons?type=3>

## 器材准备:

+ wifiduino主板 * 1

+ wifiduino拓展板 * 1

+ 灯条模块 * 2

+ 3P连接线 * 1

+ 3.7V可充电电池 * 1

## 接通小度智能音箱

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

## 程序下载

打开例程 DuerOS_rgbLIGHT.ino   修改程序中的 auth[]值和要连接的wifi的ssid及密码
02.jpg
注意程序中的定义连接RGB灯条模块的IN接口为D13

        #define PIN   D13
       
设置RGB灯的颗数为6颗

        #define NUMPIXELS      6
       
灯条模块上只有3颗灯,这里我们可以利用灯条模块的级联来添加更多的灯,模块的OUT接口用连接线连接下个模块的IN接口。

下载程序到wifiduino板中。下载结束后,IDE提示栏中显示“上传成功”
03.jpg
## 完整程序[/md]

  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. }
复制代码

[md]
## 硬件模块连接

确认扩展板对应插在wifiduino主板上,2个RGB灯条模块通过连接线级联后,连接在扩展板上的D13中。
04.jpg
## 小度音箱app中添加智能设备

在手机界面中找到“智能家居”,选择“添加智能家居设备”。找到blinker点击授权。
05.jpg
这样就将blinker软件中的绑定的设备,授权给“小度音箱”使用。
点击“账号授权”,填写blinker的账号和密码,完成登录绑定。
这时候,在智能家居一栏中就会出现刚添加的智能设备(灯wifiduino)
06.jpg
**注意:这里显示的智能设备会根据wifiduino中程序的定义自动判别添加的是插座、灯或者传感器 **(这里是“灯”)

可以修改添加设备的属性,将其取名为XX位置的XX设备。(例如 设备名称:灯  设备分组:卧室)

## 语音控制

对着小度音箱说“小度 小度 打开卧室的灯”就会执行接通灯的指令

“小度 小度 关掉卧室的灯”就会执行关闭灯的指令。

“小度小度 把卧室灯调成蓝色”并观观察灯的颜色变化状态。
07.jpg
## 常见问题

F:一张wifiduino主板被绑定过一种设备(例如:插座),现在想把它当成空气检测仪来使用可以吗?

Q:一个设备同一时间内只能被当成一种设备类型。

如果wifiduino之前被绑定过插座,你的设备还会被检查是插座,而不是空气检测仪。这时候需要采用下面办法进行重新绑定。

一、wifiduino上传灯控制的程序后,通电保证wifiduino在线。我们直接对小度音箱说“小度小度 发现设备”。小度会自动搜索附近的设备,然后添加新出现的设备(灯)

二、在手机界面中找到“智能家居”,直接点击右上角的“+”添加智能设备,找到blinker,点击“解除授权”,将之前绑定的设备解除。再重新添加新的设备。
08.jpg [/md]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-27 14:21 , Processed in 0.074107 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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