R503 having communication error randomly

I set it up to an esp8266 using around 40cm unshielded jumper cable.

Im using software serial.

Generally my sketch works great but randomly I get communication errors in serial monitor and occasionally (seldomly) it seems to for no reason take fingerprint image even theres no finger even near it.

So I changed the cable to a shielded wire but that didnt change anything.
Any Ideas what might be the reason?

Might the software serial connection eventually be the reason?

Please provide your code and schematics

@Gorkde
Read the forum guidelines to see how to properly ask a question and some good information on making a good post. You will get faster and better help if you post all your code as requested by the forum guidelines.
Please go back and fix your original post.
Also please describe what the hardware do you use.
Photos that clearly show your wiring can also be very helpful.

I didnt post that since its not relevant to the question.

Anyway heres the actual code by now (which is working as intended):
(Scematics arent useful since the pins are connected as described in the code)

I get communicartion errors (which does'nt interfere with my sketch at all) and randomly I get the feedback the image is messy (when im not using the sensor) which tends me to beliebe the sensor either has a problem or the software serial isn't up to the task (since I alredy replaced the unshiielded cable to a shielded one).

Again:
The code works perfectly but I get the feedback of communication errors (once I dont use the sensor) that I assume are because if software serial or a behavior of the sensor.
Can anyone maybe confirm that?

#include <ESP8266WiFi.h>
#include <ArduinoOTA.h>
#include <EEPROM.h>
#include <AccelStepper.h>
#include <Adafruit_Fingerprint.h>

#define WLAN_Name "xxx"
#define WLAN_Passwort "xxx"
#define OTA_Passwort "xxx"

// Variablen Fingerprint Sensor
uint8_t id;
byte FingerID = 0;
byte AdminFinger = 0;
void (*resetFunc)(void) = 0;    //declare reset function at address 0
SoftwareSerial mySerial(5, 4);  // Soft-RX D1(gelb) Soft-TX D2(braun)
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

// Variablen Motor
const bool EEpromOn = 0;  // Soll Stromausfall während Bewegung detektiert werden? Achtung nur ca 10.000 Zyklen möglich! 0=AUS 1=AN

const byte StepPin = 15;  // D8
const byte DirPin = 13;   // D7
const byte ENPin = 12;    // D6

const int StepsRotation = 6400;  // 200 Steps x 32 Microsteps

byte SchluesselPos = 0;     // 0=Schlüssel links gedreht (Schnapper auf), 1=Schlüssel Nullstellung (Schnapper zu), 2= Schlüssel doppelt verriegelt
bool LockDoorSwitch = LOW;  // LOW = Schnapper, HIGH = Doppelt verriegelt                   ?????????
bool DoorOpen = HIGH;       // Reed Kontakt HIGH = Tür geöffnet, LOW = Tür geschlossen      ?????????

// Variablen Musik





void setup() {
  Serial.begin(115200);  // Serielle Ausgabe an

  //WLAN verbinden
  WiFi.begin(WLAN_Name, WLAN_Passwort);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Verbindung wird hergestellt...");
  }
  Serial.println("WLAN Verbunden!");

  // OTA Update einrichten
  ArduinoOTA.setHostname("Tuerschloss");
  ArduinoOTA.setPassword(OTA_Passwort);
  ArduinoOTA.begin();
  ArduinoOTA.handle();  // OTA Update starten

  FingerprintSetup();  // Fingerprint Sensor initialisieren

  // Falls EEprom aktiv, initialisieren, einlesen und auf Stromausfall prüfen
  if (EEpromOn == 1) {
    EEPROM.begin(4);  // EEprom initialisieren 4 Byte lang (minimum)
    // Für EEPROM resett nach Stromausfall Kommentar dieser 2 Zeilen einmalig entfernen
    /* 
    EEPROM.write(0, 255);  // Zum Schluss EEprom wieder auf 255 setzen
     EEPROM.commit();
    */
    if (EEPROM.read(0) == 0) {
      Error();  // EEprom war auf 0 also Stromausfall während Bewegung (Position unsicher, abschalten!)
    }
  }

  pinMode(StepPin, OUTPUT);
  pinMode(DirPin, OUTPUT);
  pinMode(ENPin, OUTPUT);

  digitalWrite(StepPin, LOW);  // ????????????????????????????????????????????
  digitalWrite(DirPin, LOW);   // ????????????????????????????????????????????
  digitalWrite(ENPin, LOW);    // ????????????????????????????????????????????
}


void loop() {
  ArduinoOTA.handle();  // OTA Update starten

  // *********** SCHALTER LOCKDOOR aus eeprom EINLESEN

  // START FINGERPRINT SENSOR LOOP
  getFingerprintID();  // Check Fingerprint
  Checkfinger();       // Entsprechend erkanntem Print handeln
}


void FingerprintSetup() {
  Serial.println("\n\nFinger detect test");
  finger.begin(57600);  // set the data rate for the sensor serial port
  delay(5);

  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor!");
    while (1) {
      Error();
    }
  }

  // LEDs aus falls noch an
  finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_BLUE);
  finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_RED);
  finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_PURPLE);

  // Einschaltsignal 10x15ms blau
  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 15, FINGERPRINT_LED_BLUE, 10);

  Serial.println(F("Reading sensor parameters"));
  finger.getParameters();
  Serial.print(F("Status: 0x"));
  Serial.println(finger.status_reg, HEX);
  Serial.print(F("Sys ID: 0x"));
  Serial.println(finger.system_id, HEX);
  Serial.print(F("Capacity: "));
  Serial.println(finger.capacity);
  Serial.print(F("Security level: "));
  Serial.println(finger.security_level);
  Serial.print(F("Device address: "));
  Serial.println(finger.device_addr, HEX);
  Serial.print(F("Packet len: "));
  Serial.println(finger.packet_len);
  Serial.print(F("Baud rate: "));
  Serial.println(finger.baud_rate);

  finger.getTemplateCount();

  if (finger.templateCount == 0) {
    Serial.print("Sensor doesn't contain any fingerprint Going to run 'enroll.");
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 100, FINGERPRINT_LED_RED, 50);
    delay(5000);
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_RED, 0);
    newfingerprint();
  } else {
    Serial.println("Waiting for valid finger...");
    Serial.print("Sensor contains ");
    Serial.print(finger.templateCount);
    Serial.println(" templates");
  }
}

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      FingerID = 0;
      AdminFinger = 0;
      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;
  }
  // fingerprint read ok

  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;
  }
  // fingerprint converted ok

  p = finger.fingerSearch();
  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");
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_RED, 10);
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }

  // found a match!
  Serial.print("Found ID #");
  Serial.print(finger.fingerID);
  Serial.print(" with confidence of ");
  Serial.println(finger.confidence);

  FingerID = finger.fingerID;

  return finger.fingerID;
}

// Add new fingerprint
void newfingerprint()  // run over and over again
{
  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 0);
  Serial.println("Ready to enroll a fingerprint!");
  Serial.println("Id will be given in order First finger print is Admin");
  finger.getTemplateCount();
  Serial.print("Sensor contains ");
  Serial.println(finger.templateCount);

  id = (finger.templateCount + 1);

  if (id == 0) {  // ID #0 not allowed, try again!
    Serial.println("first run setting id to 1");
    id = 1;
    return;
  }
  Serial.print("Enrolling ID #");
  Serial.println(id);

  while (!getFingerprintEnroll())
    ;
}

uint8_t getFingerprintEnroll() {

  int s = -1;
  Serial.print("Waiting for valid finger to enroll as #");
  Serial.println(id);

  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 0);
  while (s != FINGERPRINT_OK) {
    s = finger.getImage();
    switch (s) {
      case FINGERPRINT_OK:
        Serial.println("Image taken");
        finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 1);
        delay(2000);
        break;
      case FINGERPRINT_NOFINGER:
        break;
      case FINGERPRINT_PACKETRECIEVEERR:
        Serial.println("Communication error");
        break;
      case FINGERPRINT_IMAGEFAIL:
        Serial.println("Imaging error");
        break;
      default:
        Serial.println("Unknown error");
        break;
    }
  }

  // OK success!

  s = finger.image2Tz(1);
  switch (s) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return s;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return s;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return s;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return s;
    default:
      Serial.println("Unknown error");
      return s;
  }

  // Cherck if Finger already exists in Database and skip if so
  s = finger.fingerSearch();
  if (s == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find an existing match");
  } else if (s == FINGERPRINT_OK) {
    Serial.print("Found ID #");
    Serial.println(finger.fingerID);
    Serial.println("Known Fingerprint detected, skipping");
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 30, FINGERPRINT_LED_RED, 5);
    delay(2000);
    return s;
  }  // End of Check

  Serial.println("Remove finger");
  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_BLUE, 0);
  s = 0;
  while (s != FINGERPRINT_NOFINGER) {
    s = finger.getImage();
  }
  Serial.print("ID ");
  Serial.println(id);
  s = -1;
  Serial.println("Place same finger again");
  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 0);
  while (s != FINGERPRINT_OK) {
    s = finger.getImage();
    switch (s) {
      case FINGERPRINT_OK:
        Serial.println("Image taken");
        finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 1);
        break;
      case FINGERPRINT_NOFINGER:
        break;
      case FINGERPRINT_PACKETRECIEVEERR:
        Serial.println("Communication error");
        break;
      case FINGERPRINT_IMAGEFAIL:
        Serial.println("Imaging error");
        break;
      default:
        Serial.println("Unknown error");
        break;
    }
  }

  // OK success!

  s = finger.image2Tz(2);
  switch (s) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return s;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return s;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return s;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return s;
    default:
      Serial.println("Unknown error");
      return s;
  }

  // OK converted!
  Serial.print("Creating model for #");
  Serial.println(id);

  s = finger.createModel();
  if (s == FINGERPRINT_OK) {
    Serial.println("Prints matched!");
  } else if (s == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return s;
  } else if (s == FINGERPRINT_ENROLLMISMATCH) {
    Serial.println("Fingerprints did not match");
    newfingerprint();
    // return s;
  } else {
    Serial.println("Unknown error");
    return s;
  }

  Serial.print("ID ");
  Serial.println(id);
  s = finger.storeModel(id);
  if (s == FINGERPRINT_OK) {
    Serial.println("Stored!");

    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_BLUE, 20);
    finger.LEDcontrol(FINGERPRINT_LED_GRADUAL_ON, 200, FINGERPRINT_LED_BLUE);
    delay(2000);
    finger.LEDcontrol(FINGERPRINT_LED_GRADUAL_OFF, 200, FINGERPRINT_LED_BLUE);
    delay(2000);
    finger.LEDcontrol(FINGERPRINT_LED_GRADUAL_ON, 200, FINGERPRINT_LED_BLUE);
    delay(2000);
    finger.LEDcontrol(FINGERPRINT_LED_GRADUAL_OFF, 200, FINGERPRINT_LED_BLUE);
    delay(2000);

  } else if (s == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return s;
  } else if (s == FINGERPRINT_BADLOCATION) {
    Serial.println("Could not store in that location");
    return s;
  } else if (s == FINGERPRINT_FLASHERR) {
    Serial.println("Error writing to flash");
    return s;
  } else {
    Serial.println("Unknown error");
    return s;
  }
  return true;
}

void deletedata() {
  finger.emptyDatabase();
  Serial.println("All fingerprints Deleted");
  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 5, FINGERPRINT_LED_RED, 0);
  Serial.println("Doing a soft reset of the arduino");
  resetFunc();  //call reset
}

void Checkfinger() {
  if (FingerID == 1) {  // Adminfinger erkannt
    Serial.println("Admin Fingerprint detected");
    AdminFinger = (AdminFinger + 1);
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_BLUE, 1);
    if (AdminFinger == 5) {
      finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_PURPLE);
      delay(1000);
      getFingerprintID();
      if (FingerID == 0) {
        Serial.println("ADD NEW USER");
        newfingerprint();
      }
    }
    if (AdminFinger >= 10) {
      finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_RED);
      delay(1000);
      getFingerprintID();   // Prüfen ob Finger losgelassen
      if (FingerID == 1) {  // Wenn nicht, löschen und Reset
        Serial.println("DELETE ALL USERS");
        deletedata();
      }
      Serial.println("Doing a soft reset of the arduino");
      resetFunc();  //call reset
    }
  } else if (FingerID != 0) {
    Serial.println("Normal fingerprint detected");
    Movemotor();
  }
}

void Movemotor() {
  if (EEpromOn == 1) {   // Falls EEpromON Variable gesetzt
    EEPROM.write(0, 0);  // Vor Beginn EEprom auf 0 setzen (Stromausfallerkennung)
    EEPROM.commit();
    Serial.print("EEprom: ");
    Serial.println(EEPROM.read(0));
  }


  // WENN TÜRkontakt zu
  finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_BLUE);
  // HIER TÜR ÖFFNEN EINFÜGEN
  Serial.println("MOTORBEWEGUNG AN");
  delay(8000);
  Serial.println("MOTORBEWEGUNG AUS");
  // HIER TÜR SCHLIEßEN EINFÜGEN
  // ENDE WENN ENTWEDER DELAY RUM oder Tür AUF/ZU
  finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_BLUE);


  if (EEpromOn == 1) {     // Falls EEpromON Variable gesetzt
    EEPROM.write(0, 255);  // Zum Schluss EEprom wieder auf 255 setzen
    EEPROM.commit();
    Serial.print("EEprom: ");
    Serial.println(EEPROM.read(0));
  }
}

void Error() {
  Serial.println("FEHLER! LED AN, PROGRAMMENDE BIS RESET!");
  finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_RED);
  delay(600000);
}

And yes i know the eeprom is wearing out but I didnt find a better was to detect a power outage and therefore an unreliable key position.

So I decided to just replace the microprocessor after around 2 years once itwears out.

You used a SoftwareSerial in the code, but I don't see a corresponding include in it.
Does the code compiled?

The standard SoftwareSerial reported as unstable on ESP platform. Try to use Espsoftwareserial instead:

Thanks. Today I had to switch over to ESP32 since I ran out of pins to use so I used the second hardware serial there and no communication errror since that.

So I assume the problem as you said is the normal software serial.

Just to mention about the wearing out of the Flash....
I yesterday had the idea to save the variable online in the iot cloud probably.

Thats not wearing out the flash and should work for detection of power outage.

can you share the code? mine still error

Consider switching to Espsoftwareserial due to potential instability with standard SoftwareSerial on the ESP platform. Double-check your code for missing includes or compatibility issues. Ensure proper grounding and shielding to minimize interference causing communication errors. Keep experimenting and seeking assistance if needed!

Ican do that Later, once my pc is on

Here is my latest code.
But my code is pretty long by now since it's a not so small project.
It works but I want to incluge more things.

Maybe tell me about the exact Problem so I can help.

/*  TODO:
    1) Online Variable Stromausfall
*/

#include <WiFi.h>
//#include <Arduino_ConnectionHandler.h>
//#include <ArduinoIoTCloud.h>
#include <ArduinoOTA.h>
#include <HardwareSerial.h>
#include <Bounce2.h>
#include <AccelStepper.h>
#include <Adafruit_Fingerprint.h>
#include <DYPlayerArduino.h>
#include <EEPROM.h>

// Passwörter (WLAN etc.)
#define WLAN_Name "*******"
#define WLAN_Passwort "*******"
#define OTA_Passwort "*******"
#define BoardID "*******"
#define SecretKey "*******"

// Lautsprecher Lautstärke
#define Speaker_Volume 15  // 100% Lautstärke = 30
#define Sound_Random 1     // 0 = Sound wird der Reihenfolge nach abgespielt  1 = Sound wird zufällig abgespielt

//Alarmcounter
#define ACount 3  // Ab wievieltem Finger-Fehlversuch soll erstmalig Alarm ausgelöst werden (Reset durch erfolgreiche Türöffnung)

// Liste der Sounds
char *Sound[] = {
  "/Sound/1.mp3",  // AkteX
  "/Sound/2.mp3",
  "/Sound/3.mp3",
  "/Sound/4.mp3",
  "/Sound/5.wav",  // Wölfe
  "/Sound/6.mp3",
  "/Sound/7.mp3",
  "/Sound/8.mp3",
};
size_t Playlistsize = sizeof(Sound) / sizeof(Sound[0]);
int AktuellerSound = 0;

//Serielle Schnittstelle2 initialisieren
HardwareSerial SerialPort1(1);  // use UART1
HardwareSerial SerialPort2(2);  // use UART2

// Variable für Online (ioT Cloud)
bool DoorOnlineOpen;
bool OpenLED;
bool StromausfallSpeicher;

// Variablen Fingerprint Sensor
byte AlarmCount = 0;
uint8_t id;
byte FingerID = 0;
byte AdminFinger = 0;
void (*resetFunc)(void) = 0;  //declare reset function at address 0
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&SerialPort2);

// Variablen Schloss
const byte DoorOPENAlarm = 14;   // Reed Kontakt HIGH = Tür geöffnet, LOW = Tür geschlossen
const byte LockDoorSwitch = 22;  // LOW = Schnapper, HIGH = Doppelt verriegelt                                              ?????????
const byte OpenDoorButton = 23;  // Taster zum Tür öffnen (innen) HIGH = gedrückt

Bounce DBDoorOPENAlarm = Bounce();   // 3 Debounce objecte für Taster/Schalter initialisieren
Bounce DBLockDoorSwitch = Bounce();  // 3 Debounce objecte für Taster/Schalter initialisieren
Bounce DBOpenDoorButton = Bounce();  // 3 Debounce objecte für Taster/Schalter initialisieren

// Variablen Motor
const bool EEpromOn = 0;  // Soll Stromausfall während Bewegung detektiert werden? Achtung nur ca 10.000 Zyklen möglich! 0=AUS 1=AN

const byte MicroSteps = 4;                  // Eingestellte Microsteps am Stepper Controller
const byte MotorSteps = 200;                // 200 Hardware-Steps per Umdrehung des Motors
const int Steps = MotorSteps * MicroSteps;  // Gesamte reelle Steps Pro Umdrehung

const byte StepPin = 18;
const byte DirPin = 5;
const byte ENPin = 19;

const int Verriegeln = 2 * Steps;      // Anzahl Umdrehungen zum Verriegeln (aus Nullstellung des Schlüssels)
const int Oeffnen = -65 * MicroSteps;  // Anzahl Motorsteps * MicroSteps zum öffnen des Schnappers (aus Nullstellung des Schlüssels)       //////////////////////// NOCH ANPASSEN !!!!!!

AccelStepper Motor(1, StepPin, DirPin);  // AccelStepper Objekt Motor erstellen 1= Motortreiber verwenden

// Schlüsselpositionen
#define Nullstellung 0
#define Verriegelt 1
bool SchluesselPos = Nullstellung;  // 0=Schlüssel Nullstellung (Schnapper zu), 1=Schlüssel verriegelt

// Variablen LED
const byte LEDRed = 27;
const byte LEDGreen = 26;

// Musik initialisieren
DY::Player Music(&SerialPort1);  // Initialise the player on UART1, pins TX: 33, RX: 25.

void setup() {
  // LEDs initialisieren
  pinMode(LEDRed, OUTPUT);
  pinMode(LEDGreen, OUTPUT);
  digitalWrite(LEDRed, HIGH);   // HIGH = AUS
  digitalWrite(LEDGreen, LOW);  // LED auf Grün

  // Serielle Schnittstellen initialisieren
  Serial.begin(115200);                          // Serielle Ausgabe an
  SerialPort1.begin(9600, SERIAL_8N1, 33, 25);   // Serielle Schnittstelle 1 für Audio an
  SerialPort2.begin(57600, SERIAL_8N1, 16, 17);  // Serielle Schnittstelle 2 für Fingerprint Sensor an
  delay(1000);                                   // 1 Sek warten auf Schnittstelle

  // Sound initialisieren
  Music.begin();
  Music.setVolume(Speaker_Volume);           // Oben definiert bei define
  Music.setCycleMode(DY::PlayMode::OneOff);  // File einmal abspielen, dann stop

  //WLAN verbinden
  WiFi.begin(WLAN_Name, WLAN_Passwort);
  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
    digitalWrite(LEDGreen, !LEDGreen);  // LED invertieren (blinken)
    Serial.println("Verbindung wird hergestellt...");
  }
  Serial.println("WLAN Verbunden!");
  digitalWrite(LEDGreen, HIGH);  // LED aus

  /*
  ArduinoCloud.setBoardId(BoardID);
  ArduinoCloud.setSecretDeviceKey(SecretKey);
  ArduinoCloud.addProperty(DoorOnlineOpen, READWRITE, ON_CHANGE, onDoorOnlineOpenChange);
  ArduinoCloud.addProperty(OpenLED, READ, ON_CHANGE, NULL);
  ArduinoCloud.addProperty(StromausfallSpeicher, READWRITE, ON_CHANGE, NULL);

  WiFiConnectionHandler ArduinoIoTPreferredConnection(WLAN_Name, WLAN_Passwort);
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
*/

  // OTA Update einrichten
  ArduinoOTA.setHostname("Tuerschloss");
  ArduinoOTA.setPassword(OTA_Passwort);
  ArduinoOTA.begin();
  ArduinoOTA.handle();  // OTA Update starten

  FingerprintSetup();  // Fingerprint Sensor initialisieren

  ////////////////////////////////////////////////////////////////////////////////////////////// STROM-AUS VARIABLE ONLINE prüfen!

  // Falls EEprom aktiv, initialisieren, einlesen und auf Stromausfall prüfen
  if (EEpromOn == 1) {
    EEPROM.begin(4);  // EEprom initialisieren 4 Byte lang (minimum)
    // Für EEPROM resett nach Stromausfall Kommentar dieser 2 Zeilen einmalig entfernen
    /* 
    EEPROM.write(0, 255);  // Zum Schluss EEprom wieder auf 255 setzen
     EEPROM.commit();
    */
    if (EEPROM.read(0) == 0) {
      Error();  // EEprom war auf 0 also Stromausfall während Bewegung (Position unsicher, abschalten!)
    }
  }

  // Motorvariablen initialisieren
  pinMode(StepPin, OUTPUT);
  pinMode(DirPin, OUTPUT);
  pinMode(ENPin, OUTPUT);

  Motor.setEnablePin(ENPin);
  Motor.setMaxSpeed(6000);                    // 6000-8000 (max. ca. 8000)
  Motor.setAcceleration(4000);                // 1000 Steps/Sek = 1 Sek bis volle Geschwindigkeit. 4000 = 1/4 Sek
  Motor.setPinsInverted(false, false, true);  // Enable muss low sein um an zu sein

  // Taster uns Schalter initialisieren
  DBDoorOPENAlarm.attach(DoorOPENAlarm, INPUT_PULLUP);  // 0 = Tür geschlossen, 1 = Tür offen
  DBDoorOPENAlarm.interval(5);
  DBLockDoorSwitch.attach(LockDoorSwitch, INPUT_PULLUP);  // 0 = Schalter Position ?????????????????????????????????????????
  DBLockDoorSwitch.interval(5);
  DBOpenDoorButton.attach(OpenDoorButton, INPUT_PULLUP);  // 0 = Taster gedrückt
  DBOpenDoorButton.interval(5);
}


void loop() {
  ArduinoOTA.handle();  // OTA Update starten

  // ArduinoCloud.update();  // Online Taste aktualisieren

  DBLockDoorSwitch.update();              // Auslesen mit "!DBLockDoorSwitch.read()" (INVERTIERT! Dann 1= Schalter auf AN)
  if (!DBLockDoorSwitch.read() == 0) {    // Wenn Schalter auf Schnapper steht
    if (SchluesselPos == Nullstellung) {  // Falls schon auf Nullstellung
      digitalWrite(LEDRed, LOW);          // LED auf gelb
      digitalWrite(LEDGreen, LOW);
    } else if (SchluesselPos == Verriegelt) {  // Falls verriegelt entriegeln und LED auf gelb
      Serial.println("MOTOR AN");
      Motor.enableOutputs();
      Motor.runToNewPosition(Nullstellung);
      Motor.disableOutputs();
      Serial.println("MOTOR AUS");
      SchluesselPos = Nullstellung;
      digitalWrite(LEDRed, LOW);  // LED auf gelb
      digitalWrite(LEDGreen, LOW);
    }
  } else if (!DBLockDoorSwitch.read() == 1) {
    if (SchluesselPos == Verriegelt) {  // Falls schon verriegelt
      digitalWrite(LEDRed, LOW);        // LED auf rot
      digitalWrite(LEDGreen, HIGH);
    } else if (SchluesselPos == Nullstellung) {  // Falls noch auf Nullstellung und verriegeln eingestellt, auf eingestellte Position fahren
      Serial.println("MOTOR AN");
      Motor.enableOutputs();
      Motor.runToNewPosition(Verriegeln);
      Motor.disableOutputs();
      Serial.println("MOTOR AUS");
      SchluesselPos = Verriegelt;
      digitalWrite(LEDRed, LOW);  // LED auf rot
      digitalWrite(LEDGreen, HIGH);
    }
  }

  DBOpenDoorButton.update();  // Auslesen mit "!DBOpenDoorButton.read()" (INVERTIERT! Dann 1 = Öffnen)
  if (!DBOpenDoorButton.read() == 1) {
    DoorOpen();
    DBOpenDoorButton.update();  // Nach DoorOpen() Nochmal updaten ansonsten fährt er 2x durch DoorOpen()
  }

  // START FINGERPRINT SENSOR LOOP
  getFingerprintID();  // Check Fingerprint
  Checkfinger();       // Entsprechend erkanntem Print handeln
}


void FingerprintSetup() {
  Serial.println("\n\nFinger detect test");
  finger.begin(57600);  // set the data rate for the sensor serial port
  delay(5);

  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor!");
    Error();
  }

  // LEDs aus falls noch an
  finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_BLUE);
  finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_RED);
  finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_PURPLE);

  // Einschaltsignal 10x15ms blau
  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 15, FINGERPRINT_LED_BLUE, 10);

  Serial.println(F("Reading sensor parameters"));
  finger.getParameters();
  Serial.print(F("Status: 0x"));
  Serial.println(finger.status_reg, HEX);
  Serial.print(F("Sys ID: 0x"));
  Serial.println(finger.system_id, HEX);
  Serial.print(F("Capacity: "));
  Serial.println(finger.capacity);
  Serial.print(F("Security level: "));
  Serial.println(finger.security_level);
  Serial.print(F("Device address: "));
  Serial.println(finger.device_addr, HEX);
  Serial.print(F("Packet len: "));
  Serial.println(finger.packet_len);
  Serial.print(F("Baud rate: "));
  Serial.println(finger.baud_rate);

  finger.getTemplateCount();

  if (finger.templateCount == 0) {
    Serial.print("Sensor doesn't contain any fingerprint Going to run 'enroll.");
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 100, FINGERPRINT_LED_RED, 50);
    delay(5000);
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_RED, 0);
    newfingerprint();
  } else {
    Serial.println("Waiting for valid finger...");
    Serial.print("Sensor contains ");
    Serial.print(finger.templateCount);
    Serial.println(" templates");
  }
}

uint8_t getFingerprintID() {
  uint8_t p = finger.getImage();
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      FingerID = 0;
      AdminFinger = 0;
      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;
  }
  // fingerprint read ok

  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;
  }
  // fingerprint converted ok

  p = finger.fingerSearch();
  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");
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_RED, 10);
    AlarmCount += 1;             // Falscher Finger = AlarmCounter hochzählen
    if (AlarmCount >= ACount) {  // wenn Counter > Schwelle Alarm auslösen
      Music.setVolume(25);
      Music.playSpecifiedDevicePath(DY::Device::Sd, "/Alarm/Alarm.mp3");
      Music.setVolume(Speaker_Volume);
    }
    delay(1500);  // Delay 1,5 Sek, damit Finger nicht mehrfach erkannt wird
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }

  // found a match!
  Serial.print("Found ID #");
  Serial.print(finger.fingerID);
  Serial.print(" with confidence of ");
  Serial.println(finger.confidence);

  FingerID = finger.fingerID;

  return finger.fingerID;
}

// Add new fingerprint
void newfingerprint()  // run over and over again
{
  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 0);
  Serial.println("Ready to enroll a fingerprint!");
  Serial.println("Id will be given in order First finger print is Admin");
  finger.getTemplateCount();
  Serial.print("Sensor contains ");
  Serial.println(finger.templateCount);

  id = (finger.templateCount + 1);

  if (id == 0) {  // ID #0 not allowed, try again!
    Serial.println("first run setting id to 1");
    id = 1;
    return;
  }
  Serial.print("Enrolling ID #");
  Serial.println(id);

  while (!getFingerprintEnroll())
    ;
}

uint8_t getFingerprintEnroll() {

  int s = -1;
  Serial.print("Waiting for valid finger to enroll as #");
  Serial.println(id);

  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 0);
  while (s != FINGERPRINT_OK) {
    s = finger.getImage();
    switch (s) {
      case FINGERPRINT_OK:
        Serial.println("Image taken");
        finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 1);
        delay(2000);
        break;
      case FINGERPRINT_NOFINGER:
        break;
      case FINGERPRINT_PACKETRECIEVEERR:
        Serial.println("Communication error");
        break;
      case FINGERPRINT_IMAGEFAIL:
        Serial.println("Imaging error");
        break;
      default:
        Serial.println("Unknown error");
        break;
    }
  }

  // OK success!

  s = finger.image2Tz(1);
  switch (s) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return s;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return s;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return s;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return s;
    default:
      Serial.println("Unknown error");
      return s;
  }

  // Cherck if Finger already exists in Database and skip if so
  s = finger.fingerSearch();
  if (s == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find an existing match");
  } else if (s == FINGERPRINT_OK) {
    Serial.print("Found ID #");
    Serial.println(finger.fingerID);
    Serial.println("Known Fingerprint detected, skipping");
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 30, FINGERPRINT_LED_RED, 5);
    delay(2000);
    return s;
  }  // End of Check

  Serial.println("Remove finger");
  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_BLUE, 0);
  s = 0;
  while (s != FINGERPRINT_NOFINGER) {
    s = finger.getImage();
  }
  Serial.print("ID ");
  Serial.println(id);
  s = -1;
  Serial.println("Place same finger again");
  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 0);
  while (s != FINGERPRINT_OK) {
    s = finger.getImage();
    switch (s) {
      case FINGERPRINT_OK:
        Serial.println("Image taken");
        finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_PURPLE, 1);
        break;
      case FINGERPRINT_NOFINGER:
        break;
      case FINGERPRINT_PACKETRECIEVEERR:
        Serial.println("Communication error");
        break;
      case FINGERPRINT_IMAGEFAIL:
        Serial.println("Imaging error");
        break;
      default:
        Serial.println("Unknown error");
        break;
    }
  }

  // OK success!

  s = finger.image2Tz(2);
  switch (s) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return s;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return s;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return s;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return s;
    default:
      Serial.println("Unknown error");
      return s;
  }

  // OK converted!
  Serial.print("Creating model for #");
  Serial.println(id);

  s = finger.createModel();
  if (s == FINGERPRINT_OK) {
    Serial.println("Prints matched!");
  } else if (s == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return s;
  } else if (s == FINGERPRINT_ENROLLMISMATCH) {
    Serial.println("Fingerprints did not match");
    newfingerprint();
    // return s;
  } else {
    Serial.println("Unknown error");
    return s;
  }

  Serial.print("ID ");
  Serial.println(id);
  s = finger.storeModel(id);
  if (s == FINGERPRINT_OK) {
    Serial.println("Stored!");

    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_BLUE, 20);
    finger.LEDcontrol(FINGERPRINT_LED_GRADUAL_ON, 200, FINGERPRINT_LED_BLUE);
    delay(2000);
    finger.LEDcontrol(FINGERPRINT_LED_GRADUAL_OFF, 200, FINGERPRINT_LED_BLUE);
    delay(2000);
    finger.LEDcontrol(FINGERPRINT_LED_GRADUAL_ON, 200, FINGERPRINT_LED_BLUE);
    delay(2000);
    finger.LEDcontrol(FINGERPRINT_LED_GRADUAL_OFF, 200, FINGERPRINT_LED_BLUE);
    delay(2000);

  } else if (s == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return s;
  } else if (s == FINGERPRINT_BADLOCATION) {
    Serial.println("Could not store in that location");
    return s;
  } else if (s == FINGERPRINT_FLASHERR) {
    Serial.println("Error writing to flash");
    return s;
  } else {
    Serial.println("Unknown error");
    return s;
  }
  return true;
}

void deletedata() {
  finger.emptyDatabase();
  Serial.println("All fingerprints Deleted");
  finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 5, FINGERPRINT_LED_RED, 0);
  Serial.println("Doing a soft reset of the arduino");
  resetFunc();  //call reset
}

void Checkfinger() {
  if (FingerID == 1) {  // Adminfinger erkannt
    Serial.println("Admin Fingerprint detected");
    AdminFinger = (AdminFinger + 1);
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_BLUE, 1);
    if (AdminFinger == 5) {
      finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_PURPLE);
      delay(1000);
      getFingerprintID();
      if (FingerID == 0) {
        Serial.println("ADD NEW USER");
        newfingerprint();
      }
    }
    if (AdminFinger >= 10) {
      finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_RED);
      delay(1000);
      getFingerprintID();   // Prüfen ob Finger losgelassen
      if (FingerID == 1) {  // Wenn nicht, löschen und Reset
        Serial.println("DELETE ALL USERS");
        deletedata();
      }
      Serial.println("Doing a soft reset of the arduino");
      resetFunc();  //call reset
    }
  } else if (FingerID != 0) {
    Serial.println("Normal fingerprint detected");
    finger.LEDcontrol(FINGERPRINT_LED_FLASHING, 25, FINGERPRINT_LED_BLUE, 5);
    DoorOpen();
  }
}

void DoorOpen() {
  if (EEpromOn == 1) {   // Falls EEpromON Variable gesetzt
    EEPROM.write(0, 0);  // Vor Beginn EEprom auf 0 setzen (Stromausfallerkennung)
    EEPROM.commit();
    Serial.print("EEprom: ");
    Serial.println(EEPROM.read(0));
  }

  /////////////////////////////////////////////////////////////////////////////////////////// STROM-AUS VARIABLE ONLINE SPEICHERN!

  AlarmCount = 0;  // Alarmcounter zurücksetzen, da Tür erfolgreich geöffnet wurde
  Serial.println("MOTOR AN");
  Motor.enableOutputs();
  Serial.println("MOTOR öffnet");
  Motor.runToNewPosition(Oeffnen);
  digitalWrite(LEDRed, HIGH);  // LED auf grün
  digitalWrite(LEDGreen, LOW);
  finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_BLUE);  // Fingerprint LED AN

  while (DBDoorOPENAlarm.read() == 0) {  // Warten bis Tür geöffnet wurde
    DBDoorOPENAlarm.update();
    //////////////////////////////////////// Ggf. Zeit einfügen nach der autom. verriegelt wird
  }

  Music.playSpecifiedDevicePath(DY::Device::Sd, Sound[AktuellerSound]);  // Titel abspielen
  if (Sound_Random == 0) {                                               // Wenn Sound nach Playlist abspielt
    if (AktuellerSound == (Playlistsize - 1)) {                          // Wenn letzter Sound der Liste gerade gespielt wurde, wieder zum ersten springen, ansonsten zum nächsten in der Liste spulen
      AktuellerSound = 0;
    } else {
      AktuellerSound += 1;
    }
  } else if (Sound_Random == 1) {  // Wenn Sound zufällig ausgewählt abspielt
    AktuellerSound = random(0, (Playlistsize - 1));
    Serial.print("Nächster Sound ist Playlist Nr: ");
    Serial.println(AktuellerSound);
  }

  Serial.println("MOTOR Fährt auf Schnapper");
  Motor.runToNewPosition(Nullstellung);  // Sobald Tür geöffnet wurde Schnapper freigeben
  SchluesselPos = Nullstellung;
  finger.LEDcontrol(FINGERPRINT_LED_OFF, 0, FINGERPRINT_LED_BLUE);
  digitalWrite(LEDRed, LOW);  // LED auf gelb
  digitalWrite(LEDGreen, LOW);

  while (DBDoorOPENAlarm.read() == 1) {
    DBDoorOPENAlarm.update();  // Warten bis Tür geschlossen wurde
  }

  DBLockDoorSwitch.update();  // Auslesen mit "!DBLockDoorSwitch.read()" (INVERTIERT! Dann 1= Schalter auf AN)
  if (!DBLockDoorSwitch.read() == 1) {
    delay(500);  // Sicherheitshalber delay damit Tür auch ganz zu ehe verschlossen wird
    Serial.println("MOTOR verriegelt da eingestellt");
    Motor.runToNewPosition(Verriegeln);  // Falls verriegeln eingestellt, auf eingestellte Position fahren
    SchluesselPos = Verriegelt;
    digitalWrite(LEDRed, LOW);  // LED auf rot
    digitalWrite(LEDGreen, HIGH);
  }

  Music.stop();  // Musik stoppen (sobald Tür zu)

  Serial.println("MOTOR AUS");
  Motor.disableOutputs();

  /////////////////////////////////////////////////////////////////////////////////////////// STROM-AUS VARIABLE ONLINE ZURÜCKSETZEN

  if (EEpromOn == 1) {     // Falls EEpromON Variable gesetzt
    EEPROM.write(0, 255);  // Zum Schluss EEprom wieder auf 255 setzen
    EEPROM.commit();
    Serial.print("EEprom: ");
    Serial.println(EEPROM.read(0));
  }
  return;
}

void onDoorOnlineOpenChange() {  // Add your code here to act upon DoorOnlineOpen change
                                 //if (DoorOnlineOpen == 1) {
  DoorOpen();
  //}
}

void Error() {
  Serial.println("FEHLER! MOTOR AUS, LED AN, PROGRAMMENDE BIS RESET!");
  finger.LEDcontrol(FINGERPRINT_LED_ON, 0, FINGERPRINT_LED_RED);
  Motor.disableOutputs();
  digitalWrite(LEDGreen, HIGH);  // grüne LED aus
  digitalWrite(LEDRed, LOW);     // LED rot an
  while (1) {                    // LED rot blinken
    delay(300);
    digitalWrite(LEDRed, !LEDRed);  // LED rot invertieren (blinken)
    ArduinoOTA.handle();            // OTA Update starten
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.