мигание в течении 10 секунд

anshor
anshor аватар
Offline
Зарегистрирован: 21.06.2016

Помогите разобраться что не так.

Необходимо что бы при правельной метке светодиод мигал в течении 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!");
}
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ашыпка в ХЗ какой строке. 

anshor
anshor аватар
Offline
Зарегистрирован: 21.06.2016

при правильной метке просто светодиод меняет свое состояние.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

это из какой строки видно?

anshor
anshor аватар
Offline
Зарегистрирован: 21.06.2016

это видно из диода))) по факту

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

anshor, Вам уже два раза намекнули, что Вы неправильно вставили код и его невозможно обсуждать (например, без номеров строк). См. приклеенные сверху темы в разделе "программирование"

anshor
anshor аватар
Offline
Зарегистрирован: 21.06.2016

прошу прощения намеков не понимаю

#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!");
}

 

andycat
Offline
Зарегистрирован: 07.09.2017

добавить флаг boolean, переводить его в true если метка верная

в цикле опрашифайть флаг и если true - моргать светодиодом

PS. Мне кажеться считыватели Matrix автономные дешевле чем проект на arduino.

PPS. Хотя нет - посмотрел цены от 1300 рублей - Arduino дешевле.

anshor
anshor аватар
Offline
Зарегистрирован: 21.06.2016

спасибо за консультацию но я похоже опять что то не так делаю

#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
#define BLUE_LED 6
#define YELLOW_LED 7
const int ledPin =  4;      // номер выхода, подключенного к светодиоду
boolean ledState = LOW;             // этой переменной устанавливаем состояние светодиода
boolean metState = 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)  { metState = HIGH; allow(); } else   {metState=LOW;  denied();}
                // прочее кроме работы с картой
}  }       }

void allow()        // если брелок верный 
{
    unsigned long currentMillis = millis();
      if(currentMillis- previousMillis1 > interval1)  
      {  // провереем не прошло ли время работы
         previousMillis1 = currentMillis;   // мигание лампы
       //проверяем не прошел ли нужный интервал, если прошел то
       if (metState = HIGH) {
      if(currentMillis - previousMillis > interval)
        {  // сохраняем время последнего переключения
             previousMillis = currentMillis;    // если светодиод не горит, то зажигаем, и наоборот
             if (ledState == LOW)  ledState = HIGH;  else   ledState = LOW;
             // устанавливаем состояния выхода, чтобы включить или выключить светодиод
             digitalWrite(ledPin, ledState); }
              // другие действия при мигании лампы
}      } else Serial.println("время закончилось"); }

void denied()   // если брелок не верный
{
  Serial.println("Access denied!");
}

 

andycat
Offline
Зарегистрирован: 07.09.2017

48 задержка зачем?

цикл 49...54 вообще не понял - я бы запуск allow запихнул сразу в цикл, а если б карта верная не нашлась - некий флаг бы взвел и после цикла проверил

фактически мигание лампы это все содержимое функции allow - зачем? мигание должно быть в основном цикле.

fogary
Offline
Зарегистрирован: 05.03.2016

anshor пишет:

Необходимо что бы при правельной метке светодиод мигал в течении 10 секунд с частотой 1 раз в секунду, но при этом можно было опрашивать новые метки?

Вопрос, что будет если в течении этих 10 секунд приложить еще одну правильную метку:

1. Светодиод отмигает 10 с для первой метки и сразу еще 10 с для второй?
2. Мигание для первой метки прервется и начнется мигание для второй?
3. По истечению 10 с (для первой метки) светодиод погаснет, вне зависимости от того сколько правильных меток, в течении этого времени, было приложено?

anshor
anshor аватар
Offline
Зарегистрирован: 21.06.2016

48 задержка что бы непрерывно не опрашивалась карта, без нее карту подносишь ее успевает опросить несколько раз. цикл 49... 54 спавнение карты с картой из памяти. Вынес в отдельную функцию потому чтопланируется еще много операций. Я не правильно сделал?

anshor
anshor аватар
Offline
Зарегистрирован: 21.06.2016

2. Мигание для первой метки прервется и начнется мигание для второй

andycat
Offline
Зарегистрирован: 07.09.2017

задержка в 48 строке не даст нормально мигать - ну и фиг с ней - пусть карта опрашивается - чем это мешает?

вынос в отдельную функцию (чисто мое мнение) это 1-удобство чтения 2-необходимо если функция вызывается неоднократно из разным мест, во всех остальных случаях это лишняя нагрузка на процессор на вызов функции.

anshor
anshor аватар
Offline
Зарегистрирован: 21.06.2016

все равно не работает

#include <RFID.h>
#define SS_PIN 10
#define RST_PIN 9
#define BLUE_LED 6
#define YELLOW_LED 7
const int ledPin =  4;      // номер выхода, подключенного к светодиоду
boolean ledState = LOW;             // этой переменной устанавливаем состояние светодиода
boolean metState = LOW;          // этой переменной устанавливаем состояние метки
long previousMillis = 0;        // храним время последнего переключения светодиода
long previousMillis1 =0;        // храним время послернего время работы
long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)
long interval1 =10000;           // интервал работы 
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 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("Cardnumber:");
           for (i = 0; i < 5; i++)
             {  Serial.print(rfid.serNum[i]);
                Serial.print(" ");
                reading_card[i] = rfid.serNum[i]; 
                 {if (reading_card[i] != master[i]
                    & reading_card[i] != master2[i] )  //Количество карточек/меток
                    {break;}  
                 }     
             }                 
        }
    if (i == 5)  { metState = HIGH; 
      unsigned long currentMillis = millis();
      if(currentMillis- previousMillis1 > interval1)  
       {  // провереем не прошло ли время работы
         previousMillis1 = currentMillis;   // мигание лампы
        //проверяем не прошел ли нужный интервал, если прошел то
         if (metState = HIGH) 
          {   if(currentMillis - previousMillis > interval)
             {  // сохраняем время последнего переключения
               previousMillis = currentMillis;    // если светодиод не горит, то зажигаем, и наоборот
               if (ledState == LOW)  ledState = HIGH;  else   ledState = LOW;
             // устанавливаем состояния выхода, чтобы включить или выключить светодиод
             digitalWrite(ledPin, ledState);
             }     // другие действия при мигании лампы
          }
       } else Serial.println("время закончилось");
     } else   {metState=LOW;   Serial.println("Access denied!");;}
                // прочее кроме работы с картой
  }
}

 

andycat
Offline
Зарегистрирован: 07.09.2017

как я подозреваю косяк в этом цикле

      for (i = 0; i < 5; i++)
      { Serial.print(rfid.serNum[i]);
        Serial.print(" ");
        reading_card[i] = rfid.serNum[i];
        { if (reading_card[i] != master[i]
              & reading_card[i] != master2[i] )  //Количество карточек/меток
          {
            break;
          }
        }
      }

я вот не пойму объект rfid выдает массив из 5и прочитанных карт?

если одну - то цикл совсем непонятный, т.к. проверяются элементы массива 1 с 1м 2ой со 2м и т.д.

andycat
Offline
Зарегистрирован: 07.09.2017

тогда уж вот так, но все равно как то криво

  if (rfid.isCard()) {
    if (rfid.readCardSerial()) {
      for (i = 0; i < 5; i++) {
        for (j = 0; i < 5; i++) {
          if ((reading_card[i] != master[j]) & (reading_card[i] != master2[j]) ) {
            break;
          }
        }
      }
    }
  }
  if (i == 5) & (j == 5)  {

 

andycat
Offline
Зарегистрирован: 07.09.2017

нашел я примеры по RFID

https://arthurphdent.livejournal.com/1759.html

т е номер карты из 5 байт состоит, тогда конечно цикл ваш (почти) правильный

попробуйте тупо в консоль повыводить то что считывается - понять как правильно проверять номера карт.

anshor
anshor аватар
Offline
Зарегистрирован: 21.06.2016

почти заработало))) светодиод мигает только когда рядом метка.  Как сделать что бы цикл мигания выполнился до конца или пока не придет другая метка?

#include <RFID.h>
#include <SPI.h>
#define SS_PIN 10
#define RST_PIN 9
#define BLUE_LED 6
#define YELLOW_LED 7
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;

const int ledPin =  4;      // номер выхода, подключенного к светодиоду
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода
long previousMillis = 0;        // храним время последнего переключения светодиода
long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)

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

void loop()
{  if (rfid.isCard())
   {  if (rfid.readCardSerial())
      {  Serial.println("Cardnumber:");
         for (i = 0; i < 5; i++)
         { Serial.print(rfid.serNum[i]);
           Serial.print(" ");
           reading_card[i] = rfid.serNum[i];
         }  Serial.println();
            for (i = 0; i < 5; i++)
             {  if (reading_card[i] != master[i]
                & reading_card[i] != master2[i] )  //Количество карточек/меток
               { break;}
             }
           if (i == 5)  
           {   unsigned long currentMillis = millis();
              if(currentMillis - previousMillis > interval) 
              { previousMillis = currentMillis; // если светодиод не горит, то зажигаем, и наоборот
                if (ledState == LOW) ledState = HIGH; else ledState = LOW;
                // устанавливаем состояния выхода, чтобы включить или выключить светодиод
               digitalWrite(ledPin, ledState);
              }
           } else   { Serial.println("Access denied!");}
}  }    }

 

andycat
Offline
Зарегистрирован: 07.09.2017

как я и говорил в начале - добавлением флага и выносом мигания в основной цикл:

#include <RFID.h>
#include <SPI.h>
#define SS_PIN 10
#define RST_PIN 9
#define BLUE_LED 6
#define YELLOW_LED 7
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;

const int ledPin =  4;      // номер выхода, подключенного к светодиоду
int ledState = LOW;             // этой переменной устанавливаем состояние светодиода
long previousMillis = 0;        // храним время последнего переключения светодиода
long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)

unsignet long timeStartFlash = 0;
boolean startFlash = false;

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

void loop()
{ if (startFlash) {
    if ((millis() - timeStartFlash) < 10000) {
      unsigned long currentMillis = millis();
      if (currentMillis - previousMillis > interval)
      { previousMillis = currentMillis; // если светодиод не горит, то зажигаем, и наоборот
        if (ledState == LOW) ledState = HIGH; else ledState = LOW;
        // устанавливаем состояния выхода, чтобы включить или выключить светодиод
        digitalWrite(ledPin, ledState);
      }
    } else {
      startFlash = false;
    }
  }
  if (rfid.isCard())
  { if (rfid.readCardSerial())
    { Serial.println("Cardnumber:");
      for (i = 0; i < 5; i++)
      { Serial.print(rfid.serNum[i]);
        Serial.print(" ");
        reading_card[i] = rfid.serNum[i];
      }  Serial.println();
      for (i = 0; i < 5; i++)
      { if (reading_card[i] != master[i]
            & reading_card[i] != master2[i] )  //Количество карточек/меток
        {
          break;
        }
      }
      if (i == 5)
      { timeStartFlash = millis();
        startFlash = true;
      } else   {
        Serial.println("Access denied!");
      }
    }
  }
}

 

andycat
Offline
Зарегистрирован: 07.09.2017

в строке 18 ошибка синтаксиса

и после 42ой добавить строку - погасить светодиод

 

anshor
anshor аватар
Offline
Зарегистрирован: 21.06.2016

Спасибо все заработало как я и хотел.