收藏官网首页
查看: 18795|回复: 0

[分享] 【转】ESP8266搭建简易安防系统(智能门磁)

92

主题

277

帖子

1305

积分

金牌会员

Rank: 6Rank: 6

积分
1305
跳转到指定楼层
楼主
发表于 2016-9-28 16:52:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
注册成为机智云开发者,手机加虚拟设备快速开发
  esp8266可谓一款无敌的神器,为什么说无敌呢,一方面是价格只有10块,另一方面模块内置的MCU性能很不错,还有不少IO口可用,用作物联网主机(arduino都省了)搓搓有余,可塑性很高啊。
     近期因LP大人要赴异地工作,特使用此款神器造了一个门磁,以防贼,防狼,防变态....
     先用一个逻辑图来描述一下整个项目:
      

    这会邀请主角:(外壳是用的一个LED驱动改的,size刚好合适我的nodemuc板)
    这个开发板板集成了串口芯片,方便开发调试,也引出了所有的IO口。其实用ESP8266模块也是一样的,只是手头没有arduino板,索性就直接买块开发板回来,可以串口调试。
   
    还有我们的得力小助手:干簧管传感器(这枚屌丝的作用是和门磁一样的,磁铁靠近就闭合)
    这枚传感器有三个脚,分别为VCC GND OUT 。和人体红外模块一样使用的,判断是否有磁场输出高低电平。
   
    还有这枚屌丝的搭档:磁铁先生
   

    连线非常简单,就三条线....  模块VCC---3.3V   模块GND---GND  OUT----D5

    供电方面,我是直接在洞洞板背面焊了一个AMS1117-5.0上去,通过DC座取电(9V输入),再输出到开发板的VIN口。
    下面是安装好之后的全家福(磁铁自己找了一个小塑料盒装进去,方便固定在门边)
   

    有能力的同学可以自己搭建PHP端对上传的数据进行存储和处理,或者结合公众号开发
    因为主动推送消息和硬件平台接入都要求认证过后的公众号,所以没有做这一部分的开发。
    有已经认证过公众平台号的朋友可以尝试,可以做到微信用户无缝接入,具体参考:微信硬件平台应用场景
   
   
    这个是airkiss软件 可以通过它来配置模块的wifi信息。
   
    相关链接:微信硬件平台


     下面上代码:(编译环境arduino IDE 1.6.5)
     程序PS:上电自动连接WIFI(读取上一次成功配置的SSID,PWD),20秒内链接失败则开启Smartconfig模式等待接收SSID和PWD信息。
                    连接WIFI成功后,每5S传输一次传感器状态,每10S传输一次握手信息(检测主机是否死机)

   
  • #include <ESP8266WiFi.h>
  • #define LED 2
  • unsigned long wificonnet_time=20000;  //wifi连接超时时间
  • const char* ssid;
  • const char* password;
  • //因为是自己搭建的PHP端,所以这里的设置和其他物联网平台不太一样
  • //如果是接入物联网平台,可按照平台标准去修改
  • const char* host = "***";
  • const char* controller   = "***";
  • const char* action   = "***";
  • const char* wdaction   = "***";
  • const char* Key = "***";
  • unsigned long startPost,wdtime,seniortime;
  • bool flagFirstPost = true;
  • bool Firsthandshaking = true;
  • int RS1_state = 0;
  • int RS_1 = D5;  //传感器端口
  • //int RS_2 = 0;
  • //智能配置Airkiss
  • void smartConfig()
  • {
  •   WiFi.mode(WIFI_STA);
  • // Serial.println("\r\nWait for Smartconfig");
  •   WiFi.beginSmartConfig();
  •   while (1)
  •   {
  •     //Serial.print(".");
  •     digitalWrite(LED, 0);
  •     delay(500);
  •     digitalWrite(LED, 1);
  •     delay(500);
  •     if (WiFi.smartConfigDone())
  •     {
  •       //Serial.println("SmartConfig Success");
  •       //Serial.println(WiFi.SSID().c_str());
  •       //Serial.println(WiFi.psk().c_str());
  •       break;
  •     }
  •   }
  • }
  • void setup() {
  •   pinMode(LED, OUTPUT);
  •   pinMode(RS_1,INPUT);
  •   //pinMode(RS_2,INPUT);
  •   //Serial.begin(115200);
  •   digitalWrite(LED, 0);
  •   //Serial.println();
  •   //Serial.print("Connecting to ");
  •   //Serial.println(ssid);
  •   WiFi.begin(ssid, password);
  •   while (WiFi.status() != WL_CONNECTED) {
  •     unsigned long nowtime=millis();
  •     if(nowtime>wificonnet_time){
  •       smartConfig();
  •       delay(10);
  •       if(WiFi.smartConfigDone()){
  •   //Serial.println();
  •   //Serial.println();
  •   //Serial.print("Connecting to ");
  •   //Serial.println(ssid);
  •   WiFi.begin(ssid, password);
  •   while (WiFi.status() != WL_CONNECTED) {
  •     delay(500);
  •     //Serial.print(".");
  •   }
  •   //Serial.println("");
  •   //Serial.println("WiFi connected");
  •   //Serial.println("IP address: ");
  •   //Serial.println(WiFi.localIP());
  • }
  •       }
  •     delay(500);
  •     //Serial.print(".");
  •   }
  •   //Serial.println("");
  •   //Serial.println("WiFi connected");
  •   //Serial.println("IP address: ");
  •   //Serial.println(WiFi.localIP());
  • }
  • void handshaking(){
  • // Serial.print("handshaking to ");
  •   //Serial.println(host);
  •   // Use WiFiClient class to create TCP connections
  •   WiFiClient client;
  •   const int httpPort = 80;
  •   if (!client.connect(host, httpPort)) {
  •     //Serial.println("handshaking failed");
  •     return;
  •   }
  •   // We now create a URI for the request
  •   String url = "/af/index.php/Home/";
  •   url += controller;
  •   url += "/";
  •   url += wdaction;
  •   url += "?health=1";
  •   url += "&key=";
  •   url += Key;
  •   //Serial.print("Handshaking URL: ");
  •   //Serial.println(url);
  •   // This will send the request to the server
  •   client.print(String("GET ") + url + " HTTP/1.1\r\n" +
  •                "Host: " + host + "\r\n" +
  •                "Connection: close\r\n\r\n");
  •   delay(10);
  •   // Read all the lines of the reply from server and print them to Serial
  •   while(client.available()){
  •     String line = client.readStringUntil('\r');
  •    // Serial.print(line);
  •   }
  •   //Serial.println();
  •   //Serial.println("closing connection");
  • }
  • void RS1_up(){
  •   //Serial.print("connecting to ");
  •   //Serial.println(host);
  •   // Use WiFiClient class to create TCP connections
  •   WiFiClient client;
  •   const int httpPort = 80;
  •   if (!client.connect(host, httpPort)) {
  •     //Serial.println("connection failed");
  •     return;
  •   }
  •   // We now create a URI for the request
  •   String url = "/af/index.php/Home/";
  •   url += controller;
  •   url += "/";
  •   url += action;
  •   url += "?RS_id=1";
  •   url += "&RS_state=";
  •   url += RS1_state;
  •   url += "&key=";
  •   url += Key;
  •   //Serial.print("Requesting URL: ");
  •   //Serial.println(url);
  •   // This will send the request to the server
  •   client.print(String("GET ") + url + " HTTP/1.1\r\n" +
  •                "Host: " + host + "\r\n" +
  •                "Connection: close\r\n\r\n");
  •                delay(10);
  •   // Read all the lines of the reply from server and print them to Serial
  •   while(client.available()){
  •     String line = client.readStringUntil('\r');
  •     //Serial.print(line);
  •   }
  •   //Serial.println();
  •   //Serial.println("closing connection");
  •   }
  • void loop() {
  •   if (millis()-startPost>5000 || flagFirstPost){
  •       RS1_up();
  •       startPost = millis();
  •       flagFirstPost = false;
  •       delay(10);
  •   }else if(millis()-wdtime>15000 || Firsthandshaking){
  •       handshaking();
  •       wdtime = millis();
  •       Firsthandshaking = false;
  •       delay(10);
  •   }else if(digitalRead(RS_1)==HIGH){
  •       RS1_state = 1;
  •       seniortime = millis();
  •       delay(10);
  •   }else if(digitalRead(RS_1)==LOW){
  •        if(millis()-seniortime>12000){
  •             RS1_state = 0;
  •             delay(10);
  •         }else{
  •           return;
  •           }
  •   }else{
  •     return;
  •   }
  • }

[color=rgb(51, 102, 153) !important]复制代码


所有代码托管在:GitHub

PHP端已经整合了微信公众号类和阿里大于短信API

需要微信公众号一个(具有自定义菜单功能的)
需要注册阿里大于账号(有淘宝号可以直接登录),注册后要新建应用,新建短信签名,新建短信模板,用于短信提醒发送。
服务端基于[ThinkPHP框架]和[微信公众平台类]快速开发。
Thinkphp框架下载:http://www.thinkphp.cn/
微信公众平台类下载:http://www.thinkphp.cn/extend/588.html
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表