Arbeitsblatt 1

Aufgabe 1 und 2: Vorbereiten der Hardware und Software

Hardware


Um die weiteren Aufgaben zu dokumentieren, habe ich mir ein kleines „Arduino-Fotostudio“ gebaut. Hierzu habe ich die 3D-Druck-Überwachungswebcam zweckentfremded und an meinem Mikrofonstand befestigt.

Um einen sicheren Transport der Hardware von Bern auf den Ganzenberg zu gewährleisten, bewahre ich alle losen Teile in einer raaco Sortierbox auf.

Software

Softwareseitig habe ich mich für die offizielle Arduino IDE entschieden. Die Codefiles werden via OneDrive synchronisiert, sodass ich von überall darauf zugreifen kann.

Simpler Blinker

Versuchsaufbau

Der Versuchsaufbau hier ist sehr simpel: Ich benutze die im Arduino eingebaute LED, welche über PIN 13 angesteuert werden kann. Ebenso simpel ist der zugehörige Code:

Code

blinker.ino
// Basic Blinker
// 2019, Fabian Flückiger
 
// Definition der benötigten Variablen
int ledPin = 13;
 
void setup() {
  // Setupcode, wird einmal ausgeführt.
  pinMode(ledPin, OUTPUT);
}
 
void loop() {
  // Loop
  digitalWrite(ledPin, HIGH);
  delay(500);
  digitalWrite(ledPin, LOW);
  delay(500);
 
 
}

Als erstes wird immer die Setup void einmal ausgeführt. Sie eignet sich also perfekt zum Initialisieren von Variablen und ausführen von anderem Code, welcher beim Start des Programms benötigt wird. Die Ausführung der Loop-Void wird anschliessend unendlich lange wiederholt. In dieser spielt sich also der Blinkvorgang ab: Als erstes wird die LED eingeschaltet, 500 Millisekunden gewartet, die LED ausgeschaltet und erneut 500 Millisekunden gewartet.

Aufgabe 3: Blinkende LEDs

Versuchsaufbau

Da der Arduino auf Pin 13 bereits eine ansteuerbare LED besitzt (Siehe obere Aufgabe), habe ich auf den Aufbau zweier externer LEDs verzichtet, und stattdessen nur eine externe LED aufgebaut:

Auf dem oberen Bild leuchtet die linke LED, auf dem unteren die rechte. Als Vorwiderstand habe ich mich für einen 200 Ohm Widerstand entschieden.

Code

blinker-2.ino
// AB 01, Aufgabe 3
// 2019, Fabian Flückiger
 
// Definition der benötigten Variablen
int ledPin1 = 7;
int ledPin2 = 13;
int rhythm = 5; // Blinkrhythmus in Sekunden
 
void setup() {
  // Setupcode, wird einmal ausgeführt.
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
 
}
 
void loop() {
  // Loop
 
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, LOW);
  wait(rhythm);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, HIGH);
  wait(rhythm);
 
}
 
void wait(int seconds) {
  delay(seconds * 1000);
}

Ich habe das Programm noch ein kleinwenig erweitert, sodass der Rhythmus in Sekunden eingegeben werden kann, und nicht in Millisekunden eingegeben werden muss.

Aufgabe 4: LED per Tastendruck aktivieren

Versuchsaufbau


Der Versuchsaufbau besteht aus dem aus der Aufgabe 3 + zusätzlich zwei Buttons, welche jeweils an einen Input-Pin angeschlossen werden. Auf dem oberen Bild ist die Programmausführung ohne Knopfdruck, unten umgehend nach dem Drücken des Buttons zu sehen. Leider ist der Pull-Down Widerstand aufgrund der Kameraqualität fast nicht zu sehen.

Code

button_lite.ino
// Basic Button
// 2019, Fabian Flückiger
 
// Definition der benötigten Variablen
int buttonPin = 2;
int ledPin = 7;
 
 
void setup() {
  // Setupcode, wird einmal ausgeführt.
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
}
 
void loop() {
  // Loop
  // Falls Knopf gedrückt:
  if (digitalRead(buttonPin) == HIGH) {
     // LED an
     digitalWrite(ledPin, HIGH);
     // 5 Sekunden warten
     delay(5000);
  }
  // Falls Knopf nicht (mehr) gedrückt: 
  else {
    // LED aus
    digitalWrite(ledPin, LOW);
  }
}

Aufgabe 4.1: 2 Taster

Versuchsaufbau

Dieser unterscheidet sich in meinem Fall nicht zum Aufbau der Aufgabe 4.

Code a

task4.1a.ino
// 4.1 a
// 2019, Fabian Flückiger
 
// Definition der benötigten Variablen
int buttonPin1 = 2;
int buttonPin2 = 3;
int ledPin1 = 13;
int ledPin2 = 7;
 
 
void setup() {
  // Setupcode, wird einmal ausgeführt.
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
}
 
void loop() {
  // Loop
  // Wenn der erste Button gedrückt wird:
  if (digitalRead(buttonPin1) == HIGH) {
    // soll die erste LED leuchten
    digitalWrite(ledPin1, HIGH);
  }
  // Wenn der zweite Button gedrückt wird:
  else if (digitalRead(buttonPin2) == HIGH){
    // soll die zweite LED leuchten
    digitalWrite(ledPin2, HIGH);
  }
  else {
    // Wird nichts gedrückt, soll nichts leuchten.
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
  }
}

Code b

task4.1b.ino
// 4.1 b
// 2019, Fabian Flückiger
 
// Definition der benötigten Variablen
int buttonPin1 = 2;
int buttonPin2 = 3;
int ledPin1 = 13;
int ledPin2 = 7;
 
 
void setup() {
  // Setupcode, wird einmal ausgeführt.
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
}
 
void loop() {
  // Loop
  // Wenn der erste Button gedrückt wird:
  if (digitalRead(buttonPin1) == HIGH) {
    // sollen beide LEDs eingeschaltet werden
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, HIGH);
  }
  // Wenn der zweite Button gedrückt wird:
  else if (digitalRead(buttonPin2) == HIGH){
    // sollen beide LEDs ausgeschaltet werden.
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, LOW);
  }
}

Code c

task4.1c.ino
// 4.1 c
// 2019, Fabian Flückiger
 
// Definition der benötigten Variablen
int buttonPin1 = 2;
int buttonPin2 = 3;
int ledPin1 = 13;
int ledPin2 = 7;
int counter = 0;
 
 
void setup() {
  // Setupcode, wird einmal ausgeführt.
  pinMode(buttonPin1, INPUT);
  pinMode(buttonPin2, INPUT);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  digitalWrite(ledPin1, LOW);
  digitalWrite(ledPin2, LOW);
  Serial.begin(9600);
  }
 
void loop() {
  // Loop
  // Wenn der erste Button gedrückt wird:
  Serial.println(counter);
  if (digitalRead(buttonPin1) == HIGH) {
    // wird die Variable counter um 1 erhöht.
    counter++;
    // Da es nur 3 Zustände gibt, muss der Counter bei der Erhöhung auf 4 auf 1 zurückgsetzt werden.
    if (counter == 4){
      counter = 1;
      }
 
  }
  switch (counter) {
    case 1:
      digitalWrite(ledPin1, HIGH);
      digitalWrite(ledPin2, LOW);
      break;
    case 2:
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, HIGH);
      break;
    case 3:
      digitalWrite(ledPin2, HIGH);
      digitalWrite(ledPin1, HIGH);
      break;
  }
}

Aufgabe 5: Automatisierung im Alltag

Als verfechter von SmartHome nutze ich täglich zahlreiche Automatisierungen. Hier zwei meiner Favoriten:

  • Anwesenheitserkennung: Mein Zuhause erkennt anhand von verschiedenen Faktoren meine Anwesenheit. Ist z.B. mein Smartphone nicht mehr mit dem WLAN verbunden und ich verlasse einen gewissen Radius, werden alle Lichter ausgeschaltet. In Zukunft wird dies zudem die Reinigung der Räumlichkeiten durch einen Staubsaugerroboter auslösen. (Sensor: UniFi AP Home Assistant Integration, Aktoren: Philipps Hue Lichter, Roomba Staubsaugerroboter)
  • Good-Night Mode: Drücke ich am Abend einen Knopf auf meinem Nachttisch, schliessen sich automatisch meine Verdunklungsrollos, die Lichter in der Wohnung werden ausgeschaltet und der Computer heruntergefahren. Sollte sich im Geschirrspüler schmutziges Geschirr befinden, wird dieser eingeschaltet. (Sensor: Flic2 Button, Aktoren: Philipps Hue Lichter, Windows, MyStrom-Plug (Relais), Miele Geschirrspüler)

Aufgabe 6: 2 Sensoren und Aktoren

Hierzu habe ich meine Wohnung nach Aktoren und deren Sensoren abgesucht:

Beispiel 1

Der erste Sensor: Ein Bewegungsmelder. In diesem Fall ein Philipps Hue Outdoor Motion Sensor, welcher vor meiner Haustüre Wache hält.

Der erste Aktor: Die Lampe, welche vom Bewegungsmelder gesteuert wird. In diesem Fall im Oldtimer-Gehäuse.

Beispiel 2

Der wohl häufigst zu findende Sensor der Welt: Ein Knopf. Hier in doppelter Ausführung, mit Knopfbatterie und ZigBee ausgestattet. Auch bekannt als Fernbedienung, made by IKEA.

Der zugehörige Aktor: meine IKEA-Verdunklungsrollos:

Aufgabe 7: Lichtsensor

Versuchsaufbau


Oben: Sensor mit direkter Lichtquelle Unten: Sensor durch Papier verdeckt

Code

lightsensor.ino
// Lightsensor
// 2019, Fabian Flückiger
 
// Definition der benötigten Variablen
int ledPin = 7;
int sensorPin = A0;
 
void setup() {
  // Setupcode, wird einmal ausgeführt.
  pinMode(ledPin, OUTPUT);
  pinMode(sensorPin, INPUT);
 
}
 
void loop() {
  // Loop
  if(analogRead(sensorPin) >= 100) {
    digitalWrite(ledPin, HIGH);
    }
  else {
    digitalWrite(ledPin, LOW);
  }
}

Nach einer kurzen Analyse mithilfe des Serial-Monitors, habe ich mich entschieden, alle analogen Werte des Lichtsensors unter 100 als „dunkel“, alle grösser oder gleich 100 als „hell“ zu werten.

Lessons learned

Da ich an der Gibb bereits das Arduino-Modul besucht habe, war dieses Arbeitsblatt primär eine Repetition.