資料介紹
描述
為什么?
您正在經營一家小型“極客商店”,想給當天的第一位/最后一位顧客留下深刻印象?您想離開辦公桌休息片刻,并認為告訴您的同事 - 和 Alexa - 應該足夠努力(你為什么要留下一張紙條)?或者只是為了向世界展示你有多酷?還是只是為了好玩?;)
簡介及免責聲明
這只是一個演示、一個原型、一個簡短的草圖或快速食譜,介紹如何使用亞馬遜的 Alexa 技能套件控制連接到 Arduino MKR1000 的電子紙顯示器。
如果您需要更全面的信息
- Thinger.io平臺或
- 微雪1.54寸電子紙模組的使用方法
我們鼓勵您閱讀此平臺/產品的相關文檔。
先決條件
- 硬件組件(見 BOM)
- Arduino MKR1000 的 Arduino 桌面 IDE 設置(參見此處)
- AWS 賬戶(AWS 免費套餐)
- Thinger.io帳戶
- 可選:Amazon Echo 設備
關于費用:
對于硬件(MKR1000 和電子紙模塊),您可能需要花費大約 50 美元。
要開發 Alexa 技能,您需要一個 Amazon Developer 帳戶,該帳戶可以免費注冊。您還需要創建一個 AWS Lambda 函數。計算服務 AWS Lambda 包含在 AWS 免費套餐中,每月有 1.000.000 個請求,期限不受限制。要創建和使用 AWS 免費套餐資源,您必須注冊到 AWS 并提供有效的信用卡,如果您在免費套餐計劃的限制范圍內,則不會被收取費用。
Thinger.io提供免費的評估、學習和測試計劃。對于此項目,您需要配置此計劃中包含的 2 個免費設備之一,并且您可能不會超過免費計劃中的呼叫速率限制。
物聯網
Thinger.io提供“一個隨時可用的可擴展云基礎設施,用于連接數百萬臺設備。您可以使用我們易于使用的管理控制臺來控制它們,或者使用我們的 REST API 將它們集成到您的業務邏輯中。開源。”
平臺提供的設備端點的 REST API 使將設備集成到其他平臺(此處為 AWS 平臺)上的應用程序變得容易。
首先按照如下文檔從云控制臺創建一個設備:
按照這些說明設置您的 Arduino IDE 和Arduino MKR1000 的本部分。上傳自定義示例草圖后...
#define _DEBUG_
#define _DISABLE_TLS_
#include
#include
#define USERNAME "3magku"
#define DEVICE_ID "DoorSign"
#define DEVICE_CREDENTIAL "Iq7OxG4htORD"
#define SSID "yourWifiSsid"
#define SSID_PASSWORD "yourWifiPassword"
#define LED_PIN 6
ThingerWifi101 thing(USERNAME, DEVICE_ID, DEVICE_CREDENTIAL);
void setup() {
Serial.begin(115200);
// configure wifi network
thing.add_wifi(SSID, SSID_PASSWORD);
pinMode(LED_PIN, OUTPUT);
// pin control example (i.e. turning on/off a light, a relay, etc)
thing["led"] << digitalPin(LED_PIN);
// resource output example (i.e. reading a sensor value, a variable, etc)
thing["millis"] >> outputValue(millis());
// more details at http://docs.thinger.io/arduino/
}
void loop() {
thing.handle();
}
...您的設備狀態在云控制臺中應如下所示:
微雪1.54寸電子紙模組
微 雪1.54英寸電子紙模組是一款采用微封裝電泳顯示技術MED圖像顯示技術的電子紙設備。
電子紙屏幕通過反射環境光來顯示圖案,不需要背景光。一旦設置/更新顯示模式,模塊在待機模式下的功耗極低(5 uA = 0.000005 A)
由于 Arduino MKR1000 提供比 Arduino UNO/Mega 多得多的 SRAM,并且基于 3.3 V 電壓,因此它是與 Waveshare 1.54 英寸電子紙模塊一起使用的相當大的平臺。電子紙顯示器的極低功耗使得在電池供電時嘗試將其連接到像 MKR1000 這樣的電路板更加有趣。
要將顯示模塊連接到 MKR1000 并在其上運行供應商的示例程序,您基本上可以按照供應商文檔中“使用 Arduino”的說明進行操作,并考慮 MKR1000 和 UNO 之間引腳布局的一些差異:
MKR1000 上的SPI引腳是D8 (MOSI) 、D9 (SCK)和 D10 (MISO) - UNO 上的 SPI 引腳是 D11 (MOSI)、D12 (MISO) 和 D13 (SCK)。
按照Waveshare Wiki 頁面的說明,必須將兩個 SPI 信號 SCK 和 MOSI 重新映射到 MKR1000 的 D9 和 D8。其余信號如 CS、DC、RST 和 BUSY 可以自由映射到 MKR1000 的其他數字信號。
這是將模塊與 MKR1000 接線的擴展映射表:
生成的接線如下所示:
真正的原型設置如下所示:
要運行供應商提供的示例和您自己的草圖,需要對提供的庫代碼進行一些小的更改:
- 將demo包的arduino/libraries目錄下的文件復制到documents/arduino/libraries,實際路徑由Arduino IDE --> File --> Preferences -->Sketchbook location決定。
- 在文件libraries/ep1in54/epdif.h中進行以下更改以反映 MKR1000 修改后的引腳映射:
#ifndef EPDIF_H
#define EPDIF_H
#include
/* COMMENT OR REMOVE THIS SECTION:
// Pin definition
#define RST_PIN 8
#define DC_PIN 9
#define CS_PIN 10
#define BUSY_PIN 7
*/
/* ADD THE FOLLOWING SECTION: */
// Custom pin definition (MKR1000)
#define RST_PIN 4
#define DC_PIN 5
#define CS_PIN 7
#define BUSY_PIN 3
class EpdIf {
- 編譯并上傳演示草圖 epd1in54-demo 以測試模塊和您的設置。
門牌 - 應用
門牌應用程序是前面部分中兩個示例草圖的簡單組合:用??于測試Thinger.io連接性的草圖和 Waveshare 提供的 ep1in54-demo 草圖。
對于這個演示,我們基本上:
- 創建三個小的 (200 x 200 px) 單色位圖并將這些圖像轉換為 C 字節數組 - 請參閱 Waveshare wiki 中的“如何顯示圖像”部分。
- 在草圖中包含這些位圖數組:
/* "imagedata_open.h" */
extern const unsigned char IMAGE_DATA_OPEN[];
/* "imagedata_open.coo" */
#include "imagedata_open.h"
#include
const unsigned char IMAGE_DATA_OPEN[] PROGMEM = {
/* 0X00,0X01,0XC8,0X00,0XC8,0X00, */
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, ...
// Image data for "We are open", "Sorry, we are closed" and "Be right back" ...
#include "imagedata_open.h"
#include "imagedata_closed.h"
#include "imagedata_brb.h"
- 為thinger.io定義輸入資源和處理程序以接收參數以選擇要顯示的圖像:
// Handle for "image" resource:
thing["image"] << [](pson &in) {
boolean clean = in["clean"];
int number = in["number"];
displayImage(clean, number);
};
// Handler called function for displaying images:
void displayImage(boolean clean, int number)
{
if (clean) { ePaperClear(); }
const unsigned char *image_data;
switch (number)
{
case 0:
image_data = IMAGE_DATA_OPEN;
break;
case 1:
image_data = IMAGE_DATA_AWAY;
break;
case 2:
image_data = IMAGE_DATA_CLOSED;
break;
}
ePaperShowImage(image_data);
}
// Clear e-ink display:
void ePaperClear()
{
epd.ClearFrameMemory(0xFF); // bit set = white, bit reset = black
epd.DisplayFrame();
epd.ClearFrameMemory(0xFF); // bit set = white, bit reset = black
epd.DisplayFrame();
epd.Init(lut_partial_update);
}
// Display image on e-ink display:
void ePaperShowImage(const unsigned char image_data[])
{
epd.SetFrameMemory(image_data);
epd.DisplayFrame();
epd.SetFrameMemory(image_data);
epd.DisplayFrame();
epd.Init(lut_partial_update);
}
完整的代碼可以在這里找到。
編譯、上傳和運行代碼后,設備應在thinger.io設備狀態板上顯示為在線,單擊查看 API按鈕后,您應該會在DOORSIGN API中看到先前定義的輸入資源為圖像 - 私有。當您展開此項時,您將看到輸入參數,并且您將能夠向您的設備發送請求:
如果您選擇顯示查詢,則顯示的 REST 調用稍后將在 AWS Lambda 函數中使用。
可以在此處找到有關thinger.io服務器 API的更多信息。
Alexa 技能
從Amazon Developer Console開始創建 Alexa Skill :
- 將技能類型保留為自定義交互模型。
- 如果您的設備使用英語(英國),請將語言更改為英語(英國)。
- 選擇一個名稱,例如“門牌”。
- 將所有其他全局字段保留為否。
- 保存。
- 請注意下一個屏幕上新創建的應用程序 ID 。
- 單擊下一步。
接下來定義
- Intent Schema (見下文)
{
"intents": [
{
"slots": [
{
"name": "Status",
"type": "STATUS_TYPE"
}
],
"intent": "ShowStatus"
},
{
"intent": "AMAZON.HelpIntent"
},
{
"intent": "AMAZON.StopIntent"
}
]
}
- 自定義插槽類型“STATUS_TYPE” ,值為“ open ”、“ away ”和“ closed ”
- 和示例話語(見下文)
ShowStatus display that we are {Status}
ShowStatus show that i am {Status}
ShowStatus we are {Status}
ShowStatus i am {Status}
AWS 拉姆達
作為技能的端點,我們創建了一個 AWS Lambda 函數。
- 登錄AWS 管理控制臺,
- 選擇所有服務 > 計算 > Lambda
- 選擇創建函數
- 通過輸入“alexa”選擇藍圖和過濾器
- 為您的功能選擇一個名稱,例如myDoorSign
- 選擇現有角色或定義新角色(參見此處)
- 函數創建成功后:
- 添加類型為Alexa Skills Kit的觸發器,并通過輸入先前創建的 Alexa Skill的應用程序 ID對其進行配置。
- 在函數代碼部分,選擇文件 index.js 的內聯編輯器中的所有代碼,并通過粘貼以下代碼替換它:
'use strict';
/*
* App ID for the skill
*/
var APP_ID = "REPLACE_ME__ALEXA_APP_ID";
var SKILL_NAME = "REPLACE_ME__ALEXA_SKILL_NAME";
/*
* Alexa SDK
*/
var Alexa = require('alexa-sdk');
/*
* HTTP/HTTPS
*/
var https = require('https');
/*
* Thinger.io device
*/
const ti_user = "REPLACE_ME__THINGER_IO_USER";
const ti_device = "REPLACE_ME__THINGER_IO_DEVICE_ID";
const ti_token = "REPLACE_ME__THINGER_IO_ACCESS_TOKEN";
const ti_api_host = "api.thinger.io"
const ti_api_port = 443;
const ti_api_base_path = "/v2/users/" + ti_user + "/devices/" + ti_device + "/";
/*
* Register handlers
*/
exports.handler = function (event, context, callback) {
var alexa = Alexa.handler(event, context);
alexa.appId = APP_ID;
alexa.registerHandlers(handlers);
alexa.execute();
};
var handlers = {
/*
* The "ShowStatus" intent:
*/
"ShowStatus": function () {
var myHandler = this;
var speechOutput;
var cardTitle;
var statusSlot = this.event.request.intent.slots.Status;
var status = "open";
var imageNumber = 0;
// Get slot(s):
if (statusSlot && statusSlot.value) {
status = statusSlot.value.toLowerCase();
}
// Determine image number from status:
switch (status) {
case "open":
imageNumber = 0;
break;
case "closed":
imageNumber = 2;
break;
case "away":
imageNumber = 1;
break;
default:
imageNumber = 0;
break;
}
// Build path:
var ti_api_path = ti_api_base_path + "image";
// Build request body:
var ti_input = { in: {
clean: true,
number: imageNumber
}
};
// Build POST request:
var request_body = JSON.stringify(ti_input);
var request_headers = {
"Authorization": "Bearer " + ti_token,
"Content-Type": "application/json",
"Content-Length": Buffer.byteLength(request_body)
}
var request_options = {
host: ti_api_host,
port: ti_api_port,
path: ti_api_path,
method: "POST",
headers: request_headers
}
console.log("REQUEST - HEAD:" + JSON.stringify(request_options));
console.log("REQUEST - BODY:" + JSON.stringify(request_body));
// Handle POST request:
var request = https.request(request_options, function (r) {
console.log("RESPONSE - STATUS:" + r.statusCode);
r.on('data', function (d) {
console.log("RESPONSE:" + d);
var d_json = JSON.parse(d);
});
r.on('end', function () {
console.log("END: returning speech output ...");
speechOutput = "The door sign has been updated successfully! The new status shown is '"+ status+"'.";
cardTitle = "Success";
myHandler.emit(':tellWithCard', speechOutput, cardTitle, speechOutput);
});
r.on('error', function (e) {
console.log("ERROR:");
console.error(e);
speechOutput = "Sorry, there was problem - I could not update the door sign!";
cardTitle = "Error";
myHandler.emit(':tellWithCard', speechOutput, cardTitle, speechOutput);
});
});
// Send POST request:
request.write(request_body);
request.end();
},
/*
* Built-in intents:
*/
"AMAZON.HelpIntent": function () {
this.emit(':ask', "You can say tell door sign 'we are open', or, you can say exit... What can I help you with?", "What can I help you with?");
},
"AMAZON.StopIntent": function () {
var speechOutput = "OK";
this.emit(':tell', speechOutput);
},
'Unhandled': function () {
this.emit(':ask', "What can I do for you?", "What can I do for you?");
}
};
并替換字符串:
- 將_ME__THINGER_IO_USER 替換為您的thinger.io用戶名
- REPLACE_ME__THINGER_IO_DEVICE_ID 為之前在thinger.io注冊的設備的 ID
- 將_ME__THINGER_IO_ACCESS_TOKEN 替換為之前在thinger.io上為您的設備創建的附加訪問令牌
- REPLACE_ME__ALEXA_APP_ID 為之前創建的 Alexa Skill 的 Application Id
- REPLACE_ME__ALEXA_SKILL_NAME 為之前創建的 Alexa Skill 的名稱
在您的 Alex Skill 的配置部分:
- 選擇AWS Lambda ARN (Amazon 資源名稱)作為服務端點類型
- 并在Default字段中輸入此 Lambda 函數的 ARN 。
把它們縫在一起
現在您應該已經將您的設備連接到thinger.io平臺(通過用戶名、設備 ID 和設備令牌),將您的設備鏈接到 AWS Lambda 函數(通過用戶名、設備 ID 和訪問令牌)并將 AWS Lambda 函數鏈接到一個Alexa 技能(通過技能應用程序 ID 和 Lambda 函數的 ARN)。
如果所有步驟都已正確執行,您可以測試您的設置。
?
改進、更改和待辦事項
- 一個很好的包裝
- 更復雜、功耗更低的通信設置(例如,具有重新連接算法的 MQTT 有助于延長睡眠時間)
- 更大的顯示器
- 如果您不能(或不想)獲得 Arduino MKR1000,任何具有 SPI 硬件支持的 Arduino 代碼兼容設備(例如 ESP8266 型板)也應該這樣做,如果您稍微調整一下引腳映射.
- 由Alexa控制的臺燈構建
- 由Alexa Echo控制的Arduino機器人
- Alexa控制的樂高生物實驗
- 如何使用Alexa和ESP32控制
- Alexa通過樹莓派控制LED
- 從Alexa控制Raspberry Pi(Linux設備)
- 構建自己的alexa控制的圣誕樹 1次下載
- 使用Alexa和Arduino IoT Cloud完全控制您的電視
- 使用Alexa/Google Home/Siri控制您的非智能空調
- 網絡控制演示視頻匯總下載 1次下載
- 課堂演示源代碼匯總下載 0次下載
- 基于CODESYS的CNC控制應用及程序演示 13次下載
- 如何使用Alexa語音控制電視遙控器 11次下載
- Wi-FiG演示板創建Wi-Fi網絡和從客戶端設備Web瀏覽器控制演示板功能
- 基本控制演示儀
- RL78/G16觸摸套件開發板演示(下) 500次閱讀
- RL78/G16觸摸套件開發板演示(上) 655次閱讀
- 20個MATLAB三維圖像繪制的示例演示 2380次閱讀
- 制作門牌號的算法 981次閱讀
- 系統演示平臺有助于快速原型設計和評估 823次閱讀
- 動圖演示整流電路原理:單相橋式、全波/半波、半波精密 4362次閱讀
- 用SCL編程實現一種門牌的制作 586次閱讀
- 動圖演示電容和傳感器原理 1382次閱讀
- STEVAL-ISV013V1太陽能演示板的主要特點及應用 2108次閱讀
- 微雪電子ROC-RK3308主板CC-Amazon Alexa簡介 1282次閱讀
- fireflyROC-RK3308B主板CC固件簡介 1823次閱讀
- 用降壓型穩壓器或線性穩壓器電源時值來會為負載供電 984次閱讀
- 更小更智能的電機控制器推進HEV/EV市場 1105次閱讀
- 雷賽控制卡與步進驅動器如何連接 2.3w次閱讀
- tcpdump的安裝以及通過實例來演示如何使用 tcpdump 命令 6143次閱讀
下載排行
本周
- 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次下載 | 免費
評論
查看更多