Zeit zwischen zwei Interrupts messen und über Serialmonitorausgeben

Hallo liebes Forum,

kurz zu mir ich heise Patrick bin 26 und derzeit Student und Hobbybastler.

Nun zu meinem Problem ich möchte mit einem Arduino Nano und einem Trct5000(IR-Sensor) die Drehzahl eines Puch Maxi(Mofa) Motors auslesen und diese über den Serialmonitor an einen Raspberry Pi übergeben.

Also die Verbindung zwischen Arduino und Raspberry funktioniert, nur möchte ich nur alle 100ms einen Wert an den Raspberry übergeben und da hänge ich gerade mit meinem code den mit der millis() funktion bekomme ich gar keinen Wert mehr.

Vielleicht könnt ihr mir da helfen :slight_smile:

mfg
phantomixx

//Bibliotheken
#include <Wire.h>

//Variablen
unsigned long time = 0;
int Umdrehungen;
int Intervallzeit;
long Altezeit = 0;
unsigned long startMillis;  
unsigned long aktuellMillis;
const unsigned long periode = 100;


void setup() {
  
  Serial.begin(115200);                                          //Serielleverbindung aufbauen
  while(!Serial);                                                //warten bis Serielleverbindung steht
  startMillis = millis();                                        //Zeit für Pausenzeit Speichern
  attachInterrupt(digitalPinToInterrupt(2), Intervall, RISING);  //Interrupt Event 

}

void Intervall() {
  
  time = millis();                                               //Bei Interrupt Zeitspeichern in ms-Wert

}

void loop() {
  aktuellMillis=millis();
  if(aktuellMillis - startMillis >= periode) {
    Intervallzeit = ( Altezeit - time );                         //Berechnet die Zeitr einer Umdrehung
    if( Intervallzeit <= 60000L) {                               //kontrolliert ob die Intervallzeit plausibel ist
      Umdrehungen = (1/Intervallzeit)*60000L;                    //Berechnet die Umdrehungen pro Minute
      Altezeit = time;                                           //Speichert den ms-Wert als Altezeit
      Serial.println(Umdrehungen,DEC);                           //gibt die Umdrehungen pro Minute im Serialmonitor aus
     }
    else {
      Serial.println(0,DEC);                                     //Wenn die Intervallzeit unplausibel ist Ausgabe 0
    }
  startMillis = aktuellMillis;
  }
}

Falls Du das Programm schon mal hast laufen lassen, dann weißt Du ja, was dabei herauskommt. Wo also liegt der Fehler? Es sollte eigentlich klar sein, daß eine Abfrage, die alle 100ms (periode) ausgeführt wird, nur entweder 100ms oder die letzte per Interrupt gemessene Zeit liefern kann. Logo?

Außerdem alle Zeiten als "unsigned long" deklarieren, sonst kann das üble Rechenfehler geben.
Und alles, was im Interrupt geändert wird, auch noch "volatile" deklarieren und im restlichen Programm nur mit abgeschalteten Interrupts lesen und schreiben.

Wenn die Abtastrate (periode) festgelegt ist, dann würde ich die dazwischen eingetroffenen Impulse zählen, und diese Anzahl in die aktuelle Drehzahl umrechnen und ausgeben.

Wenn dann immer noch unsinnige Werte herauskommen, lohnt sich die Betrachtung der Quelle, von der die Impulse stammen, und wie die aussehen. Schaltbild?