It should be possible. You communicate with the FPS using Serial (or SoftwareSerial). so it only requires 2 pins. Not sure how much memory it will all consume.
Unfortunately, I have been try many times to upload the example sketch provided from the Adafruit but it always comes up a few error that the Attiny doesn't have the Hardware Serial.
Can some one provide a really simple sketch to test it, please?
Just in case, I attached the code and error here below:
Code:
/***************************************************
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>
// On Leonardo/Micro or others with hardware serial, use those! #0 is green wire, #1 is white
// uncomment this line:
// #define mySerial Serial1
// For UNO and others without hardware serial, we must use software serial...
// pin #2 is IN from sensor (GREEN wire)
// pin #3 is OUT from arduino (WHITE wire)
// comment these two lines if using hardware serial
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()
{
Serial.begin(9600);
while (!Serial); // For Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("\n\nAdafruit finger detect test");
// set the data rate for the sensor serial port
finger.begin(57600);
delay(5);
if (finger.verifyPassword()) {
Serial.println("Found fingerprint sensor!");
} else {
Serial.println("Did not find fingerprint sensor :(");
while (1) { delay(1); }
}
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() // run over and over again
{
getFingerprintIDez();
delay(50); //don't ned to run this at full speed.
}
uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
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;
}
Error:
Arduino: 1.8.12 (Windows 10), Board: "ATtiny13, ATtiny13a, No (ISP Programmer Upload), 9.6MHz Internal Oscillator, Millis Available, No Tone, Better Or Equal 1.666% Error (Default), Bin, Hex, Dec Supported, Half Duplex, Read+Write, LTO Enabled, 2.7v, Default, Default"
In file included from C:\Users\Fabrizio\AppData\Local\Temp\arduino_modified_sketch_512150\fingerprint.ino:18:0:
C:\Users\Fabrizio\Documents\Arduino\libraries\Adafruit_Fingerprint_Sensor_Library/Adafruit_Fingerprint.h:120:39: error: expected ')' before '*' token
Adafruit_Fingerprint(HardwareSerial *hs, uint32_t password = 0x0);
^
C:\Users\Fabrizio\Documents\Arduino\libraries\Adafruit_Fingerprint_Sensor_Library/Adafruit_Fingerprint.h:159:3: error: 'HardwareSerial' does not name a type
HardwareSerial *hwSerial;
^
exit status 1
Error compiling for board ATtiny13.
It appears that the FPS requires a Hardware Serial port be defined, even if it is not used. The ATTiny13 does not have one. Probably the easiest way to proceed would be to remove the hardware serial info from the FPS library and try it.
Then edit the FPS library and remove all the references to the HardwareSerial class.
That library creates a reference to a software serial port and a hardware serial port. It also has class constructors for both. Just remove the hardware side of it.
you removed the closing #endif in the .h file.
After fixing that, I think you are out of memory (and there are some warnings so no sure it will actually work
Arduino: 1.8.12 (Windows 10), Board: "ATtiny13, ATtiny13, No (ISP Programmer Upload), 9.6MHz Internal Oscillator, Millis Available, No Tone, Better Or Equal 1.666% Error (Default), Bin, Hex, Dec Supported, Half Duplex, Read+Write, LTO Enabled, 2.7v, Default, Default"
...
"C:\\Users\\brianh\\AppData\\Local\\Temp\\arduino_build_966212/Test_DrawBitmap.ino.elf"
Sketch uses 3232 bytes (315%) of program storage space. Maximum is 1024 bytes.
text section exceeds available space in boardGlobal variables use 433 bytes (676%) of dynamic memory, leaving -369 bytes for local variables. Maximum is 64 bytes.
Sketch too big; see http://www.arduino.cc/en/Guide/Troubleshooting#size for tips on reducing it.
Error compiling for board ATtiny13.
So, if we would like to use an Attiny85 might work so far.
I will try to see if is possible to delete as much unnecessary line.
Sketch uses 4178 bytes (54%) of program storage space. Maximum is 7634 bytes.
Global variables use 503 bytes (98%) of dynamic memory, leaving 9 bytes for local variables. Maximum is 512 bytes.
Low memory available, stability problems may occur.
UPDATE (1)
Your are right!!! Even trying to squeeze the library and the code!!! Shame!!!
UPDATE (2)
I DID IT!!! 8)
I did some changes on the original sketch to leave all the unnecessary variables on the Flash Memory instead to go on the RAM Memory once uploading sketch and DONE!!!
Sketch uses 4192 bytes (54%) of program storage space. Maximum is 7634 bytes.
Global variables use 247 bytes (48%) of dynamic memory, leaving 265 bytes for local variables. Maximum is 512 bytes.