Lektion 20 – Mein digitales Haustier 2/2
Lass uns jetzt unser digitales Haustier programmieren. Ein bisschen Arbeit steht uns noch bevor.
Wir müssen unserem digitalen Haustier drei Sachen beibringen. Es soll mit den Augen (also den LEDs) zwinkern können. Es soll schnurren, wenn es gestreichelt wird. Und es soll meckern, wenn man es nicht beachtet. Fangen wir mit dem Augenzwinkern an.
Augenzwinkern
Das Augenzwinkern ist ja eigentlich nichts anderes, als das Blinken einer LED, wie wir es am Anfang unseres Kurses besprochen haben. Beide LEDs sind jeweils an einem eigenen Pin angeschlossen, sodass wir die Befehle pinMode und digitalWrite doppelt brauchen. Der Code könnte am einfachsten so aussehen:
int ledPin1 = 10; int ledPin2 = 11; void setup() { pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); } void loop() { digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, HIGH); delay(5000); digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); delay(50); }
Jetzt blinken die LEDs natürlich immer in der gleichen Geschwindigkeit. Das ist leider etwas langsam. Wenn wir das Augenzwinkern per Zufall auslösen könnten, wäre das bestimmt spannender. Zum Glück gibt es einen Zufalls-Befehl. Er heißt random().
Info: random();
Der random(maximal)-Befehl erzeugt eine Zufallszahl zwischen 0 und der als Argument übergebenen Zahl maximal. Dabei wird maximal aber nicht erreicht. Wenn man also schreibt random(5), dann können die zufälligen Zahlen nur 0, 1, 2, 3 und 4 sein.
Wenn wir uns eine zufällige Zahl zwischen 0 und 500 ausgeben lassen, könnten wir jetzt sagen, dass die Augen immer dann blinzeln (LED aus) sollen, wenn diese zufällige Zahl gleich eins ist. Das passiert ja in zufälligen, also unregelmäßigen Abständen. Jetzt müssen wir noch am Ende unseres Programmes ein kleines delay einbauen, damit die zufälligen Zahlen nicht einfach so schnell hintereinander generiert werden, dass die Augen ständig blinken.
int ledPin1 = 10; int ledPin2 = 11; void setup() { pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); } void loop() { // LEDs für Augen einschalten digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, HIGH); // Augenzwinkern if (random(500)==1){ digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); delay(50); } delay(10); }
Schnurren
Das digitale Haustier soll schnurren, wenn es gestreichelt wird. Um festzustellen, ob es gestreichelt wird, werden wir einen Lichtsensor in das digitale Haustier einbauen. Wenn du es streichelst, verdeckt deine Hand einfallendes Licht und das können wir mit dem Sensor registrieren.
Wenn das Arduino-Board startet, müssen wir herausfinden, wie viel Licht im digitalen Haustier ist. Den Wert lesen wir einfach in die Variable lichtNormal mit lichtNormal=analogRead(sensorPin); aus.
Die Variable sensorSchwelle sagt, ab welcher Helligkeitsdifferenz das Haustier schnurren soll. Das passiert mit if(analogRead(sensorPin)>lichtNormal+sensorSchwelle){…}. Es kann sein, dass du den Wert noch anpassen musst. Probiere einfach ein paar andere Werte, wenn es nicht so gut klappt mit dem Schnurren.
Hier ist der Code (ohne Augenzwinkern):
int sensorPin = 0; int sensorSchwelle = 20; int lichtNormal; void setup() { lichtNormal = analogRead(sensorPin); } void loop() { // Schnurren if (analogRead(sensorPin)>lichtNormal+sensorSchwelle){ tone(speakerPin,0.001); } else { noTone(speakerPin); } delay(10); }
Meckern
Damit das digitale Haustier nun auch auf sich aufmerksam machen kann, soll es eine kleine Melodie abspielen, wenn es nicht beachtet wird. Das machen wir wie bei dem Augenzwinkern mit dem random-Befehl. Allerdings soll das nur passieren, wenn man es gerade nicht streichelt. Wir müssen also zwei Bedingungen verknüpfen. Das geht in der if-Abfrage, indem wir das doppelte & Zeichen verwenden (&&).
int sensorPin = 0; int sensorSchwelle = 20; int speakerPin = 9; int lichtNormal; void setup() { lichtNormal = analogRead(sensorPin); } void loop() { // Meckern if ((random(10000)==1)&&(analogRead(sensorPin)<lichtNormal+100)){ tone(speakerPin,1200); delay(100); tone(speakerPin,800); delay(200); tone(speakerPin,1000); delay(200); tone(speakerPin,1200); delay(100); } delay(10); }
Ob dein digitales Haustier meckern können muss, kannst du natürlich selbst entscheiden.
Der komplette Code für dein digitales Haustier sieht dann so aus:
int ledPin1 = 10; int ledPin2 = 11; int sensorPin = 0; int sensorSchwelle = 20; int speakerPin = 9; int lichtNormal; void setup() { pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); lichtNormal = analogRead(sensorPin); } void loop() { // LEDs für Augen einschalten digitalWrite(ledPin1, HIGH); digitalWrite(ledPin2, HIGH); // Augenzwinkern if (random(500)==1){ digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, LOW); delay(50); } // Schnurren if (analogRead(sensorPin)>lichtNormal+sensorSchwelle){ tone(speakerPin,0.001); } else { noTone(speakerPin); } // Meckern if ((random(10000)==1)&&(analogRead(sensorPin)<lichtNormal+100)){ tone(speakerPin,1200); delay(100); tone(speakerPin,800); delay(200); tone(speakerPin,1000); delay(200); tone(speakerPin,1200); delay(100); } delay(10); }
Das war jetzt wirklich schwierig. Lass uns basteln!
Lade Dir die Bastelbogen-Datei herunter: Download
Anleitung
Herzlichen Glückwunsch!
Du hast das Ende unseres Kurses erreicht. Ich hoffe, es hat Dir Spaß gemacht und dass Du weiter am Ball bleibst. Es gibt noch so viel zu entdecken. Hier geht es bald mit neuen Tutorials weiter und bis dahin alles Gute!
Dein StartHardware.org-Team
Patrick Walther 30. September 2015
Hallo,
bin heute auf ihre Webseite gestoßen. Find diese sehr gut gelungen
Machen Sie weiter so.
Jedoch habe ich eine Frage. Haben Sie mit der Split Funktion gearbeitet?
Würde mich über eine Rückmeldung freuen.
Mit freundlichen Grüßen
Patrick Walther
Stefan Hermann 12. Oktober 2015
Hallo Patrick,
vielen Dank für die netten Worte. Mit der Split-Funktion habe ich in den Tutorials eigentlich nicht gearbeitet. Meinst Du in diesem Beispiel?
Liebe Grüße
Stefan