前言

考虑到宿舍肯定有人会忘记带钥匙,上铺又懒得下床开门,所以开学临出门前就顺手收拾了一块esp8266和一个mg995舵机还有一把杜邦线(太匆忙了,忘记带舵机的配件还有螺丝刀了,又下单买了一个新的舵机还有螺丝刀 ),军训了几天就因为疫情结束了,所以就有时间在宿舍敲代码了。
开源项目地址

材料

esp8266 x1
mg995舵机 x1
杜邦线 足够多足够长
数据线 x1
充电器 x1
固定用材(热熔胶、双面胶、胶带等等均可)

线路图

line.png

D4连接舵机信号线(黄色)
VCC连接舵机VCC(红色)
GND连接舵机GND(黑色)

代码

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <Servo.h>

Servo lockservo;

const char* ssid = "ssid"; //接入wifi
const char* password = "password";

const char* assid = "ssid"; //创建ap接入点
const char* asecret = "password";

WiFiServer server(80);

int connCount = 0;
int lockState = 0;
unsigned long previousMillis = 0;
const long interval = 5000; //开锁时长ms

void setup() {
  WiFi.mode(WIFI_AP_STA);
  WiFi.softAP(assid, asecret);  
  WiFi.begin(ssid, password); 
  lockservo.attach(2); //定义舵机接口
  lockservo.write(0); //初始化舵机角度
 
  while (WiFi.waitForConnectResult() != WL_CONNECTED) { //30次连接不上跳出循环
    delay(500);
    if(connCount > 30) {
      break;
    }
    connCount += 1;
  }

  ArduinoOTA.begin();
  server.begin();
}



String prepareHtmlPage(){
  String htmlPage =
     String("HTTP/1.1 200 OK\r\n") +
            "Content-Type: text/html\r\n" +
            "Connection: close\r\n" +
            "\r\n" +

            "<!DOCTYPE html> <html>\n"+
            "<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n"+
            "<title>LOCK Control</title>\n"+
            "<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n"+
            "body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;} h3 {color: #444444;margin-bottom: 50px;}\n"+
            ".button {display: block;width: 120px;background-color: #1abc9c;border: none;color: white;padding: 13px 30px;text-decoration: none;font-size: 25px;margin: 0px auto 35px;cursor: pointer;border-radius: 4px;}\n"+
            ".button-on {background-color: #5AD2FF;}\n"+
            ".button-on:active {background-color: #DE341E;}\n"+
           
            ".button-off {background-color: #34495e;}\n"+
            ".button-off:active {background-color: #DE341E;}\n"+
            "p {font-size: 14px;color: #888;margin-bottom: 10px;}\n"+
            "</style>\n"+
            "</head>\n"+
            "<body>\n"+

            "<h1>LOCK state: <strong>""" + lockState + """</strong></h1>"
            "<form id='F1' action='LOCKON'><input class='button button-on' type='submit' value='ON' ></form><br>"+
                        
            "</html>" +
            "\r\n";
  return htmlPage;
}

void loop() {
  ArduinoOTA.handle();
  
  WiFiClient client = server.available();
  if (client){
    while (client.connected()){
      if (client.available()){
        String line = client.readStringUntil('\r');
      if (line.indexOf("LOCKON") > 0 && lockState == 0){
        lockservo.write(180);
        delay(100); previousMillis = millis();
        lockState = 1;
        }
      if (line.length() == 1 && line[0] == '\n'){
        client.println(prepareHtmlPage());
        break;
        }
      }
    }

    delay(1);
    client.flush();
  } 
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval && lockState == 1){
    lockservo.write(0);
    delay(100);
    lockState = 0;
    }
}

修改代码中wifi、ap账号密码信息(注意ap模式密码不能少于8位,否则会创建失败)
无需外网,esp8266网页控制,支持sta、ap模式接入、ota升级方便后期更新

成品

product.jpg

舵机使用了双面胶加热熔胶固定在门上(第一次用热熔胶掉了,图上还有印记,第二次加了双面胶改成横装了 ),然后用杜邦线绑住拉锁舌的那个(叫啥来着)加上热熔胶固定在舵机的转盘配件上,因为电源在门的开门那边,所以使用了网线从门的上面绕到另外一边(注意需要质量好的5类或以上线材,否则会因为电流不够导致无法开门,这个坑遇到过,辣鸡线材 ),电源方面使用了充电宝边充边放,这样子断电也不用担心开不了门。

食用方法(使用方法)

通过自带ap连接开锁
连接设置的wifi,输入192.168.4.1进入网页,点击ON即可开锁
web.PNG

通过路由器连接开锁
连接路由器wifi,输入esp8266的ip地址,点击ON即可开锁
web.PNG

通过快捷指令开锁
点击快捷指令或大喊“嘿,siri打开宿舍门”,即可开锁
shortcut.jpg

通过api开锁
访问http://ip/LOCKON,即可开锁,可应用于自动化、APP开发等

Last modification:October 28th, 2021 at 01:40 am
If you think my article is useful to you, please feel free to appreciate