I have changed my Arduino UNO to Arduino Mega board now and the pinouts are as below
Fingerprint sensor connected to Serial1 (18, 19)pins of Arduino Mega
Ublox 6m GPS module connected to Serial3 (14, 15)pins of Arduino Mega
and 128x64 OLED is connected to I2C pins (20, 21) of Arduino Mega
With this board change now all three modules Fingerprint sensor, GPS module, and OLED work fine without getting hanging...I think as you pointed it was about having separate hardware serial interfaces for each.
But now the problem I am seeing is that GPS module output is not reliable. GPS coordinates, date, and time are not getting updated consistently. sometimes its does, and sometimes it does not.
What could be the issue? I am guessing is it something related to the timing issue or baud rate settings for GPS and optical sensor may be causing the problem? or the delays I have in my code may be causing the problem? how do I adjust these? please suggest
my latest code attached here
#include <Adafruit_Fingerprint.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SPI.h>
#include <Wire.h>
#include <TinyGPS++.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
int BUZZER = 7;
int ISThour = 0;
int ISTmin = 0;
int GMTmin = 0;
float latitude = 0;
float longitude = 0;
TinyGPSPlus gps;
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&Serial1);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup()
{
Serial3.begin(9600);
Serial1.begin(57600);
pinMode(BUZZER, OUTPUT);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Address 0x3C for 128x64
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(("Booting..."));
display.display();
delay(1500);
display.clearDisplay();
if (finger.verifyPassword())
{
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(25, 0);
display.println(("Sensors"));
display.setCursor(5, 20);
display.println("Connected");
display.display();
delay(1000);
display.clearDisplay();
}
else
{
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(25, 0);
display.println(("Sensors"));
display.setCursor(5, 20);
display.println("Not Found");
display.display();
delay(2000);
while (1)
{
delay(1);
}
}
display.clearDisplay();
}
void loop()
{
getFingerprintIDez();
delay(1500);
}
void displayInfo()
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(("Date:"));
display.setCursor(33, 0);
display.println((gps.date.day()));
display.setCursor(47, 0);
display.println(("/"));
display.setCursor(57, 0);
display.println((gps.date.month()));
display.setCursor(67, 0);
display.println(("/"));
display.setCursor(77, 0);
display.println((gps.date.year()));
display.setCursor(0, 20);
display.println(("Time:"));
GMTmin = gps.time.minute();
ISThour = gps.time.hour() + 5;
if (GMTmin >= 30) ISThour = ISThour + 1;
if (ISThour > 24) ISThour = gps.time.hour() - 24;
ISTmin = gps.time.minute() + 30;
if (ISTmin >= 60) ISTmin = ISTmin - 60;
display.setCursor(35, 20);
display.println(ISThour);
display.setCursor(47, 20);
display.println(":");
display.setCursor(53, 20);
display.println(ISTmin);
display.setCursor(65, 20);
display.println(":");
display.setCursor(71, 20);
display.println((gps.time.second()));
latitude = gps.location.lat();
longitude = gps.location.lng();
display.setCursor(0, 35);
display.println(("Lat: "));
display.setCursor(30, 35);
display.println(latitude, 6);
display.setCursor(0, 45);
display.println(("Lng: "));
display.setCursor(30, 45);
display.println(longitude, 6);
display.display();
delay(2000);
display.clearDisplay();
/else
{
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(20, 0);
display.println(("GPS Not"));
display.setCursor(10, 20);
display.println(("Available"));
display.display();
delay(1000);
display.clearDisplay();
}/
}
// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez()
{
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK)
{
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(35, 0);
display.println(("PLACE"));
display.setCursor(30, 20);
display.println(("FINGER"));
display.display();
return -1;
}
p = finger.image2Tz();
if (p != FINGERPRINT_OK)
{
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(("Messy Image"));
display.setCursor(0, 20);
display.println("Try Again");
display.display();
delay(2000);
display.clearDisplay();
return -1;
}
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) {
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(20, 0);
display.println(("Invalid"));
display.setCursor(30, 20);
display.println("Finger");
display.display();
digitalWrite(BUZZER, HIGH);
delay(200);
digitalWrite(BUZZER, LOW);
delay(200);
digitalWrite(BUZZER, HIGH);
delay(200);
digitalWrite(BUZZER, LOW);
delay(200);
digitalWrite(BUZZER, HIGH);
delay(200);
digitalWrite(BUZZER, LOW);
delay(800);
display.clearDisplay();
return -1;
}
// found a match!
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(35, 0);
display.println(("Match"));
display.setCursor(2, 20);
display.println(("Found with"));
display.setCursor(15, 40);
display.println("ID No:");
display.setCursor(90, 40);
display.println((finger.fingerID));
display.display();
digitalWrite(BUZZER, HIGH);
delay(500);
digitalWrite(BUZZER, LOW);
delay(2000);
while (Serial3.available() > 0)
if (gps.encode(Serial3.read()))
delay(1000);
displayInfo();
return finger.fingerID;
}
thanks
santosh