мигание в течении 10 секунд
- Войдите на сайт для отправки комментариев
Чт, 12/10/2017 - 12:25
Помогите разобраться что не так.
Необходимо что бы при правельной метке светодиод мигал в течении 10 секунд с частотой 1 раз в секунду, но при этом можно было опрашивать новые метки?
#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
#define BLUE_LED 6
#define YELLOW_LED 7
const int ledPin = 4; // номер выхода, подключенного к светодиоду
int ledState = LOW; // этой переменной устанавливаем состояние светодиода
long previousMillis = 0; // храним время последнего переключения светодиода
long previousMillis1 =0; // храним время послернего время работы
long interval = 1000; // интервал между включение/выключением светодиода (1 секунда)
long interval1 =10000; // интервал работы
int D0=8;
int D1=7;
int D2=6;
int D3=5;
int LAMP=2;
RFID rfid(SS_PIN, RST_PIN);
unsigned char reading_card[5]; //for reading card
unsigned char master[5] = {134, 60, 15, 158, 43}; // allowed card // Карточки и метки. Метка смотрится через монитор порта
unsigned char master2[5] = {72, 125, 151, 16, 178}; // allowed card
unsigned char i;
void allow();
void denied();
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
SPI.begin();
rfid.init();
pinMode(4, OUTPUT); //лампа мигания 1
pinMode(3, OUTPUT); //лампа мигания 2
}
void loop()
{ if (rfid.isCard())
{ if (rfid.readCardSerial()) //чтение карты
{ Serial.println(" ");
Serial.println("Card found");
Serial.println("Cardnumber:");
for (i = 0; i < 5; i++)
{ Serial.print(rfid.serNum[i]);
Serial.print(" ");
reading_card[i] = rfid.serNum[i];
}
Serial.println();
delay (1000) ;
for (i = 0; i < 5; i++) // проверка карты
{ if (reading_card[i] != master[i]
& reading_card[i] != master2[i] ) //Количество карточек/меток
{ break; }
}
if (i == 5) { allow(); } else { denied();}
// прочее кроме работы с картой
} } }
void allow() // если брелок верный
{
unsigned long currentMillis = millis();
if(currentMillis- previousMillis1 > interval1)
{ // провереем не прошло ли время работы
previousMillis1 = currentMillis; // мигание лампы
//проверяем не прошел ли нужный интервал, если прошел то
if(currentMillis - previousMillis > interval)
{ // сохраняем время последнего переключения
previousMillis = currentMillis; // если светодиод не горит, то зажигаем, и наоборот
if (ledState == LOW) ledState = HIGH; else ledState = LOW;
// устанавливаем состояния выхода, чтобы включить или выключить светодиод
digitalWrite(ledPin, ledState);
// другие действия при мигании лампы
} } }
void denied() // если брелок не верный
{
Serial.println("Access denied!");
}
ашыпка в ХЗ какой строке.
при правильной метке просто светодиод меняет свое состояние.
это из какой строки видно?
это видно из диода))) по факту
anshor, Вам уже два раза намекнули, что Вы неправильно вставили код и его невозможно обсуждать (например, без номеров строк). См. приклеенные сверху темы в разделе "программирование"
прошу прощения намеков не понимаю
добавить флаг boolean, переводить его в true если метка верная
в цикле опрашифайть флаг и если true - моргать светодиодом
PS. Мне кажеться считыватели Matrix автономные дешевле чем проект на arduino.
PPS. Хотя нет - посмотрел цены от 1300 рублей - Arduino дешевле.
спасибо за консультацию но я похоже опять что то не так делаю
48 задержка зачем?
цикл 49...54 вообще не понял - я бы запуск allow запихнул сразу в цикл, а если б карта верная не нашлась - некий флаг бы взвел и после цикла проверил
фактически мигание лампы это все содержимое функции allow - зачем? мигание должно быть в основном цикле.
Необходимо что бы при правельной метке светодиод мигал в течении 10 секунд с частотой 1 раз в секунду, но при этом можно было опрашивать новые метки?
1. Светодиод отмигает 10 с для первой метки и сразу еще 10 с для второй?
2. Мигание для первой метки прервется и начнется мигание для второй?
3. По истечению 10 с (для первой метки) светодиод погаснет, вне зависимости от того сколько правильных меток, в течении этого времени, было приложено?
48 задержка что бы непрерывно не опрашивалась карта, без нее карту подносишь ее успевает опросить несколько раз. цикл 49... 54 спавнение карты с картой из памяти. Вынес в отдельную функцию потому чтопланируется еще много операций. Я не правильно сделал?
2. Мигание для первой метки прервется и начнется мигание для второй
задержка в 48 строке не даст нормально мигать - ну и фиг с ней - пусть карта опрашивается - чем это мешает?
вынос в отдельную функцию (чисто мое мнение) это 1-удобство чтения 2-необходимо если функция вызывается неоднократно из разным мест, во всех остальных случаях это лишняя нагрузка на процессор на вызов функции.
все равно не работает
как я подозреваю косяк в этом цикле
я вот не пойму объект rfid выдает массив из 5и прочитанных карт?
если одну - то цикл совсем непонятный, т.к. проверяются элементы массива 1 с 1м 2ой со 2м и т.д.
тогда уж вот так, но все равно как то криво
нашел я примеры по RFID
https://arthurphdent.livejournal.com/1759.html
т е номер карты из 5 байт состоит, тогда конечно цикл ваш (почти) правильный
попробуйте тупо в консоль повыводить то что считывается - понять как правильно проверять номера карт.
почти заработало))) светодиод мигает только когда рядом метка. Как сделать что бы цикл мигания выполнился до конца или пока не придет другая метка?
как я и говорил в начале - добавлением флага и выносом мигания в основной цикл:
в строке 18 ошибка синтаксиса
и после 42ой добавить строку - погасить светодиод
Спасибо все заработало как я и хотел.