1. 程式人生 > >啥?你想diy一個智慧音箱,來吧

啥?你想diy一個智慧音箱,來吧

沒錯,這是智zhang語音助手

本系統基於自美系統二次開發,新增連線EMQ伺服器,語音遠端控制LED(Nodemcu),當然也可以擴充套件控制更多的裝置,只需要將下位機裝置連線到EMQ伺服器即可。

由於使用自美系統,需要配套的驅動板官方文件有相關連結。(有興趣的同學可以瞭解一下 悟空專案 ,也是一個開源智慧音箱專案)

自美系統已經將基礎的語音互動框架做好,支援自定義喚醒詞(snowboy平臺),不過有一點需要了解,如果想使用自美系統,需要購買其專用驅動板,用來驅動揚聲器和麥克風。如下圖

這不是廣告哈

對了,有一點需要主要,對於這類智慧語音互動系統,麥克風的質量真的很重要,不然都喚醒不了,那就尷尬了。

開機介面如下(介面還是很簡潔的)

這裡主要介紹一下,二次開發外掛的過程,使用Python語言,程式碼很簡單。

自美文件詳細介紹瞭如何新增外掛(這裡直接上程式碼)

# encoding: utf-8
import paho.mqtt.client as mqtt

from plugin import Plugin

HOST = "47.98.xxx.58" #EMQ伺服器地址
PORT = 1883 #埠固定1883
MQTT_ID="Client_Test" #自定義客戶端

class Test(Plugin):
    def start(self,name):   
        client = mqtt.Client(MQTT_ID)
        client.connect(HOST, PORT, 60)
        if name["data"].count("開") >=1:
            client.publish("LED","1024",2) # 釋出一個主題為'LED'
            return {'state':True,'data': "主人,燈已開啟" ,'msg':'','stop':True}   
        elif name["data"].count("關") >=1:
            client.publish("LED","0",2) # 釋出一個主題為'LED'
            return {'state':True,'data': "主人,燈已關閉" ,'msg':'','stop':True}   
        else:
            return {'state':True,'data': "沒有執行任何操作" ,'msg':'','stop':True}

語音控制Nodemcu上的一個LED 演示視訊

附加Nodemcu的程式碼(使用arduino平臺開發)

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <math.h>
int pinLED = D2;

const char* ssid = "123";//連線的路由器的名字
const char* password = "12345678";//連線的路由器的密碼
const char* mqtt_server = "47.98.xxx.58";//伺服器的地址 
const int port=1883;//伺服器埠號

WiFiClient espClient;
PubSubClient client(espClient);

int light=1024;//led的亮度值

void setup_wifi() {//自動連WIFI接入網路
  delay(10);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("hello 8266\n");
    Serial.print("...");
  }
}

void callback(char* topic, byte* payload, unsigned int length) {//用於接收資料
  //將char* 轉換為int
  int l=0;
  int p=1;
  for (int i = length-1; i >=0; i--) {
    l+=(int)((char)payload[i]-'0')*p;
    p*=10;
  }
  light=l;//賦值給light
  Serial.println(l);

}

void reconnect() {//等待,直到連線上伺服器
  while (!client.connected()) {//如果沒有連線上
    if (client.connect("nodemcu")+random(999999999)) {//接入時的使用者名稱,儘量取一個很不常用的使用者名稱
      client.subscribe("LED");//接收外來的資料時的intopic
    } else {
      Serial.print("failed, rc=");//連線失敗
      Serial.print(client.state());//重新連線
      Serial.println(" try again in 5 seconds");//延時5秒後重新連線
      delay(5000);
    }
  }
}


void setup() {//初始化程式,只執行一遍
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);//設定串列埠波特率(與燒寫用波特率不是一個概念)
  setup_wifi();//自動連WIFI接入網路
  client.setServer(mqtt_server, port);//埠號
  client.setCallback(callback); //用於接收伺服器接收的資料
}



void loop() {//主迴圈
   reconnect();//確保連上伺服器,否則一直等待。
   client.loop();//MUC接收資料的主迴圈函式。
   analogWrite(LED_BUILTIN,1024-light);//設定led亮度
}

//程式碼是網上下載的,找不到作者了,如有侵權聯絡刪除,謝謝

原始碼會上傳到Github(有需要自行下載)

小白一枚,歡迎評論指正