Tresor Bauvorschlag 3

Aus den einzelnen Grundlagen kannst du dein eigenes Programm zusammensetzen und mit Hilfe der Schemen die Tresorsteuerung selbst entwickeln. Damit du eine Vorstellung davon bekommst, wie dein Endprodukt aufgebaut werden kann, gibt es schon 3 Vorschläge. Lass dich inspirieren!

In diesem Vorschlag wird die Steuerung über einen LDR, einen IR-Sensor, einen Taster und ein RFID-Leser gemacht, mit einer RGB-LED wird der Zustand angezeigt und mit zwei Servos wird geöffnet und geschlossen.

 

///////////////////////////////////*DEFINITIONEN*///////////////////////////////////
/*SERVO-DEFINITIONEN*/
#include <Servo.h> //Bibliotheke des Servo wird eingefügt
#define SERVOPIN1 2 //Hier wird der Pin definiert, wo der Servo1 angeschlossen ist
#define SERVOPIN2 3 //Hier wird der Pin definiert, wo der Servo2 angeschlossen ist
Servo servo1; //Der Servo1 muss auch definiert werden
Servo servo2; //Der Servo2 muss auch definiert werden

/*Zustandsanzeige*/
#define LED_GREEN 5 //Die grüne LED wird am Pin5 angesteuert
#define LED_RED 6 //Die rote LED wird am Pin6 angesteuert

/*IR-DEFINITONEN*/
#include <IRremote.h> //Bibliotheke des IR-Empfängers wird eingefügt

/* WICHTIG: Der PIN darf keine Zifferwiederholungen nacheinander ausfeisen. Beispiel 1122 geht nicht. 1212 geht.*/

unsigned long PINZAHL1 = 0xFF30CF; //Pinzahl 1 entspricht der Taste 1 (0xFF30CF), was nach belieben verändert werden kann
unsigned long PINZAHL2 = 0xFF18E7; //Pinzahl 2 entspricht der Taste 2 (0xFF18E7), was nach belieben verändert werden kann
unsigned long PINZAHL3 = 0xFF7A85; //Pinzahl 3 entspricht der Taste 3 (0xFF7A85), was nach belieben verändert werden kann
unsigned long PINZAHL4 = 0xFF10EF; //Pinzahl 4 entspricht der Taste 4 (0xFF10EF), was nach belieben verändert werden kann

unsigned long MUTE_TASTE = 0xFFE21D; //Definition der MUTE-Taste
unsigned long POWER_TASTE = 0xFFA25D; //Definition der POWER-Taste

int cnt = 0; //den counter braucht es bei der PIN-Überprüfung
int reciver = 4; //An diesem Pin wird der IR-Empfänger ausgelesen
IRrecv irrecv(reciver);
decode_results results;

/*LICHT-DEFINITIONEN*/
#define LICHTPIN A0 //Der Begriff LICHTPIN hat den Wert A0

/*RFID-DEFINITIONEN*/
#include <SPI.h>
#include <RFID.h>
#define SDA_PIN 10 //über Pin10 laufen die SDA-Daten
#define RST_PIN 9 //Pin9 wird als Reset-Pin definiert
RFID rfid(SDA_PIN, RST_PIN);

byte pendant[5] = {0xA9,0xFA,0x1F,0xA3,0xEF}; //Beispielwerte für eine ID-Karte
byte card[5] = {0x10,0x60,0xD9,0xA4,0xD}; //Beispielwerte für einen ID-Anhänger

byte serNum[5];
byte data[5];

/*TASTER-DEFINITIONEN*/
#define TASTER 8 //Der Begriff TASTER hat den Wert 8

///////////////////////////////////*SETUP*///////////////////////////////////
void setup() {
  Serial.begin(9600); //Startet die serielle Kommunikation
  
  /*SERVO*/
  servo1.attach(SERVOPIN1); //Definition, welcher Pin (SERRVOPIN1) den Servo1 steuert
  servo2.attach(SERVOPIN2); //Definition, welcher Pin (SERRVOPIN2) den Servo2 steuert
  servo1.write(0); //Startposition des Servo1 wird eingestellt (0°)
  servo2.write(0); //Startposition des Servo2 wird eingestellt (0°)

  /*Zustandsanzeige*/
  pinMode(LED_GREEN, OUTPUT); //Definert den PIN der grünen LED als Ausgang
  pinMode(LED_RED, OUTPUT); //Definiert den PIN der roten LED als Ausgang

  /*IR*/
  irrecv.enableIRIn(); //Wird benötigt um den IR-Empfänger auszulesen

  /*LICHT*/
  //Die Lichtkontrolle braucht keine Befehle im setup-Teil

  /*RFID*/
  SPI.begin();
  rfid.init();
  
  /*TASTER*/
  pinMode(TASTER, INPUT_PULLUP); //Definiert den TASTER als PULLUP-Input, wo Daten gelesen werden

  Schliessen(); //Der Tresor soll bei einem Neustart immer zuerst geschlossen werden
}

///////////////////////////////////*LOOP*///////////////////////////////////
void loop() {
    /*IR*/
  KNOPFKontrolle_1(); //Startet Funktion, welche prüft, ob ein bestimmter Knopf an der Fernsteuerung gedrückt wurde
  KNOPFKontrolle_2(); //Startet Funktion, welche prüft, ob ein bestimmter Knopf an der Fernsteuerung gedrückt wurde
  PINKontrolle(); //Durchläuft die PIN-Kontrolle
  
  /*LICHT*/
  LICHTKontrolle(); //Führt ein Programm aus, welches prüft, ob der Lichtwert (160) unterschritten wurde

  /*RFID*/
  RFIDKontrolle_1(); //Startet Funktion, welche prüft, ob eine bestimmt ID-Card am RFID-Leser erkannt wurde
  RFIDKontrolle_2(); //Startet Funktion, welche prüft, ob eine bestimmt ID-Card am RFID-Leser erkannt wurde
  
  /*TASTER*/
  Taster(); //Führt ein Programm aus, welches prüft, ob der Taster gedückt wurde
}

///////////////////////////////////*WEITERE FUNKTIONEN*///////////////////////////////////

void Oeffnen(){
  servo1.write(90); //Servo1 wird auf 90° gedreht
  servo2.write(90); //Servo2 wird auf 90° gedreht
  
  /*Dieser Abschnitt lässt die grüne LED leuchten und löscht die rote LED*/
  digitalWrite(LED_GREEN, HIGH);
  digitalWrite(LED_RED, LOW);

  Serial.println("Pin korrekt oder MUTE-TASTE gedrückt oder viel Licht erkannt oder ID-Card erkannt");

  delay(2000); //2 Sekunden Pause, damit der Servo genügend Zeit zum Drehen hat
}

void Schliessen (){
  servo1.write(0); //Servo1 wird auf Startposition (0°) gedreht
  servo2.write(0); //Servo2 wird auf Startposition (0°) gedreht
  
  /*Dieser Abschnitt lässt die rote LED leuchten und löscht die grüne LED*/
  digitalWrite(LED_GREEN, LOW);
  digitalWrite(LED_RED, HIGH);

  Serial.println("POWER-TASTE gedrückt oder Anhänger erkannt oder Taster gedrückt");

  delay(2000); //2 Sekunden Pause, damit der Servo genügend Zeit zum Drehen hat
}

  /*IR*/  
void KNOPFKontrolle_1(){
  if (irrecv.decode(&results)){
      irrecv.resume();
  }
  if (results.value == MUTE_TASTE){
    Oeffnen(); //Wird ausgeführt, wenn die MUTE-Taste gedrückt wurde
    results.value = 0xFFFFFF; //results.value braucht diesen Wert, damit die Funktion "Oeffnen" nicht ohne erneute Überprüfung ausgeführt wird
  }
}

void KNOPFKontrolle_2(){
  if (irrecv.decode(&results)){
    irrecv.resume();
  }
  if (results.value == POWER_TASTE){
    Schliessen(); //Wird ausgeführt, wenn die POWER-Taste gedrückt wurde
    results.value = 0xFFFFFF; //results.value braucht diesen Wert, damit die Funktion "Schliessen" nicht ohne erneute Überprüfung ausgeführt wird
  }
}

void PINKontrolle(){
  /*Aufbau: Auslesen des Werts im IR-Empfänger. Anschliessend Vergleich des IR-Werts mit dem gespeicherten PIN. Abhängig vom PIN-Code und der momentanen Eingabe schreitet das Porgramm voran. Ist der PIN korrekt, wird die Funktion Oeffnen(); ausgeführt.*/
  if (irrecv.decode(&results)){
  irrecv.resume();
  }
  if (results.value == PINZAHL1 && cnt == 0 && results.value != 0xFFFFFFFF){
    cnt++;
    }
  if (results.value == PINZAHL2 && cnt == 1 && results.value != PINZAHL1 && results.value != 0xFFFFFFFF){
    cnt++;
    }
  else if (results.value != PINZAHL1 && cnt == 1 && results.value != 0xFFFFFFFF){
    cnt = 0;
    }
  if (results.value == PINZAHL3 && cnt == 2 && results.value != PINZAHL2 && results.value != 0xFFFFFFFF){
    cnt++;
    }
  else if (results.value != PINZAHL2 && cnt == 2 && results.value != 0xFFFFFFFF){
    cnt = 0;
    }
  if (results.value == PINZAHL4 && cnt == 3 && results.value != PINZAHL3 && results.value != 0xFFFFFFFF){
    Oeffnen();
    cnt = 0;
    }
  else if (results.value != PINZAHL3 && cnt == 3 && results.value != 0xFFFFFFFF){
    cnt = 0;
    }
}

  /*LICHT*/
void LICHTKontrolle(){
  if (analogRead(LICHTPIN) < 160){
    Oeffnen(); //Wenn der Lichtwert unterschritten wurde, wird das Unterprogramm "Oeffnen" ausgeführt
  }
}

  /*RFID*/
void RFIDKontrolle_1(){
  /*Dieses Programm überprüft ständig, ob am RFID-Leser der Wert mit dem von "card" übereinstimmt. Ist dies der Fall, wird Oeffnen(); ausgeführt*/
  boolean card_card = true;
  if (rfid.isCard()) {
    if (rfid.readCardSerial()) {
      for (int j = 0; j < 5; j++){
        data[j] = rfid.serNum[j];
      }
    }
    for (int i = 0; i < 5; i++){
      if (data[i] != card[i]) card_card = false;
    }
    if (card_card){
      Oeffnen();
    }
  }
  rfid.halt();
}

void RFIDKontrolle_2(){
  /*Dieses Programm überprüft ständig, ob am RFID-Leser der Wert mit dem von "pendant" übereinstimmt. Ist dies der Fall, wird Schliessen(); ausgeführt*/
  boolean card_card = true;
  if (rfid.isCard()) {
    if (rfid.readCardSerial()) {
      for (int j = 0; j < 5; j++){
        data[j] = rfid.serNum[j];
      }
    }
    for (int i = 0; i < 5; i++){
      if (data[i] != pendant[i]) card_card = false;
    }
    if (card_card){
      Schliessen();
    }
  }
  rfid.halt();
}

  /*TASTER*/
void Taster(){
  if (digitalRead(TASTER) == LOW){
    Schliessen(); //Wenn der Taster gedrückt wurde, wird das Unterprogramm "Schliessen" ausgeführt
  }
}