Arduino, Freematics und OBD2

Gast #5136028
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
}
#5136073
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
}
#5136086
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.
Gast #5136087
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.
#5136102
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
Gast #5136767
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren