Summary
Ich habe einige Methoden ausprobiert um die aktuelle Tiefe meines Brunnens über einen Arduino auslesen zu können:
- Ultraschall: Hier haben sich ab einer gewissen Echos gebildet und die Tiefe war ab etwa 2m nicht mehr messbar....
- LIDAR: Wasser ist transparent, was soll ich sagen, eine Messung war nur über eine aufschwimmende XPS-Platte möglich. Diese hat sich allerdings immer verschoben und damit war eine Messung nicht sichergestellt....
- Widerstandsmessung: Dies habe ich nicht in Betracht gezogen, da ich Zentimetergenau messen wollte. Für meine Brunnentiefe hätte ich zu viele Messpunkte benötigt.
Folglich bin ich zu dieser Lösung gekommen:
An eine Kette wird beidseitig ein Gewicht gehängt. Die schwerere Seite erhält zusätzlich einen Schwimmkörper, der das Gewicht auf der Wasseroberfläche hält. Die Kette wird über ein kleines Rad, welches am Brunnendeckel montiert ist, geführt. Damit ich die Rotation des Rades auslesen kann habe ich das Scroll-Rad einer alten Maus ausgebaut und in das Kettenrad integriert. Das Scroll-Rad kann man leicht über einen Arduino auslesen.
How I Designed This
Der Programmteil zum Auslesen des Mausrades
Der Sensor des Mausrades hat drei Pins: Daten, +, Daten
Wird das Rad bewegt liefern die Datenausgänge, je nach Drehrichtung vorne oder hinten, ein leicht verschobenes Signal. dies ist mit den Kommentaren //Sprung ... gemeint.
Die buttonState1&2 sind die Dateneingänge vom Mausrad, die State1 Variable ist nur als Helfer so wie buttonState11. Drehung ist das Ergebnis, welches weiterverarbeitet wird. Die Anzahl der Drehimpulse müssen dann noch in Zentimeter umgerechnet werden. Bei mir sind es etwa 2 Impulse je Zentimeter.
void Brunnen(){
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
if (buttonState11 == buttonState1){
if (buttonState1 == 1 && State1 == 1 && buttonState1 > buttonState2){ //Sprung ist am Ende Rechtsdrehung
Drehung = Drehung + 1;
State1 = 0;
}
}else{
buttonState11 = buttonState1;
if (buttonState1 == 1 && State1 == 1 && buttonState1 > buttonState2){ //Sprung ist am Ende Rechtsdrehung
Drehung = Drehung + 1;
State1 = 0;
} else if (buttonState1 == 1 && State1 == 0 && buttonState1 > buttonState2){ //Sprung am Anfang Linksdrehung
Drehung = Drehung - 1;
State1 = 1;
while (buttonState2 != 1){
buttonState2 = digitalRead(buttonPin2);
}
} else if (buttonState1 == 1 && State1 == 0 && buttonState1 == buttonState2){ //Sprung ist am Anfang Rechtsdrehung
State1 = 1;
} else if (buttonState1 == 0 && State1 == 1 && buttonState1 == buttonState2){ //Sprung ist am Ende Linksdrehung
State1 = 0;
}
}
}
Modellquelle
