Seifen-/Desinfektionsspender (Arduino - Projekt)
Bei der Suche nach interessanten Projekten im World Wide Web bin ich auf diesen Seifen- oder Desinfektionsspender gestoßen, der thematisch ja ziemlich gut zur aktuellen Situation passt ;-)
Material:
- Arduino Genuino UNO
- Sharp Abstands-Infrarotsensor
- Servomotor mit Kreuz
- Seil
- Seifen- oder Desinfekionsspender mit Pumpe
Beschreibung:
Das Grundprinzip ist eigentlich ziemlich simpel. Ein gespanntes Seil, welches auf einer Seite an einem Servomotor befestigt wurde, kann ein Hebel eines Seifen- oder Desinfektionsmittelspender nach unten gezogen werden. Gesteuert wird das ganze über einen Arduino UNO; die Auslösung erfolgt über einen Infrarot - Entfernungssensor, der registriert, ob sich eine Hand dem Spender nähert.
Das Gesamtpaket besteht aus zwei Teilschaltungen: Zum einen den Infrarotsensor, der über +5V und GND angeschlossen wird und den Servomotor - ebenfalls über +5V und GND versorgt.
Pinzuteilung:
Arduino-Pin | Anschluss Bauteil |
---|---|
+5V | Infr.S: +5V |
GND1 | Infr.S: GND |
A0 | Infr.S: Signal |
+5V | Servo: +5V |
GND2 | Servo: GND |
D7 | Servo: Signal |
Verkabelung - grafische Darstellung des Aufbaus:
Quelle: https://starthardware.org/wp-content/uploads/2020/03/arduino-seifenspender.jpg
Einrichtung der Positionen; Ermittlung der Werte:
Der Sensor reagiert in einem Messbereich von ca. 10-30 cm. Am besten macht man zuerst einen "Trockentest" um die benötigten Messwerte zu ermittlen:
- Ab wann soll der Sensor reagieren?
-
Wie weit muss sich der Motor in die jeweilige Richtung drehen, damit genug Seife herauskommt, das Seil nicht reißt und die Pumpe wieder vollständig nach oben fahren kann?
- Hierfür eignen sich beispielsweise die Variablen ServoPositionPumpen und ServoPositionNichtPumpen
Wenn die Werte korrekt ermittelt wurden (hierfür ist vermutlich etwas Geduld gefragt), können sie an den entsprechenden Stellen im Sketch eingearbeitet werden. Für das Ablesen der Werte eignet sich der serielle Monitor (s.u.), wenn man die Baud-Rate auf 115200 gestellt hat
Programmcode:
Unter "Download" ist der Sketch im .ino - Format für die Verwendung mit der Arduino IDE - Software verlinkt:
Code Download: Arduino_Seifenspender_ino
/*Sketch zur Steuerung eines berührungslosen Seifen-/Desinfektionsmittelspenders
* Achtung: Vor Inbetriebnahme müssen die Variablen 1-3 überprüft und ggf angepasst werden,
* da es sonst zu Beschädigungen am Servomotor oder anderen Bauteilen kommen kann
* Quelle Idee+Sketch: https://starthardware.org/beruehrungsloser-seifenspender-mit-arduino/
* Ausarbeitung/Anmerkungen: Florian Porth (letzte Änderung: 30.05.20)
*/
#include
int servoPin = 7;
int irPin = 0;
Servo myServo; // erstellt Servo-Objekt
int servoPositionPumpen = 30; // Variable 1: Position, in der die Pumpe des Spenders heruntergedrückt ist
int servoPositionNichtPumpen = 120; // Variable 2: Position, in der die Pumpe des Spenders nicht heruntergerückt ist
int irThreshold = 300; // Variable 3: Abstand, ab dem der Sensor auslösen soll
int lastState = -1; // -1 = Pumpe nicht gedrückt
int state = -1;
void setup() {
Serial.begin(115200); // starte seriellen Monitor; Einstellen der Baud - Rate auf 115200
myServo.attach(servoPin); // Intitialisierung Servomotor
myServo.write(servoPositionNichtPumpen); // Bei Start, soll der Spender in den Normalzustand fahren
delay(1000); // 1 Skeunde warten...
}
void loop() {
Serial.println(analogRead(irPin)); // gib Sensorwert an Seriellen Monitor
/*Im folgenden wird der Messwert des Sensors ausgelesen und geprüft*/
if (analogRead(irPin)>irThreshold) state = 1; // Hand o.ä. Objekt erkannt
else state = -1; // keine Hand o.ä Objekt erkannt
if ((state==1)&&(lastState!=1)){ // Diese Zeile verhindert dauerhaftes Auslösen
myServo.write(servoPositionPumpen); // Pumpe drücken
delay(1000); // 1 Sekunde warten
myServo.write(servoPositionNichtPumpen); // Pumpe entspannen
delay(1000); // 1 Sekunde warten
}
lastState=state; // letzer Zustand wird als aktueller Zusrand gespeichert
delay(20); // 20ms warten, dann von vorne beginnen
}
Anmerkungen:
- Quelle Idee+Sketch
- Ausarbeitung und Anmerkungen: Florian Porth, 10b