Arduino Polska Forum

Pełna wersja: Problem z kodem: Zamek do Sejfu: RFID, Servo, Czujnik Ultradźwiękowy
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam wszystkich  Smile

Mam projekt na zajęcia związany z Arduino. Postanowiłem zrobić sejf z zamkiem. Wykorzystuje on Arduino Uno, Czujnik ultradźwiękowy, Serwomechanizm, oraz czytnik RFID. 

Ma on działać na takiej zasadzie, że drzwi sejfu normalnie są zamknięte, zamek sejfu (serwomechanizm) jest zamknięty. Przykładam odpowiednią kartę do czytnika RFID, zamek w sejfie się otwiera. Otwieram drzwi i kiedy je zamykam z powrotem, zamek zamyka drzwi, ponieważ czujnik ultradźwiękowy wykrył, że drzwi są zamknięte. (odległość jest mniejsza niz 4cm)

Na ten moment niestety mam parę problemów z kodem. Teraz działa to tak, że gdy przykładam kartę, odległość musi być większa niż 4cm, żeby serwomechanizm zadziałał. A, jak opisałem powyżej, nie tak ma to działać. Następnie, kiedy zamek jest otwarty i zamknę drzwi, zamek się zamyka, tak jak powinien. 

Innym problemem jest to, że działa to tylko za pierwszym razem, gdy po wykonaniu powyższej czynności, przykładam kartę drugi raz, nic się nie dzieje.

Trzecim problemem jest, to że kiedy włączam Monitor Portu Szeregowego, wyświetla on cały czas komunikat "Message : Access denied" (mimo że nie przykładam żadnej karty) i po tym jak przyłożę dobrą kartę pojawia się wiadomość "UID tag : F2 00 7C 1B Message : Authorized access", następnie pojawia się cały czas pusta wiadomość "Message :" i gdy zamknę drzwi, z powrotem cały czas wiadomość "Message : Access denied", A chciałbym, aby ze startem programu nie spamowoało mi wiadomościami, tylko przy np. wczytaniu złej karty wyświetliło "Message : Access denied"

Mam nadzieję, że opisałem wszystko w marę zrozumiale i uda się rozwiązać chociaż jeden problem. Dodam że to moje pierwsze miesiące z arduino, wiec jestem dosyć początkującym  Undecided . Z góry dziękuję za pomoc  Big Grin 

PS. Link do filmiku jak, na ten moment, to wygląda: https://drive.google.com/file/d/1JUQ-8gm...sp=sharing


Kod:
Kod:
#include <Servo.h>
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
Servo myServo;
#define trigPin 7
#define echoPin 6
boolean doorLocked = true;
boolean tagRead = false;
String content= "";

void setup(){
 Serial.begin(9600);
 SPI.begin();
 mfrc522.PCD_Init();
 myServo.attach(8);
 lockDoor();
 Serial.println("Put your card to the reader...");
 Serial.println();
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
}
void loop()
{
  int doorClosedDistance = 4;
  int distanceToDoor = getDistance();

  if(distanceToDoor < doorClosedDistance)
  {
     if(!doorLocked)
     {
        lockDoor();
        doorLocked = true;
     }
  }

  readTag();
 
  if(tagRead)
  {
     if(checkTag())
     
     {
        openDoor();
        doorLocked = true;
     }
     tagRead = true;
  }
 

   if(doorLocked)
  {
     if(checkTag())
     {
        openDoor();
        doorLocked = false;
     }
     tagRead = false;
  }

}

int getDistance(){
 digitalWrite(trigPin, LOW);
 delayMicroseconds(5);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW);
 pinMode(echoPin, INPUT);
 unsigned long duration = pulseIn(echoPin, HIGH);
 int cm = (duration/2) / 29.1;    
 return cm;
}

int openDoor(){
   myServo.write(180);}
   
int lockDoor(){
   myServo.write(0);}
   
bool checkTag(){
if (content.substring(1) == "F2 00 7C 1B")
 {
   Serial.println("Authorized access");
   Serial.println();
   return true;
   }

else {
   Serial.println("Access denied");
   Serial.println();
   return false;
 }
 
 
}
void readTag(){
if (mfrc522.PICC_IsNewCardPresent())
{
  if (mfrc522.PICC_ReadCardSerial())
   {
     Serial.print("UID tag :");
     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("Message : ");
       content.toUpperCase();
}
Na początek napisz program tylko do karty i czy coś drukować czy nie uzależnij na początku od tego czy w ogóle odczytałeś jakiekolwiek wartości, dopiero w kolejnym kroku decyduj czy wartość odczytana jest prawidłowa czy nie.
Możesz też użyć millis() i wydruki robić nie częściej niż co 1s.
By nie odczytywać kart wtedy gdy nikt jej nie użył możesz użyć przykładu z biblioteki MFRC z IRQ, "minimalInterrupt". W tym przykładzie odczyt czytnik przywołuje przerwaniem uC po wykryciu karty.
Oczywiście odczyt karty nie ma sensu gdy drzwi są otwarte.
Do wszystkiego powinieneś jeszcze nauczyć się obsługiwać upływ czas z millis().
Teraz w programie masz tak, że natychmiast po wykryciu stanu, że odległość jest mniejsza niż 4 i drzwi są otwarte drzwi zostaną zamknięte. Powinieneś zablokować możliwość zamknięcia drzwi na np. 10s po otwarciu kartą. Być może otwarcie kartą działa, tyle że po otwarciu natychmiast są zamykane.