資料介紹
描述
介紹和動機
語音和家庭自動化自然結合。昨天回家告訴家里該做什么的夢想是今天的現實。
為了嘗試家庭自動化,我決定修改我的一個舊項目BLElectric Light 101 ,并使其成為帶有Mycroft/Picroft的語音控制物聯網設備。
整體設計
我已經從Chuck Hellyebuck 的 Filament Friday中“回收”了 3D 打印的 Edison 風格的電燈泡。燈泡中的新像素環提供光和顏色效果。在最初的項目中,我使用 Arduino 101 使用其板載 BLE 功能來控制環。
在這個項目中,我用基于 ESP8266 的開發板SparkFun ESP8266 Thing - Dev Board 替換了 Arduino 101 和 BLE,并將其變成了燈泡的 Web 服務器。這允許將燈泡或東西放置在我的家庭 Wifi 網絡上。
在我的 MyCroft 技能中使用 python HTTP請求庫給了我們:語音物聯網!
我還決定將步進電機連接到電路板上。為什么?好吧,因為我可以!但說真的,從我用來啟動它的語音命令中,你可能會猜到我將來會在這個項目中走向何方。. .
請注意,這個項目也可以使用帶有 ESP8266 WiFi 的 Adafruit Feather HUZZAH來完成。
開始使用基于 8266 的板
ESP8266 是一款支持 WiFi 的微控制器,可以通過 Arduino IDE 進行編程。adafruit 和 Sparkfun 基于這種芯片的開發板價格低廉,并且有大量的庫、教程和代碼示例可供學習。它們的主要優勢是能夠使用 Arduino IDE 和 WiFi 功能輕松對其進行編程。這些板的小尺寸使其非常容易嵌入到物體中并通過 WiFi 輕松連接。該板的一個相對缺點是 GPIO 和 ADC 引腳數量較少,但正如您從我的項目中看到的那樣,Huzzah!用 PubNub 給我上色!,有辦法克服這個問題。
總體而言,易用性、大量社區支持和共享以及 WiFi 使其成為 Makers 幾乎理想的物聯網微控制器。即將推出的ESP32 開發板希望讓任何對引腳編號的擔憂成為過去!
為了開始使用 Arduino 上的電路板,我將您指向 Sparkfun 和 adafruit 網站。兩個指南都很有用,推薦的設置似乎適用于任一板:
兩個教程都涵蓋了使用開發板和 Arduino IDE 所需的驅動程序和庫的安裝。
安裝 ESP8266 庫后,您應該查看 WiFi 示例草圖。我使用這些示例提出了我自己的 Web 服務器代碼,如下所述。
網絡服務器
Web 服務器是一個程序,它在端口上偵聽http命令并通過沿指定路由執行代碼來響應它們(路由是處理特定http命令的代碼 - 這將在稍后顯而易見)。ESP8266 提供了多個庫和大量代碼示例,使您可以非常輕松地設計自己的 Web 服務器。不要害怕,您的 Web 服務器草圖將遵循與 Arduino IDE 程序相同的結構。它將具有 setup() 和 loop() 函數,以及一些函數等。
我們的網絡服務器將有 4 條路線。一個用于處理根部,一個用于打開和關閉燈泡,一個用于處理燈光顏色,最后一個用于控制我們的步進電機。您可以將這些路由中的每一個視為按需執行的函數或代碼塊。在未來的重構中,燈泡相關的路由將更改為一個路由,有 2 個參數,但稍后會更多。現在,我將逐行介紹如何在 ESP8266 板上設置 Web 服務器的代碼。
就像在 Arduino IDE 中編寫的任何程序一樣,我們將編寫我們的 Web 服務器作為草圖上傳到我們的板上。為了設置我們的服務器,我們需要導入一些標準庫:
#include
#include
#include
#include
為了將我們的 Web 服務器連接到我們的 WiFi 網絡,我們必須提供我們的網絡 ID 和密碼,并創建一個 Web 服務器對象來監聽端口 80:
const char* ssid = "********";
const char* password = "**********";
ESP8266WebServer server(80);
如果您遵循代碼,您將看到處理我上面提到的路由的函數列表。但是,我們將首先進入草圖的setup()函數。當我們正在編寫我們的第一個 Web 服務器時,我們需要將消息寫入串行端口。這將使我們能夠看到我們正在使用的開發板的IP 地址,這對于我們向開發板發送命令至關重要!
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
if (MDNS.begin("esp8266")) {
Serial.println("MDNS responder started");
}
在串行輸出中看到 IP 地址后,請記下它。它將用于在我們的 MyCroft 技能中與董事會溝通。它將類似于172.16.254.1 ,為了連接到板,您將發出一個 http 命令,例如:
http://172.16.254.1/stepper
IP 是服務器的主機地址,“/stepper”是我們在代碼中指定的資源路徑或路由。事實上,以下幾行指定了我們的每個路徑和每個服務器應該執行的響應。要理解這一點,請像 Web 服務器一樣閱讀它:
從 http 請求 http://172.16.254.1/stepper 接收到路徑“/stepper”后,我將執行名為 handleStepper 的函數中的代碼
server.on("/", handleRoot);
server.on("/lamp", handleCommand);
server.on("/color", handleColor);
server.on("/stepper",handleStepper);
步進器處理代碼很容易理解(我為使用延遲功能道歉),因此不是很有趣。
因此,我將介紹handleCommand()代碼,它不僅可以幫助您學習如何創建和處理資源路徑,而且還必須將參數和值發送到您的函數!handleCommand的代碼在函數void handleCommand()中定義,它必須具有參數中指定的確切名稱才能傳遞給server.on()函數。
void handleCommand()
{
String message = "done";
int commandValue;
...
我們創建一個名為message的 String 變量,以傳回發出請求的客戶端。您可以在此過程中修改此字符串以將您希望返回的任何消息傳遞給您的客戶。客戶端可以是您的網絡瀏覽器、您編寫的程序,或者在我們的例子中是 Mycroft/Picroft 系統。
然后我們創建一個名為commandValue的整數變量。我們的客戶端將傳入一個參數值。在這種情況下,參數值將是 1 或 0,具體取決于客戶端是否希望打開或關閉燈。在瀏覽器窗口中,這看起來像:
http://176.16.254.1/lamp?cmd=1
or
http://176.16.254.1/lamp?cmd=0
還記得我們創建了/lamp資源路徑來處理這個嗎?當遵循此資源路徑時,調用來處理它的函數可以訪問使用server.arg()函數發送的參數和值。在我們的例子中,只有一個叫做cmd:
commandValue = (server.arg("cmd")).toInt();
首先,當然,我們檢查以確保客戶端發送了一個參數,如果沒有使用我們的消息變量將錯誤消息發送回客戶端。有更好的方法來處理這個問題,但是由于我們正在創建客戶端和它將發送的命令,所以現在這已經足夠好了。cmd參數值作為字符串類型接收。為了在非常優雅的switch/case控制結構中有效地使用它,我們使用 String 類的toInt() 函數將其轉換為整數類型。然后我們可以執行與打開或關閉燈對應的代碼:
switch(commandValue)
{
case 0:
currentColor = 0;
setLampColor();
break;
case 1:
currentColor = 1;
setLampColor();
break;
default:
message = "choose from 0, 1 for lamp off/on";
break;
}
這里有兩個重點。首先,如果客戶端應該發送一個無意義的cmd參數值,我們將向客戶端發送一條錯誤消息。其次,我們使用一個名為currentColor的狀態變量來設置和跟蹤當前的燈顏色。在打開或關閉燈的情況下,這將分別是白色或黑色。使用這種方法,我們可以將setLampColor()重新用于開/關和特定顏色設置。變量currentColor不僅充當燈泡的狀態變量,而且還是新像素顏色對象數組的索引。
如果您遵循所有這些,您可以設計自己的 Web 服務器以嵌入任何 8266 項目并制作連接的東西!
客戶
現在 Web 服務器已經啟動并運行,我們可以在 python 中開發客戶端。
正如我們在上面看到的,我們可以使用 Web 瀏覽器作為我們的客戶端,甚至可以編寫我們自己的自定義 HTML/Javascrip/CSS 頁面來與之交互。我們也可以編寫自己的 python 腳本來做同樣的事情。只要運行它的計算機可以訪問您的網絡,您就可以開展業務。然后,您可以在 Mycroft 中實施技能之前測試您希望包含在語音技能中的大部分功能。
如果您熟悉使用 Mycroft 技能,則不必編寫腳本來測試 Mycroft 之外的客戶端功能。Mycroft 技能中的大部分動作發生在技能的__init__.py文件中。您可以在此文件中實現 python 代碼寫入并從那里進行調試。由你決定!
請求和物聯網演示技能
如果您還沒有創建自己的技能,我建議您查看以下資源:
看完這些后,繼續學習你自己的“Hello World”技能并開始運行吧!以下不是技能設計和實施的綜合教程,只是亮點和一些見解。
一切由此開始:
import requests
如果你能在你的樹莓派上用 python 做到這一點,你可以在 Mycroft 下用你的聲音來控制它!
使用 python 與我們的 Web 服務器交互的關鍵是Requests: HTTP for Humans庫。沒有什么比他們自己的描述更能描述這個庫了:
Requests 是一個優雅而簡單的 Python HTTP 庫,專為人類構建。
它是為人類使用而設計和建造的!我們將使用這個庫在語音控制下與我們的物聯網設備進行通信。該庫將允許我們在我們的 python 意圖代碼中簡單地復制上面討論的 http 命令。
此 IoT 演示技能將由 3 個意圖組成:
def handle_lamp_command_intent(self, message):
def handle_lamp_color_intent(self, message):
def handle_feeder_intent(self,message):
這些意圖中的每一個都將對應于我們服務器上的一個路由(根路由除外)。它不必是這樣,也許這不是最有效的設計,但它有效,我現在會堅持下去。
在 initialize() 函數中注冊意圖:
lamp_color_intent = IntentBuilder("LampColorIntent").require("LampColorKeyword").require("ColorName").build()
self.register_intent(lamp_color_intent, self.handle_lamp_color_intent)
請務必注意,此意圖將使用LampColorKeyword.voc文件將話語與此特定意圖相匹配。該文件如下所示:
change
make
這就是說,“嘿,Mycroft,讓顏色變成粉紅色。” 這不是很理想,但我在為這個意圖創建正確的用語并讓它識別這樣的短語時遇到了一些困難。當我更多地了解意圖及其與 vocab 或 .voc 文件的關系時,在我看來,這些意圖是由構成話語的關鍵詞組成的,而不是完整的話語。我認為這可能會引起對重疊關鍵字沖突的擔憂。我發現并繼續發現以下資源是我繼續理解意圖、關鍵字等的關鍵:
當我們改變燈的顏色時,我們需要能夠響應用戶請求的顏色。這是通過使用正則表達式完成的。文件lampactions.rx如下所示:
(turn|switch) (?Pon|off) (?P.*)
(change|make) (?Pcolor|color to) (?P.*)
如果 btoharye 看到這個,他會注意到他的家庭助理工作有一些相似之處!
第二條線是我們的重點。這個正則表達式將允許我們在消息總線上通過變量名稱ColorName 傳遞用戶命名的顏色。通過匹配單詞change或make來進行匹配。我目前沒有使用Action變量。
def handle_lamp_color_intent(self, message):
lamp_color = message.data.get("ColorName")
LOGGER.info("Lamp Color: " + lamp_color)
if self.color_map.has_key(lamp_color):
self.speak_dialog("lamp.color",{"color": lamp_color})
color_index = self.color_map[lamp_color]
r = requests.get('http://ip_here/color?color='+str(color_index))
else:
self.speak_dialog("lamp.color.error",{"color": lamp_color})
我們可以創建函數處理程序并使用參數消息從用戶的話語中獲取命名的顏色:
def handle_lamp_color_intent(self, message):
lamp_color = message.data.get("ColorName")
LOGGER 對象將這些語句打印到 /var/log/mycroft-skills.log。另一種調試方法是讓 Mycroft 使用 self.speak_dialog() 函數說話。在此之前,我正在單獨編寫 python 技能功能,并將該代碼放入__init__.py文件中。但是,熟悉“在”Mycroft 本身內進行調試會為您節省一些時間,我建議您轉向這種方法。
LOGGER.info("Lamp Color: " + lamp_color)
在這之前,我們創建了一個名為color_map 的 python 地圖:
def __init__(self):
. . .
self.color_map = {'black': 0, 'white': 1, 'blue': 2, 'green': 3, 'orange': 4, 'red': 5, 'purple': 8, 'yellow': 9, 'pink': 10}
這種方法允許我們獲取 ColorName 話語并將其用作訪問相應顏色值以發送到 ESP8266 Dev Thing 的鍵。從草圖中的這段代碼可以看出,顏色鍵值和顏色索引匹配。
// From the sketch file running on the ESP8266 board
void setStandardColors()
{
black = neoRing.Color(0,0,0); //used for 'off' state
white = neoRing.Color(255,255,255);
blue = neoRing.Color(0,0,255);
green = neoRing.Color(255,0,0);
orange = neoRing.Color(140,255,0);
red = neoRing.Color(0,255,0);
red_orange = neoRing.Color(69,255,0);
sky_blue = neoRing.Color(206,135,235);
purple = neoRing.Color(0,255,255);
yellow = neoRing.Color(255,255,0);
pink = neoRing.Color(0,255,180);
standardColors[0] = black;
standardColors[1] = white;
standardColors[2] = blue;
standardColors[3] = green;
standardColors[4] = orange;
standardColors[5] = red;
standardColors[6] = red_orange;
standardColors[7] = sky_blue;
standardColors[8] = purple;
standardColors[9] = yellow;
standardColors[10] = pink;
}
這使得發送顏色消息變得容易,尤其是當我們使用請求庫時!
if self.color_map.has_key(lamp_color):
self.speak_dialog("lamp.color",{"color": lamp_color})
color_index = self.color_map[lamp_color]
r = requests.get('http://ip_here/color?color='+str(color_index))
無論您在哪里看到 ip_here ,都將其替換為您的板 IP 地址。未來版本將在 settings.json文件中包含此內容。
在沒有與可用顏色匹配的鍵的情況下,我們使用lamp.color.error.dialog文件中的錯誤對話框報告此情況。我們可以通過重復請求的顏色來幫助用戶,并提供一些有效的選項(有關更多信息,請參見下文)。
sorry {{color}} not available maybe try red green or blue
sorry {{color}} not available maybe try orange yellow or purple
{{color}} is not an option you can try red green or blue instead
{{color}} is not an option you can try purple orange or yellow
sorry could you try purple blue or orange instead of {{color}}
sorry could you try red yellow or green instead of {{color}}
聲音設計
有這么多顏色!您怎么知道要嘗試哪個,以及我們如何在提供有用建議的同時避免認知超負荷。. .這就是語音接口的挑戰。
當 Mycroft 無法識別所請求的顏色時,例如“chartreuse”,它會回復一個包含 3 個備選顏色的列表。這三種選擇是一種很好的方式,不僅可以讓用戶知道一些有效的選項,還可以引導用戶使用基本的顏色請求。所有可用顏色選項的綜合列表將無法處理并且占用太多時間。
sorry {{color}} not available maybe try red green or blue
sorry {{color}} not available maybe try orange yellow or purple
...
當我反思良好的聲音設計時,我不喜歡這里的短語:“..maybe try”?設備不應該知道它知道什么顏色嗎?跛腳,我知道,我會擺脫這個。. .
此外,這些替代方案在.dialog 文件中進行了“硬”編碼。未來的重構可能會受益于從可用的顏色中證明 3 種隨機顏色。另一個選項,可以提供更大的智能和響應能力,是讓 Mycroft 提供 2 或 3 種顏色選項,在色調上與請求的選項最接近。
目前 Mycroft 不直接支持多輪對話:
Mycroft 是否支持多回合/會話技能?
這是一個進展中的工作。在當前的主線中,有能力告訴 Mycroft 在說完任何話后立即聽。在技??能中,您可以使用...調用它self.speak("utterance", expect_response=True)
...請參閱https://github.com/MycroftAI/mycroft-core/blob/dev/mycroft/skills/core.py#L3262)
這只允許用戶與 Mycroft 對話,而不必說“Hey Mycroft”。
對于真正的對話交互,有一些正在進行的工作來實現 converse() 方法。這是即將到來的拉取請求:https ://github.com/MycroftAI/mycroft-core/pull/9253
這將允許技能在調用 Adapt 意圖解析器之前預覽話語。只有最近使用的技能會收到 converse() 通知,并按使用順序傳遞給他們。因此,您可以編寫執行以下操作的技能:
@intent_handler(IntentBuilder().require('alarm').require('cancel').build()) def handle_cancel_alarm(): self.speak("are you sure you want to cancel?", expect_response=True) def converse(self, utterances,): if utterances == "yes": # do whatever self.speak("Alarm canceled")
這顯然是頭腦簡單,但使用此代碼,以下交互將起作用:
用戶:嘿,Mycroft,請取消鬧鐘 Mycroft:你確定要取消嗎? 用戶:是 Mycroft:警報取消
未來將會有更多的工具讓建立和管理對話變得更容易,但這是基礎。
在這里,當我們請求未知顏色時,從用戶體驗的角度來看,多輪方法將是理想的。
3D 打印
您可以在我的文章 BLElectric Light 101中了解 3D 打印以及如何將組件組合在一起。我想在此重申 Lulzbot mini 能夠在沒有支撐的情況下將燈泡打印為單個單元。試試吧,它可以工作,讓您的印后整理變得更加輕松!
該設計
結論
希望你喜歡這個項目。. .更多在路上!
- 節日花環自動化開源項目
- 家庭自動化系統開源構建
- 樹莓派家庭自動化開源
- 使用電報機器人進行自動化開源
- 溫室自動化開源硬件
- 照明自動化開源分享
- 濾光輪自動化開源項目
- 家庭自動化系統開源分享
- 哈利波特式的家庭自動化開源
- 植物澆水自動化開源分享
- ESP32家庭自動化開源分享
- 家庭自動化開源分享
- 舊電腦UPS的家電自動化開源分享
- PCB家庭自動化開源分享
- 機器人自動化開展應用資料包 0次下載
- 自動化焊接機器人:引領制造業未來的高效工具 333次閱讀
- 工業自動化中的控制方式 470次閱讀
- 工業自動化和自動化區別是什么 1030次閱讀
- 過程自動化控制和運動自動化控制的原理詳解 1350次閱讀
- Selenium在自動化中有何用處 1612次閱讀
- 基于PlatformIO IDE的家庭自動化系統設計方案實現 2297次閱讀
- 基于Raspberry Pi Pico開發先進的家庭自動化系統 2849次閱讀
- 如何自學PLC與自動化? 2567次閱讀
- 什么是非標自動化設備及分類介紹 4.2w次閱讀
- 非標自動化設備的分類 6280次閱讀
- ATE自動化測試系統是什么_ATE自動化測試系統介紹 3.2w次閱讀
- 自動化領域初涉水 非標自動化和自動化到底有哪些區別? 6089次閱讀
- jenkins自動化部署 4558次閱讀
- 紅帽推出Ansible 2.2 :為開源自動化框架奠定牢靠的基礎 984次閱讀
- 意法半導體:家庭自動化完全解決方案 1046次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多