Датчик Монетного Слота С Помощью AttachedInterrupt

Привет У меня возникла проблема с моим кодом Как я могу правильно использовать подключенное прерывание на датчике монет чтобы у него не было никаких проблем с обнаружением монет

#include <Adafruit_Fingerprint.h>    //Libraries needed
#include <SoftwareSerial.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#define I2C_ADDR 0x27          //LCD i2c stuff
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
const int coinSlot = 9;
int relayPin = 4;

String Names[] = { "RAVEN", "Surtr", "Tech",}; //Those are the names affected to the fingertemplates IDs
//The first on which is Names[0] : "" has the ID 1 in the fingerprint sensor

SoftwareSerial mySerial(2, 3);                  //Fingerprint sensor wiring RX 3, TX 2
LiquidCrystal_I2C lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin); //LCD declaring

Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);                    //Fingerprint sensor declaring

volatile int coinCount = 0;
int requiredCoins = 1;
boolean coinInserted = false;

void setup()
{
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, HIGH);
  pinMode(coinSlot, INPUT_PULLUP);
  lcd.write(EEPROM.read(5));
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(9), coinInterrupt, FALLING);
  finger.begin(57600);              //Sensor baude rate
  lcd.begin (16, 2);
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.setCursor(0, 0);
  lcd.print("SECURED VAULT");
  lcd.home();
  finger.getTemplateCount();        //Counts the number of templates stored in the sensor flash memory
  delay(2000);
}

void loop() {
  int FingerPrintResult = getFingerprintIDez();

  if (FingerPrintResult != -1) { //This function keeps looping and waiting for a fingerprint to be put on the sensor
    OpenDoor();
  }
  else
  {
    if (coinInserted) {
      coinInserted = false;
      coinCount++;

      EEPROM.write(0, coinCount);
      Serial.println(EEPROM.read(0));

      lcd.setCursor(0, 0);
      lcd.print("TOTAL:");
      lcd.setCursor(0, 1);
      lcd.print(coinCount);
    }

    void coinSlot() {
      coinCount++ ;
      insert = true;

      else {
        lcd.clear();
      }
    }
  }
}
//Only the modifications are commented
int getFingerprintIDez() {
  uint8_t p = finger.getImage();        //Image scanning
  if (p != FINGERPRINT_OK)  return -1;

  p = finger.image2Tz();               //Converting
  if (p != FINGERPRINT_OK)  return -1;

  lcd.clear();                     //And here we write a message or take an action for the denied template
  p = finger.fingerFastSearch();     //Looking for matches in the internal memory
  if (p != FINGERPRINT_OK) {         //if the searching fails it means that the template isn't registered
    lcd.print("Access denied");
    delay(2000);
    return -1;
  }
  //If we found a match we proceed in the function

  lcd.print("Welcome");                  //Printing a message for the recognized template
  lcd.setCursor(2, 1);
  lcd.print(Names[finger.fingerID - 1]); //Then print the name we gave it and the -1 is to remove the shift as the ID starts from "1" but the array from "0"
  return finger.fingerID;
}
void OpenDoor() {
  digitalWrite(relayPin, LOW); // turn on solenoidlock
  delay(5000);
  digitalWrite(relayPin, HIGH); // turn off solenoidlock
}

Пожалуйста, как я могу заставить код работать и на какой строке кода я должен сосредоточиться, чтобы заставить код работать

, 👍1

Обсуждение

Вы не смогли принять предложение Майенко по вашему другому вопросу переставить штифты таким образом, чтобы вы *могли* использовать штифт с возможностью "attachInterrupt"? В противном случае, разве вы не пытались использовать библиотеку, упомянутую в моем ответе на этот вопрос?, @timemage

Да, теперь я определенно голосую за то, чтобы оставить его открытым., @timemage

почему вы не можете переместить программное обеспечение на другую пару контактов?, @Juraj

Я пробовал, но мой отпечаток пальца не работает на других контактах, а только на 2,3 контактах?, @Raven Tenepre

у SoftwareSerial нет никаких причин не работать с другими контактами. Какие контакты вы пробовали?, @Juraj

Я пробовал 2,5 2,7 2,8, @Raven Tenepre

он работал т-образный 0, 3, @Raven Tenepre

0-это аппаратный последовательный вывод. не используйте его для SoftwareSerial, @Juraj

но отпечаток пальца работал?, @Raven Tenepre


1 ответ


0

Опять же, имеет смысл просто использовать pin, способный attachInterrupt; но если по какой-то причине не может:

Установка библиотеки

Применение того, что я предложил в ответе на другой вопрос, к коду, который вы предоставили здесь, означает установку упомянутой библиотеки:

Choosing the Library Manager from Tools/Libraries menu.

А также поиск и установка библиотеки из менеджера: Searching for pinChangeInterrupt and installing.

Изменения в коде

Включая заголовок

Следуя образцу документации и примера для библиотеки, ваш код должен будет включать заголовок для библиотеки:

#include "PinChangeInterrupt.h"

Замена attachInterrupt

Ваш вызов attachInterrupt должен был бы измениться на attachPinChangeInterrupt; аналогично с функцией, которая сопоставляет pin с номером прерывания:

attachPinChangeInterrupt(digitalPinToPinChangeInterrupt(9), coinInterrupt, FALLING);

Вот, пожалуй, и все. На UNO/Nano или широко ATmega328P-based Arduino только контакты 2 и 3 работают с attachInterrupt. attachPinChangeInterrupt будет работать с большинством контактов большинства Arduino на базе AVR; любые контакты, на которые направлен сигнал PCINTn. Они не так желательны в использовании по соображениям производительности, о которых вам не нужно беспокоиться из-за кнопок или детектора монет, а также по причинам простоты использования, о которых заботится за вас эта библиотека.

,

У меня код ошибки, сэр, там написано, @Raven Tenepre

`библиотеки\SoftwareSerial\SoftwareSerial.cpp.o (символ из плагина): В функции SoftwareSerial::read()': (.text+0x0): множественное определение __вектор_3' PinChangeInterrupt0.cpp.o (символ из плагина):(.текст+0x0): впервые определено здесь collect2.exe: ошибка: ld вернул 1 статус выхода ``, @Raven Tenepre

Ах, да, это немного неприятно. "SoftwareSerial" действительно использует прерывания смены выводов, библиотеки необходимо будет изменить, чтобы освободить хотя бы один вектор PCINT в каждом, чтобы приспособиться друг к другу. В качестве альтернативы вам нужно будет отказаться от "программного обеспечения" или, как было сказано ранее, найти способ использовать контакты прерывания регулятора. Нет особых причин, по которым "SoftwareSerial" не мог быть написан в терминах "PinChangeInterrupt" и вполне мог быть. Это стоит посмотреть., @timemage

Как я могу решить эту проблему, сэр, где искать, @Raven Tenepre