Hallo zusammen,
ich bin mittlerweile am Verzweifeln und komme leider nicht weiter. Deswegen hoffe ich, dass jemand von euch darauf kommt was ich falsch mache ![]()
Vorab meine Komponenten:
ESP32-Wroom-32 von AZDelivery
https://amzn.eu/d/f5EaBFu
R503 Fingerprint Sensor:
https://amzn.eu/d/78W3bnY
Druckschalter:
https://www.ebay.de/itm/405409211060?var=675641699449
HLK-PM01
https://amzn.eu/d/b37KbSC
Das Problem ist nach dem Verbinden der ganzen Komponenten funktioniert alles soweit ganz gut, das einzige Problem das ich habe, ist sobald ich den Fingerprint in den Prüfmodus setzte, leuchtet zwar das blaue LED, aber er erkennt keinen Finger. Also nicht nur "Kein Match" sondern generell erhält er kein Signal sobald man einen Finger darauf legt. Keinerlei Regung. Weder nicht erkannt oder erkannt.
Die Debugausgabe zeigt jedoch Fingerprint Sensor gefunden.
hier noch meine Verkabelung:
HLK-PM01:
+Vo zusammen verkabelt mit: Taster 5V, R503 - 5V (rot), ESP32 5v (PIN)
-Vo zusammen verkabelt mit: Taster GND (Schwarz), R503 - Gnd (Schwarz), Esp32 - GnD (Pin)
Taster:
Blau - G23, Grün - G22, Gelb - G4
R503:
Gelb - G16, Braun/Violett - G17, Blau - G27, Weiss - 3.3V PIN vom ESP32 (Alternativ versucht an den 5V vom HLK
Der Taster funktioniert soweit da konnte ich keine Differenzen feststellen. Es geht eigentlich nur um den R503.
Ich hoffe ihr könnt mir bei dem Projekt helfen, habe schon einige Stunden damit "verbracht" ![]()
Vielen Dank.
Hier noch mein derzeitiger Code und Anschlussplan:
#include <Adafruit_Fingerprint.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include "secrets.h"
#include <ArduinoJson.h>
#include <ArduinoOTA.h>
#include <WebServer.h>
#define RX_PIN 16
#define TX_PIN 17
#define RESET_PIN 14
#define BUTTON_PIN 4
#define BELL_PIN_1 25
#define BELL_PIN_2 26
#define LED_GREEN_PIN 22
#define LED_BLUE_PIN 23
#define WAKEUP_PIN 27
int debug_aktiv = 1;
String webLog = "";
HardwareSerial mySerial(1);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
WiFiClient espClient;
PubSubClient client(espClient);
WiFiServer telnetServer(23);
WiFiClient telnetClient;
WebServer server(80);
uint8_t id;
String command = "";
String g_UniqueId;
bool resetCode = false;
String status = "";
const char* deviceIdentifier = "tuerklingel_fingersensor_ESP32";
bool lastButtonState = HIGH;
unsigned long lastBellPress = 0;
bool ledOverride = false;
unsigned long ledChangeTime = 0;
void debugPrint(String text, bool newline = true) {
if (debug_aktiv) {
if (newline) {
Serial.println(text);
if (telnetClient && telnetClient.connected()) telnetClient.println(text);
webLog += text + "\n";
} else {
Serial.print(text);
if (telnetClient && telnetClient.connected()) telnetClient.print(text);
webLog += text;
}
if (webLog.length() > 4000) webLog = webLog.substring(webLog.length() - 4000);
}
}
void setLED(int onOff, int colorIndex, int color) {
finger.LEDcontrol(onOff, colorIndex, color);
}
void triggerBell() {
unsigned long now = millis();
if (now - lastBellPress < 2000) return;
debugPrint("Klingel ausgelöst!");
pinMode(BELL_PIN_1, OUTPUT);
pinMode(BELL_PIN_2, OUTPUT);
digitalWrite(BELL_PIN_1, LOW);
digitalWrite(BELL_PIN_2, LOW);
delay(100);
pinMode(BELL_PIN_1, INPUT);
pinMode(BELL_PIN_2, INPUT);
client.publish("homeassistant/sensor/tuerklingel_klingelstatus/state", "Klingel ausgelöst!");
delay(1000);
client.publish("homeassistant/sensor/tuerklingel_klingelstatus/state", "Warten");
lastBellPress = now;
}
void checkBellButton() {
bool currentState = digitalRead(BUTTON_PIN);
unsigned long now = millis();
if (lastButtonState == HIGH && currentState == LOW && now - lastBellPress > 2000) {
triggerBell();
}
lastButtonState = currentState;
}
uint8_t readnumber(void) {
unsigned long startMillis = millis();
while (Serial.available() == 0 && millis() - startMillis < 2000) {
client.loop();
checkBellButton();
}
String input = Serial.readStringUntil('\n');
input.trim();
return input.toInt();
}
uint8_t getFingerprintSearch() {
int p = -1;
debugPrint("Warte auf Finger...");
setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_BLUE);
while (p != FINGERPRINT_OK) {
p = finger.getImage();
checkBellButton();
client.loop();
server.handleClient();
switch (p) {
case FINGERPRINT_OK:
debugPrint("Bild aufgenommen");
break;
case FINGERPRINT_NOFINGER:
debugPrint(".", false);
break;
case FINGERPRINT_PACKETRECIEVEERR:
debugPrint("Kommunikationsfehler");
break;
case FINGERPRINT_IMAGEFAIL:
debugPrint("Bildfehler");
break;
default:
debugPrint("Unbekannter Fehler");
break;
}
}
p = finger.image2Tz(1);
if (p != FINGERPRINT_OK) return -1;
p = finger.fingerSearch();
if (p == FINGERPRINT_OK) {
debugPrint("Finger erkannt! ID: " + String(finger.fingerID));
client.publish("homeassistant/sensor/tuerklingel_id/state", String(finger.fingerID).c_str());
setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_GREEN);
delay(1000);
setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_BLUE);
return FINGERPRINT_OK;
} else {
debugPrint("Kein Finger erkannt oder kein Match gefunden.");
for (int i = 0; i < 5; i++) {
setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_RED);
unsigned long start = millis();
while (millis() - start < 300) {
checkBellButton();
client.loop();
server.handleClient();
}
setLED(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_RED);
start = millis();
while (millis() - start < 300) {
checkBellButton();
client.loop();
server.handleClient();
}
}
setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_BLUE);
return -1;
}
}
uint8_t getFingerprintEnroll() {
int p = -1;
debugPrint("Warte auf Finger für ID #" + String(id));
setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_PURPLE);
while (p != FINGERPRINT_OK) {
p = finger.getImage();
checkBellButton();
client.loop();
server.handleClient();
}
if (finger.image2Tz(1) != FINGERPRINT_OK) return -1;
debugPrint("Finger entfernen");
delay(2000);
while (finger.getImage() != FINGERPRINT_NOFINGER) {
checkBellButton();
client.loop();
server.handleClient();
}
debugPrint("Gleichen Finger wieder auflegen");
while ((p = finger.getImage()) != FINGERPRINT_OK) {
checkBellButton();
client.loop();
server.handleClient();
}
if (finger.image2Tz(2) != FINGERPRINT_OK) return -1;
if (finger.createModel() != FINGERPRINT_OK) return -1;
if (finger.storeModel(id) != FINGERPRINT_OK) return -1;
setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_GREEN);
delay(1000);
setLED(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_BLUE);
return true;
}
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (unsigned int i = 0; i < length; i++) message += (char)payload[i];
debugPrint("MQTT empfangen: [" + String(topic) + "]: " + message);
if (String(topic) == "homeassistant/button/tuerklingel_pruefung/command" && message == "PRESS") command = "pruefen";
else if (String(topic) == "homeassistant/button/tuerklingel_enroll/command" && message == "PRESS") command = "enroll";
else if (String(topic) == "homeassistant/button/tuerklingel_reset/command" && message == "PRESS") ESP.restart();
}
void reconnectMQTT() {
client.setCallback(callback);
while (!client.connected()) {
debugPrint("Versuche, MQTT zu verbinden...");
if (client.connect("Türklingel", MQTT_USER, MQTT_PASSWORD)) {
debugPrint("MQTT verbunden!");
client.subscribe("homeassistant/button/tuerklingel_pruefung/command");
client.subscribe("homeassistant/button/tuerklingel_enroll/command");
client.subscribe("homeassistant/button/tuerklingel_reset/command");
} else {
debugPrint("Fehler beim MQTT: " + String(client.state()));
delay(5000);
}
}
}
void setup() {
pinMode(LED_GREEN_PIN, OUTPUT);
pinMode(LED_BLUE_PIN, OUTPUT);
pinMode(WAKEUP_PIN, OUTPUT);
digitalWrite(WAKEUP_PIN, HIGH);
Serial.begin(9600);
delay(100);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(BELL_PIN_1, INPUT);
pinMode(BELL_PIN_2, INPUT);
digitalWrite(LED_GREEN_PIN, HIGH);
digitalWrite(LED_BLUE_PIN, LOW);
IPAddress local_IP(192, 168, 1, 161);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
if (!WiFi.config(local_IP, gateway, subnet)) debugPrint("Fehler beim Setzen der statischen IP!");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
debugPrint(".", false);
}
debugPrint("WiFi verbunden! IP: " + WiFi.localIP().toString());
mySerial.begin(57600, SERIAL_8N1, RX_PIN, TX_PIN);
if (finger.verifyPassword()) debugPrint("Fingerprint Sensor gefunden!");
else {
debugPrint("Fingerprint Sensor NICHT gefunden!");
while (1) delay(1);
}
client.setServer(MQTT_SERVER, MQTT_PORT);
reconnectMQTT();
ArduinoOTA.setHostname("Türklingel_OTA");
ArduinoOTA.begin();
server.on("/", []() {
server.send(200, "text/plain", webLog);
});
server.begin();
telnetServer.begin();
telnetServer.setNoDelay(true);
}
void loop() {
ArduinoOTA.handle();
server.handleClient();
if (telnetServer.hasClient()) {
if (telnetClient && telnetClient.connected()) telnetClient.stop();
telnetClient = telnetServer.available();
}
if (!client.connected()) reconnectMQTT();
client.loop();
checkBellButton();
if (command == "pruefen") {
debugPrint("Starte Prüfung...");
int result = getFingerprintSearch();
if (result == -1) debugPrint("Kein Finger erkannt oder kein Match gefunden.");
command = "";
}
else if (command == "enroll") {
debugPrint("Gib die ID ein...");
id = readnumber();
if (id != 0) while (!getFingerprintEnroll());
command = "";
}
status = (command == "pruefen") ? "Prüfung" : (command == "enroll") ? "Enroll" : "Warten";
client.publish("homeassistant/sensor/tuerklingel_status/state", status.c_str());
client.publish("homeassistant/sensor/tuerklingel_id/state", String(id).c_str());
delay(50);
}

