2. Tasten und Relais

Servo, Motor und Schrittmotor

2.1 Ein Relais mit einer Taste einschalten und 

mit einer zweiten Taste wieder ausschalten

Verwendetes Material:
1x Arduino MEGA Platine
1x Breadboard
1x Relaismodul
1x Doppel-Tastermodul
1x langer roter Draht (+5V)
1x kurzer roter Draht (+5V) 

3x kurzer schwarzer Draht (GND)
3x kurzer Draht

In dieser Übung soll mittels 2 Taster ein Relais ein- und ausgeschaltet werden. Da die Pins der Tasten und des Relais zu kurz sind, um beim Einstecken in das Breadboard vernünftigen Kontakt herzustellen, wurden 2 Platinen-Module angefertigt.
Durch Drücken der rechten Taste schaltet das Relais ein - die Led leuchtet. Durch Drücken der linken Taste schaltet das Relais wieder aus - die Led wird wieder dunkel.

Hier der Programmcode:
int buttonONpin = 8;      // Taster zum Einschalten
int buttonOFFpin = 9;    // Taster zum Ausschalten
int Relais = 7;                    // Der Relais-Ausgang

void setup() 
{
pinMode(buttonONpin, INPUT_PULLUP);  //Pin-Deklaration als Eingang mit internem 
                                                                                  //Pull-Up. Die Taste wird gegen Gnd geschaltet
pinMode(buttonOFFpin, INPUT_PULLUP);
pinMode(Relais, OUTPUT);                             //Pin-Deklaration als Ausgang
}
void loop() 
{
   if (digitalRead(buttonONpin) == LOW)  //Einlesen der Taste ON
   {
      digitalWrite(Relais, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
   }
   if (digitalRead(buttonOFFpin) == LOW) //Einlesen der Taste ON
   {
      digitalWrite(Relais, LOW);                       //Wenn Taste gegen GND, Relaisausgang Low
   }
}

Verwendet man die kaufbaren Relaismodule (rot) und Tastenmodule (grün) werden die Anschlüsse etwas angepasst. Die Tastenmodule sind nach wie vor SW1 - GND - SW2 zu verdrahten.
Hier die alternative Variante auf dem Breadboard:

2.2 Motorumpolung mit 2 Tasten

Verwendetes Material:
1x Arduino MEGA Platine
1x Breadboard
1x L293D Motortreiber
1x 5V Minimotor
1x Doppel-Tastermodul
1x langer roter Draht (+5V)
3x kurzer roter Draht (+5V) 
4x kurzer schwarzer Draht (GND)
4x kurzer Draht

1. Variante OHNE TASTEN = Motor läuft links und rechts abwechselnd
Durch Verwendung des ICs L293D kann ein DC Motor in beiden Drehrichtungen verwendet werden. Der IC hat intern 2 H-Brücken, um 2 kleine DC-Motoren anzusteuern.
Der erste Programmcode lässt ganz simpel den Motor 1 Sekunde nach links drehen und dann  1 Sekunde nach rechts drehen. Dieses Programm dient zum Test des Aufbaus.

Hier der Programmcode:
void setup() {           
  pinMode(7, OUTPUT);  //L293D Pin 2
  pinMode(5, OUTPUT);  //L293D Pin 7
 }

 void loop(){
  digitalWrite(7, HIGH); //Linkslauf 1Sek.
  digitalWrite(5, LOW);
  delay(1000);
 
  digitalWrite(7, LOW); //Rechtslauf 1Sek.
  digitalWrite(5, HIGH);
  delay(1000);
 }
 

2. Variante MIT TASTEN = Motor läuft links und rechts mit 1 Sekunde Leerlaufzeit

Hier der Programmcode:
int buttonLINKSpin = 8;        // Taster für Linkslauf
int buttonRECHTSpin = 9;    // Taster für Rechtslauf

void setup() {    
pinMode(buttonLINKSpin, INPUT_PULLUP);  //Pin-Deklaration als Eingang mit internem 
pinMode(buttonRECHTSpin, INPUT_PULLUP); //Pull-Up. Die Taste wird gegen Gnd geschaltet
pinMode(7, OUTPUT);  //L293D Pin 2
pinMode(5, OUTPUT);  //L293D Pin 7
}

 void loop(){
if (digitalRead(buttonLINKSpin) == LOW)  //Einlesen der Taste Linkslauf ON
  {
  digitalWrite(7, LOW); //Linkslauf 
  delay(1000);
  digitalWrite(5, HIGH);  //Wenn Taste gegen GND, Relaisausgang High
  }
if (digitalRead(buttonRECHTSpin) == LOW) //Einlesen der Taste ON
  {
  digitalWrite(7, HIGH); //Rechtslauf
  delay(1000);
  digitalWrite(5, LOW); 
  }
}

2.21-Erweiterung:  PWM-Softanlauf des Motors und 3. Taste für Stop (2 Tasten für Links&Rechtslauf)

Verwendetes Material:
1x Arduino MEGA Platine
1x Breadboard
1x L293D Motortreiber
1x 5V Minimotor
1x Doppel-Tastermodul
1x Taster
1x Led5mm Rot (oder andere Farbe)
1x Widerstand 220-470R
1x langer roter Draht (+5V)
3x kurzer roter Draht (+5V) 
6x kurzer schwarzer Draht (GND)
6x kurzer Draht

Mit einer 3. Taste und einer roten Led wird eine Stop-Funktion implementiert
(z.B. NOT-AUS). Mit einem Fade-Code wird der Motor in Links- und Rechtsrichtung per Softanlauf gestartet. Damit gibt es kein Ruckeln des Motors und keine extremen Start-Ströme bei Anfahren - sprich Motor & Netzteil werden geschont.

Hier der Programmcode:
int buttonLINKSpin = 8;      // Taster zum Einschalten
int buttonRECHTSpin = 9;    // Taster zum Ausschalten
int buttonSTOPpin = 12;    // Taster zum Ausschalten
int STOPLed = 10;          // Led als Stop-Anzeige

void setup()
{
Serial.begin(9600);
Serial.print("..."); 
pinMode(buttonLINKSpin, INPUT_PULLUP);  //Pin-Deklaration als Eingang mit internem Pull-Up.                                                     
pinMode(buttonRECHTSpin, INPUT_PULLUP); // Die Tasten werden gegen Gnd geschaltet
pinMode(buttonSTOPpin, INPUT_PULLUP);
pinMode(STOPLed, OUTPUT);
pinMode(7, OUTPUT);  //L293D Pin 2
pinMode(5, OUTPUT);  //L293D Pin 7
}
void loop()
{
  Serial.println(". ");
  if (  (digitalRead(buttonSTOPpin) == LOW ) )//Einlesen der Taste STOP
  {
    Serial.println("Stop");
    analogWrite(PIN7, LOW);
    analogWrite(PIN5, LOW);
    digitalWrite(STOPLed , HIGH);//Led ON        //Stop-Led einschalten für STOP Anzeige
    Serial.println("Stopled on");
    delay(1000);
  }
  if ( (digitalRead(buttonLINKSpin) == LOW)  )   //Einlesen der Taste LINKS
  {
     Serial.println("Richtung 1");       

     for (int fadeValue = 0; fadeValue <= 255; fadeValue += 10){  //Anfangs Wert; ** ;Hochzählschritte
       analogWrite(PIN7, fadeValue);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);            //Stop-Led wieder löschen für Betrieb
       Serial.println("Stopled off");
       delay(100);                             //Schnelligkeit hochzählen
       if (fadeValue==255) {
       fadeValue=255;                          // Endgeschwindigkeit (Max)
       break;
      }
      }   
   }
   if ( (digitalRead(buttonRECHTSpin) == LOW)  ) //Einlesen der Taste RECHTS
   {
    Serial.println("Richtung 2");
    for (int fadeValue = 0; fadeValue <= 255; fadeValue += 10){  //Anfangs Wert; ** ;Hochzählschritte
       analogWrite(PIN5, fadeValue);
       analogWrite(PIN7, 0);
       digitalWrite(STOPLed , LOW);            //Stop-Led wieder löschen für Betrieb
       Serial.println("Stopled off");
       delay(100);                             //Schnelligkeit hochzählen
       if (fadeValue==255) {
       fadeValue=255;                          // Endgeschwindigkeit (Max)
       break;
       }
       }   
   }
}

Durch Drücken der Links-&Rechts-Taste wird der kleine DC Motor gestartet. Durch Drücken der Stop-Taste stoppt der Motor und die rote Led Leuchtet- Quasi eine Notaus-Funktion.  

2.3 Drehzahlregelung und Drehrichtungs-Umkehr über einen Poti mit Stop-Led

Verwendetes Material:
1x Arduino MEGA Platine
1x Breadboard
1x L293D Motortreiber
1x 5V Minimotor
1x Potentiometer 1-47kOhm
1x Led5mm Rot (oder andere Farbe)
1x Widerstand 220-470R
1x langer roter Draht (+5V)
4x kurzer roter Draht (+5V) 
5x kurzer schwarzer Draht (GND)
4x kurzer Draht

Ein Potentiometer liefert an einem anlogen Pin eine Spannung von 0-5V. Dies ergibt digital 0-1024.
Stellt man den Poti auf Mittelstellung (Wert 450 - 550) soll der Motor stoppen und eine rote Led leuchtet für "Motor Stop"

Dreht man den Poti nach links geht der Wert von 451 auf 0. Dem entsprechend wird dem Motor-Treiber L293D ein PWM Wert aufsteigend von 0 bis 255 ausgegeben. Damit kann mit dem Poti nach links die Drehzahl geregelt werden.
 

Dreht man den Poti nach rechts geht der Wert von 551 auf 1024. Dem entsprechend wird dem Motor-Treiber L293D ein PWM Wert aufsteigend von 0 bis 255 ausgegeben. Damit kann mit dem Poti nach links die Drehzahl geregelt werden. 


Hier der Programmcode:
#define POTENTIOMETER_PIN A0
int Vorheriger_Analogwert = 0;
int Analogwert = 0;
byte Genauigkeit = 10;
int STOPLed = 10;          // Led als Stop-Anzeige
int Drehzahl = 0;

void setup()
{
  pinMode(7, OUTPUT);  //L293D Pin 2  //L293D IC
  pinMode(5, OUTPUT);  //L293D Pin 7  //L293D IC
  pinMode(STOPLed, OUTPUT); 
    Serial.begin(9600);
}
void loop()
{
    Analogwert = analogRead(POTENTIOMETER_PIN);
    
    if (abs(Vorheriger_Analogwert - Analogwert) >= Genauigkeit) 
    {
        Vorheriger_Analogwert = Analogwert;
        Serial.println(Analogwert);
    }
    
    if (Analogwert < 100)                             //Rechts Ausgabe Anschlag 0 bis 450 ->Im Bereich 0 bis 450 Rechtslauf
    {
       Drehzahl = 255;
       Serial.println("Rechtslauf");            //Formel: Bei 449 soll fadeValue 1 sein      Bei 1 soll fadeValue 255 sein
       Serial.println(Drehzahl);
       analogWrite(PIN7, Drehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);            //Stop-Led wieder löschen für Betrieb
    }
     if ((Analogwert >101) && (Analogwert <200))                             
    {
       Drehzahl = 200;
       Serial.println("Rechtslauf");    
       Serial.println(Drehzahl);
       analogWrite(PIN7, Drehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);   
     }
      if ((Analogwert >201) && (Analogwert <300))                             
    {
       Drehzahl = 150;
       Serial.println("Rechtslauf");    
       Serial.println(Drehzahl);
       analogWrite(PIN7, Drehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);   
     }
       if ((Analogwert >301) && (Analogwert <400))                             
    {
       Drehzahl = 100;
       Serial.println("Rechtslauf");    
       Serial.println(Drehzahl);
       analogWrite(PIN7, Drehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);   
     }
      if ((Analogwert >401) && (Analogwert <450))                             
    {
       Drehzahl = 50;
       Serial.println("Rechtslauf");    
       Serial.println(Drehzahl);
       analogWrite(PIN7, Drehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);   
     }
     if ((Analogwert >451) && (Analogwert <549))      //Mitte Ausgabe Anschlag 490 - 510    ->Stoppentscheidung 450-550
     {   
        Serial.println("Mitte Stopp");
        analogWrite(7, 0); //Motor Stop
        analogWrite(5, 0); 
        digitalWrite(STOPLed, HIGH);                               // Bei Stop soll rote Led leuchten
     }
     if ((Analogwert >550) && (Analogwert <600))                             
     {
       Drehzahl = 50;
       Serial.println("Linkslauf");    
       Serial.println(Drehzahl);
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Drehzahl);
       digitalWrite(STOPLed , LOW);   
     }
     if ((Analogwert >601) && (Analogwert <700))                             
     {
       Drehzahl = 100;
       Serial.println("Linkslauf");    
       Serial.println(Drehzahl);
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Drehzahl);
       digitalWrite(STOPLed , LOW);   
     }
     if ((Analogwert >701) && (Analogwert <800))                             
     {
       Drehzahl = 150;
       Serial.println("Linkslauf");    
       Serial.println(Drehzahl);
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Drehzahl);
       digitalWrite(STOPLed , LOW);   
     }
     if ((Analogwert >801) && (Analogwert <900))                             
     {
       Drehzahl = 200;
       Serial.println("Linkslauf");    
       Serial.println(Drehzahl);
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Drehzahl);
       digitalWrite(STOPLed , LOW);   
     }
     if ((Analogwert >901) && (Analogwert <1024))                             
     {
       Drehzahl = 255;
       Serial.println("Linkslauf");    
       Serial.println(Drehzahl);
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Drehzahl);
       digitalWrite(STOPLed , LOW);   
     }
}

2.4 Drehzahlregelung und Drehrichtungs-Umkehr mit Stop-Led über einen Initialgeber mit einer

4 fach 7-Segment-Anzeige

In dieser Übung wird der Aufbau mit Poti und Stopp-Led stufenweise erweitert bis zum Betreib mit Rotary Encoder und 4fach-7Segment Anzeige und der Encoder-Drucktaster als Stopp.

Verwendetes Material:
1x Arduino MEGA Platine
1x Breadboard
1x L293D Motortreiber
1x 5V Minimotor
1x Led5mm Rot (oder andere Farbe)
5x Widerstand 220-470R
1x 4-fach 7-Segment aus Elegoo KIT
1x Rotary Decoder aus Elegoo KIT
1x langer roter Draht (+5V)
4x kurzer roter Draht (+5V)
5x kurzer schwarzer Draht (GND)
22x kurze&lange Drähte

Schritt 1: Den Aufbau 2.3 ohne Potentiometer als Ausgangsbasis

Schritt 2: Erweiterung mit Rotary Encoder

Schritt 3: Erweiterung 7-Segment Anzeige nur die 4 Widerstände
(zweites Bild zeigt nur die 4 ergänzten Verbindungen) 

Schritt 4: Erweiterung 7-Segment Anzeige mit den Signalleitungen
(zweites Bild zeigt nur die 8 ergänzten Verbindungen) 

Hier der Programmcode:
#include "SevSeg.h" //Die vorher hinzugefügte Library laden
SevSeg sevseg;           //Ein sieben Segment Objekt initialisieren

#define CLK 2
#define DT 3
#define SW 4

int currentStateCLK;
int lastStateCLK;
int counter = 0;
int Anzeigewert = 0;
int Motordrehzahl = 0;
String currentDir ="";
unsigned long lastButtonPress = 0;

byte Genauigkeit = 10;
int STOPLed = 10;          // Led als Stop-Anzeige
int Drehzahl = 0;

void setup()
{
 pinMode(7, OUTPUT);  //L293D Pin 2  //L293D IC
 pinMode(5, OUTPUT);  //L293D Pin 7  //L293D IC
 pinMode(STOPLed, OUTPUT);
 
byte numDigits = 4; //Hier wird die Anzahl der Ziffern angegeben
byte digitPins[] = {17, 16, 15, 14}; // Die Pins zu den Ziffern werden festgelegt
byte segmentPins[] = {24, 26, 28, 30, 32, 34, 36, 38}; //Die Pins zu den //Segmenten werden festgelegt
sevseg.begin(COMMON_CATHODE, numDigits, digitPins, segmentPins); //In diesem
//Abschnitt kann man nun entweder testen welche Art von Display man besitzt oder
//wenn man es schon weiß angeben ob es sich um ein COMMON_CATHODE oder
//COMMON_ANODE Display handelt. Das Display funktioniert nur wenn die richtige
//Art eingetragen ist, ansonsten werden alle Segmente gleichzeitig leuchten.

  // Set encoder pins as inputs
  pinMode(CLK,INPUT);
  pinMode(DT,INPUT);
  pinMode(SW, INPUT_PULLUP);
 
  Serial.begin(9600); 
 // Setup Serial Monitor 

 
  lastStateCLK = digitalRead(CLK);
 // Read the initial state of CLK 

}

void loop()
{
sevseg.setNumber(Anzeigewert); //z.B. (-100);  (100); (0); Hier können wir nun die gewünschte Zahl eintragen.
sevseg.refreshDisplay(); // Dieser Teil lässt die Nummer auf dem Display
//erscheinen.
sevseg.setBrightness(90); //Hier kann die Helligkeit des Displays 0-100 angepasst

// Read the current state of CLK
  currentStateCLK = digitalRead(CLK);

  // If last and current state of CLK are different, then pulse occurred
  // React to only 1 state change to avoid double count
  if (currentStateCLK != lastStateCLK  && currentStateCLK == 1){

    // If the DT state is different than the CLK state then
    // the encoder is rotating CCW so decrement
    if (digitalRead(DT) != currentStateCLK) {
      counter --;
      Anzeigewert --;
      delay(20);
      currentDir ="Runterzählen";
    } else {
      // Encoder is rotating CW so increment
      counter ++;
      Anzeigewert ++;
      delay(20);
      currentDir ="Hinaufzählen";
    }

    Serial.print("Richtung: ");
    Serial.print(currentDir);
    Serial.print(" | Anzeigewert: ");
    Serial.println(Anzeigewert);
  }
 
  lastStateCLK = currentStateCLK;
 // Remember last CLK state 

 
  int btnState = digitalRead(SW);
 // Read the button state 


  //If we detect LOW signal, button is pressed
  if (btnState == LOW) {
    //if 50ms have passed since last LOW pulse, it means that the
    //button has been pressed, released and pressed again
    if (millis() - lastButtonPress > 50) {
      Serial.println("Encoder Taste gedrückt");
      counter = 0;
      Anzeigewert = 0;
    }
   
    lastButtonPress = millis();
 // Remember last button press event 


  }
  delay(1);
  // Put in a slight delay to help debounce the reading 

 
if (counter == 0)
       {
       Motordrehzahl = 0;
       analogWrite(PIN7, Motordrehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , HIGH);
       }
       
if (counter >0)
       {
       Motordrehzahl = 140;
       analogWrite(PIN7, Motordrehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);
       }

if (counter >10)
       {
       Motordrehzahl = 150;
       analogWrite(PIN7, Motordrehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);
       }   
if (counter >20)
       {
       Motordrehzahl = 160;
       analogWrite(PIN7, Motordrehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);
       } 
if (counter >30)
       {
       Motordrehzahl = 170;
       analogWrite(PIN7, Motordrehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);
       } 
if (counter >40)
       {
       Motordrehzahl = 180;
       analogWrite(PIN7, Motordrehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);
       }
if (counter >50)
       {
       Motordrehzahl = 190;
       analogWrite(PIN7, Motordrehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);
       }
if (counter >60)
       {
       Motordrehzahl = 200;
       analogWrite(PIN7, Motordrehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);
       }
if (counter >70)
       {
       Motordrehzahl = 210;
       analogWrite(PIN7, Motordrehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);
       }
if (counter >80)
       {
       Motordrehzahl = 220;
       analogWrite(PIN7, Motordrehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);
       }
if (counter >90)
       {
       Motordrehzahl = 230;
       
       analogWrite(PIN7, Motordrehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);
       }
if (counter >99)
       {
       Motordrehzahl = 255;
       analogWrite(PIN7, Motordrehzahl);
       analogWrite(PIN5, 0);
       digitalWrite(STOPLed , LOW);
       }
if (counter >100)
       {
        Anzeigewert = 100;
        counter = 100;
       }

if (counter < -0)
       {
       Motordrehzahl = 140;
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Motordrehzahl);
       digitalWrite(STOPLed , LOW);
       }
if (counter < -10)
       {
       Motordrehzahl = 150;
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Motordrehzahl);
       digitalWrite(STOPLed , LOW);
       }   
if (counter < -20)
       {
       Motordrehzahl = 160;
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Motordrehzahl);
 

       digitalWrite(STOPLed , LOW);
       } 
if (counter < -30)
       {
       Motordrehzahl = 170;
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Motordrehzahl);
 

       digitalWrite(STOPLed , LOW);
       } 
if (counter < -40)
       {
       Motordrehzahl = 180;
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Motordrehzahl);
 

       digitalWrite(STOPLed , LOW);
       }
if (counter < -50)
       {
       Motordrehzahl = 190;
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Motordrehzahl);
 

       digitalWrite(STOPLed , LOW);
       }
if (counter < -60)
       {
       Motordrehzahl = 200;
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Motordrehzahl);
 

       digitalWrite(STOPLed , LOW);
       }
if (counter < -70)
       {
       Motordrehzahl = 210;
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Motordrehzahl);
 

       digitalWrite(STOPLed , LOW);
       }
if (counter < -80)
       {
       Motordrehzahl = 220;
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Motordrehzahl);
 

       digitalWrite(STOPLed , LOW);
       }
if (counter < -90)
       {
       Motordrehzahl = 230;
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Motordrehzahl);
 

       digitalWrite(STOPLed , LOW);
       }
if (counter < -99)
       {
       Motordrehzahl = 255;
       analogWrite(PIN7, 0);
       analogWrite(PIN5, Motordrehzahl);
 

       digitalWrite(STOPLed , LOW);
       } 
if (counter < -100)
       {
        Anzeigewert = -100;
        counter = -100;
       }

}

2.5 Mit der Zahlen-Tastatur die 8-fach Relaiskarte schalten

Verwendetes Material:
1x Arduino MEGA Platine
1x Breadboard
1x Doppel-Tastermodul
1x 8fach Relaismodul 5V
1x Folientastatur aus Elegoo KIT
1x kurzer roter Draht (+5V) 
2x kurzer schwarzer Draht (GND)
1x langer schwarzer Draht (GND)
18x kurze&lange Drähte

Mit der im Kit enthaltenen Zifferntastatur soll nun eine 8-fach Relaiskarte wie bei einer SPS geschalten werden. Durch Drücken der Ziffern 1-8 gehen die Relais an. Durch Drücken der Taste 0 gehen alle Relais gleichzeitig aus. Durch Drücken der Taste A schalten alle Relais gleichzeitig ein.
Mit 2 zusätzlichen Tasten auf dem Breadboard kann Relais1 und Relais2 im "toggle" Mode ein&ausgeschaltet werden. Dies funktioniert leider mit der Folientastatur nicht.

Zusätzlich wurde ein Relais-Test - oder auch Verdrahtungstest- impementiert.
Dieser könnte mit /*     und */ auskommentiert werden und damit nicht mehr aktiv sein.

Die Bibliothek keypad.h muss vorher installiert werden!

Hier der Programmcode:
#include <Keypad.h>
//Hier wird die größe des Keypads definiert
const byte COLS = 4; //4 Spalten
const byte ROWS = 4; //4 Zeilen
//Die Ziffern und Zeichen des Keypads werden eingegeben:
char hexaKeys[ROWS][COLS]={
{'D','#','0','*'},
{'C','9','8','7'},
{'B','6','5','4'},
{'A','3','2','1'}
};

int Relais1 = 6;                    // Der Relais-Ausgang 1
int Relais2 = 7;                    // Der Relais-Ausgang 2
int Relais3 = 8;                    // Der Relais-Ausgang 3
int Relais4 = 9;                    // Der Relais-Ausgang 4
int Relais5 = 10;                    // Der Relais-Ausgang 5
int Relais6 = 11;                    // Der Relais-Ausgang 6
int Relais7 = 12;                    // Der Relais-Ausgang 7
int Relais8 = 13;                    // Der Relais-Ausgang 8

int ledState1 = LOW;     // the current state of LED
int lastButtonState1;    // the previous state of button
int currentButtonState1; // the current state of button
int ledState2 = LOW;     // the current state of LED
int lastButtonState2;    // the previous state of button
int currentButtonState2; // the current state of button

const int BUTTON_PIN1 = 3;           // zusätzliche Taste1
const int BUTTON_PIN2 = 2;           // zusätzliche Taste2

byte colPins[COLS] = {38,40,42,44}; //Definition der Pins für die 4 Spalten
byte rowPins[ROWS] = {46,48,50,52};//Definition der Pins für die 4 Zeilen
char Taste; //Taste ist die Variable für die jeweils gedrückte Taste.
Keypad Tastenfeld = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS); //Das Keypad kann absofort mit "Tastenfeld" angesprochen werden

void setup() 
{
Serial.begin(9600);
pinMode(BUTTON_PIN1, INPUT_PULLUP);                  // Als Eingang mit internem Pull-Up definiert
pinMode(BUTTON_PIN2, INPUT_PULLUP);                  // Als Eingang mit internem Pull-Up definiert

currentButtonState1 = digitalRead(BUTTON_PIN1);      //Befehl zum Einlesen der Tasten
currentButtonState2 = digitalRead(BUTTON_PIN2);

pinMode(Relais1, OUTPUT);                             //Pin-Deklaration als Ausgang
pinMode(Relais2, OUTPUT);                             //Pin-Deklaration als Ausgang
pinMode(Relais3, OUTPUT);                             //Pin-Deklaration als Ausgang
pinMode(Relais4, OUTPUT);                             //Pin-Deklaration als Ausgang
pinMode(Relais5, OUTPUT);                             //Pin-Deklaration als Ausgang
pinMode(Relais6, OUTPUT);                             //Pin-Deklaration als Ausgang
pinMode(Relais7, OUTPUT);                             //Pin-Deklaration als Ausgang
pinMode(Relais8, OUTPUT);                             //Pin-Deklaration als Ausgang
digitalWrite(Relais1, HIGH);                       //alle Relaisausgaenge High
digitalWrite(Relais2, HIGH);                       
digitalWrite(Relais3, HIGH);                       
digitalWrite(Relais4, HIGH);                       
digitalWrite(Relais5, HIGH);                       
digitalWrite(Relais6, HIGH);                       
digitalWrite(Relais7, HIGH);                       
digitalWrite(Relais8, HIGH);                       

// Testprogramm ob alle Relais schalten und die Verkabelung stimmt
  delay(100);
  digitalWrite(Relais1, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100);
  digitalWrite(Relais2, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100);
  digitalWrite(Relais3, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100);
  digitalWrite(Relais4, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100);
  digitalWrite(Relais5, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100);
  digitalWrite(Relais6, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100);
  digitalWrite(Relais7, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100);
  digitalWrite(Relais8, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(1000);
  digitalWrite(Relais7, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100);
  digitalWrite(Relais6, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100);
  digitalWrite(Relais5, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100);
  digitalWrite(Relais4, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100);
  digitalWrite(Relais3, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100); 
  digitalWrite(Relais2, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100); 
  digitalWrite(Relais1, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
  delay(100);
}

void loop() 
{
Taste = Tastenfeld.getKey(); //Mit Unter der Variablen pressedKey entspricht der gedrückten Taste
if (Taste) 
 { //Wenn eine Taste gedrückt wurde
 Serial.print("Die Taste ");
 Serial.print(Taste);
 Serial.print(" wurde gedrueckt");
 Serial.println(); //Teile uns am Serial Monitor die gedrückte Taste mit
}
if (Taste=='1'){
Serial.println("Relais 1");
digitalWrite(Relais1, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
delay(50);
}
if (Taste=='2'){
Serial.println("Relais 2");
digitalWrite(Relais2, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
delay(50);
}
if (Taste=='3'){
Serial.println("Relais 3");
digitalWrite(Relais3, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
delay(50);
}
if (Taste=='4'){
Serial.println("Relais 4");
digitalWrite(Relais4, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
delay(50);
}
if (Taste=='5'){
Serial.println("Relais 5");
digitalWrite(Relais5, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
delay(50);
}
if (Taste=='6'){
Serial.println("Relais 6");
digitalWrite(Relais6, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
delay(50);
}
if (Taste=='7'){
Serial.println("Relais 7");
digitalWrite(Relais7, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
delay(50);
}
if (Taste=='8'){
Serial.println("Relais 8");
digitalWrite(Relais8, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
delay(50);
}
if (Taste=='0'){
Serial.println("alle löschen");
digitalWrite(Relais1, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais2, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais3, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais4, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais5, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais6, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais7, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais8, HIGH);                       //Wenn Taste gegen GND, Relaisausgang High
delay(50);
}
if (Taste=='A'){
Serial.println("alle ein");
digitalWrite(Relais1, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais2, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais3, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais4, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais5, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais6, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais7, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
digitalWrite(Relais8, LOW);                       //Wenn Taste gegen GND, Relaisausgang High
delay(50);
}
  lastButtonState1    = currentButtonState1;      // save the last state
  currentButtonState1 = digitalRead(BUTTON_PIN1); // read new state
  delay(50);
if((lastButtonState1 == HIGH) && (currentButtonState1 == LOW)) 
  {
  ledState1 = !ledState1;// toggle ledstate1
  digitalWrite(Relais1, ledState1); 
  Serial.println(ledState1);
  Serial.println("The rel 1 is on/off");
    delay(5);
  }
  lastButtonState2    = currentButtonState2;      // save the last state
  currentButtonState2 = digitalRead(BUTTON_PIN2); // read new state
  Serial.println("Taste 2 gedrückt" );
  Serial.println(currentButtonState2);
  Serial.println("Tastatur 2 gedrückt" );
  Serial.println(Taste);
  delay(50);

if((lastButtonState2) == HIGH && (currentButtonState2 == LOW)) 
  {
  ledState2 = !ledState2;// toggle ledstate2
  // control LED arccoding to the toggled state
  digitalWrite(Relais2, ledState2); 
  Serial.println(ledState2);
  Serial.println("The rel 2 is on/off");
  delay(100);
  }
}

Nun kann zum ersten Mal der Serial Monitor sinnvoll genutzt werden. 
Zu öffnen über Tools->Serial Monitor
Auf diesem Ausgabetool  kann man mit den Befehlen  

Serial.println("bla bla");  und  

Serial.print("bla bla");   Text ausgeben.
Man kann auch Variablen ausgeben - z.B. Serial.print(Taste);
Vor dem Start sollte in der void setup-Routine Serial.begin(9600); deklariert werden. Dies startet die Kommunikation mit 9600kboud/Sek.

Mit jedem Tastendruck wird nun protokolliert.

2.6 Automatische Schiebetür mit Ultraschallsensor und Servomotor

Mit dem im Kit enthaltenen Ultraschallsensor, der RGB Led und dem Servomotor lässt sich eine automatische Schiebetürsteuerung realisieren. Nähert man sich dem Sensor geht die Schiebetür auf (Servo Bewegung AUF). Nach einstellbaren 3 Sekunden schließt sich die Tür automatisch (Servo Bewegung ZU), außer der Ultraschallsensor registriert noch immer einen Gegenstand "in der Tür".

Hier der Programmcode:
#include <Servo.h>

const int trigPin = 9;

const int echoPin = 10;

const int servoPin = 23;

const int redPin = 5;

const int greenPin = 4;


Servo myServo;


long duration;

int distance;

bool isDetected = false;

unsigned long detectionTime = 0;

bool servoWaiting = false;


void setup() {

  pinMode(trigPin, OUTPUT);

  pinMode(echoPin, INPUT);

  pinMode(redPin, OUTPUT);

  pinMode(greenPin, OUTPUT);

  

  myServo.attach(servoPin);

  myServo.write(0);  // Startposition


  setColor(true, false); // Anfang: rot


  Serial.begin(9600);

}


void loop() {

  // Abstand messen

  digitalWrite(trigPin, LOW);

  delayMicroseconds(2);

  

  digitalWrite(trigPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);

  

  duration = pulseIn(echoPin, HIGH);

  distance = duration * 0.034 / 2;


  Serial.print("Entfernung: ");

  Serial.print(distance);

  Serial.println(" cm");


  if (distance > 0 && distance < 20 && !isDetected && !servoWaiting) {

    // Objekt erkannt -> Servo drehen und 5 Sekunden warten

    myServo.write(180);

    setColor(false, true); // grün an

    isDetected = true;

    servoWaiting = true;

    detectionTime = millis();  // Startzeit merken

  }

// 3 Sekunden Wartezeit nach Drehung

  if (servoWaiting && (millis() - detectionTime >= 3000)) {

    servoWaiting = false;

  }

// Wenn kein Objekt mehr erkannt wird und Wartezeit vorbei ist

  if ((distance >= 20 || distance == 0) && isDetected && !servoWaiting) {

    myServo.write(0);

    setColor(true, false); // rot an

    isDetected = false;

  }

delay(100);

}

// Hilfsfunktion zur Farbsteuerung der RGB-LED

void setColor(bool redOn, bool greenOn) {

  digitalWrite(redPin, redOn ? HIGH : LOW);

  digitalWrite(greenPin, greenOn ? HIGH : LOW);

}