Arduino/C++ IF/ELSE语句
[稍后编辑]我有一个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.
我希望这是有道理的,它更明确。
很难告诉你的“最后部分”的意思,但让我们假设你在这里:
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);
}
“最后一部分”意味着最后一个如果陈述,抱歉不够清楚。因为我已经在使用的例子在你的代码在我的代码 否则,如果(A && B){ /*其他内容* /} 而且它不工作,我不明白。无论状态如何,我都希望执行“最后一部分”。在我的例子中,这是其中的一个尝试。所以,ANYTIME digitalRead(IESIRE)== 0我希望这种情况发生: Serial.println(“Drum bun!”); digitalWrite(LED_V,HIGH); tone(BUZZER,350); 延迟(300); bariera.write(120); ...(等) –
如果你希望它“完成之前的状态”,那么为什么它在'else if'中具体说“只有在你没有完成其中一个其他可能性“?仔细检查答案:'如果第二位应该总是完成......'如果这不能解决问题,那么我不确定你真正想要做什么。 – John3136
因为我可能主要做的都是错的。在添加交换机之前,我有一个IF和ELSE(用于验证content.substring(1)是==还是!=。一旦我添加了交换机,我就搞砸了代码,但没有运气。 –
你的交换机上有上拉电阻吗? –
我明白,通过使用这个'digitalWrite(IESIRE,HIGH);'激活Arduino Uno上的内部上拉电阻,我也有'pinMode(BuclaInd,INPUT_PULLUP);'的另一个代码和println BuclaInd当开关没有激活时为1,当开关激活时为0,但它什么也没有做。我的问题是编程时的陈述,但我并没有真正明白我做错了什么。 –