Arduino Projekt: Türsicherheitssystem: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(46 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Kategorie:Arduino: Projekt]]
[[Kategorie:Arduino: Projekt]]
[[Datei:TastFeldXgif.gif|thumb|right|700px|Abb. 1: Tür Sicherheitssystem]]
[[Datei:TastFeldXgif.gif|thumb|right|700px|Abb. 1: Türsicherheitssystem]]


'''Autor:''' Justin Frommberger<br>
'''Autor:''' Justin Frommberger<br>


=='''Aufgabenstellung'''==
==Aufgabenstellung==
* Ziel des Projektes ist es, ein Türsicherheitssystem zu simulieren.
* Ziel des Projektes ist, ein Türsicherheitssystem zu simulieren.
* Die Aufgabe besteht darin, die Tür mit einem vierstelligen Zahlencode zu öffnen (LED leuchtet grün).
* Die Aufgabe besteht darin, die Tür mit einem vierstelligen Zahlencode zu öffnen (LED leuchtet grün).
* Wird der Code 3-mal falsch eingegeben, ertönt ein Warnsignal und die LED leuchtet rot.
* Wird der Code 3-mal falsch eingegeben, ertönt ein Warnsignal und die LED leuchtet rot.
* Alle Eingaben müssen auf dem seriellen Monitor angezeigt werden.<br><br>
* Alle Eingaben müssen auf dem seriellen Monitor angezeigt werden.<br>
 
⇒ Für den Fall, dass '''kein Arduino''' zur Verfügung steht oder '''Materialien''' nicht vorhanden sind. Kann dieser '''webbasierter Arduino Emulator''' verwendet werden. [https://wokwi.com/projects/new/arduino-uno [klicken]]
<br><br>
[[Datei:UML_Tür.png|600px]]<br>
[[Datei:UML_Tür.png|600px]]<br>
[Abb. 2: UML]
[Abb. 2: UML]


== '''Benötigte Materiallien''' ==
== Benötigte Materialien ==
'''Tabelle 1: Materialliste'''
{| class="wikitable"
{| class="wikitable"
|+ style = "text-align: left"|
|+ style = "text-align: left"| Tabelle 1: Materialliste
|-
|-
! Nr. !! Anz.    !! Beschreibung !! Bild
! Nr. !! Anz.    !! Beschreibung !! Bild
Zeile 21: Zeile 23:
|<big><big>&#9312;</big></big>  || 1 || [[Arduino|Funduino Arduino UNO R3]] ||[[Datei:Arduino Uno R3.jpg|ohne|100px|]]
|<big><big>&#9312;</big></big>  || 1 || [[Arduino|Funduino Arduino UNO R3]] ||[[Datei:Arduino Uno R3.jpg|ohne|100px|]]
|-
|-
|<big><big>&#9313;</big></big>  || 1 || USB A zu USB B||[[Datei:Arduino_Kabel.png|ohne|100px|]]
|<big><big>&#9313;</big></big>  || 1 || Typ 2 ||[[Datei:Arduino_Kabel.png|ohne|100px|]]
|-
|-
|<big><big>&#9314;</big></big>  || 20+ || Jumperkabel, männlich/männlich||[[Datei:R19-F-2-2.jpg|ohne|100px|]]
|<big><big>&#9314;</big></big>  || 20+ || Jumperkabel, männlich/männlich||[[Datei:R19-F-2-2.jpg|ohne|100px|]]
Zeile 39: Zeile 41:
|}
|}


== '''Vorab wichtig zu wissen!''' ==
== Vorab wichtig zu wissen ==
[[Datei:Anode Kathode.png |thumb|rigth|130px|Abb. 3: LED]]
[[Datei:Anode Kathode.png |thumb|rigth|130px|Abb. 3: LED]]


Zeile 48: Zeile 50:
| '''Schwarz oder Braun'''|| Masse (GND)<br>
| '''Schwarz oder Braun'''|| Masse (GND)<br>
|-
|-
| <span style="color:red;"> '''Rot''' </span>''' || VCC/+<nowiki>&thinsp;</nowiki>5&thinsp;V<br>
|'''Rot''' || VCC/+<nowiki>&thinsp;</nowiki>5&thinsp;V<br>
|-
|-
| '''Organe, Gelb oder Weiß'''|| PWM-Signal
| '''Organe, Gelb oder Weiß'''|| PWM-Signal
Zeile 54: Zeile 56:


===Tastenfeld===
===Tastenfeld===
Was ist ein Tastenfeld, siehe: [https://wiki.hshl.de/wiki/index.php/4x4_Tastenfeld [klicken]]
Definition Tastenfeld [https://wiki.hshl.de/wiki/index.php/4x4_Tastenfeld [klicken]]


== '''Aufbau Schaltung''' ==
== Aufbau Schaltung ==
[[Datei:Tür_Schaltplan.png|550px|thumb|right|Abb.4 Schaltung Tür Sicherheitssystem]]
[[Datei:Tür_Schaltplan.png|550px|thumb|right|Abb.4 Schaltung Tür Sicherheitssystem]]
In Abb. 4 wird die Schaltung für das Projekt '''"Tür Sicherheitssystem"''' dargestellt.<br>
In Abbildung 4 wird die Schaltung für das Projekt '''"Tür Sicherheitssystem"''' dargestellt.<br>
Bevor mit der Programmierung begonnen werden kann, muss die Schaltung des Projekts aufgebaut werden.
Bevor mit der Programmierung begonnen werden kann, muss die Schaltung des Projekts aufgebaut werden.


=='''Programmierung'''==
==Programmierung==
Es ist wichtig, die [[Programmierrichtlinien Einsteiger|['''Programmierrichtlinien''']]] beim Programmieren einzuhalten.<br><br>
Es ist wichtig, die [[Programmierrichtlinien Einsteiger|['''Programmierrichtlinien''']]] beim Programmieren einzuhalten.<br><br>
 
Wenn Sie Fragen zur Programmierung haben, finden Sie die Antworten in den [https://wiki.hshl.de/wiki/index.php/Kategorie:Arduino:_Projekt_Grundkenntnisse ['''Grundkenntnissen''']].
===1) Bibliotheken einfügen===
<br>
Lade, für das Projekt, die [https://github.com/Chris--A/Keypad '''Bibliothek'''] für das Tastenfeld 4x4 herunter.<br>
----
=== Bibliotheken einfügen===
Laden Sie für das Projekt die [https://github.com/Chris--A/Keypad '''Bibliothek'''] für das Tastenfeld 4x4 herunter.<br>
Benötigt werden die Bibliotheken <code>'''Servo.h'''</code> und <code>'''Keypad.h'''</code>.  
Benötigt werden die Bibliotheken <code>'''Servo.h'''</code> und <code>'''Keypad.h'''</code>.  


Zeile 73: Zeile 77:
|-
|-
|
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:14px">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
/* Benötigte Bibliotheken */
/* Benötigte Bibliotheken */
#include <Keypad.h>
#include <Keypad.h>
Zeile 79: Zeile 83:
</syntaxhighlight>
</syntaxhighlight>
|}
|}
----


===2) Initialisierung Arduino ===
=== Initialisierung Arduino ===
'''2.1 Tastenfeld initialisieren'''<br>
'''1. Tastenfeld initialisieren'''<br>
Ziel ist es, alle benötigten Variablen für die Funktion zu definieren: [https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(T%C3%BCr_Sicherheitssystem) '''<code>Keypad Tastenfeld = Keypad(makeKeymap(Hexa_Keys), Row_Pins, Col_Pins, ROWS, COLS);</code>''']
Ziel ist es, alle benötigten Variablen für die Funktion zu definieren: <br>[https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(T%C3%BCr_Sicherheitssystem) '''<code>Keypad tastenfeld = Keypad(makeKeymap(Hexa_Keys), rowPins, colPins, ROWS, COLS);</code>''']
* '''ROWS''' sind die Anzahl der Spalten und '''COLS''' sind die Anzahl der Zeilen, diese werden als Variable festgelegt.
* '''ROWS''' sind die Anzahl der Spalten und '''COLS''' sind die Anzahl der Zeilen. Diese werden als Variable festgelegt.
* Daraufhin müssen '''Row_Pins''' und '''Col_Pins''' ihren Ziffern zugeordnet werden über eine Array-Zuweisung.
* Daraufhin müssen '''rowPins''' und '''colPins''' über eine Array-Zuweisung ihren Ziffern zugeordnet werden.
* Zum Schluss muss die '''Hexa_Keys''' Matrix aufgebaut werden, hier wird jede Ziffer für das Tastenfeld festgelegt.
* Zum Schluss muss die '''hexaKeys''' Matrix aufgebaut werden. Hier wird jede Ziffer für das Tastenfeld festgelegt.


['''Quelltext 2: ''' <code>TSS.ino</code>]
['''Quelltext 2: ''' <code>TSS.ino</code>]
Zeile 92: Zeile 97:
|-
|-
|
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:14px">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
/* Tastenfeld */
/* Tastenfeld */
/* Größe des Keypads definieren */
/* Größe des Keypads definieren */
const byte COLS = 4; //4 Spalten
const byte COLS = 4; //4 Spalten
const byte ROWS = 4; //4 Zeilen
const byte ROWS = 4; //4 Zeilen
byte Col_Pins[COLS] = {2,3,4,5}; //Definition der Pins für die 3 Spalten
 
byte Row_Pins[ROWS] = {6,7,8,9}; //Definition der Pins für die 4 Zeilen
byte colPins[COLS] = {2,3,4,5}; //Definition der Pins für die 3 Spalten
byte rowPins[ROWS] = {6,7,8,9}; //Definition der Pins für die 4 Zeilen
 
/* Ziffern und Zeichen des Keypads festlegen */
/* Ziffern und Zeichen des Keypads festlegen */
char Hexa_Keys[ROWS][COLS]={
char hexaKeys[ROWS][COLS]={
{'D','#','0','*'},
{'D','#','0','*'},
{'C','9','8','7'},
{'C','9','8','7'},
Zeile 106: Zeile 113:
{'A','3','2','1'}
{'A','3','2','1'}
};
};
Keypad Tastenfeld = Keypad(makeKeymap(Hexa_Keys), Row_Pins, Col_Pins, ROWS, COLS); //Das Keypad kann ab sofort mit "Tastenfeld" angesprochen werden
Keypad tastenfeld = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //Das Keypad kann ab sofort mit "Tastenfeld" angesprochen werden
</syntaxhighlight>
</syntaxhighlight>
|}
|}


'''2.2 Tastenfeld Variablen'''<br>
'''2. Tastenfeld Variablen'''<br>
Benötigte Variablen zum:  
Benötigte Variablen zum:  
* Festlegen des Passwortes, jeder Buchstabe einzeln.
* Festlegen des Passwortes, jeder Buchstabe einzeln
* Speichern der aktuell gedrückten Taste.
* Speichern der aktuell gedrückten Taste
* Speichern der vier gedrückten Tasten.
* Speichern der vier gedrückten Tasten
* Verhindern einer falschen Position bei der Eingabe.
* Verhindern einer falschen Position bei der Eingabe


['''Quelltext 3: ''' <code>TSS.ino</code>]
['''Quelltext 3: ''' <code>TSS.ino</code>]
Zeile 122: Zeile 129:
|-
|-
|
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:14px">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
 
/* Variablen */
/* Variablen */
char P1='1';char P2='2';char P3='3';char P4='A'; // Vier Zeichen des Passwortes eingegeben
char p1='1';char p2='2';char p3='3';char p4='A'; // Vier Zeichen des Passwortes eingegeben
char Taste; //Taste ist die Variable für die jeweils gedrückte Taste auf dem Tastenfeld
char taste; //Taste ist die Variable für die jeweils gedrückte Taste auf dem Tastenfeld
char C1, C2, C3, C4; // Speichern der gedrückten Tasten
char c1, c2, c3, c4; // Speichern der gedrückten Tasten
byte z1=0, z2, z3, z4; // Falschen Position zugeordnet wird verhindern
byte z1=0, z2, z3, z4; // Falsche Position zuordnen wird verhindert
</syntaxhighlight>
</syntaxhighlight>
|}
|}
Zeile 149: Zeile 157:
|-
|-
|
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:14px">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
/* Motor */
/* Motor */
Servo Servo_blau; //Servomotor Definition
Servo servoBlau; //Servomotor Definition


/* Buzzer */
/* Buzzer */
const byte SOUND_BUZZER = 10; // Buzzer ist an Pin 10 angeschlossen
const byte SOUND_BUZZER = 10; // Buzzer ist an Pin 10 angeschlossen
unsigned int Sound = 500;  // Frequenz von 500 Hertz
unsigned int sound = 500;  // Frequenz von 500 Hertz
byte Falsche_Eingabe;    // Für eine falsche Eingabe
byte falscheEingabe;    // Für eine falsche Eingabe


/* RGB */
/* RGB */
byte ROTE_LED = 12; //Rote LED ist an Pin 12 angeschlossen
const byte ROTE_LED = 12; //Rote LED ist an Pin 12 angeschlossen
byte GRUENE_LED = 13; //Grüne LED wird an Pin 13 angeschlossen
const byte GRUENE_LED = 13; //Grüne LED wird an Pin 13 angeschlossen


void setup()  
void setup()  
{
{
Serial.begin(9600);
Serial.begin(9600);


pinMode(ROTE_LED, OUTPUT);  //Die LEDs werden als Ausgang festgelegt
pinMode(ROTE_LED, OUTPUT);  //Die LEDs werden als Ausgang festgelegt
pinMode(GRUENE_LED, OUTPUT);
pinMode(GRUENE_LED, OUTPUT);


Servo_blau.attach(11); //Der Servomotor ist an Pin 11 angeschlossen
servoBlau.attach(11); //Der Servomotor ist an Pin 11 angeschlossen
}
}
</syntaxhighlight>
</syntaxhighlight>
|}
|}
----


===3) Richtige Reihenfolge der Eingabe===
=== Richtige Reihenfolge der Eingabe===
'''Wichtig''' ist, dass die Ziffern richtig eingegeben werden.
'''Wichtig''' ist, dass die Ziffern richtig eingegeben werden.
* So muss sich eine Funktion überlegt werden, welches dies ermöglicht.
* So muss sich eine Funktion überlegt werden, welche dies ermöglicht.
* Zur Verwendung kommen nun die Variablen für die falsche Eingabe.
* Zur Verwendung kommen nun die Variablen für die falsche Eingabe.
* Auch muss die Variable Taste ihre Werte erhalten.
* Auch muss die Variable Taste ihre Werte erhalten.
* Die gedrückte Taste wird in der C1-4 Variable abgespeichert, um später das Passwort zu überprüfen.
* Die gedrückte Taste wird in der c1-4 Variable abgespeichert, um später das Passwort zu überprüfen.


'''Tipp: '''
'''Tipp: '''
# Nachdem die erste Ziffer gedrückt wurde, öffnet sich die Eingabe für die zweite Ziffer usw.
# Nachdem die erste Ziffer gedrückt wurde, öffnet sich die Eingabe für die zweite Ziffer usw.
# Benötigt wird hierfür eine [https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(Pulsierende_LED)#if-Bedingung <code>'''if-Bedingung'''</code>] und eine [https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(T%C3%BCr_Sicherheitssystem) <code>'''goto'''</code>] Funktion.
# Benötigt wird hierfür eine [https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(Pulsierende_LED)#if-Bedingung <code>'''if-Bedingung'''</code>] und eine [https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(T%C3%BCr_Sicherheitssystem) <code>'''goto'''</code>] Funktion.
# Die Taste bekommt mit der Funktion <code>'''Tastenfeld.getKey();'''</code> ihre Ziffer.
# Die Taste bekommt mit der Funktion <code>'''tastenfeld.getKey();'''</code> ihre Ziffer.


['''Quelltext 5: ''' <code>TSS.ino</code>]
['''Quelltext 5: ''' <code>TSS.ino</code>]
Zeile 191: Zeile 200:
|-
|-
|
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:14px">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
void loop()  
void loop()  
{
{
Anfang: // Goto Anfang
Anfang: // Goto Anfang
Taste = Tastenfeld.getKey();  
taste = tastenfeld.getKey();  


/* Richtige Reihenfolge des Passwortes erstellen */
/* Richtige Reihenfolge des Passwortes erstellen */
   if (z1==0) // Wenn das erste Zeichen noch nicht gespeichert wurde...
   if (z1==0) // Wenn das erste Zeichen noch nicht gespeichert wurde.
   {
   {
  C1=Taste; //Unter der Variablen "C1" wird nun die aktuell gedrückte Taste gespeichert
  c1=taste; //Unter der Variablen "C1" wird nun die aktuell gedrückte Taste gespeichert
  Serial.print("Die Taste "); //Teile uns am Serial Monitor die gedrückte Taste mit
  Serial.print("Die Taste ");  
  Serial.print(C1);
  Serial.print(c1);
  Serial.println(" wurde gedrueckt");
  Serial.println(" wurde gedrückt");
  z1=1; z2=0; z3=1; z4=1; // Zugang zur zweiten Zeicheneingabe freischalten
  z1=1; z2=0; z3=1; z4=1; // Zugang zur zweiten Zeicheneingabe freischalten
  goto Anfang;
  goto Anfang;
   }
   }
   
   
   if (z2==0) // Wenn das zweite Zeichen noch nicht gespeichert wurde...
   if (z2==0)
   {
   {
   C2=Taste; //Unter der Variablen "C2" wird nun die aktuell gedrückte Taste gespeichert
   c2=taste; //Unter der Variablen "C2" wird nun die aktuell gedrückte Taste gespeichert
   Serial.print("Die Taste "); //Teile uns am Serial Monitor die gedrückte Taste mit
   Serial.print("Die Taste ");  
   Serial.print(C2);
   Serial.print(c2);
   Serial.println(" wurde gedrueckt");
   Serial.println(" wurde gedrückt");
   z1=1; z2=1; z3=0; z4=1; // Zugang zur dritten Zeicheneingabe freischalten
   z1=1; z2=1; z3=0; z4=1; // Zugang zur dritten Zeicheneingabe freischalten
   goto Anfang;
   goto Anfang;
   }
   }


   if (z3==0) // Wenn das dritte Zeichen noch nicht gespeichert wurde...
   if (z3==0)  
   {
   {
   C3=Taste; //Unter der Variablen "C3" wird nun die aktuell gedrückte Taste gespeichert
   c3=taste; //Unter der Variablen "C3" wird nun die aktuell gedrückte Taste gespeichert
   Serial.print("Die Taste "); //Teile uns am Serial Monitor die gedrückte Taste mit
   Serial.print("Die Taste ");  
   Serial.print(C3);
   Serial.print(c3);
   Serial.println(" wurde gedrueckt");
   Serial.println(" wurde gedrückt");
   z1=1; z2=1; z3=1; z4=0; // Zugang zur vierten Zeicheneingabe freischalten
   z1=1; z2=1; z3=1; z4=0; // Zugang zur vierten Zeicheneingabe freischalten
   goto Anfang;
   goto Anfang;
   }
   }
    
    
   if (z4==0) // Wenn das vierte Zeichen noch nicht gespeichert wurde...
   if (z4==0) // Wenn das vierte Zeichen noch nicht gespeichert wurde
   {
   {
  C4=Taste; //Unter der Variablen "C4" wird nun die aktuell gedrückte Taste gespeichert
  c4=taste; //Unter der Variablen "C4" wird nun die aktuell gedrückte Taste gespeichert
  Serial.print("Die Taste "); //Teile uns am Serial Monitor die gedrückte Taste mit
  Serial.print("Die Taste ");  
  Serial.print(C4);
  Serial.print(c4);
  Serial.println(" wurde gedrueckt");
  Serial.println(" wurde gedrückt");
  z1=1; z2=1; z3=1; z4=1; // Zugang zur weiteren Zeicheneingabe sperren
  z1=1; z2=1; z3=1; z4=1; // Zugang zur weiteren Zeicheneingabe sperren
  }
  }
  }
}
}
</syntaxhighlight>
</syntaxhighlight>
|}
|}
----


===4) Tür öffnen und schließen ===
=== Tür öffnen und schließen ===
* Für das Öffnen der Tür wird die Taste '''(#)''' verwendet und zum Tür verriegeln die Taste '''(*)'''.
* Für das Öffnen der Tür wird die Taste '''(#)''' verwendet. Um die Tür zu verriegeln, wird die Taste '''(*)''' genutzt.
* Wenn die Tür offen ist, leuchtet die LED Grün und Rot, wenn sie geschlossen ist.
* Wenn die Tür offen ist, leuchtet die LED Grün, und Rot, wenn die Tür geschlossen ist.
* Der Motor soll ich zu 90 Grad drehen beim Schließen und zu 0 Grad beim Öffnen.
* Der Motor soll sich beim Schließen zu 90 Grad, beim Öffnen wiederum zu 0 Grad drehen.
* Überprüfe vor dem Öffnen, ob das Passwort korrekt ist.<br>
* Überprüfe vor dem Öffnen, ob das Passwort korrekt eingegeben wurde.<br>


'''Tipp: '''
'''Tipp: '''
# Benötigt werden if-Else Funktionen, die nach der bestimmten Taste abfragen und die Anweisung dann ausführen.
# Benötigt werden if-Else Funktionen, die nach der bestimmten Taste abfragen und die Anweisung dann ausführen.
# Nutze Vergleichsoperatoren zum Abfragen des Passwortes.
# Nutzen Sie Vergleichsoperatoren zum Abfragen des Passwortes.


['''Quelltext 6: ''' <code>TSS.ino</code>]
['''Quelltext 6: ''' <code>TSS.ino</code>]
Zeile 255: Zeile 266:
|-
|-
|
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:14px">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
void loop()  
void loop()  
{
{
Anfang: // Goto Anfang
Anfang: // Goto Anfang
Taste = Tastenfeld.getKey();  
taste = tastenfeld.getKey();  
if (Taste)  
if (taste)  
  {
  {
   if (Taste=='*')
   if (taste=='*')
   {
   {
  Serial.println("Tuer verriegelt");
    Serial.println("Tür verriegelt");
  delay(2000);
    delay(1000);
  Servo_blau.write(90); //Servo zum Verriegeln auf 90 Grad ansteuern
    servoBlau.write(90); //Servomotor zum Verriegeln auf 90 Grad ansteuern
  digitalWrite(ROTE_LED, HIGH);
    digitalWrite(ROTE_LED, HIGH);
  digitalWrite(GRUENE_LED, LOW);  
    digitalWrite(GRUENE_LED, LOW);  
  z1=0; z2=1; z3=1; z4=1; // Zugang zur ersten Zeicheneingabe freischalten
    z1=0; z2=1; z3=1; z4=1; // Zugang zur ersten Zeicheneingabe freischalten
  goto Anfang; // Damit das Zeichen "*" nicht im folgenden Abschnitt als Codeeingabe gewertet wird
    goto Anfang; // Damit das Zeichen "*" nicht im folgenden Abschnitt als Codeeingabe gewertet wird
   }
   }
    
    
   if (Taste=='#')
   if (taste=='#')
   {
   {
   if (C1==P1&&C2==P2&&C3==P3&&C4==P4) //wird geprüft, ob die eingaben Codezeichen übereinstimmen
   if (c1==p1&&c2==p2&&c3==p3&&c4==p4) //wird geprüft, ob die eingaben Codezeichen übereinstimmen
   {
   {
  Serial.println ("Code korrekt, Schloss offen");
    Serial.println ("Code korrekt, Schloss offen");
  Servo_blau.write(0); //Servo zum Öffnen auf 0 Grad ansteuern.
    servoBlau.write(0); //Servomotor zum Öffnen auf 0 Grad ansteuern.
  digitalWrite(ROTE_LED, LOW);
    digitalWrite(ROTE_LED, LOW);
  digitalWrite(GRUENE_LED, HIGH);
    digitalWrite(GRUENE_LED, HIGH);
   }
   }
   else // ist das nicht der Fall, bleibt das Schloss gesperrt
   else // ist das nicht der Fall, bleibt das Schloss gesperrt
   {
   {
  Serial.println ("Code falsch, Schloss gesperrt");
    Serial.println ("Code falsch, Schloss gesperrt");
  digitalWrite(ROTE_LED, HIGH);  
    digitalWrite(ROTE_LED, HIGH);  
  digitalWrite(GRUENE_LED, LOW);
    digitalWrite(GRUENE_LED, LOW);
  delay(2000);
    delay(2000);
  z1=0; z2=1; z3=1; z4=1; // Der Zugang für die erste Zeicheneingabe wird wieder freigeschaltet
    z1=0; z2=1; z3=1; z4=1; // Der Zugang für die erste Zeicheneingabe wird wieder freigeschaltet
  goto Anfang; // Damit das Zeichen "#" nicht im folgenden Abschnitt als Codeeingabe gewertet wird.
    goto Anfang; // Damit das Zeichen "#" nicht im folgenden Abschnitt als Codeeingabe gewertet wird.
   }
   }
  }
  }
</syntaxhighlight>
</syntaxhighlight>
|}
|}
----


===5) Einbrecher Warnung! ===
=== Einbrecher Warnung! ===
Als Zusatzaufgabe wurde sich überlegt, einen Buzzer ertönen zu lassen, wenn das Passwort 3-mal Falsche eingegeben wurde.  
Die Zusatzaufgabe ist, einen Buzzer ertönen zu lassen, wenn das Passwort 3-mal falsch eingegeben wurde.  


'''Tipp: '''
'''Tipp: '''
Zeile 308: Zeile 320:
|-
|-
|
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:14px">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
   if (Taste=='#')
   if (taste=='#')
   {
   {
   if (C1==P1&&C2==P2&&C3==P3&&C4==P4) //wird geprüft, ob die eingaben Codezeichen übereinstimmen
   if (c1==p1&&c2==p2&&c3==p3&&c4==p4) //wird geprüft, ob die eingaben Codezeichen übereinstimmen
   {
   {
  Serial.println ("Code korrekt, Schloss offen");
    Serial.println ("Code korrekt, Schloss offen");
  Servo_blau.write(0); //Servo zum Öffnen auf 0 Grad ansteuern.
    servoBlau.write(0); //Servomotor zum Öffnen auf 0 Grad ansteuern.
  digitalWrite(ROTE_LED, LOW);
    digitalWrite(ROTE_LED, LOW);
  digitalWrite(GRUENE_LED, HIGH);
    digitalWrite(GRUENE_LED, HIGH);
   }
   }
   else // ist das nicht der Fall, bleibt das Schloss gesperrt
   else // ist das nicht der Fall, bleibt das Schloss gesperrt
   {
   {
  Serial.println ("Code falsch, Schloss gesperrt");
    Serial.println ("Code falsch, Schloss gesperrt");
  Falsche_Eingabe += 1;
    falscheEingabe += 1;
    
    
   if(Falsche_Eingabe == 3)          // Wenn der Code 3 mal falsch eigegeben wurde
   if(falscheEingabe == 3)          // Wenn der Code 3 mal falsch eigegeben wurde
   {
   {
     Serial.println("Besitzer wurde benachrichtigt!");
     Serial.println("Besitzer wurde benachrichtigt!");
Zeile 330: Zeile 342:
     noTone(SOUND_BUZZER);
     noTone(SOUND_BUZZER);
   }
   }
  digitalWrite(ROTE_LED, HIGH);  
    digitalWrite(ROTE_LED, HIGH);  
  digitalWrite(GRUENE_LED, LOW);
    digitalWrite(GRUENE_LED, LOW);
  delay(2000);
    delay(2000);
  z1=0; z2=1; z3=1; z4=1; // Der Zugang für die erste Zeicheneingabe wird wieder freigeschaltet
    z1=0; z2=1; z3=1; z4=1; // Der Zugang für die erste Zeicheneingabe wird wieder freigeschaltet
  goto Anfang; // Damit das Zeichen "#" nicht im folgenden Abschnitt als Codeeingabe gewertet wird.
    goto Anfang; // Damit das Zeichen "#" nicht im folgenden Abschnitt als Codeeingabe gewertet wird.
   }
   }
  }
  }
Zeile 340: Zeile 352:
|}
|}


== '''Musterlösung''' ==
== Musterlösung ==
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Lösung Code &thinsp;</strong>
| <strong>Lösung Code &thinsp;</strong>
|-
|-
|       
|       
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:14px">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
/* Benötigte Bibliotheken */
/* Benötigte Bibliotheken */
#include <Keypad.h>
#include <Keypad.h>
Zeile 355: Zeile 367:
const byte ROWS = 4; //4 Zeilen
const byte ROWS = 4; //4 Zeilen


byte Col_Pins[COLS] = {2,3,4,5}; //Definition der Pins für die 3 Spalten
byte colPins[COLS] = {2,3,4,5}; //Definition der Pins für die 3 Spalten
byte Row_Pins[ROWS] = {6,7,8,9}; //Definition der Pins für die 4 Zeilen
byte rowPins[ROWS] = {6,7,8,9}; //Definition der Pins für die 4 Zeilen


/* Ziffern und Zeichen des Keypads festlegen */
/* Ziffern und Zeichen des Keypads festlegen */
char Hexa_Keys[ROWS][COLS]={
char hexaKeys[ROWS][COLS]={
{'D','#','0','*'},
{'D','#','0','*'},
{'C','9','8','7'},
{'C','9','8','7'},
Zeile 365: Zeile 377:
{'A','3','2','1'}
{'A','3','2','1'}
};
};
Keypad Tastenfeld = Keypad(makeKeymap(Hexa_Keys), Row_Pins, Col_Pins, ROWS, COLS); //Das Keypad kann ab sofort mit "Tastenfeld" angesprochen werden
Keypad tastenfeld = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //Das Keypad kann ab sofort mit "Tastenfeld" angesprochen werden


/* Variablen */
/* Variablen */
char P1='1';char P2='2';char P3='3';char P4='A'; // Vier Zeichen des Passwortes eingegeben
char p1='1';char p2='2';char p3='3';char p4='A'; // Vier Zeichen des Passwortes eingegeben
char Taste; //Taste ist die Variable für die jeweils gedrückte Taste auf dem Tastenfeld
char taste; //Taste ist die Variable für die jeweils gedrückte Taste auf dem Tastenfeld
char C1, C2, C3, C4; // Speichern der gedrückten Tasten
char c1, c2, c3, c4; // Speichern der gedrückten Tasten
byte z1=0, z2, z3, z4; // Falschen Position zugeordnet wird verhindern
byte z1=0, z2, z3, z4; // Falsche Position zuordnen wird verhindert




/* Motor */
/* Motor */
Servo Servo_blau; //Servomotor Definition
Servo servoBlau; //Servomotor Definition


/* Buzzer */
/* Buzzer */
const byte SOUND_BUZZER = 10; // Buzzer ist an Pin 10 angeschlossen
const byte SOUND_BUZZER = 10; // Buzzer ist an Pin 10 angeschlossen
unsigned int Sound = 500;  // Frequenz von 500 Hertz
unsigned int sound = 500;  // Frequenz von 500 Hertz
byte Falsche_Eingabe;    // Für eine falsche Eingabe
byte falscheEingabe;    // Für eine falsche Eingabe


/* RGB */
/* RGB */
byte ROTE_LED = 12; //Rote LED ist an Pin 12 angeschlossen
const byte ROTE_LED = 12; //Rote LED ist an Pin 12 angeschlossen
byte GRUENE_LED = 13; //Grüne LED wird an Pin 13 angeschlossen
const byte GRUENE_LED = 13; //Grüne LED wird an Pin 13 angeschlossen


void setup()  
void setup()  
{
{
Serial.begin(9600);
Serial.begin(9600);


pinMode(ROTE_LED, OUTPUT);  //Die LEDs werden als Ausgang festgelegt
pinMode(ROTE_LED, OUTPUT);  //Die LEDs werden als Ausgang festgelegt
pinMode(GRUENE_LED, OUTPUT);
pinMode(GRUENE_LED, OUTPUT);


Servo_blau.attach(11); //Der Servomotor ist an Pin 11 angeschlossen
servoBlau.attach(11); //Der Servomotor ist an Pin 11 angeschlossen
}
}


void loop()  
void loop()  
{
{
Anfang: // Goto Anfang
Anfang: // Goto Anfang
Taste = Tastenfeld.getKey();  
taste = tastenfeld.getKey();  
if (Taste)  
if (taste)  
{
  {
   if (Taste=='*')
   if (taste=='*')
   {
   {
  Serial.println("Tuer verriegelt");
    Serial.println("Tür verriegelt");
  delay(2000);
    delay(1000);
  Servo_blau.write(90); //Servomotor zum Verriegeln auf 90 Grad ansteuern
    servoBlau.write(90); //Servomotor zum Verriegeln auf 90 Grad ansteuern
  digitalWrite(ROTE_LED, HIGH);
    digitalWrite(ROTE_LED, HIGH);
  digitalWrite(GRUENE_LED, LOW);  
    digitalWrite(GRUENE_LED, LOW);  
  z1=0; z2=1; z3=1; z4=1; // Zugang zur ersten Zeicheneingabe freischalten
    z1=0; z2=1; z3=1; z4=1; // Zugang zur ersten Zeicheneingabe freischalten
  goto Anfang; // Damit das Zeichen "*" nicht im folgenden Abschnitt als Codeeingabe gewertet wird
    goto Anfang; // Damit das Zeichen "*" nicht im folgenden Abschnitt als Codeeingabe gewertet wird
   }
   }
    
    
   if (Taste=='#')
   if (taste=='#')
   {
   {
  if (C1==P1&&C2==P2&&C3==P3&&C4==P4) //wird geprüft, ob die eingaben Codezeichen übereinstimmen
    if (c1==p1&&c2==p2&&c3==p3&&c4==p4) //wird geprüft, ob die Eingaben Codezeichen übereinstimmen
   {
   {
  Serial.println ("Code korrekt, Schloss offen");
    Serial.println ("Code korrekt, Schloss offen");
  Servo_blau.write(0); //Servomotor zum Öffnen auf 0 Grad ansteuern.
    servoBlau.write(0); //Servomotor zum Öffnen auf 0 Grad ansteuern.
  digitalWrite(ROTE_LED, LOW);
    digitalWrite(ROTE_LED, LOW);
  digitalWrite(GRUENE_LED, HIGH);
    digitalWrite(GRUENE_LED, HIGH);
   }
   }
   else // ist das nicht der Fall, bleibt das Schloss gesperrt
   else // ist das nicht der Fall, bleibt das Schloss gesperrt
   {
   {
  Serial.println ("Code falsch, Schloss gesperrt");
    Serial.println ("Code falsch, Schloss gesperrt");
  Falsche_Eingabe += 1;
    falscheEingabe += 1;
    
    
   if(Falsche_Eingabe == 3)          // Wenn der Code 3-mal falsch eingegeben wurde
   if(falscheEingabe == 3)          // Wenn der Code 3-mal falsch eingegeben wurde
   {
   {
     Serial.println("Besitzer wurde benachrichtigt!");
     Serial.println("Besitzer wurde benachrichtigt!");
     tone(SOUND_BUZZER, Sound);
     tone(SOUND_BUZZER, sound);
     delay(8000);
     delay(8000);
     noTone(SOUND_BUZZER);
     noTone(SOUND_BUZZER);
   }
   }
  digitalWrite(ROTE_LED, HIGH);  
    digitalWrite(ROTE_LED, HIGH);  
  digitalWrite(GRUENE_LED, LOW);
    digitalWrite(GRUENE_LED, LOW);
  delay(2000);
    delay(2000);
  z1=0; z2=1; z3=1; z4=1; // Der Zugang für die erste Zeicheneingabe wird wieder freigeschaltet
    z1=0; z2=1; z3=1; z4=1; // Der Zugang für die erste Zeicheneingabe wird wieder freigeschaltet
  goto Anfang; // Damit das Zeichen "#" nicht im folgenden Abschnitt als Codeeingabe gewertet wird.
    goto Anfang; // Damit das Zeichen "#" nicht im folgenden Abschnitt als Codeeingabe gewertet wird.
   }
   }
  }
  }
Zeile 445: Zeile 457:
   if (z1==0) // Wenn das erste Zeichen noch nicht gespeichert wurde.
   if (z1==0) // Wenn das erste Zeichen noch nicht gespeichert wurde.
   {
   {
  C1=Taste; //Unter der Variablen "C1" wird nun die aktuell gedrückte Taste gespeichert
  c1=taste; //Unter der Variablen "C1" wird nun die aktuell gedrückte Taste gespeichert
  Serial.print("Die Taste ");  
  Serial.print("Die Taste ");  
  Serial.print(C1);
  Serial.print(c1);
  Serial.println(" wurde gedrückt");
  Serial.println(" wurde gedrückt");
  z1=1; z2=0; z3=1; z4=1; // Zugang zur zweiten Zeicheneingabe freischalten
  z1=1; z2=0; z3=1; z4=1; // Zugang zur zweiten Zeicheneingabe freischalten
  goto Anfang;
  goto Anfang;
   }
   }
   
   
   if (z2==0)
   if (z2==0)
   {
   {
  C2=Taste; //Unter der Variablen "C2" wird nun die aktuell gedrückte Taste gespeichert
  c2=taste; //Unter der Variablen "C2" wird nun die aktuell gedrückte Taste gespeichert
  Serial.print("Die Taste ");  
  Serial.print("Die Taste ");  
  Serial.print(C2);
  Serial.print(c2);
  Serial.println(" wurde gedrückt");
  Serial.println(" wurde gedrückt");
  z1=1; z2=1; z3=0; z4=1; // Zugang zur dritten Zeicheneingabe freischalten
  z1=1; z2=1; z3=0; z4=1; // Zugang zur dritten Zeicheneingabe freischalten
  goto Anfang;
  goto Anfang;
   }
   }


   if (z3==0)  
   if (z3==0)  
   {
   {
  C3=Taste; //Unter der Variablen "C3" wird nun die aktuell gedrückte Taste gespeichert
  c3=taste; //Unter der Variablen "C3" wird nun die aktuell gedrückte Taste gespeichert
  Serial.print("Die Taste ");  
  Serial.print("Die Taste ");  
  Serial.print(C3);
  Serial.print(c3);
  Serial.println(" wurde gedrückt");
  Serial.println(" wurde gedrückt");
  z1=1; z2=1; z3=1; z4=0; // Zugang zur vierten Zeicheneingabe freischalten
  z1=1; z2=1; z3=1; z4=0; // Zugang zur vierten Zeicheneingabe freischalten
  goto Anfang;
  goto Anfang;
   }
   }
    
    
   if (z4==0) // Wenn das vierte Zeichen noch nicht gespeichert wurde
   if (z4==0) // Wenn das vierte Zeichen noch nicht gespeichert wurde
   {
   {
  C4=Taste; //Unter der Variablen "C4" wird nun die aktuell gedrückte Taste gespeichert
  c4=taste; //Unter der Variablen "C4" wird nun die aktuell gedrückte Taste gespeichert
  Serial.print("Die Taste ");  
  Serial.print("Die Taste ");  
  Serial.print(C4);
  Serial.print(c4);
  Serial.println(" wurde gedrückt");
  Serial.println(" wurde gedrückt");
  z1=1; z2=1; z3=1; z4=1; // Zugang zur weiteren Zeicheneingabe sperren
  z1=1; z2=1; z3=1; z4=1; // Zugang zur weiteren Zeicheneingabe sperren
   }
   }
  }
  }
Zeile 487: Zeile 499:
|}
|}


Quelle: [https://funduino.de/tastenfeld-schloss Link]
[https://funduino.de/tastenfeld-schloss Quelle]


<br>
<br>
----
----
'''→ zurück zum Hauptartikel: [[Konzipierung_und_Evaluierung_von_Arduino-Projekten_verschiedener_Schwierigkeitsgrade_für_die_Lehre | BA: Arduino-Projekte für die Lehre]]'''
'''→ zurück zum Hauptartikel: [[Konzipierung_und_Evaluierung_von_Arduino-Projekten_verschiedener_Schwierigkeitsgrade_für_die_Lehre | BA: Arduino-Projekte für die Lehre]]'''

Aktuelle Version vom 22. September 2023, 15:20 Uhr

Abb. 1: Türsicherheitssystem

Autor: Justin Frommberger

Aufgabenstellung

  • Ziel des Projektes ist, ein Türsicherheitssystem zu simulieren.
  • Die Aufgabe besteht darin, die Tür mit einem vierstelligen Zahlencode zu öffnen (LED leuchtet grün).
  • Wird der Code 3-mal falsch eingegeben, ertönt ein Warnsignal und die LED leuchtet rot.
  • Alle Eingaben müssen auf dem seriellen Monitor angezeigt werden.

⇒ Für den Fall, dass kein Arduino zur Verfügung steht oder Materialien nicht vorhanden sind. Kann dieser webbasierter Arduino Emulator verwendet werden. [klicken]


[Abb. 2: UML]

Benötigte Materialien

Tabelle 1: Materialliste
Nr. Anz. Beschreibung Bild
1 Funduino Arduino UNO R3
1 Typ 2
20+ Jumperkabel, männlich/männlich
1 Steckbrett
2 LED Rot/Grün
3 Widerstand
120 Ω
1 TowerPro SG90 Servomotor
1 Piezo Lautsprecher
1 4x4 Tastenfeld

Vorab wichtig zu wissen

Abb. 3: LED

Servomotor Kabel

Tabelle 2: Servomotor Farberkennung
Schwarz oder Braun Masse (GND)
Rot VCC/+ 5 V
Organe, Gelb oder Weiß PWM-Signal

Tastenfeld

Definition Tastenfeld [klicken]

Aufbau Schaltung

Abb.4 Schaltung Tür Sicherheitssystem

In Abbildung 4 wird die Schaltung für das Projekt "Tür Sicherheitssystem" dargestellt.
Bevor mit der Programmierung begonnen werden kann, muss die Schaltung des Projekts aufgebaut werden.

Programmierung

Es ist wichtig, die [Programmierrichtlinien] beim Programmieren einzuhalten.

Wenn Sie Fragen zur Programmierung haben, finden Sie die Antworten in den [Grundkenntnissen].


Bibliotheken einfügen

Laden Sie für das Projekt die Bibliothek für das Tastenfeld 4x4 herunter.
Benötigt werden die Bibliotheken Servo.h und Keypad.h.

[Quelltext 1: TSS.ino]


Initialisierung Arduino

1. Tastenfeld initialisieren
Ziel ist es, alle benötigten Variablen für die Funktion zu definieren:
Keypad tastenfeld = Keypad(makeKeymap(Hexa_Keys), rowPins, colPins, ROWS, COLS);

  • ROWS sind die Anzahl der Spalten und COLS sind die Anzahl der Zeilen. Diese werden als Variable festgelegt.
  • Daraufhin müssen rowPins und colPins über eine Array-Zuweisung ihren Ziffern zugeordnet werden.
  • Zum Schluss muss die hexaKeys Matrix aufgebaut werden. Hier wird jede Ziffer für das Tastenfeld festgelegt.

[Quelltext 2: TSS.ino]

2. Tastenfeld Variablen
Benötigte Variablen zum:

  • Festlegen des Passwortes, jeder Buchstabe einzeln
  • Speichern der aktuell gedrückten Taste
  • Speichern der vier gedrückten Tasten
  • Verhindern einer falschen Position bei der Eingabe

[Quelltext 3: TSS.ino]

3. Motor, Buzzer und RGB initialisieren

Pins
LED 12 und 13
Motor 11
Buzzer 10

pinMode();
Servo.h
[Quelltext 4: TSS.ino]


Richtige Reihenfolge der Eingabe

Wichtig ist, dass die Ziffern richtig eingegeben werden.

  • So muss sich eine Funktion überlegt werden, welche dies ermöglicht.
  • Zur Verwendung kommen nun die Variablen für die falsche Eingabe.
  • Auch muss die Variable Taste ihre Werte erhalten.
  • Die gedrückte Taste wird in der c1-4 Variable abgespeichert, um später das Passwort zu überprüfen.

Tipp:

  1. Nachdem die erste Ziffer gedrückt wurde, öffnet sich die Eingabe für die zweite Ziffer usw.
  2. Benötigt wird hierfür eine if-Bedingung und eine goto Funktion.
  3. Die Taste bekommt mit der Funktion tastenfeld.getKey(); ihre Ziffer.

[Quelltext 5: TSS.ino]


Tür öffnen und schließen

  • Für das Öffnen der Tür wird die Taste (#) verwendet. Um die Tür zu verriegeln, wird die Taste (*) genutzt.
  • Wenn die Tür offen ist, leuchtet die LED Grün, und Rot, wenn die Tür geschlossen ist.
  • Der Motor soll sich beim Schließen zu 90 Grad, beim Öffnen wiederum zu 0 Grad drehen.
  • Überprüfe vor dem Öffnen, ob das Passwort korrekt eingegeben wurde.

Tipp:

  1. Benötigt werden if-Else Funktionen, die nach der bestimmten Taste abfragen und die Anweisung dann ausführen.
  2. Nutzen Sie Vergleichsoperatoren zum Abfragen des Passwortes.

[Quelltext 6: TSS.ino]


Einbrecher Warnung!

Die Zusatzaufgabe ist, einen Buzzer ertönen zu lassen, wenn das Passwort 3-mal falsch eingegeben wurde.

Tipp:

  1. Bei einer falschen Eingabe wird die Variable hochgezählt.
  2. Wenn die Variable 3 erreicht, ertönt der Buzzer.

tone();

[Quelltext 7: TSS.ino]

Musterlösung

Quelle



→ zurück zum Hauptartikel: BA: Arduino-Projekte für die Lehre