DIY-MedTech Arduino Basics - Team Tamberg

From Hackteria Wiki
Jump to: navigation, search

Arduino Basics mit @tamberg im Rahmen von Medizintechnik DIY

Arduino Tutorial

http://www.tamberg.org/chopen/2017/LoRaWANIoTWorkshop.pdf

  • Arduino Programmierumgebung (IDE) einrichten p.12, 13
  • Text schicken (Serial Output) vom Arduino zum Computer p.16, 17
  • LED blinken (Digital Output), p.24, 25
  • Schalter lesen (Digital Input), p.27, 28
  • LED schalten, p.29
  • Licht messen (Analog Input), p.31, 32
  • Servo steuern (PWM Output), p.36, 37
  • Servo mit Licht steuern, p.38

Vertiefung: LED schlauer schalten

Wie kann man eine LED Lampe so schalten, dass sie beim ersten Knopfdruck an geht, und beim nächsten wieder aus?

Versuch I: LED schalten mit Counter

Mit einem Counter (Zähler) können wir schauen, wie oft der Knopf gedrückt wurde.

Wenn der Counter ungerade ist, schalten wir die LED ein, wenn er gerade ist, schalten wir sie wieder aus.

int switchPin = 2;
int ledPin = 13;
int counter = 0;

void setup () {
    Serial.begin(9600);
    pinMode(switchPin, INPUT);
    pinMode(ledPin, OUTPUT);
}

void loop () {
    int switchValue = digitalRead(switchPin);
    Serial.println(counter);
    if (switchValue == HIGH) {
        while (switchValue == HIGH) {
            switchValue = digitalRead(switchPin);
        }
        counter++;
        if (counter % 2 == 1) { // odd
            digitalWrite(ledPin, HIGH);
        } else { // even
            digitalWrite(ledPin, LOW);  
        }
    }
}

Diese Lösung funktioniert zwar, aber man weiss nicht was passiert, wenn die Variable counter zu gross wird.

Ein solcher "overflow" (Überfliessen eines Werts) hat zur Explosion der Ariane 5 Rakete geführt:

http://sunnyday.mit.edu/accidents/Ariane5accidentreport.html

https://people.cs.clemson.edu/~steve/Spiro/arianesiam.htm

Versuch II: LED schalten mit State Machine

Mit einer State Machine (Zustandsmaschine) kann man sich den Zustand (hier s0, s1, s2, s3) merken: LEDSwitchStateMachine.jpg

  • Zustand s0: bei Switch Input LOW => bleibe in Zustand s0, bei HIGH => gehe zu Zustand s1
  • Zustand s1: bei Switch Input HIGH => bleibe in Zustand s1, bei LOW => gehe zu Zustand s2; schalte LED ein
  • Zustand s2: bei Switch Input LOW => bleibe in Zustand s2, bei HIGH => gehe zu Zustand s3
  • Zustand s3: bei Switch Input HIGH => bleibe in Zustand s3, bei LOW => gehe zu Zustand s0; schalte LED aus

Im Programm benutzen wir eine if (...) {...} else if (...) {...} Bedingung, um die State Machine zu bauen.

Den aktuellen Zustand speichern wir in der Variable state, Übergänge in denselben Zustand, z.B. s2 => s2 lassen wir einfach weg.

int switchPin = 2;
int ledPin = 13;
int state = 0;

void setup () {
    Serial.begin(9600);
    pinMode(switchPin, INPUT);
    pinMode(ledPin, OUTPUT);
}

void loop () {
    int switchValue = digitalRead(switchPin);
    Serial.println(state);
    if ((state == 0) && (switchValue == HIGH)) {
        state = 1;
    } else if ((state == 1) && (switchValue == LOW)) {
        digitalWrite(ledPin, HIGH);
        state = 2;
    } else if ((state == 2) && (switchValue == HIGH)) {
        state = 3;
    } else if ((state == 3) && (switchValue == LOW)) {
        digitalWrite(ledPin, LOW);
        state = 0;
    }
}