So you're a Noob? Post your questions here until you graduate! Don't be shy.

User avatar
By Marc BOettinger
#91173 Hi,

I know softserial is unstable. Anyhow, I'm trying to connect my esp12f since many hours to connect to an fingerprint. I enrolled the fingerprints via an pro mini, did set an passwort, everything fine.

But connecting to the esp-12f doesn't work. It simply goes into the OTA Update. Here is my sketch:

Code: Select all/***************************************************
  This is an example sketch for our optical Fingerprint sensor

  Designed specifically to work with the Adafruit BMP085 Breakout
  ----> http://www.adafruit.com/products/751

  These displays use TTL Serial to communicate, 2 pins are required to
  interface
  Adafruit invests time and resources providing this open source code,
  please support Adafruit and open-source hardware by purchasing
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries. 
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#include <Adafruit_Fingerprint.h>
#include <SPI.h>
#include <Wire.h>
#include <WiFiClient.h>
#include <PubSubClient.h> // Aus Wifi Mqtt
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoOTA.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 13);
//tx - mosi PIN 13  - rc503 grün - rx
//rx - miso PIN 12  - rc503 gelb - tx


Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial, "myPasswordInDigits");

//************************************************************************
/* Set these to your desired credentials. */
const char *ssid = "ssid";  //ENTER YOUR WIFI SETTINGS
const char *password = "mypassword";
const char* mqttServer = "mymqtt"; // Broker PI
const int mqttPort = 1883; // Broker PI Port
const char* mqttUser = "FP"; // Broker PI Name
const char* mqttPassword = "pwd"; // Broker PI Password

WiFiClient espClient;
PubSubClient client(espClient);
char* mqttio = "12345"; // Broker PI Wert
char* confidence = "67890"; // Broker PI Wert

uint8_t id;


//************************************************************************


void setup() 
{
  // Serial.begin(115200);
  // Serial.println("\n\nConnect to Wifi");
  connectToWiFi();

    // mqtt
  client.setServer(mqttServer, mqttPort);
  client.setCallback(callback);
 
  while (!client.connected()) {
  // Serial.println("Connecting to MQTT...");
 
  if (client.connect("ESP8266Client", mqttUser, mqttPassword )) {
 
    // Serial.println("connected"); 
 
  } else {
 
    // Serial.print("failed with state ");
    // Serial.print(client.state());
    // Serial.print("looking for update ");

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    } else { // U_FS
      type = "filesystem";
    }

    // NOTE: if updating FS this would be the place to unmount FS using FS.end()
    Serial.println("Start updating " + type);
  });
    ArduinoOTA.begin();
    while(1) {
      ArduinoOTA.handle();
      delay(50);
    }
 
  }
  }

 
 
  // Serial.println("\n\nAdafruit finger detect test");
  // set the data rate for the sensor serial port

  delay(1000);

  mySerial.begin(57600, SWSERIAL_8N1, 12, 13, false, 256, 256);
 
  finger.begin(57600);
 
  if (finger.verifyPassword()) {
    // Serial.println("Found fingerprint sensor!");
    // send command to turn on R503 led
    finger.led_control(1,100,2,1); // code(1-6),speed(1-255),color(1-R/2-B/3_P),time(1-255)

  } else {
    // Serial.println("Did not find fingerprint sensor :(");

   client.subscribe("Error");
   client.publish("Error", "No FP");

   
    delay(60000);
   
    // Serial.print("failed with state ");
    // Serial.print(client.state());
    // Serial.print("looking for update ");

  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH) {
      type = "sketch";
    } else { // U_FS
      type = "filesystem";
    }

    // NOTE: if updating FS this would be the place to unmount FS using FS.end()
    Serial.println("Start updating " + type);
  });
    ArduinoOTA.begin();
    while(1) {
      ArduinoOTA.handle();
      delay(50);
    }
   
  }

  finger.getTemplateCount();
  // Serial.print("Sensor contains "); // Serial.print(finger.templateCount); // Serial.println(" templates");
  // Serial.println("Waiting for valid finger...");

 
  client.subscribe("Fingerprint");
  client.publish("Fingerprint", "FP1");
 
}


void callback(char* topic, byte* payload, unsigned int length) {

// Serial.print("Message arrived in topic: ");
// Serial.println(topic);

// Serial.print("Message:");
for (int i = 0; i < length; i++) {
// Serial.print((char)payload[i]);
}

// Serial.println();
// Serial.println("-----------------------");

}


void loop()                     // run over and over again
{
  //check if there's a connection to WiFi or not
  if(WiFi.status() != WL_CONNECTED){
    connectToWiFi();
  }

  if (!client.connected()) {
    client.connect("ESP8266Client", mqttUser, mqttPassword );
  }
   
  if (getFingerprintIDez() == 9)  {
    delay(2000);
    getFingerprintEnroll();
  }
  delay(50);            //don't ned to run this at full speed.
}


// returns -1 if failed, otherwise returns ID #
int 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) {
    // send command to turn on R503 led
    finger.led_control(1,100,1,3); // code(1-6),speed(1-255),color(1-R/2-B/3_P),time(1-255)

    return -1;
  }
 
  // found a match!
  // Serial.print("Found ID #"); // Serial.print(finger.fingerID);
  // Serial.print(" with confidence of "); // Serial.println(finger.confidence);
  // send command to turn on R503 led
  finger.led_control(1,100,2,3); // code(1-6),speed(1-255),color(1-R/2-B/3_P),time(1-255)

  // mqtt
 
  sprintf(mqttio,"%d",finger.fingerID);
  sprintf(confidence,"%d",finger.confidence);
   
  client.subscribe("Confidence");
  client.publish("Confidence", confidence);
   
  client.subscribe("FingerprintNr");
  client.publish("FingerprintNr", mqttio);

  return finger.fingerID;
}

void connectToWiFi(){
    WiFi.mode(WIFI_OFF);        //Prevents reconnection issue (taking too long to connect)
    delay(1000);
    WiFi.mode(WIFI_STA);
    // Serial.print("Connecting to ");
    // Serial.println(ssid);
    WiFi.begin(ssid, password);
 
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      // Serial.print(".");
    }
    // Serial.println("");
    // Serial.println("Connected");
   
   
    // Serial.print("IP address: ");
    // Serial.println(WiFi.localIP());  //IP address assigned to your ESP
}







uint8_t getFingerprintEnroll() {

  // send command to turn on R503 led
  finger.led_control(1,100,3,3); // code(1-6),speed(1-255),color(1-R/2-B/3_P),time(1-255)

  id = min(finger.templateCount + 1, 127);
  int p = -1;
  // Serial.print("Waiting for valid finger to enroll as #"); // Serial.println(id);
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      // Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      // Serial.println(".");
      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!

  p = finger.image2Tz(1);
  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;
  }

  // send command to turn on R503 led
  finger.led_control(1,100,3,3); // code(1-6),speed(1-255),color(1-R/2-B/3_P),time(1-255)

 
  // Serial.println("Remove finger");
  delay(2000);
  p = 0;
  while (p != FINGERPRINT_NOFINGER) {
    p = finger.getImage();
  }
  // Serial.print("ID "); // Serial.println(id);
  p = -1;
  // Serial.println("Place same finger again");
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
    case FINGERPRINT_OK:
      // Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      // Serial.print(".");
      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!

  // send command to turn on R503 led
  finger.led_control(1,100,3,3); // code(1-6),speed(1-255),color(1-R/2-B/3_P),time(1-255)

  p = finger.image2Tz(2);
  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;
  }
 
  // OK converted!
  // Serial.print("Creating model for #");  // Serial.println(id);
 
  p = finger.createModel();
  if (p == FINGERPRINT_OK) {
    // Serial.println("Prints matched!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    // Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_ENROLLMISMATCH) {
    // Serial.println("Fingerprints did not match");
    return p;
  } else {
    // Serial.println("Unknown error");
    return p;
  }   
 
  // Serial.print("ID "); // Serial.println(id);
  p = finger.storeModel(id);
  if (p == FINGERPRINT_OK) {
    // Serial.println("Stored!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    // Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_BADLOCATION) {
    // Serial.println("Could not store in that location");
    return p;
  } else if (p == FINGERPRINT_FLASHERR) {
    // Serial.println("Error writing to flash");
    return p;
  } else {
    // Serial.println("Unknown error");
    return p;
  }   
}


Any help is appreciated.

Marc