Abo
  • Services:
Anzeige
Das verkabelte Touchboard
Das verkabelte Touchboard (Bild: Fabian Hamacher/Golem.de)

Musik abspielen

Das eigentliche Programm ist nicht weiter kompliziert. In einer Schleife werden die Drehbuchzeilen abgearbeitet, und abhängig vom Zustand wird entweder eine MP3-Datei abgespielt oder auf eine Sensoreneingabe gewartet:

  1. void loop() {
  2.  
  3. if(STATE_TOUCH == loopState) {
  4. waitForTouch();
  5. } else {
  6. playMp3();
  7. }
  8.  
  9. }

Anzeige

Die playMp3()-Funktion ist dank der MP3-Bibliothek (SFEMP3Shield) bemerkenswert einfach:

  1. void playMp3() {
  2.  
  3. while(MP3player.isPlaying()) {}
  4.  
  5. MP3player.playTrack(script[currentline].file);
  6.  
  7. setLeds();
  8. delay(script[currentline].delay);
  9. incrementScript();
  10.  
  11. }

Am Anfang erfolgt eine Prüfung, ob bereits eine Datei abgespielt wird. Wenn ja, ist die weitere Programmausführung erst einmal blockiert. Wenn nicht beziehungsweise nicht mehr, wird die im Drehbuchskript vermerkte Datei abgespielt. Da das Abspielen der MP3-Datei im Hintergrund abläuft und die Programmausführung nicht blockiert, wird über setLeds() gleichzeitig der Zustand der LEDs entsprechend gesetzt. Zum Schluss wird noch gewartet, wenn das Drehbuch dies erzwingt, und danach die nächste Drehbuchzeile aktiviert.

Auf die Sensoren warten

Die waitForTouch()-Funktion ist etwas länger, aber nur wenig. Die verwendete Bibliothek MPR121 reduziert den Aufwand deutlich, die Berührungssensoren auszuwerten. Sie besteht aus zwei Teilen. Zuerst wird ermittelt, welche Sensoren berührt wurden, dann geprüft, ob die Berührungen die Bedingungen erfüllen, um zur nächsten Drehbuchzeile zu springen:

  1. void waitForTouch() {
  2.  
  3. byte touches = 0;
  4.  
  5. if(MPR121.touchStatusChanged()){
  6. MPR121.updateTouchData();
  7.  
  8. for(int i=0; ELECTRODES > i; i++){
  9. if(MPR121.isNewRelease(i)) {
  10. touches = touches | ceil(pow(2, i));
  11. }
  12.  
  13. }
  14. }
  15.  
  16. if(touches & script[currentline].touch) {
  17. setLeds();
  18. delay(script[currentline].delay);
  19. incrementScript();
  20. }
  21. }

Zuerst wird geprüft, ob überhaupt ein Sensorkontakt stattfand (touchStatusChanged), wenn ja, müssen wir die Sensordaten holen (updateTouchData).

In einer Schleife prüfen wir dann für jede der Sensorelektroden, ob eine Berührung vermerkt wurde. Ist das der Fall, wird in einem Bitfeld ein entsprechendes Bit gesetzt. Der entsprechende Code erscheint etwas merkwürdig: touches = touches | ceil(pow(2, i));

Wir nutzen dabei aus, dass die Nummer der Elektrode direkt mit der Position im Bitfeld korrespondiert, daher erhalten wir mit pow(2, <nummer>) eine Zahl, deren binäre Darstellung genau eine 1 an der entsprechenden Stelle im Bitfeld hat. Das ceil() ist notwendig, weil pow() eine Fließkommazahl liefert, wir aber eine Ganzzahl benötigen.

Das so erzeugte Bitfeld vergleichen wir mit der Bedingung in der aktuellen Drehbuch-Zeile. Ist sie erfüllt, werden auch hier die LEDs angesteuert und es wird zur nächsten Drehbuch-Zeile gewechselt.

 Mühsam nährt sich das EichhörnchenLEDs ansteuern 

eye home zur Startseite
McFarmar 13. Jan 2015

Finde ich auch super. Ein Kollege hat ein Kind das im richtigen Alter ist - ich glaube...

Konstantin... 13. Jan 2015

den ich persönlich lustiger finde. Man benötigt zwar einen PC dafür, wenn ich aber...



Anzeige

Stellenmarkt
  1. STAHLGRUBER GmbH, Poing bei München
  2. Fresenius Kabi Deutschland GmbH, Oberursel
  3. MBtech Group GmbH & Co. KGaA, Stuttgart
  4. OPITZ CONSULTING Deutschland GmbH, verschiedene Standorte


Anzeige
Top-Angebote
  1. 499,99€ - Wieder bestellbar. Ansonsten gelegentlich bezügl. Verfügbarkeit auf der Bestellseite...
  2. 349€ inkl. Abzug (Vergleichspreis 452€)
  3. (u. a. Far Cry Primal Digital Apex Edition 22,99€, Total War: WARHAMMER 16,99€ und Total War...

Folgen Sie uns
       


  1. E-Mail

    Adobe veröffentlicht versehentlich privaten PGP-Key im Blog

  2. Die Woche im Video

    Schwachstellen, wohin man schaut

  3. UAV

    Matternet startet Drohnenlieferdienst in der Schweiz

  4. Joint Venture

    Microsoft und Facebook verlegen Seekabel mit 160 Terabit/s

  5. Remote Forensics

    BKA kann eigenen Staatstrojaner nicht einsetzen

  6. Datenbank

    Börsengang von MongoDB soll 100 Millionen US-Dollar bringen

  7. NH-L9a-AM4 und NH-L12S

    Noctua bringt Mini-ITX-Kühler für Ryzen

  8. Wegen Lieferproblemen

    Spekulationen über Aus für Opels Elektroauto Ampera-E

  9. Minix

    Fehler in Intel ME ermöglicht Codeausführung

  10. Oracle

    Java SE 9 und Java EE 8 gehen live



Haben wir etwas übersehen?

E-Mail an news@golem.de


Anzeige
Kein App Store mehr: iOS-Nutzer sollten das neue iTunes nicht installieren
Kein App Store mehr
iOS-Nutzer sollten das neue iTunes nicht installieren
  1. Apple iOS 11 Wer WLAN und Bluetooth abschaltet, benutzt es weiter
  2. Drei Netzanbieter warnt vor Upgrade auf iOS 11
  3. Betriebssystem Apple veröffentlicht Goldmaster für iOS, tvOS und WatchOS

Inspiron 5675 im Test: Dells Ryzen-Gaming-PC reicht mindestens bis 2020
Inspiron 5675 im Test
Dells Ryzen-Gaming-PC reicht mindestens bis 2020
  1. Android 8.0 im Test Fertig oder nicht fertig, das ist hier die Frage
  2. Logitech Powerplay im Test Die niemals leere Funk-Maus
  3. Polar vs. Fitbit Duell der Schlafexperten

Energieversorgung: Windparks sind schlechter gesichert als E-Mail-Konten
Energieversorgung
Windparks sind schlechter gesichert als E-Mail-Konten
  1. Optimierungsprogramm Ccleaner-Malware sollte wohl Techkonzerne ausspionieren
  2. Messenger Wire-Server steht komplett unter Open-Source-Lizenz
  3. Apache Struts Monate alte Sicherheitslücke führte zu Equifax-Hack

  1. Re: Dumme Käufer

    JackIsBlack | 11:09

  2. Re: Und bei DSL?

    bombinho | 11:04

  3. Re: War das im Video das Kabel oder der Zugdraht?

    Eheran | 11:03

  4. Re: Geringwertiger Gütertransport

    logged_in | 11:03

  5. Re: Frage

    logged_in | 11:00


  1. 11:03

  2. 09:03

  3. 17:43

  4. 17:25

  5. 16:55

  6. 16:39

  7. 16:12

  8. 15:30


  1. Themen
  2. A
  3. B
  4. C
  5. D
  6. E
  7. F
  8. G
  9. H
  10. I
  11. J
  12. K
  13. L
  14. M
  15. N
  16. O
  17. P
  18. Q
  19. R
  20. S
  21. T
  22. U
  23. V
  24. W
  25. X
  26. Y
  27. Z
  28. #
 
    •  / 
    Zum Artikel