Optimierung erwünscht: Projekt Ergometer-Fahrradcomputer/Sketch Tacho

Hallo zusammen,

im Rahmen meines “kleinen” Projektes “Ergometer-Fahrradcomputer” mit dem Nano Clone, das ich hier schon mal kurz erwähnt habe, habe ich meinen ersten Einzelsketch “Tachometer” fertig und m.E. optimiert. Ich programmiere und teste sämtliche verschiedene Funktionen übrigens erst mal in Einzelsketchen und kombiniere die nach und nach.

Es funktioniert, soweit ich das beurteilen kann schon ziemlich gut, da mir aber noch zu viele Kenntnisse in C++ fehlen, bitte ich euch mal drüber zu schauen. Vielleicht fällt euch noch was ein, wie ich den Sketch noch optimieren kann? Gibt es vielleicht Standardfunktionen die ich nutzen kann und Teile der Funktionen überflüssig machen?

Hier ist der Sketch. Hinweis der Magnetschalter ist absichtlich an einem analogen Pin angeschlossen und wird digital geschaltet, da mein vorgesehenes Display alle digitalen Pins des Nanos belegt.

#include <Arduino.h>                        //Include wird für Platformio benötigt

//Variablenberreich Tacho
const byte PinTacho = A0;                   //Reedsensor / Magnetschalter an DigitalPin mittels internen Pullup auf Gnd
uint8_t UpM;                                //Umdrehungen pro Minute
float Speed;                                //Geschwindigkeit in Km/h
float Distance;                             //bisher gefahrene Strecke in Km
bool Active;                                //Hilfsvariable für Aktivität Reed-/Magnetkontakt, True = aktiv
uint32_t Time1;                             //Anfang der Zeitmessung
uint32_t Time2;                             //Ende der Zeitmessung
int Time3;                                  //Differenz der Zeitmessung
uint32_t CountLoop;                         //Anzahl Schleifendurchläufe loop()
uint32_t CountRound;                        //Anzahl Pedalumdrehungen
const byte TimeOut = 5;                     //Timeout in Sekunden
#define debug 1                             //Zu Debuggingzwecken, Ausgabe im Seriellen Monitor

//Variablenbereich Schwierigkeitstufe (Poti)
const int potiPin = A6;                     //Poti wird über analogen Eingang ausgelesen
byte PotiProzent;                           //Schwierigkeitsstufe in prozent
float Laenge;                               //Wegstrecke pro Pedalumdrehung

//Funktionsdeklaration
void TachoMessung();
void PotiMessung();                         //Funktionsdeklaration

void setup() {
  pinMode(PinTacho, INPUT_PULLUP);          //Magnetschalter an DigitalPin mittels internen Pullup auf Gnd
  #if debug
    Serial.begin(9600);
    Serial.println(digitalRead(PinTacho));
  #endif
}

void loop() {
  PotiMessung();
  TachoMessung();
  #if debug
    CountLoop++;
    //delay(20);      //Testzwecke
  #endif
}

void PotiMessung() {
  int sensor = analogRead(potiPin);                           //Widerstandswert des Potentiometers auslesen
  PotiProzent = map(sensor, 0, 1023, 0, 100);                 //Wert 0-1023 in 0-100 (%) umwandeln
  byte Level = map(PotiProzent, 0, 100, 0, 9);                //Prozentwert in Level 0-9 umwandeln
  Laenge = 3.0 + (Level * 0.5);                               //Variable Strecke (3,0 - 7,5 m) pro Pedalumdrehung, je höher die
                                                              //Schwierigkeitsstufe (Level) = längere Strecke / Umdrehung
}

void TachoMessung() {
  if (digitalRead(PinTacho) == LOW && Active == 0) {          //LOW = Magnetschalter aktiviert
    Active = 1;                                               //Hilfsvariable - soll "Signalechos" verhindern
    #if debug
      Serial.println("Magnetschalter aktiv");
    #endif
  } else if (digitalRead(PinTacho) == HIGH && Active == 1) {  //Magnetschalter wieder deaktiviert - Zeitmessung beginnt
    Active = 0;                                               //Hilfsvariable - soll "Signalechos" verhindern
    #if debug
      CountRound++;
      Serial.println("Magnetschalter inaktiv");
    #endif
    if (Time1 == 0) {                                         //Initialisierung, Time1 noch nicht gesetzt
      Time1 = millis();                                       //Magnetschalter aktiviert, Zeitmessung startet
      Time2 = 0;
      Time3 = 0;
    } else {
      Time2 = millis();                                       //Ende der Zeitmessung / Rundenzeit
      Time3 = Time2 - Time1;                                  //Differenz der Zeitmessung
      Time1 = Time2;                                          //Rundenmessung, Übergabe Zeit aus Time2
      UpM = (60000 / Time3);                                  //Umdrehung pro Minute
      Speed = UpM * Laenge / 1000 * 60;                       //Geschwindigkeit in Km/h
      Distance = Distance + Laenge / 1000;                    //Gefahrene Strecke in Km (0.00)
      #if debug
        Serial.print("Länge ");
        Serial.print(Laenge);
        Serial.print(" ");
        Serial.print(UpM);
        Serial.print(" U/min - ");
        Serial.print(Distance);
        Serial.print(" Km - ");
        Serial.print(Speed);
        Serial.println(" Km/h");
        Serial.print("CountLoop: ");
        Serial.print(CountLoop);
        Serial.print(" - CountRound: ");
        Serial.println(CountRound);
      #endif
    }
  } else if (digitalRead(PinTacho) == HIGH && Active == 0) {
    //Zeit der Pedalumdrehung >= TimeOut in Sekunden - Abbruch der Zeitmessung
    if (millis() - Time1 >= TimeOut * 1000 && Time1 != 0) {
      #if debug
        Serial.println("Stop!");
        CountLoop = 0;
        CountRound = 0;
      #endif
      Time1 = 0;
    }
  }
}

Viele Grüße
Jörg

Edit: Titel angepasst

Ich programmiere und teste sämtliche verschiedene Funktionen übrigens erst mal in Einzelsketchen und kombiniere die nach und nach.

Besser geht’s gar nicht :wink:
Auch die Kommentare bei den Variablendefinitionen sind super.
(Könntest time1, time2, time3 evtl. noch schönere Namen geben.)

Edit: Titel angepasst

Mehr als ein Karma geht nicht :slight_smile:

michael_x:
Besser geht’s gar nicht :wink:

Danke! :slight_smile:

Auch die Kommentare bei den Variablendefinitionen sind super.

Eigentlich bin ich eher kommentierfaul, wie soll ein anderer meine Gedankengänge beim Programmieren nachvollziehen können, oder noch schlimmer wenn ich mir das Script nach Wochen wieder anschaue, versteh ich mich selbst nicht mehr…^^

(Könntest time1, time2, time3 evtl. noch schönere Namen geben.)

Oh ja, die waren mir auch schon ein Dorn im Auge, aber das mach ich im Feintuning.

Mehr als ein Karma geht nicht :slight_smile:

Nochmals Danke und zurück.