Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Arduino倒数计时器阻止程序的其余部分运行_C++_Arduino - Fatal编程技术网

C++ Arduino倒数计时器阻止程序的其余部分运行

C++ Arduino倒数计时器阻止程序的其余部分运行,c++,arduino,C++,Arduino,我有一个程序,检查RFID标签是否被读取,如果被读取,它会运行一些代码 我还有一个倒计时功能(timer),我想在后台运行。它在LCD底部显示时钟 我遇到的问题是,当我放入timer()时;在主循环中,程序的其余部分在倒计时期间延迟,这意味着没有读取RFID卡 计时器工作,但计时器()以下没有任何内容;他正在跑步 有人知道我该如何预防吗?多谢各位 #include <SPI.h> #include <MFRC522.h> #include <

我有一个程序,检查RFID标签是否被读取,如果被读取,它会运行一些代码

我还有一个倒计时功能(timer),我想在后台运行。它在LCD底部显示时钟

我遇到的问题是,当我放入timer()时;在主循环中,程序的其余部分在倒计时期间延迟,这意味着没有读取RFID卡

计时器工作,但计时器()以下没有任何内容;他正在跑步

有人知道我该如何预防吗?多谢各位

    #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();
}
#包括
#包括
#包括
#包括
int readflag;
int initstate=1;
int nextred=4;
int nextblue=8;
uint8_t读卡[4];
整数分钟=1//开始分钟
整数秒=0//开始秒
MFRC522 MFRC522(10,9);
液晶I2C液晶显示器(0x3F,2,1,0,4,5,6,7,3,正极);
/////////////////////////////////////////设置///////////////////////////////////
无效设置(){
//协议配置
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
mfrc522.PCD_设置天线增益(mfrc522.RxGain_最大值);
lcd.begin(20,4);
}
///////////////////////////////////////////////////////////////////////////////
//主回路
///////////////////////////////////////////////////////////////////////////////
空循环(){
做{
readflag=checkread();
if(initstate==0){
定时器();//启动定时器-定时器工作,但定时器()以下的任何内容都没有运行。
lcd.setCursor(0,0);
打印(“红队下一步:”);
lcd.打印(nextred);
lcd.setCursor(0,1);
打印(“蓝色团队下一步:”);
lcd.打印(下蓝);
}
}
而(!readflag);
音调(8、850、15);
recordid();
updateNext团队编号();
}
///////////////////////////////////////////////////////////////////////////////
//更新团队下一个编号的函数
///////////////////////////////////////////////////////////////////////////////
void updatenextteamnumbers(){
//如果扫描蓝色标签,则显示团队信息
如果(*(uint32_t*)读卡==0xACB7D573){
Serial.println(“检测到蓝色标记,显示团队信息”);
initstate=0;
}
//红队(顺序4,5,2,1,9)
如果(*(uint32_t*)读卡==0x29FDC9F5&&initstate==0),则为else{
Serial.println(“检测到卡4”);
nextred=5;
}
如果(*(uint32_t*)读卡==0x3FCE7832&&initstate==0),则为else{
Serial.println(“检测到卡5”);
nextred=2;
}
如果(*(uint32_t*)读卡==0x3fcce2&&initstate==0),则为else{
Serial.println(“检测到卡2”);
nextred=1;
}
如果(*(uint32_t*)读卡==0x3F7AB752&&initstate==0),则为else{
Serial.println(“检测到卡1”);
nextred=9;
//激活释放
}
如果(*(uint32_t*)读卡==0x00000000&&initstate==0),则为else{
Serial.println(“检测到卡9”);
redwins();
}
//蓝队(顺序8、6、3、7、10)
如果(*(uint32_t*)读卡==0x00000000&&initstate==0),则为else{
Serial.println(“检测到卡8”);
nextblue=6;
}
如果(*(uint32_t*)读卡==0x00000000&&initstate==0),则为else{
Serial.println(“检测到卡6”);
nextblue=3;
}
如果(*(uint32_t*)读卡==0x3F7ABA82&&initstate==0),则为else{
Serial.println(“检测到卡3”);
nextblue=7;
}
如果(*(uint32_t*)读卡==0x00000000&&initstate==0),则为else{
Serial.println(“检测到卡7”);
nextblue=10;
//激活蓝色继电器
}
如果(*(uint32_t*)读卡==0x00000000&&initstate==0),则为else{
Serial.println(“检测到卡10”);
蓝赢();
}
}
///////////////////////////////////////////////////////////////////////////////
//存储在readCard字节数组中检测到的卡的ID
///////////////////////////////////////////////////////////////////////////////
void recordid(){
mfrc522.PICC_IsNewCardPresent();
mfrc522.PICC_ReadCardSerial();
对于(int i=0;i0 | |秒>=0){
lcd.setCursor(15,3);
(分钟<10)?lcd.打印(“0”):空;
lcd.打印(分钟);
lcd.打印(“:”);
(秒<10)?lcd.打印(“0”):空;
lcd.打印(秒);
lcd.display();
减量();
延迟(1000);
}
}
/////////////////////////////////////////////
//减量计时器
/////////////////////////////////////////////
无效减量{
如果(秒>0){
秒-=1;
} 
否则{
如果(分钟>0){
秒=59;
分钟-=1;
} 
否则{
timeup();
}
}
}
///////////
while (minutes > 0 || seconds >= 0)