Arduino Projekt: Türsicherheitssystem: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
(188 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.<br>
* Ziel des Projektes ist, ein Türsicherheitssystem zu simulieren.
Die Aufgabe ist mit einem vier stelligen Zahlen Code die Tür zu öffnen.
* 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.<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>&#9314;</big></big>  || 1 || [[Steckbrett]]||[[Datei:R12-A-9-1.jpg|ohne|100px|]]
|<big><big>&#9316;</big></big>  || 2 || LED Rot/Grün||[[Datei:R20-F-1-1.jpg|ohne|100px|]]
|<big><big>&#9315;</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>&#9316;</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>&#9317;</big></big>  || 1 || [[Servomotor SG90|TowerPro SG90 Servomotor]]||[[Datei:R19-F-2-1.jpg|ohne|100px|]]
|-
|-
|<big><big>&#9319;</big></big>  || 1 || [[Piezo Lautsprecher]]||[[Datei:R6-B-0-1.jpg|ohne|100px|]]
|-
|-
|<big><big>&#9318;</big></big>  || 1 || [[Piezo Lautsprecher]]||[[Datei:R6-B-0-1.jpg|ohne|100px|]]
|<big><big>&#9320;</big></big>  || 1 || [[4x4 Tastenfeld]]||[[Datei:4x4_Tastenfeld.png|ohne|100px|]]
|<big><big>&#9319;</big></big>  || 1 || [[4x4 Tastenfeld]]||[[Datei:4x4_Tastenfeld.png|ohne|100px|]]
|-
|-
|}
|}


== '''Vorab wichtig zu wissen!''' ==
== Vorab wichtig zu wissen ==
[[Datei:Anode Kathode.png |thumb|rigth|150px|Abb. 2: LED]]
[[Datei:Anode Kathode.png |thumb|rigth|130px|Abb. 3: LED]]
'''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: '''  
===Servomotor Kabel===
* Beachte beim Arbeiten mit der LED, die Anode und Kathode nicht zu vertauschen.
{| class="wikitable"
* 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.
|+ style = "text-align: left"| Tabelle 2: Servomotor Farberkennung
* Wenn die LED am Ende des Projektes nicht leuchtet, wurde dies vertauscht, einfach umdrehen und sie leuchtet!
|-
| '''Schwarz oder Braun'''|| Masse (GND)<br>
|-
|'''Rot''' || VCC/+<nowiki>&thinsp;</nowiki>5&thinsp;V<br>
|-
| '''Organe, Gelb oder Weiß'''|| PWM-Signal
|}


'''Steckbrett: '''<br>
===Tastenfeld===
Erklärung zum Arbeiten mit einem Steckbrett: [[Steckbrett | (Link)]]
Definition Tastenfeld [https://wiki.hshl.de/wiki/index.php/4x4_Tastenfeld [klicken]]


'''Servomotor: '''
== Aufbau Schaltung ==
* Schwarz oder Braun = Masse (GND)
[[Datei:Tür_Schaltplan.png|550px|thumb|right|Abb.4 Schaltung Tür Sicherheitssystem]]
* Rot = +<nowiki>&thinsp;</nowiki>5&thinsp;V
In Abbildung 4 wird die Schaltung für das Projekt '''"Tür Sicherheitssystem"''' dargestellt.<br>
* Orange, Gelb oder Weiß = PWM-Signal
Bevor mit der Programmierung begonnen werden kann, muss die Schaltung des Projekts aufgebaut werden.


'''Tastenfeld: '''<br>
==Programmierung==
Anleitung zum Tastenfeld siehe: [https://wiki.hshl.de/wiki/index.php/4x4_Tastenfeld (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''']].
== '''Aufbau Schaltung''' ==
<br>
[[Datei:Tür_Schaltplan.png|500px|thumb|right|Abb.3 Schaltung Tür Sicherheitssystem]]
----
In Abb. 3 wird die Schaltung für das Projekt '''" Tür Sicherheitssystem"''' dargestellt.
=== Bibliotheken einfügen===
 
Laden Sie für das Projekt die [https://github.com/Chris--A/Keypad '''Bibliothek'''] für das Tastenfeld 4x4 herunter.<br>
=='''Arduino Datei erstellen'''==
Benötigt werden die Bibliotheken <code>'''Servo.h'''</code> und <code>'''Keypad.h'''</code>.  
Erstellen der ersten '''Arduino Datei''' ([https://wiki.hshl.de/wiki/index.php/Erste_Schritte_mit_der_Arduino_IDE Link zum Tutorial]).
 
=='''Programmierung Vorkenntnisse'''==
*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)]
*Grundkenntnisse für das Projekt '''"Tür Sicherheitssystem"''' verstehen. [[Grundkenntnisse Programmierung (Tür Sicherheitssystem) |(Link)]]
 
=='''Programmierung Anleitung'''==
Nachdem alle Schritte abgeschlossen sind, kann mit der Programmierung des Projektes gestartet werden.
 
===1) Bibliotheken einfügen===
Zuerst muss, für das Projekt Pong Spiel die heruntergeladenen Bibliotheken eingefügt werden.<br>
 
'''Benötigt wird: '''  
# Kommunikation zum I2C/TWI Gerät.
# Kommunikation mit dem SPI Gerät.
# Adafruit GFX Grafik.
# 128x64 and 128x32 OLEDs Displays.


'''Quelltext 1:''' <code>Pong.ino</code>
['''Quelltext 1: ''' <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
/* Benötigte Bibliotheken */
#include <SPI.h>
#include <Keypad.h>
#include <Wire.h>
#include <Servo.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
</syntaxhighlight>
</syntaxhighlight>
|}
|}
----


===2) Initialisierung Arduino===
=== 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


== '''Musterlösung''' ==
/* 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>
|}


Quelle: [https://github.com/shveytank/Arduino_Pong_Game Link]
'''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"
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Lösung Code &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 */
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
/* Taster PINS */
const char UP_BUTTON = 2;
const char DOWN_BUTTON = 3;
const char UP_BUTTON_TWO = 4;
const char DOWN_BUTTON_TWO = 5;


/* Variablen */
/* Variablen */
const unsigned char PADDLE_RATE = 33;         // const: Konstant, wert bleibt unverändert
char p1='1';char p2='2';char p3='3';char p4='A'; // Vier Zeichen des Passwortes eingegeben
const unsigned char BALL_RATE = 16;           // unsigned long: kann keine negativen Zahlen speichern
char taste; //Taste ist die Variable für die jeweils gedrückte Taste auf dem Tastenfeld
const unsigned char PADDLE_HEIGHT = 25;
char c1, c2, c3, c4; // Speichern der gedrückten Tasten
byte z1=0, z2, z3, z4; // Falsche Position zuordnen wird verhindert
</syntaxhighlight>
|}


const char SCREEN_WIDTH = 128;     // OLED Display Breite
'''3. Motor, Buzzer und RGB initialisieren'''<br>
const char SCREEN_HEIGHT = 64;    // OLED Display Höhe
{| 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>]


unsigned int Player_one = 0, Player_two = 0;
{| 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


/* Deklaration Display, verbindung zum I2C (SDA, SCL pins) */
/* Buzzer */
const char OLED_RESET = 0; // Reset pin
const byte SOUND_BUZZER = 10; // Buzzer ist an Pin 10 angeschlossen
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
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


/* Position vom Ball, Paddle und Spieler auf dem Display */
void setup()
{
Serial.begin(9600);


unsigned char Ball_x = 64, Ball_y = 32;
pinMode(ROTE_LED, OUTPUT);   //Die LEDs werden als Ausgang festgelegt
unsigned char Ball_dir_x = 1, Ball_dir_y = 1;
pinMode(GRUENE_LED, OUTPUT);


const unsigned char CPU_X = 12;
servoBlau.attach(11); //Der Servomotor ist an Pin 11 angeschlossen
unsigned char Cpu_y = 16;
}
</syntaxhighlight>
|}
----


const unsigned char PLAYER_X = 115;
=== Richtige Reihenfolge der Eingabe===
unsigned char Player_y = 16;
'''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.


unsigned long Ball_update;
'''Tipp: '''
unsigned long Paddle_update;
# 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.


void setup() {
['''Quelltext 5: ''' <code>TSS.ino</code>]
  Serial.begin(9600);
{| 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">
void loop()  
{
Anfang: // Goto Anfang
taste = tastenfeld.getKey();  


  /* Hochfahren vom Display */
/* Richtige Reihenfolge des Passwortes erstellen */
   display.begin(SSD1306_SWITCHCAPVCC, 0x3C)// Starte das Display
   if (z1==0) // Wenn das erste Zeichen noch nicht gespeichert wurde.
   display.display();                   // Zeigt das Startbild vom Arduino an
   {
   unsigned long start = millis();     // Anzahl von Ms zurück, seit Arduino-Board das aktuelle Programm gestartet hat
  c1=taste; //Unter der Variablen "C1" wird nun die aktuell gedrückte Taste gespeichert
   delay(1000);
  Serial.print("Die Taste ");  
   display.clearDisplay();             // Löscht das Bild
  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;
  }


   /* Pong Spiel Namen anzeigen */
   if (z3==0)
   display.setTextSize(2);
  {
   display.setTextColor(WHITE);
   c3=taste; //Unter der Variablen "C3" wird nun die aktuell gedrückte Taste gespeichert
   display.setCursor(5, 25);
   Serial.print("Die Taste ");  
   display.println("Pong Spiel");
   Serial.print(c3);
   display.display();
   Serial.println(" wurde gedrückt");
  delay(1000);
   z1=1; z2=1; z3=1; z4=0; // Zugang zur vierten Zeicheneingabe freischalten
  display.clearDisplay();
   goto Anfang;
 
   }
  /* Ball Timer zuweisen*/
    
   Ball_update = millis();
   if (z4==0) // Wenn das vierte Zeichen noch nicht gespeichert wurde
   delay(1000);
   {
 
  c4=taste; //Unter der Variablen "C4" wird nun die aktuell gedrückte Taste gespeichert
   /* Taster Initialisieren */
  Serial.print("Die Taste ");  
   pinMode(UP_BUTTON, INPUT);      // Taster als INPUT festlegen
  Serial.print(c4);
   pinMode(DOWN_BUTTON, INPUT);
  Serial.println(" wurde gedrückt");
  digitalWrite(UP_BUTTON, HIGH);       // Taster anschalten
  z1=1; z2=1; z3=1; z4=1; // Zugang zur weiteren Zeicheneingabe sperren
  digitalWrite(DOWN_BUTTON, HIGH);
   }
 
}
  /* Taster zwei */
  pinMode(UP_BUTTON_TWO, INPUT);
  pinMode(DOWN_BUTTON_TWO, INPUT);
  digitalWrite(UP_BUTTON_TWO, HIGH);
   digitalWrite(DOWN_BUTTON_TWO, HIGH);
}
}
</syntaxhighlight>
|}
----


/* Punkteanzeige */
=== Tür öffnen und schließen ===
void drawScore() {
* Für das Öffnen der Tür wird die Taste '''(#)''' verwendet. Um die Tür zu verriegeln, wird die Taste '''(*)''' genutzt.
  display.setTextSize(2);
* Wenn die Tür offen ist, leuchtet die LED Grün, und Rot, wenn die Tür geschlossen ist.
  display.setTextColor(WHITE);
* Der Motor soll sich beim Schließen zu 90 Grad, beim Öffnen wiederum zu 0 Grad drehen.
  display.setCursor(43, 0);
* Überprüfe vor dem Öffnen, ob das Passwort korrekt eingegeben wurde.<br>
  display.println(Player_one);


  display.setCursor(73, 0);
'''Tipp: '''
  display.println(Player_two);
# Benötigt werden if-Else Funktionen, die nach der bestimmten Taste abfragen und die Anweisung dann ausführen.
}
# Nutzen Sie Vergleichsoperatoren zum Abfragen des Passwortes.
/* Punkte zurücksetzten */
void eraseScore() {
  display.setTextSize(2);
  display.setTextColor(BLACK);
  display.setCursor(43, 0);
  display.println(Player_one);


   display.setCursor(73, 0);
['''Quelltext 6: ''' <code>TSS.ino</code>]
  display.println(Player_two);
{| 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">
void loop()
{
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>
|}
----


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


void loop() {
'''Tipp: '''
  drawScore();
# 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>


   bool update = false;                         // Ein bool enthält einen von zwei Werten, true oder false
['''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>
|}


  unsigned long time = millis();               // Zeit-Variable
== Musterlösung ==
{| role="presentation" class="wikitable mw-collapsible mw-collapsed"
| <strong>Lösung Code &thinsp;</strong>
|-
|     
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:small">
/* Benötigte Bibliotheken */
#include <Keypad.h>
#include <Servo.h>
                                 
/* Tastenfeld */
/* Größe des Keypads definieren */
const byte COLS = 4; //4 Spalten
const byte ROWS = 4; //4 Zeilen


  static bool Up_state = false;
byte colPins[COLS] = {2,3,4,5}; //Definition der Pins für die 3 Spalten
  static bool Down_state = false;
byte rowPins[ROWS] = {6,7,8,9}; //Definition der Pins für die 4 Zeilen
  static bool Up_state_two = false;
  static bool Down_state_two = false;


  Up_state |= (digitalRead(UP_BUTTON) == LOW);                  // Taster auslesen
/* Ziffern und Zeichen des Keypads festlegen */
  Down_state |= (digitalRead(DOWN_BUTTON) == LOW);
char hexaKeys[ROWS][COLS]={
  Up_state_two |= (digitalRead(UP_BUTTON_TWO) == LOW);
{'D','#','0','*'},
  Down_state_two |= (digitalRead(DOWN_BUTTON_TWO) == LOW);
{'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


/* Neue Ballposition */
/* Variablen */
  if (time > Ball_update) {
char p1='1';char p2='2';char p3='3';char p4='A'; // Vier Zeichen des Passwortes eingegeben
    /* Neue Ballposition */
char taste; //Taste ist die Variable für die jeweils gedrückte Taste auf dem Tastenfeld
    unsigned char New_x = Ball_x + Ball_dir_x;               // (x+1)
char c1, c2, c3, c4; // Speichern der gedrückten Tasten
    unsigned char New_y = Ball_y + Ball_dir_y;               // (y+1)
byte z1=0, z2, z3, z4; // Falsche Position zuordnen wird verhindert


    /* Checkt ob die verticalen Wände berüht werden */
    if (New_x == 0) {                        // Wand links
      Ball_dir_x = -Ball_dir_x;            // Wechselt die Richtung
      New_x += Ball_dir_x + Ball_dir_x;
      eraseScore();                        // Punkt für Spieler
      Player_one += 1;
      drawScore();


    }
/* Motor */
    if (New_x == 127) {                    // Wand rechts
Servo servoBlau; //Servomotor Definition
      Ball_dir_x = -Ball_dir_x;            // Wechselt die Richtung
      New_x += Ball_dir_x + Ball_dir_x;
      eraseScore();                       // Punkt für den Computer
      Player_two += 1;
      drawScore();
    }


    // Checkt ob die horizontalen Wände berüht werden
/* Buzzer */
    if (New_y == 0 || New_y == 63)  {
const byte SOUND_BUZZER = 10; // Buzzer ist an Pin 10 angeschlossen
      Ball_dir_y = -Ball_dir_y;           // Wechselt die Richtung
unsigned int sound = 500; // Frequenz von 500 Hertz
      New_y += Ball_dir_y + Ball_dir_y;
byte falscheEingabe;   // Für eine falsche Eingabe


    }
/* RGB */
    // Checkt, ob der Spieler 1 Paddel getroffen wurde
const byte ROTE_LED = 12; //Rote LED ist an Pin 12 angeschlossen
    if (New_x == PLAYER_X && New_y >= Player_y && New_y <= Player_y + PADDLE_HEIGHT) {
const byte GRUENE_LED = 13; //Grüne LED wird an Pin 13 angeschlossen
      Ball_dir_x = -Ball_dir_x;
      New_x += Ball_dir_x + Ball_dir_x;


    }
void setup()
    // Checkt, ob der Spieler 2 Paddel getroffen wurde
{
    if (New_x == CPU_X && New_y >= Cpu_y && New_y <= Cpu_y + PADDLE_HEIGHT) {
Serial.begin(9600);
      Ball_dir_x = -Ball_dir_x;
      New_x += Ball_dir_x + Ball_dir_x;
    }


    display.drawPixel(Ball_x, Ball_y, BLACK);
pinMode(ROTE_LED, OUTPUT);   //Die LEDs werden als Ausgang festgelegt
    display.drawPixel(New_x, New_y, WHITE);
pinMode(GRUENE_LED, OUTPUT);
    Ball_x = New_x;
    Ball_y = New_y;


    Ball_update += BALL_RATE;
servoBlau.attach(11); //Der Servomotor ist an Pin 11 angeschlossen
}


     update = true;               // true ~ display.display();
void loop()
{
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");
     falscheEingabe += 1;
 
  if(falscheEingabe == 3)          // Wenn der Code 3-mal falsch eingegeben 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.
   }
   }
 
}
/* Spieler 1 Paddel */
 
   display.drawFastVLine(PLAYER_X, Player_y, PADDLE_HEIGHT, BLACK);
/* Richtige Reihenfolge des Passwortes erstellen */
  if (Up_state) {
   if (z1==0) // Wenn das erste Zeichen noch nicht gespeichert wurde.
    Player_y -= 1;
  {
  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 (Down_state) {
    Player_y += 1;
   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;
   }
   }
  Up_state = Down_state = false;
 
  if (Player_y < 1) Player_y = 1;                                    // Um nicht aus dem Bildschirm zu gelangen
  if (Player_y + PADDLE_HEIGHT > 63) Player_y = 63 - PADDLE_HEIGHT;
  display.drawFastVLine(PLAYER_X, Player_y, PADDLE_HEIGHT, WHITE);


   update = true;
   if (z3==0)
 
  {
/* Spieler 2 Paddel */
  c3=taste; //Unter der Variablen "C3" wird nun die aktuell gedrückte Taste gespeichert
  display.drawFastVLine(CPU_X, Cpu_y, PADDLE_HEIGHT, BLACK);
  Serial.print("Die Taste ");
  if (Up_state_two) {
  Serial.print(c3);
    Cpu_y -= 1;                       // Paddle 1 nach unten
  Serial.println(" wurde gedrückt");
  z1=1; z2=1; z3=1; z4=0; // Zugang zur vierten Zeicheneingabe freischalten
  goto Anfang;
   }
   }
   if (Down_state_two) {
 
    Cpu_y += 1;                     // Paddle 1 nach oben
   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
   }
   }
  Up_state_two = Down_state_two = false;
}
 
  if (Cpu_y < 1) Cpu_y = 1;                                        // Um nicht aus dem Bildschirm zugelangen
  if (Cpu_y + PADDLE_HEIGHT > 63) Cpu_y = 63 - PADDLE_HEIGHT;
  display.drawFastVLine(CPU_X, Cpu_y, PADDLE_HEIGHT, WHITE);
 
 
  if (update)
    display.display();
}
}


</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