如果您对科技领域有一定了解的话,一定听说过“loT(物联网)”一词。其概念是将每个设备都连接到互联网上,从而实现设备与设备之间、用户与设备之间的相互通信。而其中具有突破性的工具之一就是将ESP8266串行至Wi-Fi芯片。今天,我们将通过解读Arduino的开发思想来制作一个使用该芯片的儿童安全锁。我称它为“儿童安全锁”,但是您可以将其用于任何想要上锁对象,并且只能在某些特定情况下才能打开。例如,使您的室友(或您自己)无法拿到冰箱里那些诱人的饼干。
项目清单:
- Arduino UNO开发板
- 具有内置电平转换器和开关的ESP8266-12 模块
- LM 7805 5V稳压器 https://www.fairchildsemi.com/pf/Lm/LM7805.html
- 两个电容器(0.1 mF和0.33 mF)
- USB串口转换器(这里使用的是Prolific PL-2303,推荐使用更新的版本)
- 一块小型螺管式电磁铁
- 9V的外部电源
该部分代码可以在https://github.com/gasparnori/iot_lock获取
连接ESP8266进行编程
这种芯片有很多优点,但同时也有很多缺点。它成本低,相对简单,并且用途十分广泛,但是在使用的时候很容易遇到一些陷阱。基于板载电平转换器和开关的模块也许可以帮助您避免这些问题,但是请谨记以下几点:
- ESP需要近200 mA的工作电流,Arduino的电源输出引脚可能无法提供,因此需要使用外部电源和一个稳压器。对于该项目,您可以使用一个5V的稳压器(如LM7805)或一个3.3V的稳压器。
- 在编程或者使用该模块时,需要调整“UART—Programming”开关。请牢记这一点,否则您将收到内存异常的信息。
- 将USB连接到串口转换器时,请确保Vcc引脚悬空并确保接地。
与ESP通信
现在您已经建立了连接,我们来看看您的芯片状况如何。有几种Arduino串行通信工具可以使用,其中我认为ESPlorer是最佳选择。下载后,只需直接运行ESPlorer.jar文件即可。设置好您的端口和通信速率(波特率),通常设置为115200,但是可能某些设备需要设置为其他不同的速率,如果设置为115200无法正常工作,请尝试其他的值直到找到最佳值为止。首先,为了检查通信是否正常,请按下复位按钮,如果能够看到一条欢迎使用的信息,证明您可以正常进行下一步操作。然后可以尝试操作左上角的一些指令,比如简单的AT指令,或连接到本地的Wi-Fi网络。现在我们可以准备对模块进行编程了。
对ESP8266进行编程
有两种控制芯片的方法。可以使用Arduino开发板,通过串行端口进行简单的AT指令操作实现控制(也就是您刚刚操作过的指令)。或者用一种更简单的方式:直接上传代码到芯片上。在本教程中,我们选择第二种方式。打开Arduino IDE,进入Tools–>Board–>Board Manager,找到ESP板,然后进行安装。
新建一个草图,进入Tools–>Board并选择您的ESP模块。另外,请确保在Tools–>Port中选择正确的端口。
现在,将以下代码复制到您的草图中,将芯片转换为编程模式,按下重置按钮,然后开始编程。上传代码后,再将其调回“uart mode”,再按下重置按钮,然后再次打开ESPlorer,查看模块返回的内容。如果一切正常,您将会看到两条信息,一个是您所连接的Wi-Fi,另一个是您的IP地址。在浏览器中打开您的IP地址,应该看到以下信息:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
//Your ssid and password
const char* ssid = "....";
const char* password = ".....";
ESP8266WebServer server(80);
//This form will be sent to your browser, when the device is locked
String form_closed =
"<html>"
"<head>"
"</head>"
"<body>"
"<center>"
"<img width='200px' src='https://www.endlessicons.com/wp-content/uploads/2012/12/lock-icon-614x460.png'>"
"<form action='msg'> <p>Do you really need that chocolate?</p>"
"<select name='msg'>"
"<option value='open'>Yesssssss</option>"
"<option value='close'>No, I continue my diet...</option>"
"</select>"
"<input type='submit' value='Open'></form>"
"</center>"
"</body>"
"</html>";
//this form will be sent to your browser, when the device is open
//there is a redirect link in the html to the main page
String form_open =
"<html>"
"<head>"
"<meta http-equiv='refresh' content='3;url=/' />"
"</head>"
"<body>"
"<center>"
"<h1>Voillaaaa </h1>"
"<img width='400px' src='https://www.clipartreview.com/_images_300/A_refrigerator_with_an_open_door_100429-171689-937009.jpg'>"
"</center>"
"</body>"
"</html>";
void handleMessage(){
String state= server.arg("msg");
Serial.println(state);
if(state=="close"){
server.send(200, "text/html", form_closed);
}
else{
server.send(200, "text/html", form_open);
//after 3 seconds closes back either way
delay(3000);
Serial.println("close");
}
}
void setup(void){
//open Serial port
Serial.begin(115200);
//open Wifi connection
WiFi.begin(ssid, password);
Serial.println("Serial started...");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Wifi connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
//handling the form itself
server.on("/msg", handleMessage);
//handling the main site
server.on("/", [](){
server.send(200, "text/html", form_closed);
});
//handling wrong url
server.onNotFound([](){
server.send(404, "text/plain", "File Not Foundnn");
});
server.begin();
Serial.println("HTTP server started");
}
void loop(void){
server.handleClient();
}
代码说明
当您打开网站时,将会看到一个html主页,如果您想要打开儿童安全锁,则网站会将您重定向到“/msg?msg=open”或者“/msg?msg=close” URL。在该URL中,您将看到另一个html页面,并停留3秒钟,然后会再次跳转到第一个页面上。幸运的是,大多数的重定向都是通过html代码来完成的,服务器只需要将每个可能的URL与返回的html站点(form_closed 和form_open事件)相关联即可。为了将html与URL相关联,我们使用server.on函数(url, handler)。最重要的通信过程在handleMessage函数中实现。服务器从URL中读取mag参数,并将其作为打开或者关闭儿童安全锁的指令在串行端口发送出去。
如果一切运行正常,我们就准备将它连接到一个真正的Arduino设备上。
Arduino 设置
从Arduino的角度来说,我们所使用的是非常简单的设置。虽然螺线管的最高工作电压为12V,但是目前在该应用中,5V的工作电压以及Arduino的输出引脚提供的电流已经足以使电磁铁工作(但是如果您想要一个更高能量的电磁铁,通过借助晶体管或者继电器就可以很容易地达到提升的目的)。因此,卸下USB转换器,并且将串行端口与地面连接在一起,然后,再次由稳压器向两个设备提供Vin。
请谨记以下几点:
- 使用Arduino的硬件串行端口(引脚0或1),因为软件串行端口可能无法在如此高的速率下工作。但是,在进行Arduino项目编程时请不要忘记拔下这些引脚,以免发生通信异常。
- 在进行Arduino编程时请拔下Vin引脚,您绝对不会想突然炸了自己的设备吧。
int lock=8;
void setup() {
pinMode(lock, OUTPUT);
digitalWrite(lock, HIGH);
Serial.begin(115200);
}
void loop() {
while (!Serial.available()) {};
//reading the answer to a string
String a= Serial.readString();
if (a=="openrn") {
digitalWrite(lock, LOW);
};
if (a=="closern") {
digitalWrite(lock, HIGH);
};
}
让我们来把它们放在一起:
对于这个锁来说我使用了一个塑料棒来稳定螺线管,并且使用一枚硬币充当能够产生磁力的东西以保证在工作状态中能够保持儿童安全锁的功能。如果您打算使用在冰箱或者其他金属门上,那么可能就没这个必要了。
总结
在这里,我们通过使用一个小螺线管和ESP8266模块,创建了一个可运行的IoT儿童安全锁。ESP模块作为服务器,通过本地IP地址提供了锁定访问途径。通过单击网站上的按钮来实现开启或关闭该儿童安全锁,该网站在任何与ESP所连接的相同Wi-Fi上的设备上都可以使用。