dimanche 4 juin 2017

Arduino/C++ IF/ELSE statements

I have a Arduino Uno together with an RFID-RC522, a servo motor and some LED's + I also made a aluminium foil sandwich/switch. Here is the code:

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

  }
}

The thing is the last part never gets executed and I've tried different variants. If a card is registered by RFICD-RC522 in the content.substring(1) then message, green light, short buzzer tone and servoM up - if a card is NOT registered - red light, long buzzer tone and NO servoM movement. Also if (digitalRead(IESIRE)==0) (The aluminium foil sandwich/switch is pressed) then give access (same as if content.substring(1) == "A0 B9 8D 7C").

I am sure my if/else if statements are wrong, I tried different variations but no luck. I'm kind of pressed by time and everything seems to fail.

Aucun commentaire:

Enregistrer un commentaire