Módulo de huellas dactilares y Bluetooth HC-06

Hola, estoy haciendo un proyecto en el que uso un módulo de huellas dactilares y uno de Bluetooth. Tengo este código:

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>


SoftwareSerial Donna(2, 3);  
SoftwareSerial bluetooth(7, 8); 

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Donna);

void setup() {

  pinMode(3, OUTPUT);
  
  Serial.begin(9600);
  bluetooth.begin(9600);
  delay(100);

  finger.begin(57600);
  delay(5);
  if (finger.verifyPassword()) {
    Serial.println("Sensor de huella detectado >:)");
  } else {
    Serial.println("No hay comunicación con el sensor de huella >:(");
    Serial.println("Revisa las conexiones...");
    while (1) { delay(1); }
  }

  finger.getTemplateCount();
  Serial.print("El sensor contiene "); 
  Serial.print(finger.templateCount); 
  Serial.println(" plantillas");
  Serial.println("Esperando por una huella válida... >:|");
}

void loop() {

  if (bluetooth.available()) {
    char data = bluetooth.read();
    Serial.print("Received: ");
    Serial.println(data);
  }

  if (Serial.available()) {
    char data = Serial.read();
    bluetooth.write(data);
  }

    Ridgway();
}

int Ridgway() {
  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) {
    Serial.println("No se encontró coincidencia de huella.");
    return -1;
  }

  Serial.print("ID #"); 
  Serial.print(finger.fingerID);
  Serial.print(" coincidencia del "); 
  Serial.println(finger.confidence);
  Serial.print("ID de huella: "); 
  Serial.println(finger.fingerID);

  if (finger.fingerID == 5) {
    Serial.println("BIENVENIDO 5");
  }
  if (finger.fingerID == 6) {
    Serial.println("BIENVENIDO 6");
  }
  
  return finger.fingerID;
}

Solo que me da problemas ya que no recibe nada del Bluetooth, Solo lo hace lo del módulo de huellas dactilares. Use hardware serial y aún así sigue igual. Los probé individualmente y funcionan perfectamente, el problema surge cuando los pongo en un mismo programa. ¿Qué puedo hacer?

Si usas 2 SoftwareSerial no puedes usarlo del modo en que lo has hecho.
Lo mejor es que uses un dispositivo como un Mega o DUE que tienen mas puertos series por hardware, en este caso un MEGA/DUE tienen 4 puertos.
Directamente esa es mi recomendación.

Entonces, ¿el error es que no se puede usar el software serial así? ¿Interfieren, o cómo?´

Las distintas instancias de SoftwareSerial no pueden recibir datos simultáneamente, tienes que indicarlo específicamente.

Revisa en la documentación de SoftwareSerial la función listen()

1 Like

¡Muchas gracias! ¡Ya pude solucionarlo!

Agregué la función listen y dos botones, así puede elegir si quiere usar la huella o el Bluetooth.

#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>


SoftwareSerial Donna(2, 3);  
SoftwareSerial bluetooth(7, 8); 

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Donna);

void setup() {

  pinMode(3, OUTPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  Serial.begin(9600);
  bluetooth.begin(9600);
  delay(100);
  Donna.begin(57600);
  finger.begin(57600);
  delay(5);
  if (finger.verifyPassword()) {
    Serial.println("Sensor de huella detectado >:)");
  } else {
    Serial.println("No hay comunicación con el sensor de huella >:(");
    Serial.println("Revisa las conexiones...");
    while (1) { delay(1); }
  }

  finger.getTemplateCount();
  Serial.print("El sensor contiene "); 
  Serial.print(finger.templateCount); 
  Serial.println(" plantillas");
  Serial.println("Esperando por una huella válida... >:|");
}

void loop() {
 if (digitalRead(4) == 1) bluetooth.listen();
 else if (digitalRead(5) == 1) Donna.listen();
  if (bluetooth.available()) {
    char data = bluetooth.read();
    Serial.print("Received: ");
    Serial.println(data);
  }

  if (Serial.available()) {
    char data = Serial.read();
    bluetooth.write(data);
  }

    Ridgway();
}

int Ridgway() {
  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) {
    Serial.println("No se encontró coincidencia de huella.");
    return -1;
  }

  Serial.print("ID #"); 
  Serial.print(finger.fingerID);
  Serial.print(" coincidencia del "); 
  Serial.println(finger.confidence);
  Serial.print("ID de huella: "); 
  Serial.println(finger.fingerID);

  if (finger.fingerID == 5) {
    Serial.println("BIENVENIDO 5");
  }
  if (finger.fingerID == 6) {
    Serial.println("BIENVENIDO 6");
  }
  
  return finger.fingerID;
}