Hallo und guten Tag!
Ich bin neu hier und habe mich primär auf Grund dieses Themas hier angemeldet.
Und hoffe, dass ich von euch etwas Hilfe bekomme.
Vorweg:
Ihr leistet hier grandiose Arbeit und zum Teil bin ich dadurch angefixt worden, mir auch ein kleines Tacho selber zu bauen.
Nun. Was mich leider enttäuscht hat ist, dass es leider keine Funktionen gibt, die man wieder verwenden könnte.
z.B. eine Funktion, die die Impulszahl pro Sekunde zurück gibt
eine andere, die aus der Impulszahl die Radumdrehung pro Sekunde ermittelt
eine neue, die aus der Radumdrehung pro Sekunde dann km/h die Stunde macht.
Leider bin ich aktuell auch noch nicht so weit, denn ich habe das größte Problem damit, den Code auch nur irgendwie logisch in meinen Kopf zu sortieren, daher schreibe ich erstmal in Pseudocode und hoffe, dass ihr mir auf die Sprünge helfen könnt
(Ich habe zwar schon ein wenig KOT geschrieben, aber leider ist er nicht über den Status von Müll gekommen)
Code: Alles auswählen
Ich habe es wie folgt versucht, angemessen die Geschwindigkeit zu ermittel:
$Var RadumfanginMM
$Var ImpulseProRadumdrehung
$Do zähle Impulse innerhalb einer Sekunde -> Schreibe in $Var ImpulseSekundeSumme
$Do Errechne die Radumdrehung-in-der-Sekunde aus: ImpulseSekundeSumme : (geteilt durch) ImpulseProRadumdrehung
$Do Berechne die Gefahrenen-Meter-in-der-Sekunde aus: Radumdrehung-in-der-Sekunde * (multipliziert) RadumfanginMM
$Do Berechne die Gefahrenen-KMH aus: $Do Berechne die Gefahrenen-Meter-in-der-Sekunde * 3,6
Eigentlich dürfte das so passen, aber ich vermute, dass ich wohl in der technischen Umsetzung ein BUG habe.
Da ich aktuell kein Signalgeber habe - sondern das mit zwei offenen Kabelenden versucht habe zu simulieren, stellte ich schnell fest, dass da was nicht passt.
Es wurden Mitunter mehrere Impulse in der Sekunde gezählt, obwohl ich versucht habe nur EINEN zu machen. (So zwischen 3 - 18 Impulse)
Daher stelle ich hier erstmal mein Code rein, der aber definitiv noch von mir zu überarbeiten ist.
Bsp. passen aktuell einfach nicht mal mehr die Beschreibungen.
....
Code: Alles auswählen
int int_fkt_geschwindigkeit(int int_RadUmfang_in_mm, int int_Impulse_pro_Umdrehung, int int_ReadPin, bool int_debug_function){
/* diese Funktion soll über eine vorgegebene Anzahl an
Impulsen und den Radumfang die Geschwindigkeit als Wert in eine paar GLOBALE Variablen schreiben/ übergeben
und ein TRUE bei Bewegung oder ein FALSE bei Stillstand zurückgeben
- int_Rumf = der Radumfang wird übegeben in mm
- int_Impulse_pro_Umdrehung = Impulse pro Umdrehungen des Rades int
- Int_ReadPin = der GPIO-Pin
---------------------------------------------------------------------------
Folgende globale Variablen werden benötigt:
int int_GlobVar_Geschwindigkeit_in_KMH = 0; // Übergabewert aus der Funktion bool_fkt_geschwindigkeit
int int_GlobVar_Geschwindigkeit_in_MPH = 0; // Übergabewert aus der Funktion bool_fkt_geschwindigkeit
int int_GlobVar_Geschwindigkeit_M-S = 0; // Meter in einer Sekunde Übergabewert aus der Funktion bool_fkt_geschwindigkeit
int int_GlobVar_Radumdrehung_pro_Sek = 0; // Übergabewert aus der Funktion bool_fkt_geschwindigkeit
*/
// Ermittelung für Debug möglicherweise für Serial-Out
if (int_debug_function) {
int int_RadUmdrehung_fuer_ein_km = 1000000 / int_RadUmfang_in_mm;
int int_Impulse_fuer_ein_km = int_RadUmdrehung_fuer_ein_km * int_Impulse_pro_Umdrehung;
Serial.print("Es werden x Umdrehungen fuer 1km gebraucht ");
Serial.println(int_RadUmdrehung_fuer_ein_km);
Serial.print("Es werden y Impulse fuer 1km gebraucht ");
Serial.println(int_Impulse_fuer_ein_km);
Serial.print("Aktuelle Impulse pro Radumdrehung: ");
Serial.println(int_Impulse_pro_Umdrehung);
}
// Setze benötigte Variablen zur Berechnung und Ermittlung
unsigned long UnLon_RadUmdrehung_in_der_Sekunde = 0;
unsigned long UnLon_Meter_in_der_Sekunde_zurueckgelegt = 0;
unsigned long UnLon_KiloMeter_TRIP_zurueckgelegt = 0;
unsigned long UnLon_Impulse_TRIP_zurueckgelegt = 0;
//ab jetzt werden die Impulse in einer Sekunde gezählt
unsigned long int_Anzahl_der_Impulse_zaehlen = 0;
unsigned long UnLon_aktuelle_Laufzeit = (millis());
[color=#FF0000]do{
if (pulseIn(int_ReadPin, HIGH)>0) int_Anzahl_der_Impulse_zaehlen++;
}
while (millis() - UnLon_aktuelle_Laufzeit < 1000);
[/color]
// aktuelle Pulsanzahl steht nun in "int_Anzahl_der_Impulse_zaehlen"
// Berechne nun die Werte zur Ermittlung der Geschwindigkeit.
[color=#FF0000]UnLon_RadUmdrehung_in_der_Sekunde = int_Anzahl_der_Impulse_zaehlen / int_Impulse_pro_Umdrehung;
UnLon_Meter_in_der_Sekunde_zurueckgelegt = (UnLon_RadUmdrehung_in_der_Sekunde * int_RadUmfang_in_mm / 1000);[/color]
// Hier soll der TRIP-COUNTER implementiert werden, da habe ich aber aktuell noch keine Idee zu!
// TRIP-COUNTER
UnLon_Impulse_TRIP_zurueckgelegt = UnLon_Impulse_TRIP_zurueckgelegt + int_Anzahl_der_Impulse_zaehlen;
if (int_debug_function) {
Serial.print("Impulse: ");
Serial.print(int_Anzahl_der_Impulse_zaehlen);
Serial.print(" | Rad Umdrehung/s: ");
Serial.println(UnLon_RadUmdrehung_in_der_Sekunde);
Serial.print(UnLon_Meter_in_der_Sekunde_zurueckgelegt);
Serial.print(" m/s |b ");
Serial.print(UnLon_Meter_in_der_Sekunde_zurueckgelegt*3.6);
Serial.print(" km/h | ");
Serial.print(UnLon_Meter_in_der_Sekunde_zurueckgelegt*2.23);
Serial.println(" mp/h ");
}
return UnLon_Meter_in_der_Sekunde_zurueckgelegt*3.6;
/*if (UnLon_Meter_in_der_Sekunde_zurueckgelegt > 0) {
return true; // Signalisiert, dass eine Bewegung ermittelt wurde
}else {
return false; // Signalisiert, dass KEINE Bewegung ermittelt wurde
}*/
}
=> Achso, meine Intention ist es, Funktionen zu bauen, die ein Jeder via Copy and Paste nutzen kann und die immer nur ein Wert zurück geben. Ich bin rein auf Communtiyentwicklung und Handhabung bei meinen Scripten aus, so habe ich Privat auf Basis von einem ESP8266 auch ein Smarthome-Sensor gebaut, der Temp, Luftfeuchte, Luftdruck, Helligkeit ausließt und bei Bedarf auch Bewegung erkennt.
Nähere Infos gebe ich gerne raus, bei Interesse.
Ich hoffe, ich falle jetzt nicht mit der Tür ins Haus:
Gruß
Christian
Edit:
Ich habe jetzt ganz vergessen zu erklären, was mich zu diesem Projekt bewegt: Ganz einfach, die Mechanik vom Bulli-Tacho hat leider nun den Geist aufgegeben und auf Grund des Sportlenkrades sehe ich quasi den Bereich zwischen 40 und 140 auf dem Tacho nicht - daher wollte ich auf Digital umbauen und die hässlichen Zusatzinstrumente wie Drehzahlmesser, Öldruck- und Öltemperaturanzeiger gleich mit 'Entsorgen'. Um H-Gutachten mache ich mir aktuell keine Sorgen, da zu einem Transporter umgebauter Camper mit Fremdmotor....
Edit2: Möglicherweise werde ich sonst statt des Arduino Micros auf ein ESP32 setzen - weil der wesentlich mehr Speicherplatz hat. Aber ich bin mir noch eben nicht sicher...