Forum: Mikrocontroller und Digitale Elektronik Arduino, Freematics und OBD2


von Arduino OBD2 (Gast)


Lesenswert?

Hallo,
so langsam bin ich wirklich am Verzweifeln und sehe den Wald vor lauter 
Bäumen nicht.

Ich habe diesen Adapter in Version 1.
https://freematics.com/pages/products/freematics-obd-ii-uart-adapter-mk2/

Nun möchte ich abhängig von der Drehzahl oder der Stellung des Gaspedals 
einen WS2812B Streifen leuchten lassen.

Im Code unten lese ich gerade die Stellung vom Gaspedal aus. Über den 
Seriellen Monitor klappt das auch prima, nur der Streifen leuchtet nicht 
so wie er soll. Eigentlich sollen jeweils zwei Leds für 25% leuchten.

Findet jemand von euch den Fehler? Und wahrscheinlich gibt es 100 
bessere Wege, um das besser zu programmieren. Ich bin noch neu und würde 
mich über generelle Tipps auch freuen. :)
1
#include <Adafruit_NeoPixel.h> //Bibliotheken einbinden
2
#include <SoftwareSerial.h>
3
#include <OBD2UART.h>
4
5
#define PIN 6 //DatenPin der WS2812B
6
7
Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, PIN, NEO_GRB + NEO_KHZ800); //Anzahl der Leds, DatenPin
8
SoftwareSerial mySerial(10, 11); // RX, TX //Für das Debuggen
9
COBD obd;
10
11
void setup() {
12
  strip.begin();
13
  strip.show(); // Schalte alle LEDS aus
14
  obd.begin(); //OBD starten
15
  mySerial.begin(9600); //Serielle Kommunikation starten
16
  while (!mySerial); //Warten, bis Serielle Kommunikation bereit
17
  mySerial.println("Seriell bereit!");
18
  while (!obd.init()); //Warten, bis OBD bereit
19
  mySerial.println("OBD bereit!");
20
}
21
22
void loop() {
23
  int Drehzahl;
24
  if (obd.readPID(PID_THROTTLE, Drehzahl)) {
25
    mySerial.println(Drehzahl);
26
    //int range = map(Drehzahl, 0, 100, 0, 3);
27
    if (Drehzahl < 25)
28
      strip.setPixelColor(0, 100, 0, 0);
29
    strip.setPixelColor(1, 100, 0, 0);
30
    strip.setPixelColor(2, 0, 0, 0);
31
    strip.setPixelColor(3, 0, 0, 0);
32
    strip.setPixelColor(4, 0, 0, 0);
33
    strip.setPixelColor(5, 0, 0, 0);
34
    strip.setPixelColor(6, 0, 0, 0);
35
    strip.setPixelColor(7, 0, 0, 0);
36
    strip.show();
37
    if ((Drehzahl > 25 ) && (Drehzahl < 50)) {
38
      strip.setPixelColor(0, 100, 0, 0);
39
      strip.setPixelColor(1, 100, 0, 0);
40
      strip.setPixelColor(2, 100, 0, 0);
41
      strip.setPixelColor(3, 100, 0, 0);
42
      strip.setPixelColor(4, 0, 0, 0);
43
      strip.setPixelColor(5, 0, 0, 0);
44
      strip.setPixelColor(6, 0, 0, 0);
45
      strip.setPixelColor(7, 0, 0, 0);
46
      strip.show();
47
      if ((Drehzahl > 50 ) && (Drehzahl < 75)) {
48
        strip.setPixelColor(0, 100, 0, 0);
49
        strip.setPixelColor(1, 100, 0, 0);
50
        strip.setPixelColor(2, 100, 0, 0);
51
        strip.setPixelColor(3, 100, 0, 0);
52
        strip.setPixelColor(4, 100, 0, 0);
53
        strip.setPixelColor(5, 100, 0, 0);
54
        strip.setPixelColor(6, 0, 0, 0);
55
        strip.setPixelColor(7, 0, 0, 0);
56
        strip.show();
57
        if (Drehzahl > 75 ) {
58
          strip.setPixelColor(0, 100, 0, 0);
59
          strip.setPixelColor(1, 100, 0, 0);
60
          strip.setPixelColor(2, 100, 0, 0);
61
          strip.setPixelColor(3, 100, 0, 0);
62
          strip.setPixelColor(4, 100, 0, 0);
63
          strip.setPixelColor(5, 100, 0, 0);
64
          strip.setPixelColor(6, 100, 0, 0);
65
          strip.setPixelColor(7, 1a00, 0, 0);
66
          strip.show();
67
        }
68
      }
69
    }
70
  }
71
}

von Robin F. (gehacktes)


Lesenswert?

Du darfst keine Abfrage in einer Abfrage einbauen.
Wenn die Drehzahl größer als 25 ist, kommst du nicht in die anderen 
Bedingung rein.

Probier es mal so:
1
if (Drehzahl < 25)
2
 strip.setPixelColor(0, 100, 0, 0);
3
 strip.setPixelColor(1, 100, 0, 0);
4
 strip.setPixelColor(2, 0, 0, 0);
5
 strip.setPixelColor(3, 0, 0, 0);
6
 strip.setPixelColor(4, 0, 0, 0);
7
 strip.setPixelColor(5, 0, 0, 0);
8
 strip.setPixelColor(6, 0, 0, 0);
9
 strip.setPixelColor(7, 0, 0, 0);
10
 strip.show();
11
}
12
if ((Drehzahl > 25 ) && (Drehzahl < 50)) {
13
 strip.setPixelColor(0, 100, 0, 0);
14
 strip.setPixelColor(1, 100, 0, 0);
15
 strip.setPixelColor(2, 100, 0, 0);
16
 strip.setPixelColor(3, 100, 0, 0);
17
 strip.setPixelColor(4, 0, 0, 0);
18
 strip.setPixelColor(5, 0, 0, 0);
19
 strip.setPixelColor(6, 0, 0, 0);
20
 strip.setPixelColor(7, 0, 0, 0);
21
 strip.show();
22
}
23
if ((Drehzahl > 50 ) && (Drehzahl < 75)) {
24
 strip.setPixelColor(0, 100, 0, 0);
25
 strip.setPixelColor(1, 100, 0, 0);
26
 strip.setPixelColor(2, 100, 0, 0);
27
 strip.setPixelColor(3, 100, 0, 0);
28
 strip.setPixelColor(4, 100, 0, 0);
29
 strip.setPixelColor(5, 100, 0, 0);
30
 strip.setPixelColor(6, 0, 0, 0);
31
 strip.setPixelColor(7, 0, 0, 0);
32
 strip.show();
33
}
34
if (Drehzahl > 75 ) {
35
 strip.setPixelColor(0, 100, 0, 0);
36
 strip.setPixelColor(1, 100, 0, 0);
37
 strip.setPixelColor(2, 100, 0, 0);
38
 strip.setPixelColor(3, 100, 0, 0);
39
 strip.setPixelColor(4, 100, 0, 0);
40
 strip.setPixelColor(5, 100, 0, 0);
41
 strip.setPixelColor(6, 100, 0, 0);
42
 strip.setPixelColor(7, 1a00, 0, 0);
43
 strip.show();
44
}

: Bearbeitet durch User
von Arduino OBD2 (Gast)


Lesenswert?

Robin F. schrieb:
> Du darfst keine Abfrage in einer Abfrage einbauen.
> Wenn die Drehzahl größer als 25 ist, kommst du nicht in die anderen
> Bedingung rein.

Ah, das klingt logisch. Vielen Dank für den Tipp.

Robin F. schrieb:
> Probier es mal so:

Werde ich morgen nach der Arbeit gleich ausprobieren.

von Robin F. (gehacktes)


Lesenswert?

Arduino OBD2 schrieb:
> if (Drehzahl > 75 ) {
>           strip.setPixelColor(0, 100, 0, 0);
>           strip.setPixelColor(1, 100, 0, 0);
>           strip.setPixelColor(2, 100, 0, 0);
>           strip.setPixelColor(3, 100, 0, 0);
>           strip.setPixelColor(4, 100, 0, 0);
>           strip.setPixelColor(5, 100, 0, 0);
>           strip.setPixelColor(6, 100, 0, 0);
>           strip.setPixelColor(7, 1a00, 0, 0);  // <-- 1a00 = 100
>           strip.show();

und denk dran den Schreibfehler mit raus zu nehmen.

von chris (Gast)


Lesenswert?

Arduino OBD2 schrieb:
> if (Drehzahl < 25)
>       strip.setPixelColor(0, 100, 0, 0);

Da fehlen geschweifte Klammern um den Block.
Aktuell fällt nur die Zeile "strip.setPixelColor(0, 100, 0, 0);" unter 
die if-Abfrage. Die darauffolgenden werden immer ausgeführt.

Und natürlich wie oben gesagt die ifs nicht ineinander schachteln.

von H.Joachim S. (crazyhorse)


Lesenswert?

noch ein paar Ungenauigkeiten -  was passiert bei 25 und 50?

Und einfacher wirds so herum (ohne doppelte Bedingungen)
if (Drehzahl > 75)
   {
   }
   else if (Drehzahl>50)
.
.
.
      else {     //<25
            }

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Achte auch auf die geshweiften Klammern.

Müsste Es selber testen, denke aber, daß Deine ganzen Abschnitte:
1
if (Drehzahl < 25)
2
      strip.setPixelColor(0, 100, 0, 0);
3
    strip.setPixelColor(1, 100, 0, 0);
4
    strip.setPixelColor(2, 0, 0, 0);
5
    strip.setPixelColor(3, 0, 0, 0);
6
    strip.setPixelColor(4, 0, 0, 0);
7
    strip.setPixelColor(5, 0, 0, 0);
8
    strip.setPixelColor(6, 0, 0, 0);
9
    strip.setPixelColor(7, 0, 0, 0);
10
    strip.show();
nur je die erste Zeile unter der IF-Abfrage bedingt ausführen.
Die restlichen Zeilen dürften, meiner Meinung nach, nicht mehr zur 
IF-Abfrage gehören und somit immer ausgeführt werden - und dort löscht 
Du die LEDs (bis auf die 1).
Dadurch sollten aber alle IF-Abfragen abgearbeitet werden, da Diese ja 
auch nur in einer 'nächsten Zeile' stehen.

Rein spekulativ :)
Das Klammern-Gewirr gliedert aber auch, wenn Es eigentlich nicht 
benötigt wird.

MfG

: Bearbeitet durch User
von Arduino OBD2 (Gast)


Lesenswert?

Danke für die viele Hilfe. :-)
Damit werde ich das bestimmt hinbekommen.
Wünsche euch allen ein schönes Wochenende.

von Arduino OBD2 (Gast)


Lesenswert?

So klappt es nun. Nochmal danke für die schnelle Hilfe. Den Rest schaffe 
ich nun wohl alleine.

Zwei weitere Fragen habe ich aber noch.

1.
Wie funktioniert dieses Modul?
http://www.happylightshow.com/happyblue/happyblue-1.html
Die Werte kann ich mit meinem Gerät und einem Arduino ja bereits 
auslesen, aber kann ich auch irgendwelche Sachen senden?

2.
Ich möchte mehrere Modis haben, welche mit einem Taster umgeschaltet 
werden können. Wie realisiert man das mit dem Arduino am besten? Ein 
Begriff zum Googeln würde mir schon reichen. Ich finde einfach nicht das 
richtige. :-)

1
#include <Adafruit_NeoPixel.h> //Bibliotheken einbinden
2
#include <SoftwareSerial.h>
3
#include <OBD2UART.h>
4
5
#define PIN 6 //DatenPin der WS2812B
6
7
Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, PIN, NEO_GRB + NEO_KHZ800); //Anzahl der Leds, DatenPin
8
SoftwareSerial mySerial(10, 11); // RX, TX //Für das Debuggen
9
COBD obd;
10
11
12
void setup() {
13
  strip.begin();
14
  strip.show(); // Schalte alle LEDS aus
15
  strip.show(); // Schalte alle LEDS aus
16
  obd.begin(); //OBD starten
17
  while (!mySerial); //Warten, bis Serielle Kommunikation bereit
18
  mySerial.println("Seriell bereit!");
19
  while (!obd.init()); //Warten, bis OBD bereit
20
  mySerial.println("OBD bereit!");
21
}
22
23
void loop() {
24
  int Drehzahl;
25
  if (obd.readPID(PID_THROTTLE, Drehzahl)) {
26
    mySerial.println(Drehzahl);
27
  }
28
  if (Drehzahl <= 25) {
29
    {
30
      strip.setPixelColor(0, 100, 0, 0);
31
      strip.setPixelColor(1, 100, 0, 0);
32
      strip.setPixelColor(2, 0, 0, 0);
33
      strip.setPixelColor(3, 0, 0, 0);
34
      strip.setPixelColor(4, 0, 0, 0);
35
      strip.setPixelColor(5, 0, 0, 0);
36
      strip.setPixelColor(6, 0, 0, 0);
37
      strip.setPixelColor(7, 0, 0, 0);
38
      strip.show();
39
    }
40
  }
41
  if ((Drehzahl > 25 ) && (Drehzahl <= 50)) {
42
    {
43
      strip.setPixelColor(0, 100, 0, 0);
44
      strip.setPixelColor(1, 100, 0, 0);
45
      strip.setPixelColor(2, 100, 0, 0);
46
      strip.setPixelColor(3, 100, 0, 0);
47
      strip.setPixelColor(4, 0, 0, 0);
48
      strip.setPixelColor(5, 0, 0, 0);
49
      strip.setPixelColor(6, 0, 0, 0);
50
      strip.setPixelColor(7, 0, 0, 0);
51
      strip.show();
52
    }
53
  }
54
  if ((Drehzahl > 50 ) && (Drehzahl <= 75)) {
55
    {
56
      strip.setPixelColor(0, 100, 0, 0);
57
      strip.setPixelColor(1, 100, 0, 0);
58
      strip.setPixelColor(2, 100, 0, 0);
59
      strip.setPixelColor(3, 100, 0, 0);
60
      strip.setPixelColor(4, 100, 0, 0);
61
      strip.setPixelColor(5, 100, 0, 0);
62
      strip.setPixelColor(6, 0, 0, 0);
63
      strip.setPixelColor(7, 0, 0, 0);
64
      strip.show();
65
    }
66
  }
67
  if (Drehzahl > 75 ) {
68
    {
69
      strip.setPixelColor(0, 100, 0, 0);
70
      strip.setPixelColor(1, 100, 0, 0);
71
      strip.setPixelColor(2, 100, 0, 0);
72
      strip.setPixelColor(3, 100, 0, 0);
73
      strip.setPixelColor(4, 100, 0, 0);
74
      strip.setPixelColor(5, 100, 0, 0);
75
      strip.setPixelColor(6, 100, 0, 0);
76
      strip.setPixelColor(7, 100, 0, 0);
77
      strip.show();
78
    }
79
  }
80
}

von Arduino OBD2 (Gast)


Lesenswert?

Niemand? :-)

von Bastler (Gast)


Lesenswert?

Schalter an ein paar digitalpins und dann DigitalRead. Abhängig vom 
gelesenen Wert dann if oder eine andere Programmablaufseuerung benutzen.

https://www.arduino.cc/en/Reference/DigitalRead

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Debounce (Entprellen) - dazu gibt es auch eine Lib
https://www.arduino.cc/en/Tutorial/Debounce
Wenn man mechanische Taster nimmt, sieht der µC durch das Prellen 
mehrere Tastungen - kann beim Durchblättern eines Menü zu Frust führen.

OBD_II scheint ein interessantes Thema zu sein - vll. gebe ich Da auch 
Mal was Geld aus ... Jemand Erfahrungen damit?

MfG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.