基于物联网的语音控制智能火箭点火器
随着冬季的临近;每年庆祝灯节的时候到了 。是的,我们谈论的是排灯节,这是一个真正的印度节日,在全球范围内庆祝。 今年排灯节已经结束,看到人们放鞭炮,我想出了一个 基于 Alexa 的语音控制火箭发射器或点火器的想法,它可以通过语音命令发射火箭,对孩子们来说非常安全和有趣。
需要说明的是,我不是来鼓励人们在排灯节放鞭炮的,印度政府已经对鞭炮实施了限制以遏制污染,我们有责任遵守它。这里的想法是,与其花一整天的时间发射饼干,不如让我们构建一个很酷的语音控制的 Arduino 火箭点火器并以风格发射一些火箭。我认为这是双赢的。
这个Arduino 火箭发射器将与其他火箭发射器大不相同。它有一个由胶合板制成的非常坚固的底盘,一个可靠的基于继电器的控制机构,以及一个非常独特的发射和重新装载火箭的机构,所以事不宜迟,让我们直接进入构建过程。
基于 Alexa 的语音控制火箭发射器 - 工作
电路的工作原理很简单,负责发射火箭的主要部件是镍铬合金线,它以加热线圈的形式出现。这种镍铬合金线将充当火箭点火器。如何?我稍后会告诉你。
正如您在上图中看到的,镍铬合金线以加热线圈的形式出现,对我来说,这是最简单的方法。我们必须将其拉直并弯曲以形成如下图所示的形状。
完成此操作后,我们将使用 12V 铅酸电池为其供电,它会发出红光。这足以点燃火箭内部的黑色火药,它的作用就像正常的引信剂量一样。请注意,这是一个大功率火箭发射控制器,使电线红热所需的电流很高。在大电流下工作时请遵循安全建议。
测试完成后,唯一剩下的就是控制过程,我们将在本文中继续进行时执行此操作。
我们的 NodeMCU Rocket Launch 控制器的 Launchpad
对于这个构建,让我们制作一个启动板。完成启动板后,我们可以轻松地重新加载一些破解程序并非常轻松地启动它们。我已经构建了一个启动板,如下图所示。
让我们逐步了解构建启动板的过程。对于框架的两侧,我使用了两块(25X3X1.5)英寸长的胶合板。对于顶部,我使用了 (20X3X1.5) 英寸长的胶合板部分,对于底座,我使用了 (20X6X1.5) 英寸长的胶合板,这将使其更加稳定。下面的图片会给你一个清晰的想法。
现在,是时候制造镍铬合金丝了,它可以作为我们火箭的保险丝。为此,我买了一个 1000W 的镍铬合金线底座加热线圈,将其拉直,制成如下图所示的结构。我必须使用两个钳子和侧刀来塑造镍铬合金线,如下所示。
完成此操作后,我将 20 英寸的胶合板块分成七块测量它,并钻孔以放入镍铬合金线基细丝,一旦完成,它看起来像下面的图像。
但在放置灯丝之前,我在每个端子上连接了 1 平方毫米厚的铜线并将它们穿过孔,一旦一切完成,它看起来像下图。
如您所见,我还加入了双组分粘合剂以将电线和细丝固定到位。完成后,我们的启动板就完成了。正如您从本节的第一张图片中看到的那样,我将灯丝线直接连接到 PCB,因为我们正在处理非常高的电流,所以我没有费心放置螺丝端子,这标志着我们机箱的末端建设过程。
Alexa 控制的火箭发射器所需的组件
对于硬件方面,我们使用了非常通用的部件,您可以从当地的爱好商店轻松获得,下面给出了完整的物品清单。
12V-继电器 - 3
BD139 晶体管 - 3
1N4004 二极管 - 3
5.08 毫米螺丝端子 - 1
LM7805 - 稳压器 - 1
100uF去耦电容 - 2
5.1V 稳压二极管 - 1
NodeMCU (ESP8266-12E) 开发板 - 1
虚线性能板 - ?
连接线 - 10
Arduino火箭发射器电路图
下面给出了Alexa 控制的火箭发射器的完整示意图。我使用标签将一个引脚连接到另一个引脚。如果你看得足够近,解释原理图应该不难。
电路结构非常简单,所以我不会详细介绍。
首先,我们有 IC1,它是一个 LM7805 稳压器,其 100uF 去耦电容由 C1 和 C2 表示。之后,我们有了项目的核心,即 NodeMCU 板,其中包含 ESP-12E 模块。由于我们使用的是 12V 铅酸电池为整个电路供电,这就是为什么我们必须先使用 LM7805 将其转换为 12V 到 5V 来为 NodeMCU 板供电。我们这样做是因为板载 AMS1117 稳压器不足以将 12V 直接转换为 3.3V,这就是需要 7805 的原因。
继续前进,我们有三个 12V 继电器,在这个演示中,我们使用了三个继电器,但正如我们之前提到的,发射台有一个用于 7 枚火箭的占位符。您可以稍微调整一下代码,然后将所有七枚火箭一起发射。三个继电器由三个NPN晶体管T1、T2、T3驱动,足以驱动一个real的负载。最后,我们有三个续流二极管,用于保护电路免受继电器产生的高压尖峰的影响。
在 PerfBoard 上构建电路
从主图中可以看出,我们的想法是制作一个可以在短时间内处理大量电流的简单电路,根据我们的测试,800 毫秒足以点亮一张纸。因此,我们在一块穿孔板上构建电路,并用 1 平方毫米厚的铜线连接所有主要连接。在我们完成焊接板之后。一旦我们完成,它看起来像下面显示的东西。
为 Alexa 控制的火箭发射器编程 NodeMCU
现在硬件已经准备就绪,是时候开始为我们基于 Alexa 的语音控制火箭发射器编写代码了。完整的代码可以在本页末尾找到,但在我们开始之前,将所需的库添加到您的 Arduino IDE 非常重要。确保从下面给出的链接中添加正确的库,否则代码在编译时会抛出错误。
下载 Espalexa 库
添加所需库后,您可以直接上传本页底部给出的代码,以检查电路是否正常工作。如果您想知道代码是如何工作的,请继续阅读。
像往常一样,我们通过添加所需的头文件并为我们的热点定义引脚名称和凭据来开始程序。
#include#include //定义与Relays连接的GPIO #define ROCKET_1_PIN 4 #define ROCKET_2_PIN 13 #define ROCKET_3_PIN 15 // WiFi 凭证 const char* ssid = "deba_2.4"; const char* 密码 = "il2ww*ee";
继续我们的代码,我们有我们的函数原型和回调函数定义。
函数connectToWiFi()用于连接 Wi-Fi 网络,当 Wi-Fi 连接成功时该函数返回 true。
接下来,我们有我们的回调函数,当我们向 Alexa 发出命令时会调用这个函数,espalexa API 会处理这些函数
void allrockets(uint8_t 亮度); void firstrocket(uint8_t 亮度); void secondrocket(uint8_t 亮度); 无效第三火箭(uint8_t亮度);
接下来,我们定义设备名称。这些定义的设备名称将反映在 Alexa 应用程序上,当我们说出命令时,Alexa 将通过这些名称识别设备。所以这些名字非常重要。
// 设备名称 String First_Device_Name = "所有火箭"; String Second_Device_Name = "火箭一号"; String Third_Device_Name = "火箭二号"; String Forth_Device_Name = "三号火箭";
接下来,我们定义一个布尔变量wifiStatus,它将保存 Wi-Fi 的连接状态。最后,我们创建一个 Espalexa 对象 espalexa。我们将使用这个对象来配置 NodeMCU。
// wifi状态检查 布尔 wifiStatus = 假; // Espalexa 对象 埃斯帕莱克斯帕莱克斯;
接下来,我们有我们的void setup()部分。在本节中,我们使用Serial.begin()函数初始化串行通信以进行调试。我们使用pinMode()函数将之前定义的所有引脚设置为输出,接下来我们调用connectToWiFi()函数,它会尝试连接到 Wi-Fi 15 次,如果连接成功,则返回 true连接起来,它将返回 false 并且代码将永远执行while()循环。如果 Wi-Fi 连接成功,我们使用espalexa.addDevice()函数将之前定义的设备添加到 Alexa 对象中。这个函数有两个参数,第一个是设备名称,第二个是回调函数的名称,当我们向 Alexa 发出命令时,会调用相邻的函数。一旦我们完成了所有四个设备的操作,我们调用 espalexa 对象的begin()方法。
无效设置(){ 序列号.开始(115200);// 启用串行调试消息 pinMode(ROCKET_1_PIN,输出);//设置ESP引脚作为输出 pinMode(ROCKET_2_PIN,输出);//设置ESP引脚作为输出 pinMode(ROCKET_3_PIN,输出);//设置ESP引脚作为输出 wifiStatus = connectToWiFi(); // 连接到本地 Wi-Fi 网络 if (wifiStatus) {// 设置所有 espalexa 设备 // 在此处定义您的设备。 espalexa.addDevice(First_Device_Name, allrockets); //最简单的定义,默认状态关闭 espalexa.addDevice(Secound_Device_Name, firstrocket); espalexa.addDevice(Third_Device_Name, secondrocket); espalexa.addDevice(Forth_Device_Name, thirdrocket); espalexa.begin(); } 别的 { 而(1){ 串行。println("无法连接WiFi。请检查数据并重置ESP。"); 延迟(2500); } } }
在循环部分,我们调用 espalexa 对象的loop()方法,该方法将始终检查任何传入的命令,如果发现为真,则调用回调函数。
无效循环(){ espalexa.loop(); 延迟(1); }
接下来,我们定义所有回调函数,在本节中,我们将定义调用此回调函数时会发生什么。当调用 allrockets()函数时,所有火箭将一起发射。为此,我们将打开继电器 00 毫秒,然后关闭继电器。在我的测试中,我发现对于指定长度的镍铬合金线,我需要 800 毫秒的延迟才能完全加热线,这对你来说可能是这样,也可能不是。所以相应地选择延迟。
void allrockets(uint8_t 亮度) { 如果(亮度 == 255) { 数字写入(ROCKET_1_PIN,高); 数字写入(ROCKET_2_PIN,高); 数字写入(ROCKET_3_PIN,高); 延迟(800); 数字写入(ROCKET_1_PIN,低); 数字写入(ROCKET_2_PIN,低); 数字写入(ROCKET_3_PIN,低); Serial.println("所有火箭发射"); } }
接下来,我们有我们的第一个 rocket(),当我们调用 Alexa 并说 tie 命令发射第一颗火箭时,它会被调用。过程很相似,我们开启继电器800ms再关闭。
void firstrocket(uint8_t 亮度){ 如果(亮度 == 255) { 数字写入(ROCKET_1_PIN,高); 延迟(800); 数字写入(ROCKET_1_PIN,低); Serial.println("第一枚火箭发射"); } }
最后,我们有了connectToWiFi()函数。这个函数非常通用且不言自明,所以我不会详细介绍这个函数。该函数将 ESP 连接到 Wi-Fi 并返回连接状态。
布尔连接到WiFi() { 布尔状态 = 真; 诠释 i = 0; WiFi.mode(WIFI_STA); WiFi.begin(ssid, 密码); 序列号.println(""); Serial.println("连接到 WiFi"); // 等待连接 Serial.print("正在连接..."); 而(WiFi.status()!= WL_CONNECTED){ 延迟(500); Serial.print("."); 如果 (i > 15) { 状态=假;休息; } 我++; } 序列号.println(""); 如果(状态){ Serial.print("连接到"); 序列号.println(ssid); Serial.print("IP地址:"); Serial.println(WiFi.localIP()); } 别的 { Serial.println("连接失败。"); } 返回状态; }
定义的这个函数标志着编码部分的结束。
使用 Alexa Android 应用程序配置 Alexa
当且仅当 Alexa 识别 esp8866 设备时,它才会接受命令。为此,我们需要借助 Android 上的 Alexa 应用程序来配置 Alexa。在我们继续之前要做的一件重要的事情是,我们需要确保 Alexa 配置了我们的 android 应用程序。
为此,请转到 Alexa 应用程序的更多部分,然后单击“添加设备”选项,单击“灯光”, 然后在页面底部向下滚动并单击“其他” 。
接下来,单击DISCOVER DEVICE并 等待片刻,然后 Alexa 将找到新设备。一旦 Alexa 找到设备,您需要单击它们并将它们添加到各自的位置/类别中,然后您就完成了。
Alexa 控制的火箭发射器 - 测试
在测试过程中,我去了我的花园,把火箭上的所有保险丝都拔了出来,放在各自的地方,然后我喊着 Alexa……!打开所有的火箭,我的手指交叉。所有的火箭都将我的努力标记为巨大的成功。它看起来像这样。
最后,我再次说 Alexa……!打开所有火箭,以获得您可以在下面看到的细丝的史诗般的图片。
/************************************************* ************************************
TITLE: Alexa control 3 通道 Rocket Launcher 可以很容易地升级到 7 通道
作者:Debashis Das(技术研究单元)
下载 Espalexa 库:
https://github.com/Aircoookie/Espalexa
****************************************************** ************************************/
#include
#include
//定义与Relays连接的GPIO
#define ROCKET_1_PIN 4
#define ROCKET_2_PIN 13
#define ROCKET_3_PIN 15
// WiFi 凭证
const char* ssid = "deba_2.4";
const char* 密码 = "il2ww*ee";
// 原型
布尔连接到WiFi();
//回调函数
void allrockets(uint8_t 亮度);
void firstrocket(uint8_t 亮度);
void secondrocket(uint8_t 亮度);
无效第三火箭(uint8_t亮度);
// 设备名称
String First_Device_Name = "所有火箭";
String Second_Device_Name = "火箭一号";
String Third_Device_Name = "火箭二号";
String Forth_Device_Name = "三号火箭";
// wifi状态检查
布尔 wifiStatus = 假;
// Espalexa 对象
埃斯帕莱克斯帕莱克斯;
无效设置()
{
// 启用串行调试消息
序列号.开始(115200);
//设置ESP引脚作为输出
pinMode(ROCKET_1_PIN,输出);
pinMode(ROCKET_2_PIN,输出);
pinMode(ROCKET_3_PIN,输出);
// 连接到本地 Wi-Fi 网络
wifiStatus = connectToWiFi();
// 如果 Wi-Fi 连接设置所有 espalexa 设备
如果(wifi状态)
{
// 在此处定义您的设备。
espalexa.addDevice(First_Device_Name, allrockets); //最简单的定义,默认状态关闭
espalexa.addDevice(Secound_Device_Name, firstrocket);
espalexa.addDevice(Third_Device_Name, secondrocket);
espalexa.addDevice(Forth_Device_Name, thirdrocket);
espalexa.begin();
}
别的
{
而 (1)
{
Serial.println("无法连接WiFi。请检查数据并重置ESP。");
延迟(2500);
}
}
}
无效循环()
{
espalexa.loop();
延迟(1);
}
//回调函数
void allrockets(uint8_t 亮度)
{
如果(亮度 == 255)
{
数字写入(ROCKET_1_PIN,高);
数字写入(ROCKET_2_PIN,高);
数字写入(ROCKET_3_PIN,高);
延迟(800);
数字写入(ROCKET_1_PIN,低);
数字写入(ROCKET_2_PIN,低);
数字写入(ROCKET_3_PIN,低);
Serial.println("所有火箭发射");
}
}
void firstrocket(uint8_t 亮度)
{
如果(亮度 == 255)
{
数字写入(ROCKET_1_PIN,高);
延迟(800);
数字写入(ROCKET_1_PIN,低);
Serial.println("第一枚火箭发射");
}
}
void secondrocket(uint8_t 亮度)
{
如果(亮度 == 255)
{
数字写入(ROCKET_2_PIN,高);
延迟(800);
数字写入(ROCKET_2_PIN,低);
Serial.println("第二枚火箭发射");
}
}
无效第三火箭(uint8_t 亮度)
{
如果(亮度 == 255)
{
数字写入(ROCKET_3_PIN,高);
延迟(800);
数字写入(ROCKET_3_PIN,低);
Serial.println("第三枚火箭发射");
}
}
// 连接本地 Wi-Fi - 如果成功则返回 true,否则返回 false
布尔连接到WiFi()
{
布尔状态 = 真;
诠释 i = 0;
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, 密码);
序列号.println("");
Serial.println("连接到 WiFi");
// 等待连接
Serial.print("正在连接...");
而(WiFi.status()!= WL_CONNECTED){
延迟(500);
Serial.print(".");
如果(我> 20){
状态=假;休息;
}
我++;
}
序列号.println("");
如果(状态){
Serial.print("连接到");
序列号.println(ssid);
Serial.print("IP地址:");
Serial.println(WiFi.localIP());
}
别的 {
Serial.println("连接失败。");
}
返回状态;
}