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
Einfacher Tacho für niedrige Geschwindigkeiten – Code optimieren
11.10.2016, 18:07
Beitrag #1
Einfacher Tacho für niedrige Geschwindigkeiten – Code optimieren
Hallo,

Ich sammle grad meine Ersten Erfahrungen mit dem Arduino und elektronischen Bauteilen, die über LED’s hinausgehen. Beim Programmieren habe ich etwas Erfahrung in VB.net und VBA.

Nun will ich einen minimalistischen Tacho für einen alten Traktor und einen Drehzahlmesser für die Werkstatt bauen. Grundsätzlich funktioniert es auf dem Steckbrett bereits. Man könnte aber am Programmablauf noch einiges verbessern und ich würde den Code gerne besser verstehen.

Hardware:
1x Arduino Uno
1x Hall Effect Sensor A3144 (+5V, GND, Signal an Pin 2)
1x 12K Wiederstand zwischen +5V und dem Signal. (durch herumprobieren gefunden, kleinere funktionieren aber auch)
1x TM1637 4 Digit Display (+5V, GND, Pin 8, 9)

Die Teile waren sehr einfach zu verkabeln und mit Codeschnipseln zum Laufen zu bringen. Bei dem einfachen Display muss ich noch auf den Dezimalpunkt verzichten, darum habe ich die km/h vorerst mit 100 multipliziert. Wichtiger ist mir, auch bei relativ niedrigen Drehzahlen (~40/min), noch möglichst aktuelle und realistische Werte auf das Display zu bekommen.

Bugs:
Der Serielle Monitor zeigt beim Start 34560 RPM an, bis der Magnet Signale generiert, dann wird die Messung scheinbar realistisch. Ich kann das bisher aber nur schätzen.

Die zuletzt angezeigte Geschwindigkeit, bleibt beim Stillstand erhalten.
Ich denke, das hat mit den, für mich völlig neuen, Interrupts zu tun?
„Hier steht z.B. im Code: http://arduinoprojects101.com/arduino-rp...achometer/
//Don't process interrupts during calculations
detachInterrupt(0);”

So sieht mein überwiegend zusammenkopiertes Werk aktuell aus:
Code:
#include <Arduino.h>
#include <TM1637Display.h>

const int CLK = 9; //Set the CLK pin connection to the display
const int DIO = 8; //Set the DIO pin connection to the display

TM1637Display display(CLK, DIO);  //set up the 4-Digit Display.

//Hall Sensor >>> Quelle für RPM: http://forum.arduino.cc/index.php?topic=192061.0
volatile uint32_t diff = 0;
volatile uint32_t p1 = 0;

void setup()
{
// Display
display.setBrightness(0x0a);  //set the diplay to maximum brightness
  
  Serial.begin(115200);
  Serial.println("Start");
  attachInterrupt(0, counter, RISING);
}

void loop()
{
uint16_t RPM = 60000000UL/ (diff + (diff==0));  // prevent divide by zero
Serial.print("RPM:\t");
Serial.println(RPM);

// KMH berechnen
float RAufa = 1888; // Radumfang
float StreckeMin = RPM * RAufa; // MM/Min
float StreckeStd = (StreckeMin * 60)/1000000; // KMH

Serial.print("KMH:\t");
Serial.println(StreckeStd);

// Display Ausgabe(n)
//display.showNumberDec(StreckeStd *100);
display.showNumberDec(RPM);

delay(150);

}

void counter()
{
  if (p1 == 0) p1 = micros();
  else
  {
    diff = micros() - p1;
    p1 = 0;
  }

}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2016, 12:45
Beitrag #2
RE: Einfacher Tacho für niedrige Geschwindigkeiten – Code optimieren
Hallo Bastelo,

deine Funktion "counter" wird ja nur aufgerufen wenn ein Signal am Interrupt einkommt. Wenn jetzt durch "stillstand" nichts mehr kommt werden die Messungen auch nicht mehr akutallisiert.

Du müsstest also in deiner Hauptschleife prüfen ob zum beispiel die letzten x Sekunden ein Messimpuls gekommen ist. Wenn nicht steht das Rad oder der Messsensor ist defekt.

Gruß
Stephan
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.10.2016, 20:31
Beitrag #3
RE: Einfacher Tacho für niedrige Geschwindigkeiten – Code optimieren
Danke, das ist noch eine Nummer zu hoch für mich. Hab schon einiges in der Richtung versucht, z.B. :

Code:
// Zeitmesseung
int pin = 2;
unsigned long T;          //Periodendauer in ms

void setup()
{Serial.begin(9600);
pinMode(pin, INPUT);
}

void loop()
{
  T = pulseIn(pin, HIGH) + pulseIn(pin, LOW);
if (T<1) {
Serial.println("Steht");
Serial.println(T);}
else
{              
  Serial.println("Dreht");
  Serial.println(T);
}
}

Es klappt solo hervorragend, im Code für den Drehzahlmesser eingebaut, spielen die Ausgaben damit aber verrückt. Es scheint als ob die Abfragen dem Drehzahlmesser neue Impulse vorgaukeln. Im Zweifel lebe ich lieber noch damit, bis ich besser verstehe, was wohin gehört. Noch verwirren mich die geschweiften Klammern zu sehr.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Volume Up falscher Tastatur Hex-Code Maxi290997 7 413 03.07.2017 21:49
Letzter Beitrag: Maxi290997
  delay(...) im Code ok? donut 4 323 08.06.2017 20:16
Letzter Beitrag: donut
  Textdokument in Arduino Code umwandeln Tellen 9 479 03.06.2017 16:30
Letzter Beitrag: Tellen
  BMW tacho aufwecken Medolino 12 727 27.04.2017 13:41
Letzter Beitrag: Medolino
  TFT Pixel to Code oOSpikeOo 5 342 06.04.2017 18:49
Letzter Beitrag: Tommy56
  Tri-State Code ?? Franz54 3 294 12.02.2017 19:23
Letzter Beitrag: Franz54
  Code aus 1.6.9 geht mit 1.8.1 nicht mehr zu kompilieren DL1AKP 7 621 02.02.2017 12:16
Letzter Beitrag: Tommy56
  Code mit Verifikation über Keypad & LCD machnetz 5 556 10.10.2016 15:01
Letzter Beitrag: torsten_156
  Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library) avoid 4 690 05.06.2016 14:16
Letzter Beitrag: avoid
  Serial Monitor Eingabe über Code Maxi290997 4 849 12.05.2016 18:57
Letzter Beitrag: SkobyMobil

Gehe zu:


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