2017-06-05 17 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カード/ TAGが「A0 B9 8D 7C」、LED_Vライト、短いブザー音、およびサーボ(ここでは名前のbariera)であれば120度になる。

RFIDカード/タグが「A0 B9 8D 7C」でない場合、LED_Rが点灯し、長いブザー音とservは何もしません。

アルミフォイルスイッチ(アルミ板2枚を段ボールで挟んだり、(デジタル読み込み(IESIRE)== 0)を押してLEDバックライト、ショートブザー音、サーボ(ここではバリエラ) 。120度

にこれはスイッチで全部のコードです(の#define 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); 

    } 
} 

文やものならば、私はコーディングにかなり新しいよ、他は無視してくださいスイッチを押すと(これは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) 'というコードもありました。スイッチが作動していないときは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 ifは無視されます。

常に2番目のビットを終了する必要がある場合は、「else if」を削除して、常にチェックします。どちらかのケースである場合は、より具体的な部分を一般的な場合の前に入れてください。(A && B)

また、私は明確に言うと、substrを2回呼び出さないでください。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(自分を繰り返さないでください)が重要である理由の良い例です。あなたは2つの条件のために繰り返される約10行の1つのチャンクを持っています - それはそれがずっとシャットが起こっていることを見ることがはるかに難しくなります。元のコードとこの単純化されたバージョンのコードを比較してください。

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

"最後の部分"は最後のelse if文を意味します。コード内のコードで既に例を使用しているため、わかりません。 else if(A && B){ /*その他のもの*/ } これは機能しません。私は "最後の部分"がその前の状態に関係なく実行されるようにしたい。私の例では、試行の1つでした。だから、いつもdigitalRead(IESIRE)== 0これが起こりたいのです。 Serial.println( "Drum bun!"); digitalWrite(LED_V、HIGH); tone(BUZZER、350); 遅延(300); bariera.write(120); ...(等) –

+0

"前の状態に関係なく"それをしたいのであれば、特に、 "あなたが他の可能性 "?答えをダブルチェックしてください。「2番目のビットを常に実行する必要がある場合は...」問題が解決しない場合は、実際に何をしたいか分かりません。 – John3136

+0

私はおそらく大部分が間違っているでしょう。スイッチを追加する前に、私はIFとELSEを持っていました(content.substring(1)が==または!=になっていることを確認するために)。スイッチを追加した後、私は運が無かったのでコードを駄目にしました。 –

関連する問題