Neigungsschalter am Multi Function Shield

Das Multi Function Shield, das ich ja bereits vorgestellt habe und das mittlerweile ja auch um einen Drehgeber erweitert wurde, bietet mit der Möglichkeit zur einfachen Anzeige von Daten auf seinem 4-fach-7-Segment-Display und den freien Anschlusspins eine gute Grundlage, Sensoren ausprobieren.

In meiner 37-in-one-Sensoren-Bulk-Sammlung finden sich auch Module mit Neigungsschaltern, jeweils in Ausführung mit Stahlkugel und mit Quecksilber.

Hardware: Neigungsschalter


Neigungsschalter gibt es in vielfältigen Bauformen, wie das Foto zeigt. Sie lassen sich in die Kategorie "Stahlkugel" (die beiden oben links) und "Quecksilber" (der Rest) einordnen.

Bei der Stahlkugel-Variante rollt eine kleine Stahlkugel in einem Rährchen hin und her. An einem Ende rollt sie auf zwei Kontakte und schließt diese so kurz.

Bei den Quecksilberschaltern übernimmt dies eine kleine Quecksilber-Kugel. Da Quecksilber bei Zimmertemperatur flüssig und eine hoche Oberflächenspannung besitzt bildet sie eine Kugel, die in einem Glasröhrchen hin und her rollen kann. Auch hier befinden sich an einem Ende zwei Kontakte, die das Quecksilber kurzschließt, wenn es durch eine gewisse Neigung an dieses Enge rollt.

Quecksilberschalter sind allerdings mit größter Vorsicht zu behandeln. Meist ist das Quecksilber nur in eine dünne Glasampulle eingeschweißt, die, wenn sie zerbricht, das Quecksilber freigibt. Diese fällt dann zu Boden und verliert durch den Aufprall am Boden die Oberflächenspannung und zerspringt in hunderte kleine Kugeln, die in alle Richtungen rollen. Rollt so ein Kügelchen in eine Bodenritze, dann bleibt sie dort für "ewig" liegen. Quecksilber ist relativ schwer. Der Dampf, den Quecksilber auch schon bei Zimmertemperatur abgibt ist hochtoxisch und vergiftet Personen, die sich in dem Raum aufhalten über lange Zeit.

Darum verzichtet man lieber auf Komponenten mit Quecksilber und setzt besser solche mit Stahlkugel ein.

Die unterschiedlichen Bauformen stelle ich hier kurz in einem Video vor:



Ab wann ein Neigungsschalter durchschaltet und inwiefern er prellt, also zwischen dem Ein- und Auszustand hin und her-"wackelt", wollen wir mit einem Programm für den Arduino realisieren. Dies soll je nach Zustand (geschlossen oder nicht) den Beeper auf dem Multi Function Shield an- und ausschalten und zudem eine LED. Außerdem soll es die Zustandsveränderungen zählen, um so die Prelleigenschaften aufzuzeigen.

Im folgenden Video wird das Programm anhand der beiden Stahlkugelschalter demonstriert. Die Quecksilberschalter hatte ich schon wieder sicher verpackt. Sie werden darum nicht noch einmal gezeigt. Es sei aber gesagt, dass die Quecksilberschalter aufgrund der Verformbarkeit des flüssigen Quecksilbers eine sehr viele geringe Prellung haben.



Und das zugehörige Programm ist folgendes:

Source-Code

//////////////////////////////////////////////////////// // (C) 2019 by Oliver Kuhlemann // // Bei Verwendung freue ich mich über Namensnennung, // // Quellenangabe und Verlinkung // // Quelle: http://cool-web.de/arduino/ // //////////////////////////////////////////////////////// #include <TimerOne.h> // für Timings und Interrupts #include <MultiFuncShield.h> // API für das Multi Function Shield #define PinData 5 // wo ist Data angeschlossen? #define DurPause 1 // Pause in ms zwischen den Messungen void setup() { Timer1.initialize(); MFS.initialize(&Timer1); // initialize multi-function shield library pinMode (PinData, INPUT_PULLUP); // Pullup-Widerstand für definierten Zustand //Serial.begin (115200); } void loop() { int za=-1; int wert=0; int wertBefore=-1; boolean silence=false; int btn=0; MFS.beep(1, 5, 2); // bereit MFS.write(za); while (1) { btn=MFS.getButton(); if (btn == BUTTON_1_PRESSED) { silence = !silence; if (silence) { MFS.write ("ton-"); } else { MFS.write ("ton+"); } } if (btn == BUTTON_2_PRESSED) { MFS.write ("null"); za=0; } wert = digitalRead(PinData); if (!silence) { digitalWrite(3,wert); } else { digitalWrite(3,1); } if (wert != wertBefore) { if (wert == 0) { MFS.writeLeds(LED_1, ON); MFS.writeLeds(LED_2, OFF); } else { MFS.writeLeds(LED_1, OFF); MFS.writeLeds(LED_2, ON); } za++; if (za > 9999) za=0; MFS.write(za); wertBefore = wert; } delay(DurPause); } }