Arduino/c 如果/else语句
Arduino/C++ IF/ELSE statements
[以后的编辑]我有一个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);
}
- 我的简单if-else语句是如何无法访问的代码
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 我似乎对if/else的基本语句有问题:/
- 如果 else 语句不断循环
- C++ If/Else 语句被跳过
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 如何将 if else 语句重写为 switch 语句
- 在 C++ 中的 if-else if- else 语句期间更改变量
- 为什么我的 if else 语句不起作用并从数组中输出正确的索引?
- 我的 If Else 语句无法在向量 (C++) 中提供最大值
- 如果 else 语句使用大写和小写字母
- 为什么无论输入如何,所有 if-else 语句都会打印?
- 多个'if'语句,不带'else'
- 嵌套的 else 语句 c++
- 为什么切换 if else 语句的顺序会导致错误?
- 如何使用 if else 语句
- if/else 语句输出由于加号或减号而未显示正确的消息
- if-else 语句仅按特定顺序工作,我不知道为什么
- "if else"被视为单个语句吗?
- 试图避免在 for 循环中出现 if-else 语句,但代码似乎有一些错误