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
  Code mit Verifikation über Keypad & LCD machnetz 5 213 10.10.2016 15:01
Letzter Beitrag: torsten_156
  Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library) avoid 4 377 05.06.2016 14:16
Letzter Beitrag: avoid
  Serial Monitor Eingabe über Code Maxi290997 4 515 12.05.2016 18:57
Letzter Beitrag: SkobyMobil
  Problem: RFID code mit Inhalt einer Textdatei auf einer SD Karte vergleichen MartinK 6 505 29.03.2016 16:45
Letzter Beitrag: MartinK
  OSC Arduino Code Fabian_Fabian 5 431 10.03.2016 23:23
Letzter Beitrag: hotsystems
  Code bei fritzing Miro 3 1.364 08.02.2016 16:16
Letzter Beitrag: Uwa
  Code für Würfel korrekt? JanGamer11 12 803 12.01.2016 19:41
Letzter Beitrag: Claus_M
  Programm Code Erweitern hugolost 8 658 01.01.2016 20:02
Letzter Beitrag: Bitklopfer
  Jeffs 4-Way Button Code auf Arduino Leonardo? noxx 17 1.307 16.11.2015 20:30
Letzter Beitrag: noxx
  Code Server oder Client seitig?? SchwesterStefan 3 566 09.11.2015 22:47
Letzter Beitrag: hotsystems

Gehe zu:


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