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