Товарищи, подскажите пожалуйста, как при помощи сканера отпечатков (as608), Ардуино уно записать в память сканера нужный отпечаток?
если попроще обратиться в платный раздел за помощью,(за дорого!!!)
а если на халяву, то наверное скинуть код и схему подключения, что бы доказать что вы пытались…
как вам пару вариантов для начала ?
А где третий – “спросить у ИИ”?
он наверное уже спросил у него, только код не рабочий, и стесняется выложить, ну не мог же он посчитать что нам нечем заняться, как за него обращаться к ии, или скидывать разные примеры, и предлагать ему варианты реализации… хотя… да нет, не может же быть такого)))
Сам люблю в сарказм господа, но не этот случай. Когда я только задумался о том чтоб приобщиться к ардуине, почитал разномастных блогеров, Ардуино это не сложно, разберётся даже ребёнок. Я уже давно не ребёнок, скоро уже у моего ребенка будет ребёнок, однако ж так и не постиг всех премудростей. Пытался смотреть уроки по Ардуино, всё сводилось к тому что показывали как правильно подключить 4 провода от сканера к плате. А в плане написаний скетча полная неразбериха. Я даже обращался к вашим новомодным ИИ. Эта бездушная машина писала мне пару скетчей, я их загружал на плату и чуда не происходило. Скачивал SFGDemo. Программа не видит, или не хочет видеть плату и датчик. Где то натыкался на пост, там сканер подключали к ардуине через какую то дополнительную плату. Вот собственно и вопрос был, можно ли это всё сделать имея только комплюхтер, плату Уно и сам сканер, или для этого надо ещё что то докупать. Может кто то сталкивался уже. Может кто то может на возмездной основе помочь. А посмеяться над новичком может каждый. А помочь - единицы. С уважением к вам!
В теории, мне нужно чтоб ардуинка считывал мой отпечаток пальца, если он валидный, чтоб сервомотор непрерывного вращения делал оборот на 360 градусов. Ещё раз прикладываю палец, он делает оборот в другую сторону.
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
#include <Servo.h>
// AS608 via SoftwareSerial
#define RX_PIN 2 // connect AS608 TX → Arduino D2
#define TX_PIN 3 // connect AS608 RX → Arduino D3
SoftwareSerial fingerSerial(RX_PIN, TX_PIN);
Adafruit_Fingerprint finger(&fingerSerial);
// Continuous-rotation servo settings
#define SERVO_PIN 9 // PWM pin for servo signal (changeable)
Servo crServo;
// Pulse widths (microseconds) - calibration may be required
const int STOP_PULSE = 1500; // neutral (stop) ~1500us
const int CW_PULSE = 1700; // clockwise (adjust if needed)
const int CCW_PULSE = 1300; // counter-clockwise (adjust if needed)
// Time to run to make ~1 full revolution (ms) - needs calibration
unsigned long TURN_TIME_MS = 600; // default, change after testing
void setup() {
Serial.begin(115200);
while (!Serial) { delay(10); }
Serial.println();
Serial.println(F(“AS608 + Continuous-Rotation Servo — Enroll & Turn 1 rev on match”));
// init fingerprint sensor
finger.begin(57600);
if (finger.verifyPassword()) {
Serial.println(F("Fingerprint sensor found"));
} else {
Serial.println(F("Fingerprint sensor not found. Check wiring and power."));
while (1) { delay(1000); }
}
// attach servo and stop it
crServo.attach(SERVO_PIN);
crServo.writeMicroseconds(STOP_PULSE);
printMenu();
}
void loop() {
if (Serial.available()) {
char c = Serial.read();
if (c == 'e') {
Serial.println(F("\\nEnroll new fingerprint"));
Serial.print(F("Enter ID (1-255): "));
while (!Serial.available()) { delay(10); }
int id = Serial.parseInt();
if (id < 1 || id > 255) {
Serial.println(F("Invalid ID. Use 1..255."));
} else {
enrollFingerprint(id);
}
printMenu();
}
else if (c == 'v') {
Serial.println(F("\\nVerify fingerprint (search)"));
uint8_t res = getFingerprintID();
// if match found -> finger.fingerID set and code returned FINGERPRINT_OK
if (res == FINGERPRINT_OK) {
Serial.println(F("Match detected. Turning servo one revolution..."));
turnServoOneRevolution();
Serial.println(F("Turn complete. Servo stopped."));
}
printMenu();
}
else if (c == 'd') {
Serial.println(F("\\nDelete ID"));
Serial.print(F("Enter ID (1-255): "));
while (!Serial.available()) { delay(10); }
int id = Serial.parseInt();
if (id < 1 || id > 255) {
Serial.println(F("Invalid ID."));
} else {
deleteFingerprint(id);
}
printMenu();
}
else if (c == 'l') {
listEnrolled();
printMenu();
}
else if (c == 'c') {
Serial.println(F("\\nCalibration: current TURN_TIME_MS and pulses:"));
Serial.print(F("TURN_TIME_MS = ")); Serial.println(TURN_TIME_MS);
Serial.print(F("CW_PULSE = ")); Serial.println(CW_PULSE);
Serial.print(F("CCW_PULSE = ")); Serial.println(CCW_PULSE);
Serial.print(F("STOP_PULSE = ")); Serial.println(STOP_PULSE);
Serial.println(F("To change TURN_TIME_MS send: t<ms> (e.g. t700)"));
Serial.println(F("To change CW pulse send: pCW<us> (e.g. pCW1700)"));
Serial.println(F("To change CCW pulse send: pCCW<us>"));
printMenu();
}
else if (c == 't') {
// set TURN_TIME_MS: user types 't' then number (already in buffer)
while (!Serial.available()) { delay(10); }
unsigned long t = Serial.parseInt();
if (t > 0 && t < 10000) {
TURN_TIME_MS = t;
Serial.print(F("TURN_TIME_MS set to ")); Serial.println(TURN_TIME_MS);
} else Serial.println(F("Invalid time"));
printMenu();
}
else if (c == '1') { // quick test: rotate CW for TURN_TIME_MS
Serial.println(F("Quick test: rotate CW for TURN_TIME_MS"));
turnServoOneRevolution();
printMenu();
}
// simple pulse change commands: expecting formats pCWxxxx or pCCWxxxx
else if (c == 'p') {
// read next two chars (CW or CC)
while (!Serial.available()) { delay(10); }
String sub = "";
// read until newline or timeout
unsigned long start = millis();
while (Serial.available() == 0 && millis() - start < 200) delay(5);
while (Serial.available()) {
char nc = Serial.read();
if (nc == '\\n' || nc == '\\r') break;
sub += nc;
// small safety break
if (sub.length() > 10) break;
}
if (sub.startsWith("CW")) {
int val = sub.substring(2).toInt();
if (val >= 1300 && val <= 2000) { // reasonable range
// update CW_PULSE (must be global const -> but we can cast via variable replacement)
// here we assign to a global variable instead of const if needed; to simplify, we'll use globals
// NOTE: for safety in this sketch, CW_PULSE declared const above; to change at runtime, those should be non-const.
Serial.println(F("To change pulse values at runtime recompile with non-const pulse variables."));
} else Serial.println(F("Invalid pulse value"));
} else {
Serial.println(F("Unknown p command. Use pCW or pCCW"));
}
printMenu();
}
}
}
void printMenu() {
Serial.println();
Serial.println(F(“Commands:”));
Serial.println(F(" e - Enroll new fingerprint"));
Serial.println(F(" v - Verify fingerprint (on match → servo 1 rev)"));
Serial.println(F(" d - Delete fingerprint by ID"));
Serial.println(F(" l - List enrolled IDs (quick scan)"));
Serial.println(F(" c - Calibration info"));
Serial.println(F(" t - Set TURN_TIME_MS (send ‘t’ then number)"));
Serial.println(F(" 1 - Quick test rotate servo"));
Serial.println();
Serial.print(F("Enter command: "));
}
// ----- Verify / Search -----
uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) {
if (p == FINGERPRINT_NOFINGER) Serial.println(F("No finger detected"));
else {
Serial.print(F("getImage error: "));
Serial.println(p);
}
return p;
}
p = finger.image2Tz();
if (p != FINGERPRINT_OK) {
Serial.print(F("image2Tz error: "));
Serial.println(p);
return p;
}
p = finger.fingerFastSearch();
if (p == FINGERPRINT_OK) {
Serial.print(F("Found ID #"));
Serial.print(finger.fingerID);
Serial.print(F(" Confidence: "));
Serial.println(finger.confidence);
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println(F("No match found"));
} else {
Serial.print(F("fingerFastSearch error: "));
Serial.println(p);
}
return p;
}
// ----- Enrollment -----
void enrollFingerprint(int id) {
Serial.print(F(“Enrolling ID #”));
Serial.println(id);
Serial.println(F(“Place finger on sensor…”));
while (true) {
uint8_t p = finger.getImage();
if (p == FINGERPRINT_OK) { Serial.println(F("Image taken")); break; }
else if (p == FINGERPRINT_NOFINGER) {}
else { Serial.print(F("getImage error: ")); Serial.println(p); return; }
delay(200);
}
if (finger.image2Tz(1) != FINGERPRINT_OK) { Serial.println(F(“Error converting image 1”)); return; }
Serial.println(F(“Remove finger”)); delay(1500);
Serial.println(F(“Place same finger again…”));
while (true) {
uint8_t p = finger.getImage();
if (p == FINGERPRINT_OK) { Serial.println(F("Image taken")); break; }
else if (p == FINGERPRINT_NOFINGER) {}
else { Serial.print(F("getImage error: ")); Serial.println(p); return; }
delay(200);
}
if (finger.image2Tz(2) != FINGERPRINT_OK) { Serial.println(F(“Error converting image 2”)); return; }
if (finger.createModel() != FINGERPRINT_OK) { Serial.println(F(“Could not create model - try again”)); return; }
if (finger.storeModel(id) == FINGERPRINT_OK) {
Serial.print(F("Successfully stored ID #")); Serial.println(id);
} else {
Serial.println(F("Error storing the model"));
}
}
// ----- Delete -----
void deleteFingerprint(int id) {
if (finger.deleteModel(id) == FINGERPRINT_OK) {
Serial.print(F("Deleted ID #")); Serial.println(id);
} else {
Serial.println(F("Failed to delete or ID not found"));
}
}
// ----- List -----
void listEnrolled() {
Serial.println(F(“\nScanning IDs 1..255 (quick check)…”));
for (int i = 1; i <= 255; i++) {
uint8_t p = finger.loadModel(i);
if (p == FINGERPRINT_OK) {
Serial.print(F(" - ID ")); Serial.println(i);
}
delay(10);
}
Serial.println(F(“Done.”));
}
// ----- Servo control: run CW for TURN_TIME_MS then stop -----
void turnServoOneRevolution() {
// rotate clockwise
crServo.writeMicroseconds(CW_PULSE);
delay(TURN_TIME_MS);
// stop
crServo.writeMicroseconds(STOP_PULSE);
delay(200); // short settle
}
Вот такой скетч пишет ИИ. Загружаю. Мотор начинает с хрипом крутиться постоянно.
Серво подключен к источнику питания, управляющий пин 9. Сканер подключен к питанию от платы, и два Пина 2 и 3
наверное вы не потратили около 50к хотя бы, на разные модули, что бы потом уметь относительно без проблем собирать проекты, и знать какие сложности возникнут, надо просто стараться…
по идеи по tx rx подключить можно… хоть с дополнительной платой, хоть сразу к уно…
я думаю нужно прочитать как вставлять код правильно, что бы другие могли скопировать…
но на вашем месте я бы наверное сразу в платном разделе разместил тему… успехов!))
А с чего вы взяли, что кого-то интересует, что вам нужно?
Выложить код по правилам форума - это элементарное уважение к тем, кто будет отвечать. А у вас вместо этого какая-то мешаника строк и стилей.
Вы не заслужили того, чтобы кто-то вникал в ваш вопрос.
А вы забавный))))
Вот это пинг! ![]()
а ты нет