INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Geschwindigkeit messen mit Arduino Uno
26.06.2020, 17:13
Beitrag #1
Geschwindigkeit messen mit Arduino Uno
Hallo!

Ich habe an einen Arduino Uno einen Paddelradgeber angeschlossen, um die Bootsgeschwindigkeit zu ermitteln. Den Code dazu habe ich hier zusammenkopiert. Mit der ISR zählt der Logzähler auch einwandfrei hoch.
Mir geht es letzlich um den Programmteil Logspeed, wo ich die Anzahl der Impulse im Messintervall durch die rechnerische Anzahl der Impulse je Seemeile teile um die Geschwindigkeit zu erhalten. Das Ergebnis ist leider null. Kleiner oder großer Denkfehler?

Code:
#include <Wire.h>            // Wire Bibliothek hochladen

const byte Logge = 2 ;        // PIN für den Magnetischen Hall Sensor beim Arduino UNO auf 2 wg Interrupt
unsigned long Logzaehler = 0;           // Startwert des Logzählers
volatile byte LoggeStatus = 0;          // Der Status der Logge
float Geschwindigkeit;    //Anzeige der Geschwinigkeit in Seemeile/h


void setup() {
Wire.begin();
pinMode(Logge, INPUT_PULLUP) ;  // definieren des PIN's für den LoggeSensor als Eingangssignal
attachInterrupt(digitalPinToInterrupt(Logge), Log , HIGH);
}

void loop() {
  Logspeed();         //Ermitteln der Geschwindigkeit durchs Wasser

}

void Log() //Die Interrupt Service Routine
{
  volatile int WertLog = digitalRead(Logge);   // Lesen des Zustandes des Sensors.
  (WertLog != LoggeStatus);                    // Der Zustand des Schalters hat sich verändert                                          
  if (WertLog == CHANGE);                                        
  Logzaehler++;                                // Inkrementieren der Variablen Logzaehler
  LoggeStatus = WertLog;                       // Den Zustand merken
}

void Logspeed() //Die Ermittlung der Geschindigkeit durchs Wasser
{
  const int Zeitintervall = 5000;                                //5 Sekunden bis zum naechsten Update
  unsigned long LetzterLogzaehler;                               //Wert bei der letzten Messung
  unsigned long LetzteMillis;                                    //Speicherwert der letzen Zeit
  if( millis -LetzteMillis > Zeitintervall)
{ Geschwindigkeit = ((Logzaehler - LetzterLogzaehler)*720/59264);//Geschwindigkeit in kn/h entspricht der Anzahl der Impulse im Messintervall /Impulse je sm
  LetzterLogzaehler = Logzaehler;                                //speichert den Wert des Logzaehlers zum Messzeitpunkt
  LetzteMillis = millis;                                         //speichert den Messzeitpunkt
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.06.2020, 17:16 (Dieser Beitrag wurde zuletzt bearbeitet: 26.06.2020 19:06 von Tommy56.)
Beitrag #2
RE: Geschwindigkeit messen mit Arduino Uno
Hänge Dir serielle Ausgaben rein, die Dir die Variablenwerte ausgeben, Dann siehst Du genau, was Dein Programm macht.

Gruß Tommy

Edit: Du musst Logzaehler atomar (also bei ausgeschalteten Interrupts) in eine Hilfsvariable umkopieren und dann mit dieser weiter arbeiten

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.06.2020, 21:51
Beitrag #3
RE: Geschwindigkeit messen mit Arduino Uno
@nimmzwei
...ähm ich glaube du hast nen ganz simplen Fehler gemacht... ohne das ich jetzt alles was du gecodet hast nachzuvollziehen behaupte ich mal das eben deine Variablen in der Funktion Logspeed() nach dem verlassen der Routine einfach wieder verloren gehen...also die Inhalte. Definiere doch alle Variablen mal Global und dann schätze ich mal das dann alles anderster aussieht.
Auch die Variablen in der Interrupt Routine sollte Global sein.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.06.2020, 22:24
Beitrag #4
RE: Geschwindigkeit messen mit Arduino Uno
(26.06.2020 21:51)Bitklopfer schrieb:  @nimmzwei
...ähm ich glaube du hast nen ganz simplen Fehler gemacht... ohne das ich jetzt alles was du gecodet hast nachzuvollziehen behaupte ich mal das eben deine Variablen in der Funktion Logspeed() nach dem verlassen der Routine einfach wieder verloren gehen...also die Inhalte. Definiere doch alle Variablen mal Global und dann schätze ich mal das dann alles anderster aussieht.
Auch die Variablen in der Interrupt Routine sollte Global sein.
lgbk
Habe es direkt mal ausprobiert, auch weil ich natürlich gehofft habe, dass die Lösung simpel ist, und alle Variablen global gesetzt. Leider löst es das Problem noch nicht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.06.2020, 22:47
Beitrag #5
RE: Geschwindigkeit messen mit Arduino Uno
(26.06.2020 22:24)nimmzwei schrieb:  ....
Habe es direkt mal ausprobiert, auch weil ich natürlich gehofft habe, dass die Lösung simpel ist, und alle Variablen global gesetzt. Leider löst es das Problem noch nicht.

...dann hast in deinem Code wohl noch einen logischen Denkfehler drin...
Poste doch noch deinen aktuellen Code mit den Globalen Variablen.

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.06.2020, 23:08
Beitrag #6
RE: Geschwindigkeit messen mit Arduino Uno
(26.06.2020 22:47)Bitklopfer schrieb:  
(26.06.2020 22:24)nimmzwei schrieb:  ....
Habe es direkt mal ausprobiert, auch weil ich natürlich gehofft habe, dass die Lösung simpel ist, und alle Variablen global gesetzt. Leider löst es das Problem noch nicht.

...dann hast in deinem Code wohl noch einen logischen Denkfehler drin...
Poste doch noch deinen aktuellen Code mit den Globalen Variablen.

Code:
#include <Wire.h>            // Wire Bibliothek hochladen

const byte Logge = 2 ;        // PIN für den Magnetischen Hall Sensor beim Arduino UNO auf 2 wg Interrupt
unsigned long Logzaehler = 0;           // Startwert des Logzählers
volatile byte LoggeStatus = 0;          // Der Status der Logge
float Geschwindigkeit;    //Anzeige der Geschwinigkeit in Seemeile/h
const int LogIntervall = 5000;                   //5 Sekunden bis zum naechsten Update
const int Aufloesung =4;                         //Aulösung des Paddelradgebers in Impulse je Umdrehung
const int Umfang = 125;                          //Umfang des Paddelradgebers > sollte durch Versuche angepasst werden
const int  seemeile = 1852000;                   //Seemeile in mm /theoretische Auflösung
unsigned long LetzterLogzaehler = 0;             //Wert bei der letzten Messung
unsigned long LetzteLogMillis = 0;               //Speicherwert der letzen Zeit

void setup() {
Wire.begin();
pinMode(Logge, INPUT_PULLUP) ;  // definieren des PIN's für den LoggeSensor als Eingangssignal
attachInterrupt(digitalPinToInterrupt(Logge), Log , HIGH);
}

void loop() {
  Logspeed();         //Ermitteln der Geschwindigkeit durchs Wasser

}

void Log() //Die Interrupt Service Routine
{
  volatile int WertLog = digitalRead(Logge);   // Lesen des Zustandes des Sensors.
  (WertLog != LoggeStatus);                    // Der Zustand des Schalters hat sich verändert                                          
  if (WertLog == CHANGE);                                        
  Logzaehler++;                                // Inkrementieren der Variablen Logzaehler
  LoggeStatus = WertLog;                       // Den Zustand merken
}

void Logspeed() //Die Ermittlung der Geschindigkeit durchs Wasser
{
                                    
  if( millis -LetzteLogMillis > LogIntervall)
{ Geschwindigkeit = ((Logzaehler - LetzterLogzaehler)*720/59264);//Geschwindigkeit in kn/h entspricht der Anzahl der Impulse im Messintervall /Impulse je sm
  LetzterLogzaehler = Logzaehler;                                //speichert den Wert des Logzaehlers zum Messzeitpunkt
  LetzteLogMillis = millis;                                         //speichert den Messzeitpunkt
}
}

Ich habe das jetzt rauskopiert.In dem Sketch ist noch mehr, worumes jetzt gerade ja nicht geht und ein paar Variablen umbenannt. Hoffe, es ist alles nachvollziehbar
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.06.2020, 09:17
Beitrag #7
RE: Geschwindigkeit messen mit Arduino Uno
Meinen Hinweis mit dem atomaren Lesen ignorierst Du immer noch.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.06.2020, 10:17
Beitrag #8
RE: Geschwindigkeit messen mit Arduino Uno
(27.06.2020 09:17)Tommy56 schrieb:  Meinen Hinweis mit dem atomaren Lesen ignorierst Du immer noch.

Gruß Tommy

Nein,von ignorieren kann keine Rede sein.
Du meinst die Anzeige der Variablen Logzaehler, LetzterLogzaehler, LetzteLogMillis und Geschwindigkeit, oder?
Das Umsetzen ist für mich etwas aufwändiger. Ich habe bisher kaum mit dem seriellen Monitor gearbeitet und müsste erstmal eine weitere Seite auf dem OLED-Display programmieren.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Wert von einem Arduino zu einem zweiten Arduino senden Thorsten_S 9 1.947 14.10.2019 14:48
Letzter Beitrag: Thorsten_S
  DC-Motor Geschwindigkeit regeln Mjischa 4 1.467 22.06.2019 23:22
Letzter Beitrag: Mjischa
  Waagerechte Beschleunigung messen scritch 3 1.158 18.03.2019 22:45
Letzter Beitrag: Bitklopfer
  Drezahl messen mit Arduino Due Idefix 10 2.261 11.01.2019 11:14
Letzter Beitrag: Tommy56
  Bewegung zweier Motoren mit unterschiedlicher Geschwindigkeit mit AccelStepper Yoink 2 1.499 15.07.2018 06:40
Letzter Beitrag: MicroBahner
Question Spannungen unter 5V messen phischmi 6 1.872 06.04.2018 19:48
Letzter Beitrag: phischmi
  2 LEDLauflichter mit verschiedener Geschwindigkeit Atze 48 7.685 05.02.2018 09:52
Letzter Beitrag: hotsystems
Question HC-05 zu Android Bluetooth Geschwindigkeit Test Kai H. 2 2.472 04.12.2017 16:21
Letzter Beitrag: Tommy56
  Die Frequenz von der Lichtmaschine, Klemme W messen torwart0306 7 4.256 13.09.2017 17:53
Letzter Beitrag: georg01
  Schrittmotor Geschwindigkeit mit Wägezelle + HX711 Modul steuern Schrittmotor 10 5.398 30.08.2017 23:45
Letzter Beitrag: hotsystems

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste