Проблема со сканером отпечатков

Товарищи, подскажите пожалуйста, как при помощи сканера отпечатков (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 подключить можно… хоть с дополнительной платой, хоть сразу к уно…

я думаю нужно прочитать как вставлять код правильно, что бы другие могли скопировать…

но на вашем месте я бы наверное сразу в платном разделе разместил тему… успехов!))

А с чего вы взяли, что кого-то интересует, что вам нужно?
Выложить код по правилам форума - это элементарное уважение к тем, кто будет отвечать. А у вас вместо этого какая-то мешаника строк и стилей.
Вы не заслужили того, чтобы кто-то вникал в ваш вопрос.

А вы забавный))))

Вот это пинг! :smiley:

а ты нет