Arduino/c 如果/else语句

Arduino/C++ IF/ELSE statements

本文关键字:语句 else Arduino 如果      更新时间:2023-10-16

[以后的编辑]我有一个Arduino uno,还有RFID-RC522,一个伺服电机和一些LED ,我还制作了一个铝箔三明治/开关。这是铝开关之前的代码,一切正常。

#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卡/标签不是" A0 B9 8d 7c",LED_R灯,长蜂鸣器音调和服务无济于事。

我还制作了一个铝箔开关(两张由纸板隔开的铝纸,当按下时((digitalRead(iesire(== 0(,它应该:LED_V灯光,短蜂鸣器音调和伺服器(这里名为Bariera(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)(,无论其他语句如何

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.

我希望这是有道理的,而且更明确。

很难说出您的意思是"最后一部分",但假设您在这里:

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",因此请始终检查。如果是一个或另一个情况,则将更具体的部分(A && B)放在一般情况下。

另外:对于性能和敢说清晰,请勿两次调用substr - 将substr(...) != "..."存储在变量中,然后使用该变量。如果您给它一个明智的名称,例如!= "A0 B9 8D 7C"的实际含义,那么您的代码就会变得更加清晰!您还避免了必须在2个位置更改的弦的麻烦,值得更改等。

编辑:因此,从评论中:Anytime DigitalRead(Iesire(== 0我希望发生这种情况:serial.println(" Drum bun!"(;DigitalWrite(LED_V,高(;音调(蜂鸣器,350(;延迟(300(;Bariera.Write(120(;...(等(

您应该这样做:

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

请注意,这不是else if,我们删除了您不在乎的冗余检查。

另一个编辑:

我认为这样做。这是一个很好的例子,说明为什么干燥(不要重复自己(很重要。您有一个大约10行的一部分,可以在2个条件下重复进行 - 这使得Shat正在进行中变得更加困难。将您的原始代码与您的代码的简化版本进行比较。

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);
 }