资料介绍
描述
为什么?
您正在经营一家小型“极客商店”,想给当天的第一位/最后一位顾客留下深刻印象?您想离开办公桌休息片刻,并认为告诉您的同事 - 和 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次下载 | 免费
评论
查看更多