Wemos D1 - Keypad mit Fingerabdrucksensor kompatibel machen

Moin, wir sitzen gerade an einem Uni-Projekt und sind Anfänger in dem Thema. Wir haben ein Problem bei der Programmierung unseres Wemos D1 und der Verwendung eines Fingerabdrucksensors und dem Keypad.
Wir haben zuvor ein Arduino Uno benutzt und haben jetzt auf den Wemos umgestellt (brauchten das Wlan-Modul). Beim Wechsel auf den Wemos D1, haben wir nun das Problem, dass der Fingerabdrucksensor nicht mehr so funktioniert wie er soll (Communication_error). Nach langem “Debuggen” haben wir herausgefunden, dass es an dem Zusammenspiel zwischen Keypad und Sensor liegt, da die Pinbelegung “kollidiert”. Auf dem Bild sieht man die Pinbelegung und was uns dort stutzig macht , ist, dass es zweimal den D12 und D13 gibt. Eine andere Belegung ist uns auf dem Board nicht möglich, da sonst das Keypad oder der Sensor nicht mehr erkannt werden. (Uns ist bewusst, dass wir Pin D1 und D2 auslassen müssen, aber wie wir diesen Fehler beheben, wissen wir nicht.)

Folgenden Wemos benutzen wir:

Wir laden auch nochmal ein Bild hoch, damit man unsere Belegung sehen kann.

Folgender Code funktioniert einwandfrei auf dem Arduino (natürlich statt D12, nur 12 usw.), aber nicht auf dem Wemos, da dort statt “no finger detected”, “Communication error” ausgegeben wird:

#include <Adafruit_Fingerprint.h>

#include <LiquidCrystal_I2C.h>

#include <Keypad.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
SoftwareSerial mySerial(D12,D13);

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);



const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//define the cymbols on the buttons of the keypads
char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {D9, D8, D7, D6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {D5, D4, D3, D0}; //connect to the column pinouts of the keypad

//initialize an instance of class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup() {
  Serial.begin(9600);
  lcd.begin();
  lcd.print("BBBBBBBBB");
  finger.begin(57600);
    if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
  } else {
    Serial.println("Did not find fingerprint sensor :(");
  }

  //How many fingerprints are stored inside sensor
  finger.getTemplateCount();
  if (finger.templateCount == 0) {
    Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.");
  }
  else {
    Serial.println("Waiting for valid finger...");
    Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
  }
}

void loop() {
  fingerprintDetection();
  //then detect keypad inputs
  keypadDetector();
  
}

void keypadDetector() {
  char customKey = customKeypad.getKey();

  switch (customKey) {
    case 'A': Serial.println("A");
      lcd.print(customKey);
      //Ereignis-Eintragen
      //      newAdminFingerprint();
      break;
    case 'B': Serial.println("B");
//      globalState = 2;
//      enrollNewUser();
      break;
    case 'C': Serial.println("C");
      break;
    case 'D': Serial.println("D");
      break;
    default: break;
  }
}

void fingerprintDetection() {
  getFingerprintID();
}

uint8_t getFingerprintID() {
  Serial.print("Hier bin ich");
  uint8_t p = finger.getImage();
  Serial.print("p= ");
  Serial.println(p);
  Serial.println(FINGERPRINT_PACKETRECIEVEERR);
  switch (p) {

    case FINGERPRINT_OK:
      Serial.println("Image taken");
      break;
    case FINGERPRINT_NOFINGER:
      Serial.println("No finger detected");
      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;
  }

  // OK success!

  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;
  }

  // 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 p;
  } else if (p == FINGERPRINT_NOTFOUND) {
    Serial.println("Did not find a match");
    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);

  return finger.fingerID;
}

// 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)  return -1;

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

Ihr könntet z.B. das Keypad über den PCF8574 an I2C betreiben und dadurch Pins frei bekommen.Funktioniert der Fingerabdrucksensor wenigstens allein am ESP?

Gruß Tommy

Moin Tommy, danke für die schnelle Antwort! Also: alleine am ESP funktioniert alles einwandfrei! Nur wenn die beiden zusammen angeschlossen werden, kommt das problem auf! Wir haben nur diesen einen I2C-Adapter und wüssten jetzt nicht genau, wie wir da noch das Keypad ranmachen können, oder wie meinst du das? Was halt auch für uns interessant wäre ist, was eigentlich genau das problem ist und warum genau der fehler dann auftritt.. Wir vermuten dass es mit den Anschlüssen D12 und D13 zu tun hat, weil die ja quasi zwei mal angesprochen werden können.

Ich sehe in Eurem Code keine doppelte Verwendung von D12 und D13, weil es D12 und D13 am Wemos D1 überhaupt nicht gibt und D12/D13 ist nicht gleich 12/13, denn 12/13 sind D6/D7.

Bei den ESP sollte man sich von vorn herein an die Schreibweise der GPIO-Nummern gewöhnen, also 12 anstelle von D6 / 13 anstelle von D7 usw.

Was hindert Euch daran, den PCF8574 an den I2C-Bus zum Display hinzu zu fügen?

Gruß Tommy

Ne das stimmt, wir benutzen D12 und D13 nicht doppelt, aber wenn du dir nochmal den WemosD D1 anschaust, dann siehst du, dass bei dem fünften Pin z.B. steht: D13/SCK/D5 . Und das irritiert uns, weil dann bei dem 13 Pin auch nochmal steht: D13/SCK . Warum das doppelte D13, obwohl zwei unterschiedliche Pins? Von den GPIO-Nummern haben wir auch schon gehört, bzw. die angewendet, aber eigentlich funktioniert es immer einwandfrei, wenn wir bei dem Wemos statt 12, D12 übergeben und der Fingerabdrucksensor wird ja auch mit
SoftwareSerial mySerial(D12,D13); an Pin 12 und 13 erkannt. Nur das Zusammenspiel mit dem Keypad funktioniert beim Wemos halt nicht mehr. Zu deinem Vorschlag mit dem PCF8574 müssen wir sagen, dass wir gar nicht wussten, dass es so einfach geht. Also meinst du, dass wir quasi die 8 Stecker vom Keypad in das Brettboard stecken und quasi zwischen das lcd display und i2c adapter machen? Meinst du mit dem PCD8574 den überhaupt den I2C-Adapter, so haben wir es gerade verstanden. Wenn nicht, wäre es nett, wenn du es etwas näher erklären könntest, was wir genau machen sollten.

LG Niko

Ihr braucht natürlich einen eigenen PCF8574 für das Keypad, das Ihr auch auf eine andere I2C-Adresse einstellen müsst, als das vom Display.
Wenn Ihr mal "PCF8574 Keypad" in die Suchmaschine Eurer Wahl eingebt, werdet Ihr mögliche Lösungen finden. Schließlich wollt Ihr ja eine Studienarbeit (positiv) benotet haben und nicht wir.

Detailfragen, werden gern beantwortet, aber es muss auch Lösungsinitiative von Euch zu merken sein.

Übrigens viele Profs/Assistenten lesen die einschlägigen Foren mit. Also nicht fremde Leistungen als eigene ausgeben wollen :wink: Das könnte in Plagiatsproblemen enden.
Damit will ich Euch nichts unterstellen. Das soll nur ein allgemeiner Hinweis sein.

Gruß Tommy

Okay, ja den haben wir leider nicht! :confused: Das war so ein bisschen die Frage! :smiley: Ja das Problem ist auch eher, dass wir uns ein bisschen alleine gelassen fühlen, da wir quasi unseren Prof nicht mehr erreichen können. Hast du denn eine Antwort zu den Pins mit D12 und D13. Eine interessante Sache könnte auch noch sein, dass der Sensor beim ersten Funktionsaufruf noch normal funktioniert und erst wenn die KeypadDetector-Funktion aufgerufen wird, den Error ausgibt. Wir versuchen wirklich seit Stundne hier weiterzukommen, aber es funktioniert einfach nicht.

Und bitte darauf achten, der Wemos (ESP8266) kann als I2C nur Master sein. Daher muss der PCF8574 per IRQ dem ESP mitteilen, dass dieser Daten hat.

Aber mal eine Grundsätzliche Frage, warum bleibt Ihr mit eurem Projekt nicht auf dem Uno und übertragt die erforderlichen Daten an den Wemos per I2C oder seriell ?

@HotSystems Der TO schrieb was von WLan.
Meiner Meinung braucht es kein IRQ da das Tastaturfeld als Matrix abgefragt wird und das Display nr daten bekommt aber keine gibt.
@nikojamoin ein I2C Expander wie der PCF8574 kostet weniger als die Zeit die Du und wier verplempern um eine Lösung zu finden. Auch ein PCF8574 Display Adapter kann als Tastaturinterface mißbraucht werden. Vieleicht habt ihr ein zweites.
Grüße Uwe

uwefed:
@HotSystems Der TO schrieb was von WLan.
Meiner Meinung braucht es kein IRQ da das Tastaturfeld als Matrix abgefragt wird und das Display nr daten bekommt aber keine gibt.

Ja, normal nicht.
Aber ist dir bekannt, was der im WLan noch so alles machen soll ?
Bisher sind die Informationen noch alle sehr dürftig, was auch daran liegt, das der TO Anfänger ist.

nikojamoin:
Hast du denn eine Antwort zu den Pins mit D12 und D13.

Das habe ich ja schon geschrieben: Die gibt es auf dem WEMOS D1 mini nicht.
Baut Euer System komplett auf GPIO-Nummern um, wenn Ihr ESP verwendet.
Dann seht Ihr auch die Doppelbelegungen eindeutig und Doppelbelegungen funktionieren nicht.

Dass Ihr Euren Prof nicht erreicht, ist zwar nicht schön, aber eher das Problem Eurer Hochschule/Uni, als unseres.

Evtl. kannst Du uns mal das Pinout zeigen, wo Du 2 mal D12/D13 siehst.

Gruß Tommy

Fakt ist, der Wemos hat nicht genug Pins um das Tastenfeld direkt anzusteuern.
Der hat nur 6 echte GPIO, die anderen sind nur mit Vorsicht zu nutzen.

Also entweder auf I2C umsteigen oder den Uno mit dem Wemos verbinden.

Wann musst ihr fertig sein ?

HotSystems:
Und bitte darauf achten, der Wemos (ESP8266) kann als I2C nur Master sein. Daher muss der PCF8574 per IRQ dem ESP mitteilen, dass dieser Daten hat.

Aber mal eine Grundsätzliche Frage, warum bleibt Ihr mit eurem Projekt nicht auf dem Uno und übertragt die erforderlichen Daten an den Wemos per I2C oder seriell ?

Weil wir gerne alles über ein Gerät machen wollten und uns unser Prof den Wemos ans Herz gelegt hat. Jetzt wollten wir heute switchen von Uno auf Wemos und dann funktionieren diese beiden Module nicht miteinander, obwohl es auf dem Uno funktioniert. Wir sitzen einfach seit 5 Stunden daran, überhaupt erstmal genau herauszufinden, was den Fehler auslöst und können nirgendswo eine Antwort herbekommen. Wir vermuten halt ganz stark, dass es mit den Pins zu tun hat und dass da etwas kollidiert (wir wissen ja auch immer nicht genau, warum doppelt D13 beschriftet ist etc..). Ich habe gerade auch schon gesagt, wenn wir einfach den eigentlichen Fehler nicht finden können, müssen wir die beiden miteinander verbinden, aber dann müssen wir uns das erstmal wieder aneignen und wir haben nicht mehr so viel Zeit(ich weiß eigene Schuld, aber so ist das jetzt halt):confused:

Das mit dem I2C werden wir in so kurzer Zeit nicht umsetzen können, weil wir uns dann erstmal die Sachen kaufen müssen etc..

Edit: Ich weiß es ja auch zu schätzen, dass ihr euch Zeit nehmt und die Dinge vorschlagt! Ich würde nur so gerne die Lösung des Problems kennen. Warum kann der Uno die beiden im Zusammenspiel laufen lassen, aber der Wemos nicht. Es muss ja an den Pins liegen:/

Edit2: Sorry ich kann nur alle 5 Minuten schreiben:D @Tommy, wir benutzen keinen Mini, wenn du im Original Post guckst, habe ich den Wemos verlinkt, den wir benutzen. :slight_smile:

Da ist aber auch der ESP8266 -12 drauf und der hat eben nur eine begrenzte Anzahl GPIO die direkt genutzt werden können, und das sind 6 Stk.

@Tommy56 da hast du Recht, sollte auch nicht so rüberkommen, als sollte das euer Problem sein!

@HotSystems alles klar, also wir würden dann so vorgehen und jetzt den uno mit dem wemos verbinden und dann alles bis auf die wlan funktionalität auf den uno packe.
Ich muss aber gerade gestehen, dass ich überhaupt keine Ahnung habe wie man das macht und ich einfach dankbar für einen hilfreichen Link bin, der mir das erklären könnte. Ich google hier gerade schon rum, aber finde irgendwie echt wenig bis nichts

nikojamoin:
@Tommy, wir benutzen keinen Mini, wenn du im Original Post guckst, habe ich den Wemos verlinkt, den wir benutzen. :slight_smile:

Ach Du große Sch...e. Was habt Ihr Euch denn da angelacht? Habt Ihr dazu überhaupt schon mal ein aussagekräftiges Pinout gefunden, was wirklich an den Pins anliegt?

Gruß Tommy

Zur I2C-Verbindung WEMOS D1 mini / NodeMCU zu UNO/Nano habe ich mal eine Machbarkeitsstudie gemacht.
Da braucht Ihr aber immer noch einen I2C-Pegelwandler (sonst stirbt der ESP gerade bei der Vorführung)

Evtl. kenn hier ja jemand das ominöse Board aus der Threaderöffnung.

Gruß Tommy

Ok, auch wenn ich mit dieser Art fast allein hier stehe :wink: sehe ich das aktuell als gangbaren Weg.

Die Verbindung beider Controller baut ihr seriell auf, auf beiden Seiten mit SoftwareSerial.
Damit könnt ihr die gemessenen Daten an den Wemos übertragen und da weiter machen.
Ich bin derzeit nicht am PC und habe keine passenden Links hier, bin mir aber sicher, dass Tommy gleich einen Link für die serielle Übertragung postet.
Das wird dann funktionieren. Ich arbeite aktuelle auch an einem Projekt, da habe ich 4 Uno mit jeweils einem Wemos D1 mini verbunden und diese tauschen dann Daten per WLan aus.

Also kein Problem, das wird schon.

Tommy56:
Zur I2C-Verbindung WEMOS D1 mini / NodeMCU zu UNO/Nano habe ich mal eine Machbarkeitsstudie gemacht.
Da braucht Ihr aber immer noch einen I2C-Pegelwandler (sonst stirbt der ESP gerade bei der Vorführung)

Evtl. kenn hier ja jemand das ominöse Board aus der Threaderöffnung.

Gruß Tommy

Tommy, das ist für viele sicher der bessere Weg, aber lass es doch seriell machen, gibt echt weniger Probleme.

Bei seriell kann ich kein Beispiel beisteuern, nur eine allgemeine Leseroutine in den Zeichenketten-Infos. Aber auch da ist ein Pegelwandler notwendig.

Ich habe die Befürchtung, dass dieses ominöse Board in der IDE überhaupt nicht einstellbar ist. Ich wüßte nicht, welches ich da nehmen sollte. Damit ist es auch nicht wirklich programmierbar.

@TO: Welches Board habt Ihr in den Einstellungen der IDE gewählt?

Gruß Tommy