Digitale Ausgänge

Ein digitaler Ausgang (Pin) kann entweder als HIGH oder LOW geschalten werden, also entweder an oder aus. Ist eine LED an den Pin angeschlossen, so leuchtet diese bei HIGH bzw ist aus, falls der Pin auf LOW geschalten ist.

Wichtig sind hierzu folgende Punkte:

  1. Die Pinnummer wird in einer Variablen abgespeichert, damit das Programm besser lesbar wird und bei einer Änderung der Pinnummer nur die Variable und nicht das ganze Programm geändert wird.
  2. Meist wird die Leuchtdauer mit Hilfe von delay() definiert. Dies ist aber bei Anwendungen nicht akzeptabel, falls auf Einflüsse von außen adhoc reagiert werden muss.
  3. Zur besseren Lesbarkeit und zur logischen Strukturierung sollen wiederkehrende oder in sich geschlossenen Probleme als Methode programmiert werden.

Beispielprogramm

/*
* Blinkprogramm
*/

int
led = 3; // die LED ist am Pin Nummer 3 angeschlossen void setup() { // wird einmal zu Beginn aufgerufen  pinMode(led, OUTPUT); // der Pin wird als Ausgang definiert } void loop() { // Schleife wird permanent wiederholt  digitalWrite(led, HIGH);   // schaltet die led an (HIGH)  delay(1000);                       // eine Sekunde warten  digitalWrite(led, LOW);    // schaltet die led aus (LOW)  delay(1000);                       // eine Sekunde warten }

Vorwiderstand einer LED

Eine LED verträgt im Normalfall eine Stromstärke von ca. 20 mA.  Wenn die LED direkt an den 5 V des Arduino angeschlossen werden, würde ein größerer Strom fließen. Die LED würde früher (oder gleich) kaputt gehen. Deshalb muss der Strom verringert werden. Dies erreicht man dadurch, dass die Spannung von 5V auf 2V verringert wird. Dies macht man mit Hilfe eines Widerstandes.

Es gilt: Aus $U = R \cdot I $ bzw. $R = {U \over I} = {{5V -2V}\over {0,020 A}} =150 \Omega$. Man muss also einen Widerstand von ca. $150 \Omega$ mit der LED in Reihe schalten. Wir benutzen im Unterricht einen Widerstand von 330$\Omega$.

Farbcode von Widerständen

Der Farbcode auf Widerständen besteht aus vier Farbringen. Der letzte (4.) Ring einen etwas größeren Abstand:

Farbe 1. Ring 2. Ring 3. Ring 4. Ring  
schwarz - 0 - -  
braun 1 1 x10 ± 1%  
rot 2 2 x100 ± 2%  
orange 3 3 x1000 -  
gelb 4 4 x10.000 -  
grün 5 5 x100.000 ± 0,5%  
blau 6 6 x1000.000 -  
lila 7 7 - -  
grau 8 8 - -  
weiß 9 9 - -  
gold - - x 0,1 ± 5%  
silber - - x 0,01 ± 10%  

Die ersten zwei Ringe geben jeweils Ziffern an. Der 3. Ring ist ein Multiplikator.
Der 4. Ring gibt die Toleranz an.

  • Der Widerstand mit dem Farbcode orange-orange-braun gold hat also 330$\Omega$ und ist zu 5% genau.
  • $10 k\Omega$ hat den Farbcode: braun-schwarz-orange.

Verkehrsampel

Die Ampel soll ganz normal von Rot über Gelb nach Grün schalten.

Hinweise

Im Bild gelten folgende Anschlüsse:
  • rote LED am Pin Nummer 3
  • gelbe LED am Pin Nummer 6
  • grüne LED  am Pin Nummer 5

Die LEDs sind mit einem 330Ω - Schutzwiderstand abgesichert.
Der Schalter ist noch ohne Bedeutung.

 
  Verkehrsampel (Lösung einfach mit delay())

Verkehrsampel (Lösung einfach mit delay())

int gelb =6;
int gruen = 5;
int rot =3;

void setup() {
  // put your setup code here, to run once:

   pinMode(rot, OUTPUT);
  pinMode(gelb, OUTPUT);
  pinMode(gruen, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
 digitalWrite(rot, HIGH);   // turn the LED on (HIGH is the voltage level)
 digitalWrite(gelb,LOW);   // turn the LED on (HIGH is the voltage level)
 digitalWrite(gruen, LOW);   // turn the LED on (HIGH is the voltage level)
  delay(1000);

digitalWrite(rot, LOW);   // turn the LED on (HIGH is the voltage level)
 digitalWrite(gelb,HIGH);   // turn the LED on (HIGH is the voltage level)
 digitalWrite(gruen, LOW);   // turn the LED on (HIGH is the voltage level)
  delay(1000);


digitalWrite(rot, LOW);   // turn the LED on (HIGH is the voltage level)
 digitalWrite(gelb,LOW);   // turn the LED on (HIGH is the voltage level)
 digitalWrite(gruen, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);

}

  Verkehrsampel (Lösung mit einer Methode)

Verkehrsampel (Lösung mit einer Methode)

int gelb = 6;
int gruen = 5;
int rot = 3;

void setup() {
  pinMode(rot, OUTPUT);
  pinMode(gelb, OUTPUT);
  pinMode(gruen, OUTPUT);
}

void loop() {
  ampelschaltung(1, 0, 0);
  delay(1000);
  ampelschaltung(1, 1, 0);
  delay(500);
  ampelschaltung(0, 0, 1);
  delay(1000);
  ampelschaltung(0, 1, 0);
  delay(1000);
}

void ampelschaltung(boolean ro, boolean ge, boolean gr) {
  if (ro == 1) { // schaltet rot 
    digitalWrite(rot, HIGH);
  } else {
    digitalWrite(rot, LOW);
  }
  if (ge == 1) {// schaltet gelb 
    digitalWrite(gelb, HIGH);
  } else {
    digitalWrite(gelb, LOW);
  }
  if (gr == 1) {// schaltet gruen 
    digitalWrite(gruen, HIGH);
  } else {
    digitalWrite(gruen, LOW);
  }
} // ende void ampelschaltung

  Verkehrsampel (Lösung ohne Delay)

Verkehrsampel (Lösung ohne Delay)

int gelb = 6;
int gruen = 5;
int rot = 3;
unsigned long start;

void setup() {
  pinMode(rot, OUTPUT);
  pinMode(gelb, OUTPUT);
  pinMode(gruen, OUTPUT);
  start = millis();
}

void loop() {
  
  if((millis()-start)<1000){
  ampelschaltung(1, 0, 0);
  }
  if((millis()-start)>1000 && (millis()-start)<2000){
  ampelschaltung(1, 1, 0);
  }
  if((millis()-start)>2000 && (millis()-start)<3000){
  ampelschaltung(0, 0, 1);
  }
  if((millis()-start)>3000 && (millis()-start)<4000){
  ampelschaltung(0, 1, 0);
  }
  if(millis()-start>4000){
    start=millis();
  }
}

void ampelschaltung(boolean ro, boolean ge, boolean gr) {
  if (ro == 1) { // schaltet rot 
    digitalWrite(rot, HIGH);
  } else {
    digitalWrite(rot, LOW);
  }
  if (ge == 1) {// schaltet gelb 
    digitalWrite(gelb, HIGH);
  } else {
    digitalWrite(gelb, LOW);
  }
  if (gr == 1) {// schaltet gruen 
    digitalWrite(gruen, HIGH);
  } else {
    digitalWrite(gruen, LOW);
  }
} // ende void ampelschaltung

Ampelschaltung mit Millis()