Tresor Bauvorschlag 2

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 und einen IR-Sensor gemacht, mit einer RG-LED wird der Zustand angezeigt und mit einem Servo 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
Servo servo1; //Der Servo1 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

///////////////////////////////////*SETUP*///////////////////////////////////
void setup() {
  Serial.begin(9600); //Startet die serielle Kommunikation
  
  /*SERVO*/
  servo1.attach(SERVOPIN1); //Definition, welcher Pin (SERRVOPIN1) den Servo1 steuert
  servo1.write(0); //Startposition des Servo1 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

  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
}

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

void Oeffnen(){
  servo1.write(90); //Servo1 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");

  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
  
  /*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");

  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 Schliessen2(); 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
  }
}