//通过闪存联网实现 WiFi 开锁、存储指纹信息并识别,识别成功即可开锁
#include <ESP8266WiFi.h>
// 本程序使用 ESP8266WiFi 库
//#include <ESP8266WiFiMulti.h> // 本程序使用 ESP8266WiFiMulti 库
#include <ESP8266WebServer.h> // 本程序使用 ESP8266WebServer 库
#include <FS.h>
// 本程序使用 SPIFFS 库
#include <Adafruit_Fingerprint.h>//指纹识别
#include <Wire.h>//12C 数据
#include "SSD1306.h"
SSD1306 display(0x3c,5, 4);
//ESP8266WiFiMulti wifiMulti;
// 建立 ESP8266WiFiMulti 对象,对象名称是'wifiMulti'
ESP8266WebServer esp8266_server(80);
// 建立网络服务器对象,该对象用于响应 HTTP
请求。监听端口(
80)
const char* ssid = "redk40"; //客户名
const char* password = "12345678"; //密码
void handleLEDControl();
void handleUserRequest();
SoftwareSerial mySerial(13,15);//D7,D8
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
int k;
//存入指纹信息
uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");//检测成功
break;
case FINGERPRINT_NOFINGER:
Serial.println("No finger detected");//没有指纹信息
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error"); //信息错误
return p;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error"); //存储失败
return p;
default:
Serial.println("Unknown error"); //其他错误
return p;
}
//信息转换p = finger.image2Tz();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted"); //转换成功
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy"); // 图像混乱
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error"); //通信错误
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features"); //找不到指纹特征
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error"); //其他错误
return p;
}
//搜索指纹信息进行匹配
//串口检测
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("Did not find a match");
return p;
} else {
Serial.println("Unknown error");
return p;
}
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
return finger.fingerID;
}
// 匹配失败返回-1,成功则返回 IDint getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) { return -1;}
p = finger.image2Tz();
if (p != FINGERPRINT_OK) {return -1;}
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) {return -1;}
// 串口输出信息与屏幕展示
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
Serial.print("已开锁");
display.init();//屏幕初始化
display.setFont(ArialMT_Plain_24);
display.drawString(0, 0, "open");
display.display();
delay(5000);//开锁时间
display.init(); //屏幕初始化
display.setFont(ArialMT_Plain_24);
display.drawString(0, 0, "
");
display.display();
return finger.fingerID;//返回·1ID
}
void setup(){
Serial.begin(9600);
Serial.println("");
pinMode(D8, OUTPUT);
// 初始化 NodeMCU 控制板载 LED 引脚为 OUTPU
digitalWrite(D8, HIGH);
//通过 addAp 函数存储 WiFi 名称 WiFi 密码
WiFi.begin(ssid, password); // 环境查找是否有这里列出的 WiFi ID。//如果有
Serial.println("Connecting ...");
// 则尝试使用此处存储
的密码进行连接。
int i = 0;
while (WiFi.status() != WL_CONNECTED) { // 在当前环境中搜索 addAP 函数所存储的
WiFi
delay(1000);
// 如果搜到多个存储的 WiFi 那么
NodeMCU
Serial.print(i++); Serial.print('.'); // 将会连接信号最强的那一个 WiFi 信号。
finger.begin(57600);
delay(5);if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor ");
while (1) { delay(1); }
}
finger.getTemplateCount();
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
Serial.println("Waiting for valid finger...");
Wire.begin(5,4);
}
// WiFi 连接成功后将通过串口监视器输出连接成功信息
Serial.println('\n');
// WiFi 连接成功后
Serial.print("Connected to ");
// NodeMCU 将通过串口监视器输出。
Serial.println(WiFi.SSID());
// 连接的 WiFI 名称
Serial.print("IP address:\t");
// 以及
Serial.println(WiFi.localIP());
// NodeMCU 的 IP 地址
if(SPIFFS.begin()){
// 启动闪存文件系统
Serial.println("SPIFFS Started.");
} else {
Serial.println("SPIFFS Failed to Start.");
}
esp8266_server.on("/LED-Control", handleLEDControl); // 告知系统如何处理/LED-Control 请
求
esp8266_server.onNotFound(handleUserRequest);
// 告知系统如何处理其它用户
请求
esp8266_server.begin();
// 启动网站服务
Serial.println("HTTP server started");
}
void loop(){
esp8266_server.handleClient(); //处理用户请求
k=0;
getFingerprintIDez();
delay(50);
}
// 处理/LED-Control 请求
void handleLEDControl(){bool ledStatus = digitalRead(D8);
// 此变量用于储存 LED 状态
ledStatus == HIGH ? digitalWrite(D8, LOW) : digitalWrite(D4, HIGH); // 点亮或者熄灭 LED
esp8266_server.sendHeader("Location", "/LED.html");
esp8266_server.send(303);
}
// 处理/LED-Control 请求
// 处理用户浏览器的 HTTP 访问
void handleUserRequest() {
// 获取用户请求资源(Request Resource)
String reqResource = esp8266_server.uri();
Serial.print("reqResource: ");
Serial.println(reqResource);
// 通过 handleFileRead 函数处处理用户请求资源
bool fileReadOK = handleFileRead(reqResource);
// 如果在 SPIFFS 无法找到用户访问的资源,则回复 404 (Not Found)
if (!fileReadOK){
esp8266_server.send(404, "text/plain", "404 Not Found");
}
}
bool handleFileRead(String resource) {
//处理浏览器 HTTP 访问
if (resource.endsWith("/")) {
// 如果访问地址以"/"为结尾
resource = "/index.html";
// 则将访问地址修改为/index.html 便
于 SPIFFS 访问
}
String contentType = getContentType(resource); // 获取文件类型
if (SPIFFS.exists(resource)) {
// 如果访问的文件可以在 SPIFFS 中找
到
File file = SPIFFS.open(resource, "r");
// 则尝试打开该文件
esp8266_server.streamFile(file, contentType);// 并且将该文件返回给浏览器
file.close();
// 并且关闭文件
return true;
// 返回 true
}
return false;
// 如果文件未找到,则返回 false
}
// 获取文件类型
String getContentType(String filename){if(filename.endsWith(".htm")) return "text/html";
else if(filename.endsWith(".html")) return "text/html";
else if(filename.endsWith(".css")) return "text/css";
else if(filename.endsWith(".js")) return "application/javascript";
else if(filename.endsWith(".png")) return "image/png";
else if(filename.endsWith(".gif")) return "image/gif";
else if(filename.endsWith(".jpg")) return "image/jpeg";
else if(filename.endsWith(".ico")) return "image/x-icon";
else if(filename.endsWith(".xml")) return "text/xml";
else if(filename.endsWith(".pdf")) return "application/x-pdf";
else if(filename.endsWith(".zip")) return "application/x-zip";
else if(filename.endsWith(".gz")) return "application/x-gzip";
return "text/plain";
}
基于物联网平台的智能门禁系统
最新推荐文章于 2023-11-25 23:16:13 发布