Доброго!
делаю управление замком. Использую сканер отпечатка пальцев FPM10A и NodeMCU c Асинхронным ВебСервером.
Т.е. дергается пин либо с веб-странички, либо со сканера.
Код состоит из двух. Первая часть- это код Rui Santos https://RandomNerdTutorials.com/esp32-esp8266-web-server-physical-button/
Вторая часть -это код из примера библиотеки <Adafruit_Fingerprint.h>
Все компилируется, загружается, начинает работать как надо- и оп-па через 7-8 секунд ребут с вот такой ошибкой
Exception 0: Illegal instruction
PC: 0x4020c71c
EXCVADDR: 0x00000000
............................................
Если по частям, то и веб-сервер и сканер отпечатков работают отлично! Собственно ХЕЛП!!!!
Код целиком
делаю управление замком. Использую сканер отпечатка пальцев FPM10A и NodeMCU c Асинхронным ВебСервером.
Т.е. дергается пин либо с веб-странички, либо со сканера.
Код состоит из двух. Первая часть- это код Rui Santos https://RandomNerdTutorials.com/esp32-esp8266-web-server-physical-button/
Вторая часть -это код из примера библиотеки <Adafruit_Fingerprint.h>
Все компилируется, загружается, начинает работать как надо- и оп-па через 7-8 секунд ребут с вот такой ошибкой
Exception 0: Illegal instruction
PC: 0x4020c71c
EXCVADDR: 0x00000000
............................................
Если по частям, то и веб-сервер и сканер отпечатков работают отлично! Собственно ХЕЛП!!!!
Код целиком
Код:
/*********
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp32-esp8266-web-server-physical-button/
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*********/
// Import required libraries
#ifdef ESP32
#include <WiFi.h>
#include <AsyncTCP.h>
#else
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#endif
#include <ESPAsyncWebServer.h>
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
#include <TimerMs.h> // таймер для двери
// Replace with your network credentials
const char* ssid = "*****";
const char* password = "******";
const char* PARAM_INPUT_1 = "state";
const int output = 13; // Pin for Relay to Lock
const int buttonPin = 4; // Pin for input from ...
//Fingerprint scanner Pins
#define Finger_Rx 14 //D5
#define Finger_Tx 12 //D6
// Variables will change:
//int ledState = LOW; // the current state of the output pin
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
SoftwareSerial mySerial(Finger_Rx, Finger_Tx);
uint8_t id; // id number of fingerprint
int k;
bool doorState = 1;
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0; // the last time the output pin was toggled
unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); // init UART Serial port
TimerMs tmr(5000, 0, 1);
// Create AsyncWebServer object on port 80
AsyncWebServer server(80);
const char index_html[] PROGMEM = R"rawliteral( // загоняем страничку в RAM
<!DOCTYPE HTML><html>
<head>
<title>ESP Web Server</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
html {font-family: Arial; display: inline-block; text-align: center;}
h2 {font-size: 3.0rem;}
p {font-size: 3.0rem;}
body {max-width: 600px; margin:0px auto; padding-bottom: 25px;}
.switch {position: relative; display: inline-block; width: 120px; height: 68px}
.switch input {display: none}
.slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; border-radius: 34px}
.slider:before {position: absolute; content: ""; height: 52px; width: 52px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 68px}
input:checked+.slider {background-color: #2196F3}
input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform: translateX(52px); transform: translateX(52px)}
</style>
</head>
<body>
<h2>The door</h2>
%BUTTONPLACEHOLDER%
<script>function toggleCheckbox(element) {
var xhr = new XMLHttpRequest();
if(element.checked){ xhr.open("GET", "/update?state=1", true); }
else { xhr.open("GET", "/update?state=0", true); }
xhr.send();
}
setInterval(function ( ) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var inputChecked;
var outputStateM;
if( this.responseText == 1){
inputChecked = true;
outputStateM = "On";
}
else {
inputChecked = false;
outputStateM = "Off";
}
document.getElementById("output").checked = inputChecked;
document.getElementById("outputState").innerHTML = outputStateM;
}
};
xhttp.open("GET", "/state", true);
xhttp.send();
}, 1000 ) ;
</script>
</body>
</html>
)rawliteral";
// конец странички
// Replaces placeholder with button section in your web page
String processor(const String& var){
//Serial.println(var);
if(var == "BUTTONPLACEHOLDER"){
String buttons ="";
String outputStateValue = outputState();
buttons+= "<h4>Output - GPIO 2 - State <span id=\"outputState\"></span></h4><label class=\"switch\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"output\" " + outputStateValue + "><span class=\"slider\"></span></label>";
return buttons;
}
return String();
}
String outputState(){
if(digitalRead(output)){
return "checked";
}
else {
return "";
}
return "";
}
void setup(){
// Serial port for debugging purposes
Serial.begin(115200);
// set the data rate for the sensor serial port
finger.begin(57600);
tmr.setTimerMode();
pinMode(output, OUTPUT);
digitalWrite(output, HIGH);
//pinMode(buttonPin, INPUT);
// Connect to Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi..");
}
// Print ESP Local IP Address
Serial.println(WiFi.localIP());
// Route for root / web page
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html, processor);
});
// Send a GET request to <ESP_IP>/update?state=<inputMessage>
server.on("/update", HTTP_GET, [] (AsyncWebServerRequest *request) {
String inputMessage;
String inputParam;
// GET input1 value on <ESP_IP>/update?state=<inputMessage>
if (request->hasParam(PARAM_INPUT_1)) {
inputMessage = request->getParam(PARAM_INPUT_1)->value();
inputParam = PARAM_INPUT_1;
digitalWrite(output, inputMessage.toInt());
doorState = !doorState;
}
else {
inputMessage = "No message sent";
inputParam = "none";
}
Serial.println(inputMessage);
request->send(200, "text/plain", "OK");
});
// Send a GET request to <ESP_IP>/state
server.on("/state", HTTP_GET, [] (AsyncWebServerRequest *request) {
request->send(200, "text/plain", String(digitalRead(output)).c_str());
});
// Start server
server.begin();
}
void loop() {
// get the state of the fingerprint......
k=getFingerprintIDez(); // return ID fingerprint вызывает функцию getFingerprintIDez()
// если это id из набора то LOW на пин...
if (k >=1 && k<=8 && doorState==1 ) {
// set the LED:
Serial.println("Считали отпечаток");
doorState=0;
tmr.start(); // запускаем таймер на 5 минут (после отладки)
digitalWrite(output, doorState); // открываем дверь
}
if (tmr.tick()) {
Serial.println("Таймер, закрываем дверь");
doorState=1;
digitalWrite(output, doorState); // закрываем дверь
}
}
// Описание функции getFingerprintIDez
// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
//Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
//Serial.println("No finger detected");
return 0;
case FINGERPRINT_PACKETRECIEVEERR:
//Serial.println("Communication error");
return -2;
case FINGERPRINT_IMAGEFAIL:
//Serial.println("Imaging error");
return -2;
default:
//Serial.println("Unknown error");
return -2;
}
// OK success!
p = finger.image2Tz();
switch (p) {
case FINGERPRINT_OK:
//Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
//Serial.println("Image too messy");
return -1;
case FINGERPRINT_PACKETRECIEVEERR:
//Serial.println("Communication error");
return -2;
case FINGERPRINT_FEATUREFAIL:
//Serial.println("Could not find fingerprint features");
return -2;
case FINGERPRINT_INVALIDIMAGE:
//Serial.println("Could not find fingerprint features");
return -2;
default:
//Serial.println("Unknown error");
return -2;
}
// OK converted!
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) {
//Serial.println("Found a print match!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
//Serial.println("Communication error");
return -2;
} else if (p == FINGERPRINT_NOTFOUND) {
//Serial.println("Did not find a match");
return -1;
} else {
//Serial.println("Unknown error");
return -2;
}
// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
if(finger.fingerID==1 && finger.confidence>100){//confidence- это точность совпадения.
digitalWrite(LED_BUILTIN, HIGH);
}
if(finger.fingerID==2 && finger.confidence>100){
digitalWrite(LED_BUILTIN, LOW);
}
return finger.fingerID; // возвращает номер под которым записан отпечаток.
}