Есть ли способ включить светодиод после 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 минут контакта метки и считывателя.
@Ayat.H, 👍0
Обсуждение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
- Является ли SPI хорошим способом подключения двух модулей RFID на отдельных платах Arduino?
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Использование прерываний с RC522
- Проблема совместного использования MISO с несколькими RFID-считывателями RC522
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
первое, что нужно сделать, это исправить отступы вашего кода, чтобы блоки кода были четко видны...... это поможет определить, где разместить код, считающий количество повторений, @jsotola
Откажитесь от
delay()
и работайте только сmillis()
. Используйте переменную-счетчик, которая увеличивается при каждом чтении. В цикле вы можете проверить, что оно >=12, и включить светодиод., @chrislпоскольку я новичок, не будет ли слишком много просить о примере?, @Ayat.H