Hall Sensor + bestimmte Drehzahl = Funktion

Hi,

erstmal vorab, bin ein totaler Noob was das Thema Arduino angeht.

Ich baue gerade ein mechanisches System, bei dem ich über mehrere Zahnräder hinweg versuche ein LED Display zum Leuchten zu bringen. Sprich: Ich drehe ein Zahnrad über eine Kurbel, welches mehrfach übersetzt wird, um am Ende einen Kurbelinduktor / Dynamo zu betreiben, der ab einer gewissen Drehzahl genug Strom liefert, um das Display zum Leuchten zu bringen.

Da aber einige meiner Lager nicht exakt berechnet sind, funktioniert die Konstruktion nur schwammig. Ich habe mir daher überlegt:

Ich könnte doch einfach an das "letzte" Zahnrad einen Magneten anbringen, dahinter einen Hall Sensor, der über meinen programmierten Arduino die Drehzahl misst und ab einer bestimmten Drehzahl das Display zum Leuchten bringt. Soweit verständlich?

Ich habe in meiner Kiste noch ein paar Hall Sensoren gehabt. Ich habe jetzt einen gefunden und mit dem Arduino getestet. Er scheint Unipolar zu sein und kein Latch, sprich er bringt meine LED zum leuchten, wenn der Magnet sich dem Sensor nähert und diesen wieder abschaltet, sobald ich ihn entferne. In meinen Augen also genau das, was ich brauche?

Mittels diesem Code habe ich es geschafft, den Sensor zu testen

const int ledPin = 7;
const int hallPin = 4;

void setup() {
 pinMode(4, INPUT);
 pinMode(7, OUTPUT);
}

void loop() {
 digitalWrite(ledPin, digitalRead(hallPin));
}

Jetzt bräuchte ich passenden Code um daraus einen Drehzahlmesser zu machen und diesem begreiflich zu machen, dass zum Beispiel ab Drehzahl 10/sek ein Display anfängt zu leuchten.

Meine nächste Frage wäre: Brauche ich dazu mehr als Arduino, Hall Sensor, Magnet und Display?

Ihr seht, ich bin sehr neu. Bitte habt Verständnis.

Lieben Gruß,

Max

Hallo,

als erstes musst du millis() anwenden können. Deine ewig laufende Uhr.

Theseus erklärt millis() http://forum.arduino.cc/index.php?topic=400102.msg2752141#msg2752141

GuntherB - BlinkwithoutDelay - Die Nachtwächtererklärung http://forum.arduino.cc/index.php?topic=423688.0

Damit zählst du innerhalb jeder Sekunde die Eingangsimpulse. Das wäre der Anfang ...

Hallo,

in diese Richtung könnte das gehen ... Die update_Sensor Funktion sorgt dafür das nur neue Pulse gezählt werden und nicht gezählt wird wenn der Magnet länger vorm Sensor steht.

const byte pinSensor = 4;
const byte pinLed = 7;


void setup() {
  Serial.begin(9600);
  pinMode(pinSensor, INPUT);
  pinMode(pinLed, OUTPUT);
}

void loop()
{
  bool puls = update_Sensor();
  
  //digitalWrite(pinLed, puls);
  
  unsigned long var = pulse_pro_Zeit (puls, 1000);  // zählt Pulse pro 1000ms

  zeige_Drehzahl(var, 1000);                        // zeigt Wert aller Sekunde
}


// ****** Funktionen ****** //
unsigned long pulse_pro_Zeit (bool puls, unsigned int zeit)
{
  static unsigned long diff = 0;
  static unsigned long count = 0;
  static unsigned long last_count = 0;
  static unsigned long last_ms = 0;
  unsigned long ms = millis();

  if (puls) count++;
  
  if (ms - last_ms >= zeit) {
    last_ms = ms;
    diff = count - last_count;
    last_count = count;
  }

  return diff;
}

bool update_Sensor()
{
  bool state = false;
  static bool oldRead = false;
  
  bool read = digitalRead(pinSensor);
  
  if (read && (!oldRead) ) {
    state = true;
  }
  oldRead = read;

  return state;
}

void zeige_Drehzahl (unsigned long var, unsigned int intervall)                   
{
  static unsigned long last_ms = 0;
  unsigned long ms = millis();
  
  if (ms - last_ms >= intervall) {
    last_ms = ms;
    Serial.println(var);
  }
}

Vielen Dank dafür, das versuche ich nachzubauen und nachzuvollziehen!

Wenn du nicht mal genügend Strom für das Display hast, wie versorgst du den Arduino?

Die Idee ist über ein Relais. Das Display soll (ersteinmal) über Blockbatterien gespeist werden.

Sprich, der Arduino soll die RPM zählen und dann IF RPM größer als 20/sek z.B., soll das Relais getriggert werden, was dann das Display anwirft.

p.s.: mal anders gefragt, warum soll der Arduino mit seinen 5V nicht auch das Display betreiben können? Das Display ist hartkodiert, da leuchten maximal 10 LEDs... das sollte nicht sonderlich viel ziehen? Noch zur Info, das Display zeigt die immer gleich "Zahl" an. Da ändert sich nichts drauf.

Hallo,

Leds? Was ist das denn für ein Display? Bedenke auch das dein Relais selbst auch etwas Strom benötigt. Könnte den Spareffekt (teilweise) zu nichte machen.

Das Display ist ein bzw. mehrere Kingbright SA56 displays. ich habe die Felder, die Leuchten sollen mit einem Widerstand versehen und alles so auf eine Platine gelötet, dass man diese nur noch an ± eines Batterie Block Akkus anschließen muss. Dann Leuchten die korrekten Zahlen.

Dieser Mechanismus soll dann vom Relais getriggert werden.

Hallo,

http://www.us.kingbright.com/images/catalog/SPEC/SA56-11EWA.pdf aha, dann sagen wir dazu lieber 7-Segment LED Anzeige statt Display und die Verwirrung ist vom Tisch. Ich weiß jetzt nicht welchen maximalen Strom du pro Segment veranschlagt hast. 7x20mA wären 140mA. Wenn du das Arduinoboard an seinem Spannungsreglereingang (runde Buchse) mit 7-9V versorgst, nicht mehr, dann sollte er es verkraften. Hintergrund ist das der kleine Spannungsregler nicht viel Verlustleistung verkraftet. Wenn es dir möglich ist, dann versorge die LED Anzeige nicht über das Board. Ansonsten tun es vielleicht auch 10mA pro Segment. Alles vorsorglich betrachtet. Beim Relais, denke an die Freilaufdiode.

Okey. Wenn ich also den Arduino nicht nutzen möchte für die Stromversorgung des LED Segments, würde dann folgende Zeichnung Sinn machen?

Nein. Falls es eine fertige Relaisplatine ist, fehlt das Signalkabel. Wenn es ein Relais ist fehlt der Treibertransistor. Wenn es ein Relais ist (was ich bezweifle ), was man direkt an einen Ausgang anschließen kann, muss es an einen Ausgang und nicht auf 5V.

Und ein Relais braucht zwingend eine Freilaufdiode, andernfalls wird Transistor bzw. Arduino-Ausgang zerstört.