到了我奶奶 90 岁生日的时候,我正在为送什么礼物给她而苦恼。她对我的生活产生了很大的影响,我想做一些事情来证明这一点。我知道我想以某种方式整合 Twilio,因为她年轻时是Bell Telephone的接线员。然后它像一大堆电话一样击中了我。我将创建一个带有可编程 WirelessSIM和 Grove 按钮的硬件设备。当奶奶按下 Grove 按钮时,语音呼叫将被路由到她的电话,接线员将告诉她我有多爱她并祝她生日快乐。
对于此项目,您将需要以下组件:
我想使用Wio LTE从我的Twilio SIM生成呼叫。Grove Button连接到 Wio LTE 并用于物理交互。单击 Grove 按钮时,它将在 Twilio 中触发回调。要进行调用,我需要创建一些将响应回调的TwiML 。然后,当呼叫接通时,我需要另一块 TwiML,它将使用Amazon Polly播放文本转语音消息。由于我们将电路板上的 SIM 卡连接到真实设备,因此我们将使用一些变通方法来播放消息。通过在 ` 上包含 `url` 属性` Twilio 会在接通电话之前向接听电话的人播放 TwiML。这被称为耳语。
首先,购买Twilio 电话号码。此电话号码将用于使用语音数据将呼叫从可编程无线SIM 路由到我祖母的电话。
从包装中取出 Twilio SIM,注册并激活您的 SIM 。
我想使用TwiML创建文本转语音消息。TwiML,或 Twilio 标记语言,是一种基于 XML 的语言,它指示 Twilio 如何处理各种事件,例如来电和去电、SMS 消息和 MMS 消息。在构建 Twilio 应用程序时,您将在将所需操作传达给 Twilio 时使用 TwiML。TwiML Bin是一种无需自己创建和托管 Web 服务器即可与 TwiML 交互原型的方法。
为此,我使用了 TwiML 动词来创建一条消息,当我的祖母接听电话时,该消息将被口头表达。为了让它更逼真,我使用语音属性选择了Amazon Polly语音,听起来更逼真。
<Response>
<Say voice="Polly.Joey" language="en-US">Happy Birthday Gram! I love you.Say>
Response>
完成以下上述步骤后,您的 TwiML 应如下所示。保存 TwiML Bin 并确保复制 TwiML Bin 的 URL,它会立即使用。
文本转语音部分已准备就绪,接下来我需要使用 TwiML 从 SIM路由入站可编程语音呼叫。这些是设置它的步骤:
在 Programmable Voice & SMS 下,将Voice Url更改为TwiML
将 TwiML Bin URL 粘贴到数字名词的URL属性中
<Response>
<Dial callerId="YOUR_TWILIO_NUMBER">
<Number url="TWIML_BIN_URL">{{To}}Number>
Dial>
Response>
伟大的!SIM 现在配置为使用 Twilio 电话号码路由传出语音呼叫,并使用文本到语音转换为我的祖母朗读自定义消息。毫无疑问,那是一口蛋糕。接下来让我们把它做成一个物理设备。
打开Wio LTE开发板的包装箱,然后使用提供的 Micro-USB 数据线将开发板连接到计算机。根据操作系统的不同,可能需要USB 驱动程序才能连接到 Wio LTE。
将您注册的Twilio SIM 卡插入开发板背面的 Wio LTE SIM 插槽中。
Wio LTE 盒子内有一根 LTE 天线。从包装中取出 LTE 天线,将 LTE 天线连接到 Wio LTE 背面,上面写着LTE main 。
现在从包装中取出Grove Button ,然后将 Grove Button 连接到 Wio LTE 的 D38 插座。
接下来下载Arduino IDE 。这将用于编程和上传代码到 Wio LTE。安装 Arduino IDE 后,从 GitHub 下载Wio LTE Arduino 库并按照本指南安装库。该库是STM32F4 芯片的包装器,它利用Arduino 核心并添加了 Quectel EC21-A调制解调器功能。
接下来将 Wio LTE 置于引导加载程序模式。需要启用此模式才能将代码上传到电路板。要启用引导加载程序模式:
按住电路板下方的BOOT0按钮
按下电路板顶部的RST
释放 BOOT0 按钮以启用引导加载程序模式
创建一个新的 Arduino 草图(文件 -> 新建)。
首先添加 Wio LTE 库文件wio_tracker.h并在setup()函数上方为Grove Button定义一个全局变量。接下来使用变量wio创建WioTracker的实例并创建一个计数器变量。计数器将用于对Grove Button 进行去抖动,因此我们可以更好地控制 Grove Button 的交互。
#include "wio_tracker.h"
#define BUTTON_PIN (D38)
WioTracker wio = WioTracker();
int counter = 0;
setup()函数用于在启动时初始化程序的各个方面。pinMode()用于设置 Grove Button 连接到的物理引脚以及板期望的功能类型。然后该板会运行其初始化过程并将 Twilio SIM 连接到蜂窝网络。
void setup()
{
// Grove Button Setup
pinMode(BUTTON_PIN, INPUT);
// Wio LTE Power Up
SerialUSB.println("Wait for power on...");
wio.Power_On();
SerialUSB.println("Power On O.K!");
// Wio LTE Initialization
while (!wio.init()) {
delay(1000);
SerialUSB.println("Accessing network...");
}
SerialUSB.println("Initialize done...");
// Connect to the network
bool ret = wio.waitForNetworkRegister();
if (true == ret) {
SerialUSB.println("Network accessed!");
} else {
SerialUSB.println("Network failed!");
return;
}
SerialUSB.println("Ready!");
}
该程序的 Grove Button 逻辑是在loop()函数中创建的。该函数持续监听板的状态变化。在这种情况下,它正在等待Grove Button 状态改变。变量buttonState使用digitalRead()从板上的物理引脚读取传入的 Grove 按钮状态更改。
void loop()
{
// Define Grove Button state
int buttonState = digitalRead(BUTTON_PIN);
// Define the counter functionality
if (buttonState == 0) {
// Zero counter
counter = 0;
} else {
// Continue counter
counter++;
// Catch only 1 press, no duplicate calls
if (counter == 1) {
SerialUSB.println("Happy Birthday sent!");
wio.callUp("GRANDMA_PHONE_NUMBER");
}
}
// Restart
delay(100);
}
主要的if 语句管理传入的状态更改。计数器用作消除Grove Button抖动的一种方式,因此只进行一次调用。如果没有去抖动逻辑,程序将在按住 Grove 按钮时继续每 100 毫秒调用一次。
当 Grove 按钮未被按下时,状态“0”,计数器将重置为 0。
if (buttonState == 0) {
// Zero counter
counter = 0;
}
当按下 Grove 按钮时,状态“1”,计数器开始迭代。嵌套的 if 语句用于捕获计数器创建的特定数字。当抓到数字 1 时,使用wio.callUp( "GRANDMA_PHONE_NUMBER") 向我的祖母拨打电话。
else {
// Continue counter
counter++;
// Catch only 1 press, no duplicate calls
if (counter == 1) {
SerialUSB.println("Happy Birthday sent!");
wio.callUp("GRANDMA_PHONE_NUMBER");
}
}
这就是我们需要的所有代码,将其传输到 Wio LTE 板按上传。
上传完成后,断开 Wio LTE 与 Micro-USB 数据线的连接。将锂电池连接到板上。
#include "wio_tracker.h"
#define BUTTON_PIN (D38)
WioTracker wio = WioTracker();
int counter = 0;
void setup()
{
// Grove Button Setup
pinMode(BUTTON_PIN, INPUT);
// Wio LTE Setup
SerialUSB.println("Wait for power on...");
wio.Power_On();
SerialUSB.println("Power On O.K!");
// Wio LTE Initialization
while (!wio.init()) {
delay(1000);
SerialUSB.println("Accessing network...");
}
SerialUSB.println("Initialize done...");
// Connect to the network
bool ret = wio.waitForNetworkRegister();
if (true == ret) {
SerialUSB.println("Network accessed!");
} else {
SerialUSB.println("Network failed!");
return;
}
SerialUSB.println("Ready!");
}
void loop()
{
// Define Grove Button state
int buttonState = digitalRead(BUTTON_PIN);
// Define the counter functionality
if (buttonState == 0) {
// Zero counter
counter = 0;
} else {
// Continue counter
counter++;
// Catch only 1 press, no duplicate calls
if (counter == 1) {
SerialUSB.println("Happy Birthday sent!");
wio.callUp("GRANDMA_PHONE_NUMBER");
}
}
delay(100);
}
在派对上,我把电路板、电池和 LTE 天线放在一个小盒子里,让它更像样。
创建这个项目后,我意识到这对可能相距很远的个人很有用。并且可以使用音频文件代替文本转语音来发送个人消息,例如反向发送语音邮件。发送一封情书并提醒您关心的其他人很重要。您正在使用可编程无线构建什么类型的#TwilioIoT 项目?随时在Twitter上发表您的评论、问题和项目。不要忘记查看我的GitHub 上的完整项目。网上见,乘风破浪。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !