Hallo.
Ich bin in ganz neu in der programmierwelt. Habe mir bis jetzt nur ein paar YouTube Videos zu dem Thema angeschaut und die Anfänger Schaltungen und Codes gemacht.
Zurzeit habe ich ein arduino Uno, Steckbrett und die Anfänger Teile ( LEDs, Poti, Wiedersstände usw)
Zu meinen Vorhaben.
Ich habe einen Wartburg mit Verbrauchsanzeige. Die ich aber nicht nutze. Dafür sind 12 LEDs im Kombiinstrument. 8 grüne 4 gelbe. Diese würde ich gerne als groben Drehzahlmesser verwenden. Diese würde ich dann mit einem nano ansteuern wollen. Bin aber für Alternativen offen.
Nun steht mir aber der Code und die Signal abgreifung im Weg. Ich würde gerne einen induktiv Geber dazu verwenden. Es gibt ja Betriebsstunde Zähler, bei dem man nur ein Kabel, um das Zündkabel, wickelt. So was würde ich gerne nehmen. Allerdings weiß ich nicht was ich da an Hardware benötige.
Zu Versuchszwecke habe ich Mal eine Schaltung aufgebaut. Anstatt ein Drehzahlsignal, wollte ich ein Poti nehmen. Poti bekomme ich auch ausgelesen im serial Monitor. Nur die LEDs leuchten nicht.
Ich weiß nun nicht ob ich den Sketch hier hochladen soll oder nur eine Textdatei, das da Mal jemand drüberschauen könnte.
MfG Robert
Guten Morgen Robert,
herzlich willkommen in der Arduinowelt.
Dein Vorhaben ist machbar, benötigt aber etwas Vorarbeit.
Ich bin grad am überlegen... aber die Verbrauchsanzeige war doch die selbe wie im Trabbi...
Jetzt kommt die alles entscheidende Frage: Was ist von der Anzeige übrig geblieben?
Wenn Du nur die LED's ohne die Elektronik nutzen willst, dann beachte, das die Vorwiderstände auf 12V (14V) ausgelegt waren.
Wenn Du die Elektronik und damit nur den Signalpin vom Durchflussgeber nutzen willst, gilt auch hier: beachte, das Du 12V brauchst und sich da ein hallsensor und kein Poti hinter befand.
Mach doch mal gute Fotos von dem was Du hast/verarbeitest, damit man sich ein Bild machen kann.
Also ich will nur die LEDs im Kombiinstrument nutzen\ ansteuern. Habe mir so gedacht das ich Kabel an die Beinchen Löte und dann an den nano.
Wie es im Trabbi ist weiß ich nicht.
Den nano habe ich noch nicht.
Wollte mich erstmal mit dem programmieren beschäftigen. Deswegen erstmal nur trocken Übungen mit den Steckboard und ein Poti. Das ich den Code verstehe.
Hier geht's ja um das grundlegend gleiche Thema.
Wenn die Auflösung nur über 12 LEDs geht, braucht man keine großartigen Klimmzüge zu machen.
Ich habe anno dazumal einen Drehzahlmesser mit nem UAA180 gebaut, der treibt auch direkt 12 LEDs. Und den Zündimpuls habe ich einfach über ein R/C Glied integriert und damit den UAA gefüttert. Reichte völlig aus.
Mit nem arduino kann man das gleiche machen, dann eben mit analogread und entsprechender Ausgabe. Eigentlich umständlicher aber natürlich machbar 
OK ich habe jetzt die Hälfte verstanden was du geschrieben hast 
Hallo,
Wilkommen im Forum.
Da Du die Bordspannung nutzen willst wirst Du ein paar zusätzliche Maßnahmen ergreifen müssen da die 12V des KFz ziemlich verseucht sind. Das Betrifft dann die Versorgungsspannung und die Signale.
Letzlich willst Du eine Frequenz messen. Dazu solltest Du wissen welche min und maximale Frequenz in etwa zu erwarten ist. 500-5000U/min 4 Takter /4 Zylinder
5000 /60 x4/2= 166Hz
das sind recht kleine Frequenzen , also solltest Du eigentlich eine Periodendauer Messung machen. Da Du mit Deinen 8 LED allerdings nur eine sehr begrenzte Auflösung hast kannst Du auch eine feste Messzeit z.B 1s nehmen und die Impulse zählen die in der einen Sekunde kommen. Das wären dann etwa 16-160 Impulse. Die musst Du nun in gleiche 8 Bereiche aufteilen. Dann bietet sich ein Kostrukt aus swich case an. Man kann auch Bereiche angeben.
switch (messwert) {
case 0 ... 20:
Serial.print("LED1 an");
Serial.println(messwert);
break;
case 21 ... 40:
Serial.print("LED2 an");
Serial.println(messwert);
break;
.
.
.
Heinz
Ich hätte jetzt allerdings gedacht, dass bei höherer Drehzahl mehr Led leuchten sollen, statt einer anderen.
Die Led sollen bei kleinerer Drehzahl auch wieder ausgehen.
Im Beispiel mit der Dauer zwischen zwei Impulsen in ms
(Trabi = 2 Impulse / Umdrehung ?)
LED1 ab 300 RPM
LED2 ab 800
LED3 ab 1400
...
LED8 ab 6000
kannst du die Zuordnung einfach mit 8 Funktionsaufrufen für die 8 LED beliebig konfigurierbar machen, nicht unbedingt gleich
void loop(){
...
uint16_t cycle = 9999; // alle aus
if (millis() - lastpulse < 6000) cycle = millis() - lastpulse;
set(LED1, 300, cycle);
set(LED2, 800, cycle);
...
}
void set(byte pin, uint16_t limit, uint16_t cycle) {
digitalWrite(pin,cycle < 30000/limit);
}
Das geht auch ohne die breaks zwischendurch und dann hast nen schickes Mäuseklavier alias Vu-Meter 
// Forensketch Drehzahlanzeige mit LED
// https://forum.arduino.cc/t/drehzahlmesser-mit-arduino/1110796/7
const byte inputPin = A0;
const byte led[] = {10, 11, 12, 13};
const byte ledNums = sizeof(led);
void setup()
{
Serial.begin(115200);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
delay(300);
#endif
Serial.println(F("\r\nStart...\r\n"));
for (byte b = 0; b < ledNums; b++)
{
pinMode(led[b], OUTPUT);
digitalWrite(led[b], LOW);
}
}
void loop()
{
for (byte b = 0; b < ledNums; b++)
{
digitalWrite(led[b], LOW);
}
switch (analogRead(inputPin))
{
case 781 ... 1023:
digitalWrite(led[3], HIGH);
/* FALLTHROUGH */
case 511 ... 780:
digitalWrite(led[2], HIGH);
/* FALLTHROUGH */
case 256 ... 510:
digitalWrite(led[1], HIGH);
/* FALLTHROUGH */
case 0 ... 255:
digitalWrite(led[0], HIGH);
break;
}
}
@maxxer90 ich hab mich an Dein Foto gehalten - wenn die leds nicht anfangen zu leuchten, ist was faul...
Jungs was ihr hier rein zaubert ist mir noch einwenig zu hoch
. Da verstehe ich nur, wenn überhaupt die Hälfte.
Also erst Mal ist es ein brachialer 3 Zylinder 2takter.
und 12 LEDs 8 grüne und 4 gelbe. Die sollen alle Leuchten bei max. Drehzahl. Und ich sag jetzt Mal beispielhaft, bei 1000 eine bei 2000 zwei usw.
Was brauche ich um das Signal zubekommen.
Und viel wichtiger ist, wie macht ihr das mit dem Code hierrein schrieben? Ich würde gerne Mal meinen Code für das Poti hier rein stellen, das da Mal jemand drüberschauen kann und sagt was falsch ist.
Dann tu das doch. Bitte in Codetags. Wie das geht, steht hier.
Gruß Tommy
1 Like
int ledGruen1 = 13;
int ledGruen2 = 12;
int ledGelb =11;
int ledRot = 10;
int potPin = A0;
int potWert = 0;
void setup() {
Serial.begin(9600);
pinMode(ledGruen1, OUTPUT);
pinMode(ledGruen2,OUTPUT);
pinMode(ledGelb, OUTPUT);
pinMode(ledRot, OUTPUT);
pinMode(potPin, INPUT);
}
void loop() {
potWert = analogRead(potPin);
Serial.println(potWert);
delay(100);
digitalWrite(ledGruen1, HIGH);
if(potWert > 255);
else(potWert < 255);
digitalWrite(ledGruen2, HIGH);
if(potWert > 511);
else(potWert < 511);
digitalWrite(ledGelb, HIGH);
if(potWert > 766);
else(potWert < 766);
digitalWrite(ledRot, HIGH);
if(potWert > 900);
else(potWert <900);
}```
Das ist in 2er Hinsicht Unsinn.
- Das ; nach der Bedingung schließt das if kurz, es wirkt also nicht
- das else (Bedingung); tut zusätzlich nichts sinnvolles.
Besser wäre:
if (potWert >= 255) { tu was }
else if (potWert < 255) {tu was anderes}
Wenn beide Werte gleich sind, kann das zum Flackern führen, deshalb nimmt amn da einen Abstand rein - die Hysterese (z.B. >=255 und < 254 austesten)
Gruß Tommy
Deine LED's gehen nicht mehr aus.
Mein Code macht genau das selbe. Nur mit anderen Umschaltwerten - ist aber egal.
Einziger Unterschied: Da gehen die LED's auch aus.
@Tommy56 das mag er aber nicht 
Compilation error: expected primary-expression before 'else'
@my_xy_projekt das verstehe ich aber nicht. const byte led[] = {10, 11, 12, 13};
woher weis der arduino welche led er schalten soll?
ja, "tu was" kann er ja auch nicht kennen. Da weist ja nur Du, was Du tun sollst.
Etwas mitdenken ist schon sinnvoll.
Gruß Tommy
Ich kommentiere Dir den mal komplett:
// Forensketch Drehzahlanzeige mit LED
// https://forum.arduino.cc/t/drehzahlmesser-mit-arduino/1110796/7
const byte inputPin = A0;
// Hier wird ein Array angelegt mit 4 Elementen
// Die Elemente beginnen ab 0 an zu zählen
// Das letzte Element ist damit 3
// led[2] greift auf den INHALT des Elementes zu.
const byte led[] = {10, 11, 12, 13}; // 10 ist Element 0, 11 Element 1 usw..
const byte ledNums = sizeof(led); // Merker, fürs durchzählen
void setup()
{
Serial.begin(115200);
#if (defined(ARDUINO_AVR_MEGA) || defined(ARDUINO_AVR_MEGA2650)) // https://github.com/arduino/Arduino/issues/10764
delay(300);
#endif
Serial.println(F("\r\nStart...\r\n"));
// Hier zähle ich alle led durch
// b fängt bei 0 an und das letzte b ist dann 3 (weil kleiner 4 -> Siehe ledNums)
for (byte b = 0; b < ledNums; b++)
{
pinMode(led[b], OUTPUT); // Hier greife ich auf den Inhalt von Element [b] zu
digitalWrite(led[b], LOW); // Hier auch
}
}
void loop()
{
for (byte b = 0; b < ledNums; b++) // Das ist das selbe wie im setup()
{
digitalWrite(led[b], LOW); // Jedes Element des Array wird aufgerufen und der Pin aus gemacht
}
switch (analogRead(inputPin)) // einlesen des analogwertes führt sofort zum sprung zum case
{
case 781 ... 1023: // wenn also fast am Anschlag
digitalWrite(led[3], HIGH); // macht er den Pin der sich hinter dem Element versteckt wieder an
/* FALLTHROUGH */ // Das hier ist eine Anweisung an den Kompiler das fehlende break zu ignorieren
// hier würde normalerweise ein break stehen
// fehlt dieses, warnt der Compiler davor und in späteren Versionen könnte er den Dienst versagen
case 511 ... 780:
digitalWrite(led[2], HIGH); // Mit jedem weiteren case passiert genau das selbe ...
/* FALLTHROUGH */
case 256 ... 510:
digitalWrite(led[1], HIGH);
/* FALLTHROUGH */
case 0 ... 255:
digitalWrite(led[0], HIGH);
break;
// ... und es bleiben damit alle LEDs zwischendurch auch an
}
}
1 Like
Also ich muss mich nochmal entschuldigen. Ich kenne die ganzen Begriffe nicht beim Code schreiben. Ich schreibe zb auch nur int davor weil es in einen Video gesagt wurde, das es davor stehen muss.
Pinmode, digitalwrite leuchtet mir schon ein.
Für mein Verständnis ist es halt so logisch, das wenn ich
digitalwrite(Led, high)
If(potwert 255)
Schriebe, das er weiß daß er die LED anschalten soll.
Und bei
Else(potwert 254)
aus.
Ich verstehe das eben noch nicht. Bzw weiß ich es nicht anders.
Da die LED als Kette leuchten sollen (wenn ich das richtig verstanden habe) gibt es ja eigentlich nur einen Schaltwert (und evtl. 1 bis 2 tiefer als Ausschaltschwelle).
Das schreit doch förmlich nach einem Struct mit init und check (an oder aus) bzw. einer class.
Ein switch/case mit Bereich halte ich da für weniger zielführend.
Gruß Tommy
Naja, ich hab auch mal angefangen. Bin bis heute noch nicht weiter.
Aber warum nicht erstmal einige Grundlagen?
Geht natürlich auch mit if... oder mit struct...
Aber das case hat schon erschreckt

Ich würde es so machen (ungetestet, aber kompiliert), als Beispiel mit 2 LED und deren Anschaltwerten. Für 12 LED muss nur das Array arr erweitert werden.
// Forensketch LEDLeiste
class LedInLeiste {
public:
LedInLeiste(byte pin, uint16_t anWert) : pin{pin}, anWert{anWert} {};
void init() {
pinMode(pin, OUTPUT);
}
void check(uint16_t aktWert) {
if (aktWert >= anWert) digitalWrite(pin, HIGH);
else if (aktWert < anWert-2) digitalWrite(pin, LOW);
}
private:
byte pin;
uint16_t anWert;
};
// jeweils pin, Anschaltwert
LedInLeiste arr[] = {
{2,255},
{3, 312}
};
const byte anz = sizeof(arr) / sizeof(arr[0]);
void setup() {
for(byte i=0; i < anz;i++) arr[i].init();
}
void loop() {
uint16_t aktual = analogRead(A0); // wert auslesen
for(byte i=0; i < anz; i++) arr[i].check(aktual); // an-/ausschalten
}
Evtl. ist das für den TO im Moment zu hoch, aber er kann ja mal mit Tante Google oder besser einem guten C++-Buch sich den Inhalt erarbeiten.
Gruß Tommy
1 Like