2017-06-05 151 views
-1

[稍後編輯]我有一個Arduino Uno和一個RFID-RC522,一個伺服電機和一些LED +我也做了一個鋁箔三明治/開關。下面是代碼的鋁基開關之前,一切工作完美:Arduino/C++ IF/ELSE語句

#include <SPI.h> 
#include <MFRC522.h> 
#include <Servo.h> 

#define SS_PIN 10 // SLAVE SELECT la DIGITAL 10 
#define RST_PIN 9 // PIN RESET la DIGITAL 9 
#define LED_V 5 //LED_Verde la D5 
#define LED_R 4 //LED_Rosu la D4 
#define BUZZER 2 //BUZZER la D2 
MFRC522 mfrc522(SS_PIN, RST_PIN); // Creaza instanta MFRC522. 
Servo bariera; //defineste nume Servo 

void setup() 
{ 
    Serial.begin(9600); // Incepe comunicatia seriala cu PC-ul 
    SPI.begin();  // Initializeaza bus-ul SPI 
    mfrc522.PCD_Init(); // Initializeaza MFRC522 
    bariera.attach(3); //servo pin 
    bariera.write(0); //servo pozitie start 
    pinMode(LED_V, OUTPUT); 
    pinMode(LED_R, OUTPUT); 
    pinMode(BUZZER, OUTPUT); 
    noTone(BUZZER); 
    Serial.println("Apropie cartela...[x][][]"); 
    delay(2500); 
    Serial.println("Apropie cartela...[x][x][]"); 
    delay(3500); 
    Serial.println("Apropie cartela...[x][x][x]"); 
    delay(4500); 
    Serial.println("Astept raspuns utilzator!"); 
    Serial.println(); 

} 
void loop() 
{ 
    // Cauta cartele noi 
    if (! mfrc522.PICC_IsNewCardPresent()) 
    { 
    return; 
    } 
    // Selecteaza una dintre cartele 
    if (! mfrc522.PICC_ReadCardSerial()) 
    { 
    return; 
    } 
    //Arata UID pe monitorul serial 
    Serial.print("ID Tag/Cartela: "); 
    String content= ""; 
    byte letter; 
    for (byte i = 0; i < mfrc522.uid.size; i++) 
    { 
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); 
    Serial.print(mfrc522.uid.uidByte[i], HEX); 
    content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); 
    content.concat(String(mfrc522.uid.uidByte[i], HEX)); 
    } 
    Serial.println(); 
    Serial.print("Mesaj : "); 
    content.toUpperCase(); 
    if (content.substring(1) == "A0 B9 8D 7C") //aici schimbam ID-ul (UID-ul) cartelelor autorizate, citite anterior pe monitorul serial 
    { 
    Serial.println("Acces autorizat! Bine ati venit!"); 
    Serial.println(); 
    delay(500); 
    digitalWrite(LED_V, HIGH); 
    tone(BUZZER, 350); 
    delay(300); 
    noTone(BUZZER); 
    bariera.write(120); 
    delay(5000); 
    bariera.write(0); 
    digitalWrite(LED_V, LOW); 

    } 

else { 
    Serial.println(" Access interzis! La revedere!"); 
    digitalWrite(LED_R, HIGH); 
    tone(BUZZER, 300); 
    delay(1000); 
    digitalWrite(LED_R, LOW); 
    noTone(BUZZER); 
    } 
} 

因此,如果RFID卡/標籤爲「A0 B9 8D 7C」,LED_V燈,短蜂鳴音,伺服(這裏命名bariera)達到120度。

如果RFID CARD/TAG不是「A0 B9 8D 7C」,LED_R點亮,蜂鳴器響一聲,伺服器什麼也不做。 (digitalRead(IESIRE)== 0),它應該:LED_V燈,短蜂鳴器音和伺服器(這裏命名爲bariera)去。120度

這是與交換機整個事情的代碼包括:(#定義IESIRE 6):

#include <SPI.h> 
#include <MFRC522.h> 
#include <Servo.h> 

#define SS_PIN 10 // SLAVE SELECT la DIGITAL 10 
#define RST_PIN 9 // PIN RESET la DIGITAL 9 
#define LED_V 5 //LED_Verde la D5 
#define LED_R 4 //LED_Rosu la D4 
#define BUZZER 2 //BUZZER la D2 
#define IESIRE 6 // IESIRE la D6 
MFRC522 mfrc522(SS_PIN, RST_PIN); // Creaza instanta MFRC522. 
Servo bariera; //defineste nume Servo 

void setup() 
{ 
    Serial.begin(9600); // Incepe comunicatia seriala cu PC-ul 
    SPI.begin();  // Initializeaza bus-ul SPI 
    mfrc522.PCD_Init(); // Initializeaza MFRC522 
    bariera.attach(3); //servo pin 
    bariera.write(0); //servo pozitie start 
    pinMode(LED_V, OUTPUT); 
    pinMode(LED_R, OUTPUT); 
    pinMode(BUZZER, OUTPUT); 
    pinMode(IESIRE, INPUT); 
    digitalWrite(IESIRE, HIGH); 
    noTone(BUZZER); 
    Serial.println("Apropie cartela...[x][][]"); 
    delay(2500); 
    Serial.println("Apropie cartela...[x][x][]"); 
    delay(3500); 
    Serial.println("Apropie cartela...[x][x][x]"); 
    delay(4500); 
    Serial.println("Astept raspuns utilzator!"); 
    Serial.println(); 
} 
void loop() 
{ 
    // Cauta cartele noi 
    if (! mfrc522.PICC_IsNewCardPresent()) 
    { 
    return; 
    } 
    // Selecteaza una dintre cartele 
    if (! mfrc522.PICC_ReadCardSerial()) 
    { 
    return; 
    } 
    //Arata UID pe monitorul serial 
    Serial.print("ID Tag/Cartela: "); 
    String content= ""; 
    byte letter; 
    for (byte i = 0; i < mfrc522.uid.size; i++) 
    { 
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); 
    Serial.print(mfrc522.uid.uidByte[i], HEX); 
    content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ")); 
    content.concat(String(mfrc522.uid.uidByte[i], HEX)); 
    } 
    Serial.println(); 
    Serial.print("Mesaj : "); 
    content.toUpperCase(); 
    if (content.substring(1) == "A0 B9 8D 7C") //aici schimbam ID-ul (UID-ul) cartelelor autorizate, citite anterior pe monitorul serial 
    { 
    Serial.println("Acces autorizat! Bine ati venit!"); 
    Serial.println(); 
    delay(500); 
    digitalWrite(LED_V, HIGH); 
    tone(BUZZER, 350); 
    delay(300); 
    noTone(BUZZER); 
    bariera.write(120); 
    delay(5000); 
    bariera.write(0); 
    digitalWrite(LED_V, LOW); 

    } 

else if (content.substring(1) != "A0 B9 8D 7C") { 
    Serial.println(" Access interzis! La revedere!"); 
    digitalWrite(LED_R, HIGH); 
    tone(BUZZER, 300); 
    delay(1000); 
    digitalWrite(LED_R, LOW); 
    noTone(BUZZER); 

} 

    else if ((content.substring(1) != "A0 B9 8D 7C") && (digitalRead(IESIRE)==0))  { 
    Serial.println("Drum bun!"); 
    digitalWrite(LED_V, HIGH); 
    tone(BUZZER, 350); 
    delay(300); 
    bariera.write(120); 
    delay(5000); 
    bariera.write(0); 
    digitalWrite(LED_V, LOW); 

    } 
} 

請忽略else if語句之類的東西,我是相當新的編碼所以如果開關被按下(這轉換爲digitalRead(IESIRE)==0)),伺服需要達到120度,而不管其他狀態NTS。

CARD/RFID TAG present > recognised > servo to 120 + led, buzzer 
       present > not recognised > led, buzzer 
IF SWITCH is pressed > servo to 120 + led, buzzer REGARDLESS of the CARD stuff. 

我希望這是有道理的,它更明確。

+0

你的交換機上有上拉電阻嗎? –

+0

我明白,通過使用這個'digitalWrite(IESIRE,HIGH);'激活Arduino Uno上的內部上拉電阻,我也有'pinMode(BuclaInd,INPUT_PULLUP);'的另一個代碼和println BuclaInd當開關沒有激活時爲1,當開關激活時爲0,但它什麼也沒有做。我的問題是編程時的陳述,但我並沒有真正明白我做錯了什麼。 –

回答

4

很難告訴你的「最後部分」的意思,但讓我們假設你在這裏:

else if (content.substring(1) != "A0 B9 8D 7C") { 
    /* stuff */ 
} 
else if ((content.substring(1) != "A0 B9 8D 7C") && (digitalRead(IESIRE)==0))  { 
    /* other stuff */ 
    } 

讓簡化:

else if (A) { 
    /* stuff */ 
} 
else if (A && B)  { 
    /* other stuff */ 
    } 

你現在可以看嗎?如果符合條件A,則第一位完成,因此忽略else。

如果第二位應該總是刪除「else if」,所以它總是被檢查。如果是某種情況,則在一般情況之前放置更具體的部分(A && B)

另外:對於性能和敢於說清晰度,不要撥打substr兩次 - 將substr(...) != "..."存儲在一個變量中,只使用該變量。如果你給它一個明智的名字,比如!= "A0 B9 8D 7C"實際上意味着什麼,你的代碼就變得更清晰了!你也避免了必須改變字符串在2個地方的麻煩,如果值的變化等

編輯: 所以從評論:ANYTIME digitalRead(IESIRE)== 0我想這發生:Serial.println(「鼓包!「); digitalWrite(LED_V,HIGH); (BUZZER,350);延遲(300); bariera.write(120); ...(等)

你應該這樣做:

else if (content.substring(1) != "A0 B9 8D 7C") { 
    /* stuff */ 
} 

if (digitalRead(IESIRE)==0)  { 
    /* other stuff */ 
    } 

注意它不是一個else if,我們已經刪除了冗餘的檢查,你不關心。

另一編輯:

我認爲這樣做。這是DRY(不要重複自己)很重要的一個很好的例子。你有一條大約10條線,這是重複的兩種條件 - 這使得更難以看到破壞正在發生。將您的原始代碼與此代碼的簡化版本進行比較。

if (content.substring(1) == "A0 B9 8D 7C") { //aici schimbam ID-ul (UID-ul) cartelelor autorizate, citite anterior pe monitorul serial 
    doA(); 
    } 
else if (content.substring(1) != "A0 B9 8D 7C") { 
    do(B); 
} 
    else if ((content.substring(1) != "A0 B9 8D 7C") && (digitalRead(IESIRE)==0))  { 
    doA(); 
    } 


I think this is what you want: 


bool isRightCard = (content.substring(1) == "A0 B9 8D 7C"); 
bool buttonPressed = digitalRead(IESIRE)==0; 
if (isRightCard || buttonPressed) //aici schimbam ID-ul (UID-ul) cartelelor autorizate, citite anterior pe monitorul serial 
    { 
    if (buttonPressed) 
    { 
     Serial.println("Drum bun!"); 
    } 
    else 
    { 
     Serial.println("Acces autorizat! Bine ati venit!"); 
    } 
    Serial.println(); 
    delay(500); 
    digitalWrite(LED_V, HIGH); 
    tone(BUZZER, 350); 
    delay(300); 
    noTone(BUZZER); 
    bariera.write(120); 
    delay(5000); 
    bariera.write(0); 
    digitalWrite(LED_V, LOW); 

    } 
else { 
    Serial.println(" Access interzis! La revedere!"); 
    digitalWrite(LED_R, HIGH); 
    tone(BUZZER, 300); 
    delay(1000); 
    digitalWrite(LED_R, LOW); 
    noTone(BUZZER); 

} 
+0

「最後一部分」意味着最後一個如果陳述,抱歉不夠清楚。因爲我已經在使用的例子在你的代碼在我的代碼 否則,如果(A && B){ /*其他內容* /} 而且它不工作,我不明白。無論狀態如何,我都希望執行「最後一部分」。在我的例子中,這是其中的一個嘗試。所以,ANYTIME digitalRead(IESIRE)== 0我希望這種情況發生: Serial.println(「Drum bun!」); digitalWrite(LED_V,HIGH); tone(BUZZER,350); 延遲(300); bariera.write(120); ...(等) –

+0

如果你希望它「完成之前的狀態」,那麼爲什麼它在'else if'中具體說「只有在你沒有完成其中一個其他可能性「?仔細檢查答案:'如果第二位應該總是完成......'如果這不能解決問題,那麼我不確定你真正想要做什麼。 – John3136

+0

因爲我可能主要做的都是錯的。在添加交換機之前,我有一個IF和ELSE(用於驗證content.substring(1)是==還是!=。一旦我添加了交換機,我就搞砸了代碼,但沒有運氣。 –