Реле и таймер, помогите с кодом

Тема в разделе "Arduino & Shields", создана пользователем imMan, 14 янв 2016.

  1. imMan

    imMan Нерд

    Суть вопроса, есть считыватель карточек, arduino nano и relay shield, при считывании карты если карта валидна происходит замыкание реле на 30 секунд, помогите сделать так, что-бы при повторном считывании карты в течении этих 30 секунд замыкание реле можно было отменить

    вот код который сейчас работает с delay()
    Код (C++):
    #include <Wiegand.h>

    WIEGAND wg;

    void setup()
      {    
            wg.begin();
            pinMode(12, OUTPUT);
            digitalWrite(12,HIGH);
      }

    void loop()
      {    
          if(wg.available())
            {        
              if(wg.getCode() == 1078628)
                {
                  digitalWrite(12,LOW);
                  delay(30000);
                  digitalWrite(12 ,HIGH);                        
                }
            }
      }
     
    Последнее редактирование: 14 янв 2016
  2. Mestniy

    Mestniy Гуру

    Не знаю вот впопыхах накидал код, который в случае второго появления маячка через 30 сек отключал реле:
    Код (C++):
    unsigned long currentTime;//переменные для времени
    unsigned long loopTime;
    #include <Wiegand.h>

    WIEGAND wg;

    void setup()
      {  
            wg.begin();
            pinMode(12, OUTPUT);
            digitalWrite(12,HIGH);
               currentTime = millis(); // считываем время
      loopTime = currentTime;
      }

    void loop()
      {  
          if(wg.available())
            {      
              if(wg.getCode() == 1078628)
                {
                  for (int i = 0; i<2; i++)
                  {
                 if (i = 0)
                {
                  digitalWrite(12,LOW);
                  delay(30000);
                  digitalWrite(12 ,HIGH);                      
               }
               if (i == 1)
               {
               currentTime = millis(); // считываем время
               if(currentTime >= (loopTime + 30000))//ставим условие: если через 3 мин свет включен то..
    {
               digitalWrite (12, LOW);
    }
            }
             }
              }
            }
      }
     
  3. imMan

    imMan Нерд

    Спасибо это не совсем то, мне нужно при повторном считывании карты не через 30 секунд отключить реле, а мне нужно прервать работу реле в течении 30 секунд его работы

    Опишу нагляднее, приложили карту реле замкнулось на 30 секунд, образно лампочка загорелась и через 30 секунд погаснет, но мне нужна возможность погасить лампочку раньше путем повторного считывания карты
     
  4. Mestniy

    Mestniy Гуру

    Код (C++):
    #include <Wiegand.h>

    WIEGAND wg;

    void setup()
      {  
            wg.begin();
            pinMode(12, OUTPUT);
            digitalWrite(12,HIGH);
      }

    void loop()
      {    
          if(wg.available())
            {      
              if(wg.getCode() == 1078628)
                {
                 for(int i = 0; i<2; i++)
         {
        if (i == 0)
    {
                  digitalWrite(12,LOW);
                  delay(30000);
                  digitalWrite(12 ,HIGH);                        
    if (i ==1)
    {
    digitalWrite(12, LOW)
    }
    }        
    }
    }
            }
      }
     
  5. Mestniy

    Mestniy Гуру

    Проверь, должно работать. Извиняюсь за отсутствие изящности!
     
  6. Mestniy

    Mestniy Гуру

    Как успехи?
     
  7. imMan

    imMan Нерд

    спасибо добрался до компьютера, не работает, ну как не работает реле включается но прервать его работу невозможно
     
  8. Sindbad

    Sindbad Гик

    Код (C++):
    #include <Wiegand.h>

    WIEGAND wg;

    void setup()
      {
            wg.begin();
            pinMode(12, OUTPUT);
            digitalWrite(12,HIGH);
      }

    void loop()
      {  
          if(wg.available())
            {    
              if(wg.getCode() == 1078628)
                {
                  digitalWrite(12,LOW);

                  unsigned long timer = millis();
                  while (millis()-timer <30000) {
                     if(wg.available())    {    
                         if(wg.getCode() == 1078628)  {
                             break;
                          }
                      }
                   }

                  digitalWrite(12 ,HIGH);                      
                }
            }
      }
    Это не вдаваясь в то как работает библиотека и что значит "считывает карточку", просто скопировал вашу версию считывания. Надеюсь, идея понятна.
     
    Последнее редактирование: 14 янв 2016
    imMan нравится это.
  9. imMan

    imMan Нерд

    То, что надо!!!!
    работает отлично спасибо