Есть ли способ включить светодиод после 10 показаний или, скажем, через минуту?

Я использую Arduino для проекта RFID, где светодиод должен включаться либо после 12 считываний метки, либо через 2 минуты, считывание метки происходит каждые 10 секунд. Кажется, я не могу придумать, как включить светодиод только после вышеупомянутых условий.

Я безуспешно пытался выполнить различные циклы if, ниже приведен код, который я сейчас использую:

#include <RFID.h>
#include <SPI.h>
#define SS_PIN 10
#define RST_PIN 9
#define LED_PIN A0

RFID rfid(SS_PIN, RST_PIN);
int serNum[5];
String cardno;
int interval = 15000; // миллисекунды
long now = 0;
long lasttime = millis();
// меняем идентификатор читателя на свое имя
String readerID = "Reader_001";

void setup() {
  Serial.begin(9600);
  SPI.begin();
  rfid.init();
  pinMode(A0, OUTPUT);
}

void loop() {
  now = millis();
  if (now > lasttime + interval) {
    lasttime = now;
    Serial.print(readerID);
    Serial.print(":");
    Serial.println("I am alive");
  }
  if (rfid.isCard()) {
    if (rfid.readCardSerial()) {
      lasttime = now;
      cardno = String(rfid.serNum[0]) +
               String(rfid.serNum[1]) +
               String(rfid.serNum[2]) +
               String(rfid.serNum[3]) +
               String(rfid.serNum[4]);

      Serial.print(readerID);
      Serial.print(":");
      Serial.println(cardno);
    }
  }
  rfid.halt();
  delay(10000);
}

Ожидаемый результат — включение светодиода после 2 минут контакта метки и считывателя.

, 👍0

Обсуждение

первое, что нужно сделать, это исправить отступы вашего кода, чтобы блоки кода были четко видны...... это поможет определить, где разместить код, считающий количество повторений, @jsotola

Откажитесь от delay() и работайте только с millis(). Используйте переменную-счетчик, которая увеличивается при каждом чтении. В цикле вы можете проверить, что оно >=12, и включить светодиод., @chrisl

поскольку я новичок, не будет ли слишком много просить о примере?, @Ayat.H


1 ответ


Лучший ответ:

1

Вы хотите, чтобы светодиод загорелся, когда один и тот же чип был прочитан 12 раз подряд. Поэтому я бы предложил что-то вроде этого:

Внутри функции voidloop() вы используете стиль кодирования millis() (см. пример BlinkWithoutDelay, который поставляется с Arduino IDE) для сканирования каждые 10 секунд в поисках чипа. Затем вы добавляете переменную-счетчик для подсчета частоты сканирования одного и того же чипа. Если эта переменная счетчика >=12, вы включаете светодиод. Если сканировался другой чип, вы устанавливаете счетчик на 1 (так как этот чип теперь сканировался 1 раз). Это приводит к примерно такому коду:

#define READ_INTERVAL 10000
int read_counter = 0;
unsigned long read_timestamp=0;
String last_identifier="";
void loop(){
    if(millis()-read_timestamp>READ_INTERVAL){
        // Читаем чип
        if(card_identifier == last_identifier)
            read_counter++;
        else
            read_counter = 1;
        if(read_counter>=12){
            digitalWrite(LED_PIN, HIGH);
        }
    }
}

Обязательно используйте unsigned long с функцией millis(), чтобы предотвратить ее переполнение до отрицательного значения.

,

Есть ли у вас какие-либо предложения по подключению двух Arduino? оба моих проекта Arduino - это контроль доступа по RFID, это первый, второй - простой RFID, но доступ к нему должен зависеть от выхода первого RFID, @Ayat.H

я подумываю о создании ведущего и ведомого SPI? вы бы порекомендовали это, @Ayat.H

Да, это должно быть возможно. Это также зависит от расстояния между Arduinos., @chrisl