Arduino Projekt: Türsicherheitssystem: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(179 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
[[Kategorie:Arduino: Projekt]]
[[Kategorie:Arduino: Projekt]]
[[Datei:Tür_Sicherheitssystem.gif|thumb|right|600px|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 von dem Projekt ist eine Tür Sicherheitssystem zu simulieren.
* Ziel des Projektes ist, ein Türsicherheitssystem zu simulieren.
* Die Aufgabe ist, mit einem vierstelligen Zahlen Code die Tür zu öffnen.
* Die Aufgabe besteht darin, die Tür mit einem vierstelligen Zahlencode zu öffnen (LED leuchtet grün).
* Wenn der Code 3-mal Falsche eingegeben wurde, ertönt ein Warnsignal.
* Wird der Code 3-mal falsch eingegeben, ertönt ein Warnsignal und die LED leuchtet rot.
* Alle Eingaben sollen auf dem seriellen Monitor angezeigt werden.
* Alle Eingaben müssen auf dem seriellen Monitor angezeigt werden.<br>


== '''Benötigte Software''' ==
⇒ 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]]
*Aktuellste '''Arduino IDE''' mit der Version für ihren PC. [https://www.arduino.cc/en/software/ (Download link)]
<br><br>
*Bibliotheken für das 4x4 Tastenfeld downloaden: [https://github.com/Chris--A/Keypad (Link)]
[[Datei:UML_Tür.png|600px]]<br>
** Klicke oben rechts in GitHub auf Code und dann downloade die Zip-Datei.
[Abb. 2: UML]
** Um die Zip-Datei in ihre Arduino Bibliothek einzubinden, folgen diese Schritte: [https://ardutronix.de/anleitung-library-in-arduino-ide-installieren-und-einbinden/ (Link)]


== '''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 !! Pos. !! Anz.    !! Beschreibung !!Bild
! Nr. !! Anz.    !! Beschreibung !! Bild
|-
|-
|<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>  || viele || Jumper Kabel, männlich/männlich||[[Datei:R19-F-2-2.jpg|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>&#9315;</big></big>  || 1 || [[Steckbrett]]||[[Datei:Steckbrett1.png|ohne|100px|]]
|-
|<big><big>&#9316;</big></big>  || 2 || LED Rot/Grün||[[Datei:R20-F-1-1.jpg|ohne|100px|]]
|-
|<big><big>&#9317;</big></big>  || 3 || Widerstand <br>120&thinsp;Ω||[[Datei:Widerstaende.jpg|ohne|100px|]]
|-
|<big><big>&#9318;</big></big>  || 1 || [[Servomotor SG90|TowerPro SG90 Servomotor]]||[[Datei:R19-F-2-1.jpg|ohne|100px|]]
|-
|-
|<big><big>&#9314;</big></big>  || 1 || [[Steckbrett]]||[[Datei:R12-A-9-1.jpg|ohne|100px|]]
|<big><big>&#9319;</big></big>  || 1 || [[Piezo Lautsprecher]]||[[Datei:R6-B-0-1.jpg|ohne|100px|]]
|<big><big>&#9315;</big></big>  || 2 || LED Rot/Grün||[[Datei:R20-F-1-1.jpg|ohne|100px|]]
|-
|-
|<big><big>&#9320;</big></big>  || 1 || [[4x4 Tastenfeld]]||[[Datei:4x4_Tastenfeld.png|ohne|100px|]]
|-
|-
|<big><big>&#9316;</big></big>  || 3 || Widerstand <br>120&thinsp;Ω||[[Datei:Widerstaende.jpg|ohne|100px|]]
|}
|<big><big>&#9317;</big></big>  || 1 || [[Servomotor SG90|TowerPro SG90 Servomotor]]||[[Datei:R19-F-2-1.jpg|ohne|100px|]]
 
== Vorab wichtig zu wissen ==
[[Datei:Anode Kathode.png |thumb|rigth|130px|Abb. 3: LED]]
 
===Servomotor Kabel===
{| class="wikitable"
|+ style = "text-align: left"| Tabelle 2: Servomotor Farberkennung
|-
|-
| '''Schwarz oder Braun'''|| Masse (GND)<br>
|-
|-
|<big><big>&#9318;</big></big>  || 1 || [[Piezo Lautsprecher]]||[[Datei:R6-B-0-1.jpg|ohne|100px|]]
|'''Rot''' || VCC/+<nowiki>&thinsp;</nowiki>5&thinsp;V<br>
|<big><big>&#9319;</big></big>  || 1 || [[4x4 Tastenfeld]]||[[Datei:4x4_Tastenfeld.png|ohne|100px|]]
|-
|-
| '''Organe, Gelb oder Weiß'''|| PWM-Signal
|}
|}


== '''Vorab wichtig zu wissen!''' ==
===Tastenfeld===
[[Datei:Anode Kathode.png |thumb|rigth|150px|Abb. 2: LED]]
Definition Tastenfeld [https://wiki.hshl.de/wiki/index.php/4x4_Tastenfeld [klicken]]
'''Arduino Uno R3:'''
* Der Arduino besitzt unterschiedliche [[Arduino_UNO:_Board_Anatomie | Schnittstellen]], weil der Arduino ein digitaler Mikrocontroller ist, kann er nur <nowiki>&thinsp;</nowiki>5&thinsp;Volt ausgeben oder annehmen.
* Bei einer konstanten <nowiki>&thinsp;</nowiki>5&thinsp;V Spannung, ist die LED immer gleich hell, so ist das Ziel die Spannung zur LED zu reduzieren.
* Dafür wird eine Pulsweitenmodulation (PWM) Schnittstelle benötigt, denn bei den anderen Schnittstellen ist dies nicht möglich.
* Bei einem geringen PWM-Wert ist das <nowiki>&thinsp;</nowiki>5&thinsp;V Signal kaum noch vorhanden und bei einem hohen PWM-Wert liegt das <nowiki>&thinsp;</nowiki>5&thinsp;V Signal nahezu durchgehend am Pin an.  
* Durch die PWM Schnittstelle kann nun die LED unterschiedlich hell leuchten, da die Spannung anpassbar ist.
* Die [[https://de.wikipedia.org/wiki/Pulsdauermodulation PWM]] Schnittstellen sind ganz einfach zu erkennen an diesem Zeichen (~)


'''LED: '''  
== Aufbau Schaltung ==
* Beachte beim Arbeiten mit der LED, die Anode und Kathode nicht zu vertauschen.
[[Datei:Tür_Schaltplan.png|550px|thumb|right|Abb.4 Schaltung Tür Sicherheitssystem]]
* In die Anode fließt der Strom hinein (lange Seite), danach fließt der Strom wieder durch die Kathode hinaus (kurze Seite) siehe Abb. 2.
In Abbildung 4 wird die Schaltung für das Projekt '''"Tür Sicherheitssystem"''' dargestellt.<br>
* Wenn die LED am Ende des Projektes nicht leuchtet, wurde dies vertauscht, einfach umdrehen und sie leuchtet!
Bevor mit der Programmierung begonnen werden kann, muss die Schaltung des Projekts aufgebaut werden.


'''Steckbrett: '''<br>
==Programmierung==
Erklärung zum Arbeiten mit einem Steckbrett: [[Steckbrett | (Link)]]
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''']].
<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>.
 
['''Quelltext 1: ''' <code>TSS.ino</code>]
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Lösung &thinsp;</strong>
|-
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
/* Benötigte Bibliotheken */
#include <Keypad.h>
#include <Servo.h>
</syntaxhighlight>
|}
----
 
=== Initialisierung Arduino ===
'''1. Tastenfeld initialisieren'''<br>
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.
* 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: ''' <code>TSS.ino</code>]
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Lösung &thinsp;</strong>
|-
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
/* Tastenfeld */
/* Größe des Keypads definieren */
const byte COLS = 4; //4 Spalten
const byte ROWS = 4; //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 */
char hexaKeys[ROWS][COLS]={
{'D','#','0','*'},
{'C','9','8','7'},
{'B','6','5','4'},
{'A','3','2','1'}
};
Keypad tastenfeld = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //Das Keypad kann ab sofort mit "Tastenfeld" angesprochen werden
</syntaxhighlight>
|}
 
'''2. Tastenfeld Variablen'''<br>
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: ''' <code>TSS.ino</code>]
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Lösung &thinsp;</strong>
|-
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
 
/* Variablen */
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 c1, c2, c3, c4; // Speichern der gedrückten Tasten
byte z1=0, z2, z3, z4; // Falsche Position zuordnen wird verhindert
</syntaxhighlight>
|}
 
'''3. Motor, Buzzer und RGB initialisieren'''<br>
{| class="wikitable"
|+ style = "text-align: left"| Pins
|-
| '''LED''' || 12 und 13
|-
| '''Motor''' || 11
|-
| '''Buzzer''' || 10
|}
[https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(Pulsierende_LED)#pinMode() '''<code>pinMode();</code>''']<br>
[https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(Servomotor_mit_einem_Potentiometer_steuern)#Servo.h <code>'''Servo.h'''</code>]<br>
['''Quelltext 4: ''' <code>TSS.ino</code>]
 
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Lösung &thinsp;</strong>
|-
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
/* Motor */
Servo servoBlau; //Servomotor Definition
 
/* Buzzer */
const byte SOUND_BUZZER = 10; // Buzzer ist an Pin 10 angeschlossen
unsigned int sound = 500;  // Frequenz von 500 Hertz
byte falscheEingabe;    // Für eine falsche Eingabe
 
/* RGB */
const byte ROTE_LED = 12; //Rote LED ist an Pin 12 angeschlossen
const byte GRUENE_LED = 13; //Grüne LED wird an Pin 13 angeschlossen
 
void setup()
{
Serial.begin(9600);
 
pinMode(ROTE_LED, OUTPUT);  //Die LEDs werden als Ausgang festgelegt
pinMode(GRUENE_LED, OUTPUT);
 
servoBlau.attach(11); //Der Servomotor ist an Pin 11 angeschlossen
}
</syntaxhighlight>
|}
----


'''Servomotor: '''
=== Richtige Reihenfolge der Eingabe===
* Schwarz oder Braun = Masse (GND)
'''Wichtig''' ist, dass die Ziffern richtig eingegeben werden.
* Rot = +<nowiki>&thinsp;</nowiki>5&thinsp;V
* So muss sich eine Funktion überlegt werden, welche dies ermöglicht.
* Orange, Gelb oder Weiß = PWM-Signal
* 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.


'''Tastenfeld: '''<br>
'''Tipp: '''
Anleitung zum Tastenfeld siehe: [https://wiki.hshl.de/wiki/index.php/4x4_Tastenfeld (Link)]
# 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.
# Die Taste bekommt mit der Funktion <code>'''tastenfeld.getKey();'''</code> ihre Ziffer.


== '''Aufbau Schaltung''' ==
['''Quelltext 5: ''' <code>TSS.ino</code>]
[[Datei:Tür_Schaltplan.png|500px|thumb|right|Abb.3 Schaltung Tür Sicherheitssystem]]
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
In Abb. 3 wird die Schaltung für das Projekt '''" Tür Sicherheitssystem"''' dargestellt.
| <strong>Lösung &thinsp;</strong>
|-
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
void loop()
{
Anfang: // Goto Anfang
taste = tastenfeld.getKey();


=='''Arduino Datei erstellen'''==
/* Richtige Reihenfolge des Passwortes erstellen */
Erstellen der ersten '''Arduino Datei''' ([https://wiki.hshl.de/wiki/index.php/Erste_Schritte_mit_der_Arduino_IDE Link zum Tutorial]).
  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
  Serial.print("Die Taste ");
  Serial.print(c1);
  Serial.println(" wurde gedrückt");
  z1=1; z2=0; z3=1; z4=1; // Zugang zur zweiten Zeicheneingabe freischalten
  goto Anfang;
  }
  if (z2==0)
  {
  c2=taste; //Unter der Variablen "C2" wird nun die aktuell gedrückte Taste gespeichert
  Serial.print("Die Taste ");
  Serial.print(c2);
  Serial.println(" wurde gedrückt");
  z1=1; z2=1; z3=0; z4=1; // Zugang zur dritten Zeicheneingabe freischalten
  goto Anfang;
  }


=='''Programmierung Vorkenntnisse'''==
  if (z3==0)
*Kenntnisse in den '''Programmierrichtlinien''' für die Erstellung von Software. ([[Programmierrichtlinien Einsteiger|Link]])<br>
  {
*Grundkenntnisse von Projekt '''1-4''' verstanden haben. [https://wiki.hshl.de/wiki/index.php/Kategorie:Arduino:_Projekt (Link)]
  c3=taste; //Unter der Variablen "C3" wird nun die aktuell gedrückte Taste gespeichert
*Grundkenntnisse für das Projekt '''"Tür Sicherheitssystem"''' verstehen. [[Grundkenntnisse Programmierung (Tür Sicherheitssystem) |(Link)]]
  Serial.print("Die Taste ");
  Serial.print(c3);
  Serial.println(" wurde gedrückt");
  z1=1; z2=1; z3=1; z4=0; // Zugang zur vierten Zeicheneingabe freischalten
  goto Anfang;
  }
 
  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
  Serial.print("Die Taste ");
  Serial.print(c4);
  Serial.println(" wurde gedrückt");
  z1=1; z2=1; z3=1; z4=1; // Zugang zur weiteren Zeicheneingabe sperren
  }
}
}
</syntaxhighlight>
|}
----


=='''Programmierung Anleitung'''==
=== Tür öffnen und schließen ===
Nachdem alle Schritte abgeschlossen sind, kann mit der Programmierung des Projektes gestartet werden.
* 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.<br>


===1) Bibliotheken einfügen===
'''Tipp: '''
Zuerst muss, für das Projekt Tür Sicherheitssystem, die heruntergeladenen Bibliotheken eingefügt werden.<br>
# Benötigt werden if-Else Funktionen, die nach der bestimmten Taste abfragen und die Anweisung dann ausführen.
Benötigt wird die Bibliothek für den '''Servomotor''' und für das '''Tastenfeld'''.  
# Nutzen Sie Vergleichsoperatoren zum Abfragen des Passwortes.


'''Quelltext 1: ''' <code>TSS.ino</code>
['''Quelltext 6: ''' <code>TSS.ino</code>]
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Lösung &thinsp;</strong>
| <strong>Lösung &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 */
void loop()
#include <Keypad.h>
{
#include <Servo.h>
Anfang: // Goto Anfang
taste = tastenfeld.getKey();
if (taste)
{
  if (taste=='*')
  {
    Serial.println("Tür verriegelt");
    delay(1000);
    servoBlau.write(90); //Servomotor zum Verriegeln auf 90 Grad ansteuern
    digitalWrite(ROTE_LED, HIGH);
    digitalWrite(GRUENE_LED, LOW);
    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
  }
 
  if (taste=='#')
  {
  if (c1==p1&&c2==p2&&c3==p3&&c4==p4) //wird geprüft, ob die eingaben Codezeichen übereinstimmen
  {
    Serial.println ("Code korrekt, Schloss offen");
    servoBlau.write(0); //Servomotor zum Öffnen auf 0 Grad ansteuern.
    digitalWrite(ROTE_LED, LOW);
    digitalWrite(GRUENE_LED, HIGH);
  }
  else // ist das nicht der Fall, bleibt das Schloss gesperrt
  {
    Serial.println ("Code falsch, Schloss gesperrt");
    digitalWrite(ROTE_LED, HIGH);
    digitalWrite(GRUENE_LED, LOW);
    delay(2000);
    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.
  }
}
</syntaxhighlight>
</syntaxhighlight>
|}
|}
----


===2) Initialisierung Arduino ===
=== Einbrecher Warnung! ===
Im nächsten Schritt wird das Projekt mit den verbundenen Hardwarebauteilen im Programm initialisiert.
Die Zusatzaufgabe ist, einen Buzzer ertönen zu lassen, wenn das Passwort 3-mal falsch eingegeben wurde.  


====2.1) Tastenfeld initialisieren ====
'''Tipp: '''
# Bei einer falschen Eingabe wird die Variable hochgezählt.
# Wenn die Variable 3 erreicht, ertönt der Buzzer.
⇒ [https://wiki.hshl.de/wiki/index.php/Grundkenntnisse_Programmierung_(USS_mit_Buzzer)#tone() <code>'''tone();'''</code>]<br>


== '''Musterlösung''' ==
['''Quelltext 7: ''' <code>TSS.ino</code>]
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Lösung &thinsp;</strong>
|-
|
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
  if (taste=='#')
  {
  if (c1==p1&&c2==p2&&c3==p3&&c4==p4) //wird geprüft, ob die eingaben Codezeichen übereinstimmen
  {
    Serial.println ("Code korrekt, Schloss offen");
    servoBlau.write(0); //Servomotor zum Öffnen auf 0 Grad ansteuern.
    digitalWrite(ROTE_LED, LOW);
    digitalWrite(GRUENE_LED, HIGH);
  }
  else // ist das nicht der Fall, bleibt das Schloss gesperrt
  {
    Serial.println ("Code falsch, Schloss gesperrt");
    falscheEingabe += 1;
 
  if(falscheEingabe == 3)          // Wenn der Code 3 mal falsch eigegeben wurde
  {
    Serial.println("Besitzer wurde benachrichtigt!");
    tone(SOUND_BUZZER, Sound);
    delay(8000);
    noTone(SOUND_BUZZER);
  }
    digitalWrite(ROTE_LED, HIGH);
    digitalWrite(GRUENE_LED, LOW);
    delay(2000);
    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.
  }
}
</syntaxhighlight>
|}


Quelle: [https://funduino.de/tastenfeld-schloss Link]
== 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 117: Zeile 366:
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 126: 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 C1, C2, C3, C4; // Speichern der gedrückten Tasten
char taste; //Taste ist die Variable für die jeweils gedrückte Taste auf dem Tastenfeld
byte z1=0, z2, z3, z4; // Falschen Position zugeordnet wird verhindern
char c1, c2, c3, c4; // Speichern der gedrückten Tasten
char Taste; //Taste ist die Variable für die jeweils gedrückte Taste auf dem Tastenfeld
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 Servo 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); //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 gepü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 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 Abschlitt als Codeeingabe gewertet wird.
    goto Anfang; // Damit das Zeichen "#" nicht im folgenden Abschnitt als Codeeingabe gewertet wird.
   }
   }
  }
  }
    
    
/* 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
   }
   }
  }
  }
Zeile 246: Zeile 498:
</syntaxhighlight>
</syntaxhighlight>
|}
|}
[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