Arduino Projekt: Türsicherheitssystem: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Zeile 109: Zeile 109:
== '''Musterlösung''' ==
== '''Musterlösung''' ==


Quelle: [https://github.com/shveytank/Arduino_Pong_Game Link]
Quelle: [https://funduino.de/tastenfeld-schloss Link]
{| 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>
Zeile 116: Zeile 116:
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:14px">
<syntaxhighlight lang="C" style="border: none; background-color: #EFF1C1; font-size:14px">
/* 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>
/* Tastenfeld */
 
/* 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 C1, C2, C3, C4; // Speichern der gedrückten Tasten
const unsigned char PADDLE_HEIGHT = 25;
 
const char SCREEN_WIDTH = 128;      // OLED Display Breite
const char SCREEN_HEIGHT = 64;    // OLED Display Höhe
 
unsigned int Player_one = 0, Player_two = 0;
 
/* Deklaration Display, verbindung zum I2C (SDA, SCL pins) */
const char OLED_RESET = 0; // Reset pin
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
 
 
/* Position vom Ball, Paddle und Spieler auf dem Display */
 
unsigned char Ball_x = 64, Ball_y = 32;
unsigned char Ball_dir_x = 1, Ball_dir_y = 1;
 
const unsigned char CPU_X = 12;
unsigned char Cpu_y = 16;
 
const unsigned char PLAYER_X = 115;
unsigned char Player_y = 16;
 
unsigned long Ball_update;
unsigned long Paddle_update;


void setup() {
/* Größe des Keypads definieren */
  Serial.begin(9600);
const byte COLS = 4; //4 Spalten
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


  /* Hochfahren vom Display */
/* Ziffern und Zeichen des Keypads festlegen */
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);   // Starte das Display
char Hexa_Keys[ROWS][COLS]={
  display.display();                   // Zeigt das Startbild vom Arduino an
{'D','#','0','*'},
  unsigned long start = millis();      // Anzahl von Ms zurück, seit Arduino-Board das aktuelle Programm gestartet hat
{'C','9','8','7'},
  delay(1000);
{'B','6','5','4'},
  display.clearDisplay();             // Löscht das Bild
{'A','3','2','1'}
};
byte z1=0, z2, z3, z4; // Falschen Position zugeordnet wird verhindern
char Taste; //Taste ist die Variable für die jeweils gedrückte Taste auf dem Tastenfeld
Keypad Tastenfeld = Keypad(makeKeymap(Hexa_Keys), Row_Pins, Col_Pins, ROWS, COLS); //Das Keypad kann absofort mit "Tastenfeld" angesprochen werden


  /* Pong Spiel Namen anzeigen */
/* Motor */
  display.setTextSize(2);
Servo Servo_blau; //Servomotor definition
  display.setTextColor(WHITE);
  display.setCursor(5, 25);
  display.println("Pong Spiel");
  display.display();
  delay(1000);
  display.clearDisplay();


  /* Ball Timer zuweisen*/
/* Buzzer */
  Ball_update = millis();
const byte SOUND_BUZZER = 10; // Buzzer ist an Pin 10 angeschlossen
  delay(1000);
unsigned int Sound = 500; // Frequenz von 500 Hertz
byte Falsche_Eingabe;    // Für eine falsche Eingabe


  /* Taster Initialisieren */
/* RGB */
  pinMode(UP_BUTTON, INPUT);       // Taster als INPUT festlegen
byte ROTE_LED = 12; //Rote LED ist an Pin 12 angeschlossen
  pinMode(DOWN_BUTTON, INPUT);
byte GRUENE_LED = 13; //Grüne LED wird an Pin 13 angeschlossen
  digitalWrite(UP_BUTTON, HIGH);      // Taster anschalten
  digitalWrite(DOWN_BUTTON, HIGH);


  /* Taster zwei */
void setup()  
  pinMode(UP_BUTTON_TWO, INPUT);
{
  pinMode(DOWN_BUTTON_TWO, INPUT);
Serial.begin(9600);
  digitalWrite(UP_BUTTON_TWO, HIGH);
  digitalWrite(DOWN_BUTTON_TWO, HIGH);
}


/* Punkteanzeige */
pinMode(ROTE_LED, OUTPUT);  //Die LEDs werden als Ausgang festgelegt
void drawScore() {
pinMode(GRUENE_LED, OUTPUT);
  display.setTextSize(2);
   display.setTextColor(WHITE);
  display.setCursor(43, 0);
  display.println(Player_one);


  display.setCursor(73, 0);
Servo_blau.attach(11); //Der Servo ist an Pin 11 angeschlossen
  display.println(Player_two);
}
}
/* Punkte zurücksetzten */
void eraseScore() {
  display.setTextSize(2);
  display.setTextColor(BLACK);
  display.setCursor(43, 0);
  display.println(Player_one);


  display.setCursor(73, 0);
void loop()  
  display.println(Player_two);
{
}
Anfang: // Goto Anfang
 
Taste = Tastenfeld.getKey();  
 
if (Taste)  
void loop() {
{
   drawScore();
   if (Taste=='*')
 
  {
  bool update = false;                         // Ein bool enthält einen von zwei Werten, true oder false
  Serial.println("Tuer verriegelt");
 
  delay(2000);
  unsigned long time = millis();              // Zeit-Variable
  Servo_blau.write(90); //Servo zum verriegeln auf 90 Grad ansteuern
 
  digitalWrite(ROTE_LED, HIGH);
  static bool Up_state = false;
  digitalWrite(GRUENE_LED, LOW);  
  static bool Down_state = false;
  z1=0; z2=1; z3=1; z4=1; // Zugang zur ersten Zeicheneingabe freischalten
  static bool Up_state_two = false;
  goto Anfang; // Damit das Zeichen "*" nicht im folgenden Abschnitt als Codeeingabe gewertet wird
  static bool Down_state_two = false;
  }
 
 
  Up_state |= (digitalRead(UP_BUTTON) == LOW);                   // Taster auslesen
  if (Taste=='#')
  Down_state |= (digitalRead(DOWN_BUTTON) == LOW);
  {
  Up_state_two |= (digitalRead(UP_BUTTON_TWO) == LOW);
  if (C1==P1&&C2==P2&&C3==P3&&C4==P4) //wird gepüft, ob die eingaben Codezeichen übereinstimmen
  Down_state_two |= (digitalRead(DOWN_BUTTON_TWO) == LOW);
  {
 
  Serial.println ("Code korrekt, Schloss offen");
/* Neue Ballposition */
  Servo_blau.write(0); //Servo zum öffnen auf 0 Grad ansteuern.
  if (time > Ball_update) {
  digitalWrite(ROTE_LED, LOW);
    /* Neue Ballposition */
  digitalWrite(GRUENE_LED, HIGH);
    unsigned char New_x = Ball_x + Ball_dir_x;               // (x+1)
  }
    unsigned char New_y = Ball_y + Ball_dir_y;               // (y+1)
  else // ist das nicht der Fall, bleibt das Schloss gesperrt
 
  {
    /* Checkt ob die verticalen Wände berüht werden */
  Serial.println ("Code falsch, Schloss gesperrt");
    if (New_x == 0) {                         // Wand links
  Falsche_Eingabe += 1;
      Ball_dir_x = -Ball_dir_x;            // Wechselt die Richtung
 
      New_x += Ball_dir_x + Ball_dir_x;
  if(Falsche_Eingabe == 3)         // Wenn der Code 3 mal falsch eigegeben wurde
      eraseScore();                         // Punkt für Spieler
  {
      Player_one += 1;
     Serial.println("Besitzer wurde benachrichtigt!");
      drawScore();
     tone(SOUND_BUZZER, Sound);
 
     delay(8000);
    }
    noTone(SOUND_BUZZER);
    if (New_x == 127) {                    // Wand rechts
  }
      Ball_dir_x = -Ball_dir_x;            // Wechselt die Richtung
  digitalWrite(ROTE_LED, HIGH);
      New_x += Ball_dir_x + Ball_dir_x;
  digitalWrite(GRUENE_LED, LOW);
      eraseScore();                       // Punkt für den Computer
  delay(2000);
      Player_two += 1;
  z1=0; z2=1; z3=1; z4=1; // Der Zugang für die erste Zeicheneingabe wird wieder freigeschaltet
      drawScore();
  goto Anfang; // Damit das Zeichen "#" nicht im folgenden Abschlitt als Codeeingabe gewertet wird.
    }
 
    // Checkt ob die horizontalen Wände berüht werden
    if (New_y == 0 || New_y == 63) {
      Ball_dir_y = -Ball_dir_y;          // Wechselt die Richtung
      New_y += Ball_dir_y + Ball_dir_y;
 
    }
    // Checkt, ob der Spieler 1 Paddel getroffen wurde
     if (New_x == PLAYER_X && New_y >= Player_y && New_y <= Player_y + PADDLE_HEIGHT) {
      Ball_dir_x = -Ball_dir_x;
      New_x += Ball_dir_x + Ball_dir_x;
 
     }
    // Checkt, ob der Spieler 2 Paddel getroffen wurde
     if (New_x == CPU_X && New_y >= Cpu_y && New_y <= Cpu_y + PADDLE_HEIGHT) {
      Ball_dir_x = -Ball_dir_x;
      New_x += Ball_dir_x + Ball_dir_x;
    }
 
    display.drawPixel(Ball_x, Ball_y, BLACK);
    display.drawPixel(New_x, New_y, WHITE);
    Ball_x = New_x;
    Ball_y = New_y;
 
    Ball_update += BALL_RATE;
 
    update = true;               // true ~ display.display();
   }
   }
 
}
/* 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 "); //Teile uns am Serial Monitor die gedrückte Taste mit
  Serial.print(C1);
   Serial.println(" wurde gedrueckt");
  z1=1; z2=0; z3=1; z4=1; // Zugang zur zweiten Zeicheneingabe freischalten
  goto Anfang;
   }
   }
   if (Down_state) {
    Player_y += 1;
   if (z2==0) // Wenn das zweite Zeichen noch nicht gespeichert wurde...
  {
  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(C2);
  Serial.println(" wurde gedrueckt");
  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;


/* Spieler 2 Paddel */
  if (z3==0) // Wenn das dritte Zeichen noch nicht gespeichert wurde...
   display.drawFastVLine(CPU_X, Cpu_y, PADDLE_HEIGHT, BLACK);
  {
   if (Up_state_two) {
  C3=Taste; //Unter der Variablen "C3" wird nun die aktuell gedrückte Taste gespeichert
    Cpu_y -= 1;                       // Paddle 1 nach unten
   Serial.print("Die Taste "); //Teile uns am Serial Monitor die gedrückte Taste mit
   Serial.print(C3);
  Serial.println(" wurde gedrueckt");
  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 "); //Teile uns am Serial Monitor die gedrückte Taste mit
  Serial.print(C4);
  Serial.println(" wurde gedrueckt");
  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();
}
}



Version vom 25. Juli 2023, 06:34 Uhr

Abb. 1: Tür Sicherheitssystem

Autor: Justin Frommberger

Aufgabenstellung

  • Ziel von dem Projekt ist eine Tür Sicherheitssystem zu simulieren.
  • Die Aufgabe ist, mit einem vierstelligen Zahlen Code die Tür zu öffnen.
  • Wenn der Code 3-mal Falsche eingegeben wurde, ertönt ein Warnsignal.
  • Alle Eingaben sollen auf dem seriellen Monitor angezeigt werden.

Benötigte Software

  • Aktuellste Arduino IDE mit der Version für ihren PC. (Download link)
  • Bibliotheken für das 4x4 Tastenfeld downloaden: (Link)
    • Klicke oben rechts in GitHub auf Code und dann downloade die Zip-Datei.
    • Um die Zip-Datei in ihre Arduino Bibliothek einzubinden, folgen diese Schritte: (Link)

Benötigte Materiallien

Tabelle 1: Materialliste

Nr. Anz. Beschreibung Bild Pos. Anz. Beschreibung Bild
1 Funduino Arduino UNO R3
viele Jumper Kabel, 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. 2: LED

Arduino Uno R3:

  • Der Arduino besitzt unterschiedliche Schnittstellen, weil der Arduino ein digitaler Mikrocontroller ist, kann er nur  5 Volt ausgeben oder annehmen.
  • Bei einer konstanten  5 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  5 V Signal kaum noch vorhanden und bei einem hohen PWM-Wert liegt das  5 V Signal nahezu durchgehend am Pin an.
  • Durch die PWM Schnittstelle kann nun die LED unterschiedlich hell leuchten, da die Spannung anpassbar ist.
  • Die [PWM] Schnittstellen sind ganz einfach zu erkennen an diesem Zeichen (~)

LED:

  • Beachte beim Arbeiten mit der LED, die Anode und Kathode nicht zu vertauschen.
  • 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.
  • Wenn die LED am Ende des Projektes nicht leuchtet, wurde dies vertauscht, einfach umdrehen und sie leuchtet!

Steckbrett:
Erklärung zum Arbeiten mit einem Steckbrett: (Link)

Servomotor:

  • Schwarz oder Braun = Masse (GND)
  • Rot = + 5 V
  • Orange, Gelb oder Weiß = PWM-Signal

Tastenfeld:
Anleitung zum Tastenfeld siehe: (Link)

Aufbau Schaltung

Abb.3 Schaltung Tür Sicherheitssystem

In Abb. 3 wird die Schaltung für das Projekt " Tür Sicherheitssystem" dargestellt.

Arduino Datei erstellen

Erstellen der ersten Arduino Datei (Link zum Tutorial).

Programmierung Vorkenntnisse

  • Kenntnisse in den Programmierrichtlinien für die Erstellung von Software. (Link)
  • Grundkenntnisse von Projekt 1-4 verstanden haben. (Link)
  • Grundkenntnisse für das Projekt "Tür Sicherheitssystem" verstehen. (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.

Benötigt wird:

  1. Kommunikation zum I2C/TWI Gerät.
  2. Kommunikation mit dem SPI Gerät.
  3. Adafruit GFX Grafik.
  4. 128x64 and 128x32 OLEDs Displays.

Quelltext 1: Pong.ino

2) Initialisierung Arduino

Musterlösung

Quelle: Link



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