2016-04-03 16 views
1

Bir RFID etiketinin okunup okunmadığını kontrol eden bir program var, eğer varsa, bir kod çalıştırıyor.Arduino geri sayım programının geri kalanını engeller

Ayrıca arka planda çalıştırmak istediğim geri sayım işlevi (zamanlayıcı) da var. LCD'nin altındaki saati gösterir.

Sorun şu ki, zamanlayıcı(); Ana döngüde, programın geri kalanı geri sayım süresi boyunca geciktirilir, bu da RFID kartlarının okunmadığı anlamına gelir.

Zamanlayıcı çalışır ancak zamanlayıcı(); çalışıyor.

Bunu nasıl önleyebileceğimi bilen var mı? Teşekkür ederim. Bu değişkenlerin değerleri hem decrement işlevi artık onları değiştirmek olacaktır, 0 ulaştığında

while (minutes > 0 || seconds >= 0) 

:

#include <SPI.h>  
#include <MFRC522.h> 
#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 


int readflag; 
int initstate = 1; 

int nextred = 4; 
int nextblue = 8; 

uint8_t readCard[4];   

int minutes = 1; //start min 
int seconds = 0; //start seconds 


MFRC522 mfrc522(10, 9); 
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 


///////////////////////////////////////// Setup /////////////////////////////////// 
void setup() { 

    //Protocol Configuration 
    Serial.begin(9600); 
    SPI.begin();   
    mfrc522.PCD_Init();  
    mfrc522.PCD_SetAntennaGain(mfrc522.RxGain_max); 

    lcd.begin(20, 4); 


} 


/////////////////////////////////////////////////////////////////////////////// 
    // Main loop 
/////////////////////////////////////////////////////////////////////////////// 
void loop() { 

do {                
    readflag = checkread(); 
if (initstate == 0) { 
    timer(); //start timer - timer works but nothing below timer(); is running. 
    lcd.setCursor(0,0); 
    lcd.print("Red team next: "); 
    lcd.print(nextred); 
    lcd.setCursor(0,1); 
    lcd.print("Blue team next: "); 
    lcd.print(nextblue); 

} 
    } 
    while (!readflag); 
    tone(8, 850, 15); 
    recordid(); 
    updatenextteamnumbers(); 
} 


/////////////////////////////////////////////////////////////////////////////// 
    // Function to update team next numbers 
/////////////////////////////////////////////////////////////////////////////// 
void updatenextteamnumbers() { 
//If Blue Tag scanned show team info 
    if (*((uint32_t *)readCard) == 0xACB7D573) { 

    Serial.println("Blue Tag detected, showing team info"); 
    initstate=0; 

    } 


//Red Team (sequence 4, 5, 2, 1, 9) 
else if (*((uint32_t *)readCard) == 0x29FDC9F5 && initstate == 0) { 
    Serial.println("CARD 4 detected"); 
    nextred = 5; 

     } 

else if (*((uint32_t *)readCard) == 0x3FCE7832 && initstate == 0) { 

    Serial.println("CARD 5 detected"); 
    nextred = 2; 

} 

else if (*((uint32_t *)readCard) == 0x3FCCECE2 && initstate == 0) { 

    Serial.println("CARD 2 detected"); 
    nextred = 1; 

     } 


    else if (*((uint32_t *)readCard) == 0x3F7AB752 && initstate == 0) { 

    Serial.println("CARD 1 detected"); 
    nextred = 9; 

    //activateredrelay 

     } 


    else if (*((uint32_t *)readCard) == 0x00000000 && initstate == 0) { 

    Serial.println("CARD 9 detected"); 
    redwins();  

     } 



//Blue Team (sequence 8, 6, 3, 7, 10) 

else if (*((uint32_t *)readCard) == 0x00000000 && initstate == 0) { 
    Serial.println("CARD 8 detected"); 
    nextblue = 6; 

     } 

else if (*((uint32_t *)readCard) == 0x00000000 && initstate == 0) { 

    Serial.println("CARD 6 detected"); 
    nextblue = 3; 

} 

else if (*((uint32_t *)readCard) == 0x3F7ABA82 && initstate == 0) { 

    Serial.println("CARD 3 detected"); 
    nextblue = 7; 

     } 


    else if (*((uint32_t *)readCard) == 0x00000000 && initstate == 0) { 

    Serial.println("CARD 7 detected"); 
    nextblue = 10; 

    //activatebluerelay 

     } 


    else if (*((uint32_t *)readCard) == 0x00000000 && initstate == 0) { 

    Serial.println("CARD 10 detected"); 
    bluewins();  

     } 

} 


/////////////////////////////////////////////////////////////////////////////// 
    // Stores the ID of the card that's been detected in readCard byte array 
/////////////////////////////////////////////////////////////////////////////// 
void recordid() { 
    mfrc522.PICC_IsNewCardPresent(); 
    mfrc522.PICC_ReadCardSerial(); 

    for (int i = 0; i < mfrc522.uid.size; i++) { 
     readCard[i] = mfrc522.uid.uidByte[i]; 
     Serial.print(mfrc522.uid.uidByte[i], HEX); 
     } 
Serial.println(""); 
    mfrc522.PICC_HaltA(); 
    } 


///////////////////////////////////////////// 
    // Returns 1 if a card has been detected 
///////////////////////////////////////////// 
int checkread() { 
    if (! mfrc522.PICC_IsNewCardPresent()) { 
    return 0; }          //no card detected 

    mfrc522.PICC_HaltA(); 
    return 1; }          //card detected 


///////////////////////////////////////////// 
    // Runs if red team wins 
///////////////////////////////////////////// 
void redwins() { 
     lcd.clear(); 
     lcd.setCursor(0,0); 
     lcd.print("Red team wins!"); 
     lcd.display(); 
     Serial.println("Red team wins!"); 
     delay(36000); 
} 

///////////////////////////////////////////// 
    // Runs if blue team wins 
///////////////////////////////////////////// 
void bluewins() { 
     lcd.clear(); 
     lcd.setCursor(0,0); 
     lcd.print("Blue team wins!"); 
     lcd.display(); 
     Serial.println("Blue team wins!"); 
     delay(36000); 
} 


///////////////////////////////////////////// 
    // Count down timer 
///////////////////////////////////////////// 
void timer() { 
lcd.setCursor(0,3); 
    lcd.print("Time left:"); 
while (minutes > 0 || seconds >= 0) { 
    lcd.setCursor(15, 3); 
(minutes < 10) ? lcd.print("0") : NULL; 
lcd.print(minutes); 
lcd.print(":"); 
(seconds < 10) ? lcd.print("0") : NULL; 
lcd.print(seconds); 
lcd.display(); 
decrement(); 
delay(1000); 
} 
} 

///////////////////////////////////////////// 
    // Decrement timer 
///////////////////////////////////////////// 
void decrement() { 
     if (seconds > 0) { 
      seconds -= 1; 
     } 
     else  { 
     if (minutes > 0) { 
      seconds = 59; 
      minutes -= 1; 
      } 
      else { 
      timeup(); 
      } 
     } 
} 

///////////////////////////////////////////// 
    // Called when time expires 
///////////////////////////////////////////// 
void timeup() { 
     lcd.clear(); 
     lcd.setCursor(0,0); 
     lcd.print("Time up!"); 
     lcd.display(); 
} 
+1

Bunu http://arduino.stackexchange.com/ adresinden sorun. Bunun için http://stackoverflow.com/ hesabınızı kullanarak bu topluluklara da bağlayabilirsiniz. Siteye gidin, sağ üstte "bu topluluğa katılın" ı tıklayın. – jbm

cevap

0

burada silahın aşağıdaki satırı olarak görünüyor. Bu, seconds >= 0 hala doğru olarak değerlendirdiğinden, dolayısıyla sonsuz bir döngüye neden olduğu için bir sorundur.

+0

Merhaba @Brian - sayaç işlevleri iyi - Sadece 'arka planda' çalıştırmak için ihtiyacım var. Millis() kullanarak (gecikmeyi kaldıran, 'bloke eden' ama maalesef hala işe yaramayacak şekilde kullanıyorum.) – mh512

+0

@ mh512 - Bence orijinal cevabımı yanlış anladınız, engelleme değil Bu, bu durumun askıya alınmasına neden olur, ancak "while (dakikalar> 0 || saniye> = 0)" satırı, 0 dakika, 0 saniyede durduğu için her zaman doğru olarak değerlendirilir. – bcarrigan