電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>Alexa控制的門(mén)牌演示

Alexa控制的門(mén)牌演示

2023-01-31 | zip | 0.33 MB | 次下載 | 免費(fèi)

資料介紹

描述

為什么?

您正在經(jīng)營(yíng)一家小型“極客商店”,想給當(dāng)天的第一位/最后一位顧客留下深刻印象?您想離開(kāi)辦公桌休息片刻,并認(rèn)為告訴您的同事 - 和 Alexa - 應(yīng)該足夠努力(你為什么要留下一張紙條)?或者只是為了世界展示有多?還是只是為了好玩?;)

簡(jiǎn)介及免責(zé)聲明

這只是一個(gè)演示、一個(gè)原型、一個(gè)簡(jiǎn)短的草圖或快速食譜,介紹如何使用亞馬遜的 Alexa 技能套件控制連接到 Arduino MKR1000 的電子紙顯示器。

如果您需要更全面的信息

我們鼓勵(lì)您閱讀此平臺(tái)/產(chǎn)品的相關(guān)文檔。

先決條件

  • 硬件組件(見(jiàn) BOM)
  • Arduino MKR1000 的 Arduino 桌面 IDE 設(shè)置(參見(jiàn)此處
  • 可選:Amazon Echo 設(shè)備

關(guān)于費(fèi)用:

對(duì)于硬件(MKR1000 和電子紙模塊),您可能需要花費(fèi)大約 50 美元。

要開(kāi)發(fā) Alexa 技能,您需要一個(gè) Amazon Developer 帳戶,該帳戶可以免費(fèi)注冊(cè)。您還需要?jiǎng)?chuàng)建一個(gè) AWS Lambda 函數(shù)。計(jì)算服務(wù) AWS Lambda 包含在 AWS 免費(fèi)套餐中,每月有 1.000.000 個(gè)請(qǐng)求,期限不受限制。要?jiǎng)?chuàng)建和使用 AWS 免費(fèi)套餐資源,您必須注冊(cè)到 AWS 并提供有效的信用卡,如果您在免費(fèi)套餐計(jì)劃的限制范圍內(nèi),則不會(huì)被收取費(fèi)用。

Thinger.io提供免費(fèi)的評(píng)估、學(xué)習(xí)和測(cè)試計(jì)劃。對(duì)于此項(xiàng)目,您需要配置此計(jì)劃中包含的 2 個(gè)免費(fèi)設(shè)備之一,并且您可能不會(huì)超過(guò)免費(fèi)計(jì)劃中的呼叫速率限制。

物聯(lián)網(wǎng)

Thinger.io提供“一個(gè)隨時(shí)可用的可擴(kuò)展云基礎(chǔ)設(shè)施,用于連接數(shù)百萬(wàn)臺(tái)設(shè)備。您可以使用我們易于使用的管理控制臺(tái)來(lái)控制它們,或者使用我們的 REST API 將它們集成到您的業(yè)務(wù)邏輯中。開(kāi)源。”

平臺(tái)提供的設(shè)備端點(diǎn)的 REST API 使將設(shè)備集成到其他平臺(tái)(此處為 AWS 平臺(tái))上的應(yīng)用程序變得容易。

首先按照如下文檔從云控制臺(tái)創(chuàng)建一個(gè)設(shè)備

?
?
?
?
poYBAGPXLmiAVM1hAACVo6TAW_g556.jpg
?
1 / 8 ?在“設(shè)備”部分下單擊“添加設(shè)備”
?

按照這些說(shuō)明設(shè)置您的 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();
}

...您的設(shè)備狀態(tài)在云控制臺(tái)中應(yīng)如下所示:

?
poYBAGPXLm6AarxBAAD0hYPgLBo842.jpg
設(shè)備在線
?

微雪1.54寸電子紙模組

雪1.54英寸電子紙模組一款采用微封裝電泳顯示技術(shù)MED圖像顯示技術(shù)的電子紙?jiān)O(shè)備。

電子紙屏幕通過(guò)反射環(huán)境光來(lái)顯示圖案,不需要背景光。一旦設(shè)置/更新顯示模式,模塊在待機(jī)模式下的功耗極低(5 uA = 0.000005 A)

由于 Arduino MKR1000 提供比 Arduino UNO/Mega 多得多的 SRAM,并且基于 3.3 V 電壓,因此它是與 Waveshare 1.54 英寸電子紙模塊一起使用的相當(dāng)大的平臺(tái)。電子紙顯示器的極低功耗使得在電池供電時(shí)嘗試將其連接到像 MKR1000 這樣的電路板更加有趣。

要將顯示模塊連接到 MKR1000 并在其上運(yùn)行供應(yīng)商的示例程序,您基本上可以按照供應(yīng)商文檔中“使用 Arduino”的說(shuō)明進(jìn)行操作,并考慮 MKR1000 和 UNO 之間引腳布局的一些差異:

MKR1000 上SPI引腳是D8 (MOSI) D9 (SCK)和 D10 (MISO) - UNO 上的 SPI 引腳是 D11 (MOSI)、D12 (MISO) 和 D13 (SCK)。

按照Waveshare Wiki 頁(yè)面的說(shuō)明,必須將兩個(gè) SPI 信號(hào) SCK 和 MOSI 重新映射到 MKR1000 的 D9 和 D8。其余信號(hào)如 CS、DC、RST 和 BUSY 可以自由映射到 MKR1000 的其他數(shù)字信號(hào)。

這是將模塊與 MKR1000 接線的擴(kuò)展映射表:

?
pYYBAGPXLnGACfshAACU_Aj4EUo299.png
引腳和電線;將電子紙模塊連接到 MKR1000
?

生成的接線如下所示:

?
pYYBAGPXLnOAdnp5AAE1iUbHerI044.png
接線(架構(gòu))
?

真正的原型設(shè)置如下所示:

?
poYBAGPXLqGAQQ26ABFQ189cFZ4047.jpg
測(cè)試電子紙模塊設(shè)置
?

要運(yùn)行供應(yīng)商提供的示例和您自己的草圖,需要對(duì)提供的庫(kù)代碼進(jìn)行一些小的更改:

  • 將demo包的arduino/libraries目錄下的文件復(fù)制到documents/arduino/libraries,實(shí)際路徑由Arduino IDE --> File --> Preferences -->Sketchbook location決定。
  • 在文件libraries/ep1in54/epdif.h中進(jìn)行以下更改以反映 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 以測(cè)試模塊和您的設(shè)置。

門(mén)牌 - 應(yīng)用

門(mén)牌應(yīng)用程序是前面部分中兩個(gè)示例草圖的簡(jiǎn)單組合:用??于測(cè)試Thinger.io連接性的草圖和 Waveshare 提供的 ep1in54-demo 草圖。

對(duì)于這個(gè)演示,我們基本上:

  • 創(chuàng)建三個(gè)小的 (200 x 200 px) 單色位圖并將這些圖像轉(zhuǎn)換為 C 字節(jié)數(shù)組 - 請(qǐng)參閱 Waveshare wiki 中的“如何顯示圖像”部分。
?
?
?
?
pYYBAGPXLqSAS27WAAAbpasacXQ591.png
?
1 / 3 ?打開(kāi)
?
  • 在草圖中包含這些位圖數(shù)組:
/* "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定義輸入資源和處理程序以接收參數(shù)以選擇要顯示的圖像:
// 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);
}

完整的代碼可以在這里找到

編譯、上傳和運(yùn)行代碼后,設(shè)備應(yīng)thinger.io設(shè)備狀態(tài)板上顯示為在線,單擊查看 API按鈕后,您應(yīng)該會(huì)DOORSIGN API中看到先前定義的輸入資源為圖像 - 私有當(dāng)您展開(kāi)此項(xiàng)時(shí),您將看到輸入參數(shù),并且您將能夠向您的設(shè)備發(fā)送請(qǐng)求:

?
?
?
?
poYBAGPXLqeAcCcoAADQNE3w714690.png
?
1 / 6 ? DOORSIGN 儀表板
?

如果您選擇顯示查詢,則顯示的 REST 調(diào)用稍后將在 AWS Lambda 函數(shù)中使用。

可以在此處找到有關(guān)thinger.io服務(wù)器 API的更多信息。

Alexa 技能

從Amazon Developer Console開(kāi)始創(chuàng)建 Alexa Skill

  • 將技能類(lèi)型保留為自定義交互模型。
  • 如果您的設(shè)備使用英語(yǔ)(英國(guó)),請(qǐng)將語(yǔ)言更改為英語(yǔ)(英國(guó))。
  • 選擇一個(gè)名稱(chēng),例如“門(mén)牌”。
  • 將所有其他全局字段保留否。
  • 保存。
  • 請(qǐng)注意下一個(gè)屏幕上新創(chuàng)建的應(yīng)用程序 ID
  • 單擊下一步。
?
?
?
?
pYYBAGPXLqmAZoCDAADqu5_kme4516.jpg
?
1 / 5 ?開(kāi)發(fā)者控制臺(tái)
?

接下來(lái)定義

  • Intent Schema (見(jiàn)下文)
{
 "intents": [
    {
 "slots": [
        {
 "name": "Status",
 "type": "STATUS_TYPE"
        }
      ],
 "intent": "ShowStatus"
    },
    {
 "intent": "AMAZON.HelpIntent"
    },
    {
 "intent": "AMAZON.StopIntent"
    }
  ]
}
  • 自定義插槽類(lèi)型“STATUS_TYPE” ,值為“ open ”、“ away ”和“ closed
  • 示例話語(yǔ)(見(jiàn)下文)
ShowStatus display that we are {Status}
ShowStatus show that i am {Status}
ShowStatus we are {Status}
ShowStatus i am {Status}
?
?
?
?
pYYBAGPXLqyATUlMAAD4METnQak429.jpg
?
1 / 5 ?交互模型:意圖模式
?

AWS 拉姆達(dá)

作為技能的端點(diǎn),我們創(chuàng)建了一個(gè) AWS Lambda 函數(shù)。

  • 選擇所有服務(wù) > 計(jì)算 > Lambda
  • 選擇創(chuàng)建函數(shù)
  • 通過(guò)輸入“alexa”選擇藍(lán)圖和過(guò)濾器
  • 選擇任何藍(lán)圖,例如alexa-skill-kit-sdk-factskill (Node.js),然后單擊配置
  • 為您的功能選擇一個(gè)名稱(chēng),例如myDoorSign
  • 選擇現(xiàn)有角色或定義新角色(參見(jiàn)此處
  • 函數(shù)創(chuàng)建成功后:
  • 添加類(lèi)型為Alexa Skills Kit的觸發(fā)器,并通過(guò)輸入先前創(chuàng)建的 Alexa Skill的應(yīng)用程序 ID對(duì)其進(jìn)行配置。
  • 函數(shù)代碼部分,選擇文件 index.js 的內(nèi)聯(lián)編輯器中的所有代碼,并通過(guò)粘貼以下代碼替換它:
'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__ALEXA_APP_ID 為之前創(chuàng)建的 Alexa Skill 的 Application Id
  • REPLACE_ME__ALEXA_SKILL_NAME 為之前創(chuàng)建的 Alexa Skill 的名稱(chēng)

在您的 Alex Skill 的配置部分:

  • 選擇AWS Lambda ARN (Amazon 資源名稱(chēng))作為服務(wù)端點(diǎn)類(lèi)型
  • 并在Default字段中輸入此 Lambda 函數(shù)的 ARN 。
?
?
?
?
poYBAGPXLq6Ad8hxAAFbswbu2zk363.jpg
?
1 / 15 ? AWS 管理控制臺(tái)
?

把它們縫在一起

現(xiàn)在您應(yīng)該已經(jīng)將您的設(shè)備連接到thinger.io平臺(tái)(通過(guò)用戶名、設(shè)備 ID 和設(shè)備令牌),將您的設(shè)備鏈接到 AWS Lambda 函數(shù)(通過(guò)用戶名、設(shè)備 ID 和訪問(wèn)令牌)并將 AWS Lambda 函數(shù)鏈接到一個(gè)Alexa 技能(通過(guò)技能應(yīng)用程序 ID 和 Lambda 函數(shù)的 ARN)。

如果所有步驟都已正確執(zhí)行,您可以測(cè)試您的設(shè)置。

?
?
?
?
pYYBAGPXLrKAEJPxAAE6K74ctWY560.jpg
?
1 / 4 ?測(cè)試
?

?

?

改進(jìn)、更改和待辦事項(xiàng)

  • 一個(gè)很好的包裝
  • 更復(fù)雜、功耗更低的通信設(shè)置(例如,具有重新連接算法的 MQTT 有助于延長(zhǎng)睡眠時(shí)間)
  • 更大的顯示器
  • 如果您不能(或不想)獲得 Arduino MKR1000,任何具有 SPI 硬件支持的 Arduino 代碼兼容設(shè)備(例如 ESP8266 型板)也應(yīng)該這樣做,如果您稍微調(diào)整一下引腳映射.

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開(kāi)發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)