DIY-MedTech Arduino Basics - Team Tamberg

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:
 * 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  Bedingung, um die State Machine zu bauen.

Den aktuellen Zustand speichern wir in der Variable, Ü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; } } Category:MedTech-DIY