ESP-12f und Fingerprint

Begonnen von MBHG, 23 April 2021, 08:55:58

Vorheriges Thema - Nächstes Thema

MBHG

Guten Morgen,

ich bastle schon seit längerer Zeit an einem ESP-12f und einem Fingerprint (r503 operiert auf 3.3v) und bin fast am verzweifeln.

Der Fingerprint ist mit dem ESP wie folgt verbunden:

tx - mosi PIN 13  - rc503 gelb - tx
rx - miso PIN 12  - rc503 grün - rx


rx - mosi PIN 13  - rc503 gelb - tx
tx - miso PIN 12  - rc503 grün - rx

Ich nutze das SoftwareSerial und bekomme einfach keine Verbindung. Die Rückmeldung über MQTT ist, dass kein Fingerprint verbunden ist. Prinzipiell funktioniert der Fingerprint. Hat  jemand einen Tipp für mich?

/***************************************************
  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(13, 12);
//tx - mosi PIN 13  - rc503 gelb - tx
//rx - miso PIN 12  - rc503 grün - rx


Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);

//************************************************************************
/* Set these to your desired credentials. */
const char *ssid = "myssid";  //ENTER YOUR WIFI SETTINGS
const char *password = "mypwd";
const char* mqttServer = "myip"; // Broker PI
const int mqttPort = 1883; // Broker PI Port
const char* mqttUser = "FP"; // Broker PI Name
const char* mqttPassword = "mymqpwd"; // 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, 13, 12, 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;
  }   
}







-----------------------------------------------------------
https://smarthome.family.blog Debian Linux, NanoCUL 868, Signalduino, 4x HM-SW4, 11x HM Asksin Unisensor, NodeMCU ESP8266, RCS 1000 N Comfort, Magic Home, Rauchmelder PT2262, Babble

frank

normaler weise werden doch rx/tx gekreuzt.
also, was der eine bei tx labert, soll der andere bei rx hören.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

MBHG

Hi Frank,

im Code ist es richtig, in meinem Kommentar falsch. Sorry, ich korrigiere es.

Gruss Marc
-----------------------------------------------------------
https://smarthome.family.blog Debian Linux, NanoCUL 868, Signalduino, 4x HM-SW4, 11x HM Asksin Unisensor, NodeMCU ESP8266, RCS 1000 N Comfort, Magic Home, Rauchmelder PT2262, Babble

Papa Romeo

#3
Hallo MBHG,

ich denke du nutzt den Hardware SPI, da ich jetzt in deinem Programm auf Anhieb für SPI keine andere Zuweisung sehen kann ...

...leg mal Gelb vom Fingerprint auf GPIO14 und ändere SoftwareSerial auf mySerial(14, 12) ab und nutze Software SPI.

hier auch nochmal ein Beispielprogramm https://smarthome.family.blog/2020/09/18/fingerprint-r503-esp-mqtt-fhem/

LG
Papa Romeo
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

MBHG

Hi Papa Romeo,

ich nutze das Softserial. Das HardwareSerial habe ich auch schon angetestet, aber hatte kein Erfolg.

Zitat von: Papa Romeo am 23 April 2021, 09:44:09
hier auch nochmal ein Beispielprogramm https://smarthome.family.blog/2020/09/18/fingerprint-r503-esp-mqtt-fhem/

Lustig, ist Deine Referenz auf meinen Blog - es gibt also Leute die es lesen ;D. In der Tat hatte ich es letztes Jahr einmal zum Laufen bekommen, aber es mit dem Setup in dem Link tut  es nicht mehr. Dann bin ich auf die Pins 12 und 13 umgestiegen oder auch das Hardwareserial. Aber das tut leider auch nicht.

Lieben Gruss Marc

-----------------------------------------------------------
https://smarthome.family.blog Debian Linux, NanoCUL 868, Signalduino, 4x HM-SW4, 11x HM Asksin Unisensor, NodeMCU ESP8266, RCS 1000 N Comfort, Magic Home, Rauchmelder PT2262, Babble

Papa Romeo

Zitat von: MBHG am 23 April 2021, 10:10:06
ich nutze das Softserial. Das HardwareSerial habe ich auch schon angetestet, aber hatte kein Erfolg.

Hallo Marc,

... zu was hast du dann #include <SPI.h> in deinem Programm.

Der Hardware SPI belegt doch auch die GPIO´s 12, 13 und 14, wie dein mySerial ...

LG
Papa Romeo
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

MBHG

Hallo Papa Romeo,

super Punkt. Wenn ich es raus nehme, klappt es leider immer noch nicht  :(

Gruss Marc
-----------------------------------------------------------
https://smarthome.family.blog Debian Linux, NanoCUL 868, Signalduino, 4x HM-SW4, 11x HM Asksin Unisensor, NodeMCU ESP8266, RCS 1000 N Comfort, Magic Home, Rauchmelder PT2262, Babble

Papa Romeo

#7
Hallo Marc,

ich weiß jetzt nicht wie´s beim ESP8266 ist, aber bei manchen MCU´s gibt´s da Limitationen, dass nicht alle GPIO´s, z.B. auch 13, als RX verwendet werden können.

https://www.arduino.cc/en/Reference/SoftwareSerial

Ich würd einfach mal 12 und 13 tauschen und testen.

LG
Papa Romeo
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

MBHG

Hallo Papa Romeo,

ich hab mich erkundigt, PIN 12 und 13 müssten klappen, genauso wie PIN 12 und 14. Habe schon x-fach getauscht. Muss also anerkennen, dass es wohl an etwas anderem liegt. Mal sehen.

Gruss Marc
-----------------------------------------------------------
https://smarthome.family.blog Debian Linux, NanoCUL 868, Signalduino, 4x HM-SW4, 11x HM Asksin Unisensor, NodeMCU ESP8266, RCS 1000 N Comfort, Magic Home, Rauchmelder PT2262, Babble

habeIchVergessen

ESP-SDK Version seit dem letzten Test geändert?

MBHG

Zitat von: habeIchVergessen am 25 April 2021, 20:12:09
ESP-SDK Version seit dem letzten Test geändert?

Eigentlich nicht. Vielleicht ist der ESP hinüber. Ich hab mal nen neuen bestellt. Der Fingerprint tut mit einem Pro Mini.
-----------------------------------------------------------
https://smarthome.family.blog Debian Linux, NanoCUL 868, Signalduino, 4x HM-SW4, 11x HM Asksin Unisensor, NodeMCU ESP8266, RCS 1000 N Comfort, Magic Home, Rauchmelder PT2262, Babble

MBHG

Ich hab ne Vermutung. Im Testaufbau wo er funktionierte hatte ich ihn direkt am fetten Netzteil. Danach am Spannungsregler. Vermutlich fehlt der 100uF. Der esp zwingt beim Einschalten / WLAN den r503 in die Knie...
Gruss
-----------------------------------------------------------
https://smarthome.family.blog Debian Linux, NanoCUL 868, Signalduino, 4x HM-SW4, 11x HM Asksin Unisensor, NodeMCU ESP8266, RCS 1000 N Comfort, Magic Home, Rauchmelder PT2262, Babble

Papa Romeo

#12
Zitat von: MBHG am 27 April 2021, 19:04:51
Der esp zwingt beim Einschalten / WLAN den r503 in die Knie...

Kann ich mir eigentlich nicht vorstellen. Wenn der ESP die 3.3 Volt in die Knie zwingen würde, dürfte er selber auch nicht booten bzw. in einer Bootschleife hängen.

Wieviel bringt deine jetzige Spannungsversorgung ?

Hast du mal versucht unter  - void setup() - die Initialisierung des Fingerprint vor ... connectToWiFi();  zu legen ?

LG
Papa Romeo
...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary

MBHG

Hi Papa Romeo,

ja, das mit dem WiFi habe ich abgeändert. Schalte es erst hinterher ein. Allerdings habe ich Mal einen debug gestartet. Da sehe ich WiFi Aktivitäten vor dem Connecttowifi.

Mein alter Script tut auch nicht mehr. Ich vermute inzwischen ein Hardware Issue. Softwaretechnisch habe ich so viel probiert.

Der fp tut an einem Pro Mini. Hier wird ähnliches berichtet. https://forum.iobroker.net/topic/23398/fingerprint-an-einem-esp8266/20



-----------------------------------------------------------
https://smarthome.family.blog Debian Linux, NanoCUL 868, Signalduino, 4x HM-SW4, 11x HM Asksin Unisensor, NodeMCU ESP8266, RCS 1000 N Comfort, Magic Home, Rauchmelder PT2262, Babble

Papa Romeo

Zitat von: MBHG am 28 April 2021, 06:33:26
Der fp tut an einem Pro Mini... 

...vielleicht ist das ja der "Knackpunkt" und doch ein Spannungsproblem. Der Pro Mini arbeitet mit 5 Volt. Der ESP mit nur 3.3 Volt.

Ist es eventuell möglich dass der Fingerprint, entgegen seinen Spezifikationen, an 3.3 Volt nicht so optimal funktioniert und doch 5 Volt benötigt ?

... bin mal auf die Suche gegangen und habe dazu das hier gefunden...

ZitatThe above circuit diagram shows how an Fingerprint Sensor is interfaced with NodeMCU ESP8266 12E Board. The fingerprint sensor is connected to UART pins D5 & D6. The fingerprint sensor Tx and Rx wires color may vary. In my case, the color is yellow and blue where yellow is Tx and Blue is Rx. So connect it by finding appropriate color wires else the module won't be detected by NodeMCU.

The R305 fingerprint sensor is supplied with 5V through Vin pins of NodeMCU. In my case, the sensor didn't work at 3.3V.

LG
Papa Romeo

...die richtige Lötspitzentemperatur prüft man zwischen Daumen und Zeigefinger.
...überlasse niemals etwas einer Software, das du hardwaremässig erreichen kannst.
...unvorsichtige Elektriker werden schnell zu leitenden Angestellten.
und...never change a running System...no Updates if not necessary