基于ESP8266与51单片机的震动报警器(车辆报警器)
前言
笔者是桂工通信工程的一名在读大学生,在进行课程设计的时候,想要去做一个可以在手机上进行消息提醒的报警器。在传统的声光报警器上有所突破,可以进行消息的推送来提醒使用者。
构想
传统的车辆报警器(震动报警器)一般都是声光报警,震动模块接收到外界信号时就会把信号反馈给单片机从而进行声光报警。我们可以用ESP8266实现局域网内一定范围的消息推送报警,如果有WiFi,我们还可以结合ESP8266与IOT平台,利用微信对其进行消息推送。
设计要求
1.震动传感器震动,接收信息,发出报警声音。 2.报警时长可以通过数码管显示,一分钟关闭。 3.报警声时长可以用按键设置。 4.报警触发,进行消息提醒发送。
硬件电路
对于设计要求,前三个利用51单片机即可轻松完成,而第四个要求可以实现的途径有很多,而我选择使用ESP8266去进行消息功能开发。 所以电路可以分为两个部分去进行设计,一个是51单片机电路,另一个则是后面添加ESP8266模块即可。
51电路
(注:图中的Header 3H为震动模块的接入孔位;Header 4为ESP8266预留的孔位。)
下述为各个模块的简单分析;
晶振模块 对于晶振模块,我们采用的是 11.0592MHZ 的晶振,89C51 内部有一个高增益反向放大器,用于构成一个片内振荡器,引脚 XTAL1 和 XTAL2 分别是此放大器的输入端和输出端。 在这两个端口跨接晶体或陶瓷谐振器,这就构成了自激振荡器,其发出的脉冲直接送入内部时钟发生器。 外接晶振时,两个电容通常选择30PF,这两个电容可以稳定频率并对震荡频率有微调作用,震荡 范围为 0~24MHZ。 为了减少寄生电容,更好地保证振荡器稳定可靠地工作,谐振器和电容应尽可能安装得与单片机芯片靠近。
按键模块 对于按键模块,我的设想是四个按键,一个按键是复位按键,剩下三个按键是功能按键。 对于复位按键,复位引脚是高电平有效的,所以开关的另一端要接 VCC。 对于剩下的三个功能按键:一分钟警报模式按键,两分钟警报模式按键,撤防按键其按键的另一端对接着 GND,这跟我们的 STC89C51 芯片引脚的默认电平为高电平有一定的关系。
数码管显示模块 三极管主要负责稳压放大的作用,根据接线,我们用 P0 口去控制数码管的片选,用 P2 口去控制数码管的位选,对于位选端口,我们利用三级管去对其位选电流进行功放,有足够大的电流去控制驱动数码管的位选使能端。在什么位置显示,显示什么数字,通过 P0 口和 P2 口就可以进行控制了。
PCB设计
有了电路的雏形,PCB的设计简直易如反掌,单层板可以直接满足要求。 接线尽量简单,避免电磁干扰。信号也不是什么高速信号,线路不用过于讲究,预留孔位直接留排针就行了。
ESP8266的接入
ESP8266的TXD,RXD端口,与单片机的TXD RXD端口的连接要注意不要连接错误,单片机的PCB板子上应保留ESP8266的电源端口和GND端口。
代码设计
对于51单片机的代码编写,可以说是十分简单。 (蜂鸣器的报警时长可以设置多种报警时长,也可以对其进行一个倒计时的显示设计以丰富功能性和设计感。) 下述为部分代码:
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void time0init()
{
TMOD=0x01;
TL0=0x66;
TH0=0xFC ;
TF0=0;
TR0=1;
}
void beep(uint m, uint k)
{
uchar i = 0;
uint j = 0;
for(j = m;j > 0;j --)
{
for(i = 0;i <= 50; i++)
{
Beep=~Beep ;
delay(k);
}
}
}
而对于ESP8266的代码编写,我的思路有两个。
正如前文提及的那样,一种是基于局域网范围内的,这种方式较为简单,还有一种方式是基于IOT平台去实现的。 先说第一种。 局域网 当震动模块报警,单片机的TXD,RXD的端口就会发挥作用,传送数据给ESP8266。而接收但数据之后,ESP8266的程序就会开始工作,这跟程序的编写方式有一定的关系。 而我选择引出一个管脚直接接到震动模块上,直接接收震动模块传来的高电平信号,这样就算单片机的部分因某种问题无法工作的时候,消息推送报警都可以实现。 以下为部分代码:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
const char* ssid = "D";
const char* password = "12345678";
WiFiServer server(5045);
WiFiClient client;
char data[1500];
int ind = 5;
void setup() {
Serial.begin(115200);
WiFi.begin(ssid,password);
Serial.println("");
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("Connected to "); Serial.println(ssid);
Serial.print("IP Address: "); Serial.println(WiFi.localIP());
server.begin();
}
void loop() {
if(!client.connected())
{
client = server.available();
}
else
{
if(digitalRead(D0)){for(int j=0;j < ind; j++){client.print("报警!");}}
}
}
注:上述代码中ESP8266作为了TCPsever的角色,而手机可以作为client的角色,就可以接收串口传送的信息了。
联网推送 我们都实现了局域网报警,为什么不直接研究一手在线消息推送提醒?(反正可以白嫖的物联网平台不在少数。) 下述是部分代码,是可以进行功能实现的。
void startSTA(){
WiFi.disconnect();
WiFi.mode(WIFI_STA);
WiFi.begin(DEFAULT_STASSID, DEFAULT_STAPSW);
}
void doWiFiTick(){
if ( WiFi.status() != WL_CONNECTED ) {
if (millis() - lastWiFiCheckTick > 1000) {
lastWiFiCheckTick = millis();
startSTA();
}
}
}
void doHttpStick(){
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin(ApiUrl+"?uid="+uid+"&title="+title+"&msg="+msg);
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
Serial.println(payload);
}
http.end();
}
}
实物焊接
|