IF Abfrage

Hallo zusammen,

ich weiß nicht weiter und hoffe, dass mir einer von euch auf die Sprünge helfen kann.

ich habe diesen Sketch

#include <Canbus.h>
#include <SPI.h>
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9340.h"

//Define pins for tft display
#define _sclk 13
#define _miso 12
#define _mosi 11
#define _cs 9
//#define _sdcs 5
#define _rst 5
#define _dc 4

// Define color
#define	BLACK           0x0000
#define	BLUE            0x001F
#define	RED             0xF800
#define	GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0  
#define WHITE           0xFFFF
#define ORANGE          0xFD20

Adafruit_ILI9340 tft = Adafruit_ILI9340(_cs, _dc, _rst);

//int data;
char buffer[300];  //Data will be temporarily stored to this buffer before being written to the file
int data;

void setup()
{

// Set CAN to 500 Kbit/s 
Canbus.init(CANSPEED_500);

tft.begin();
 
  //Print RPM
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.setCursor(30, 30);
  tft.print("rpm: ");
  tft.setTextSize(2);
  
  //Print km/h
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  tft.setCursor(30, 150);
  tft.print("km/h: ");
  tft.setTextSize(2);
  
  //Print Version
  tft.setTextColor(WHITE);        
  tft.setTextSize(1);
  tft.setCursor(290, 230);
  tft.println("V 1.4"); 
}


void loop()

{ 
  
  Canbus.ecu_req(ENGINE_RPM, buffer);
  tft.setCursor(90, 150);
  tft.setTextSize(2);
    if (ENGINE_RPM < 2000) tft.setTextColor(GREEN, BLACK);
    if (ENGINE_RPM > 2000) tft.setTextColor(ORANGE, BLACK);
    if (ENGINE_RPM > 4000) tft.setTextColor(RED, BLACK);
  tft.print(buffer);
  
   if (ENGINE_RPM < 1000) tft.print(' ');
   if (ENGINE_RPM < 100) tft.print(' ');
   if (ENGINE_RPM < 10) tft.print(' ');
    
  Canbus.ecu_req(VEHICLE_SPEED, buffer);
  tft.setCursor(80, 30);
  tft.setTextSize(2);
  tft.print(buffer);
  
   if (VEHICLE_SPEED < 1000) tft.print(' ');
   if (VEHICLE_SPEED < 100) tft.print(' ');
   if (VEHICLE_SPEED < 10) tft.print(' ');
 
}

und möchte mit einer IF Abfrage

    if (ENGINE_RPM < 2000) tft.setTextColor(GREEN, BLACK);
    if (ENGINE_RPM > 2000) tft.setTextColor(ORANGE, BLACK);
    if (ENGINE_RPM > 4000) tft.setTextColor(RED, BLACK);

lediglich die Farbe ändern.

Leider passiert nichts.
Liegt es daran, dass der Wert erst in einen buffer geschrieben wird?
Hat hier vielleicht jemand eine Idee woran es liegen könnte?
Ich habe jetzt wirklich viel probiert aber alles ohne Erfolg.

Besten Dank schonmal und Gruß

Hallo,

hast Du schon mal ENGINE_RPM auf dem seriellen Monitor ausgegeben?
Wie sind die Werte

Hallo Juergen,

vielen Dank für deine schnelle Antwort.

Anbei ein Bild was auf dem Serial ausgegeben wird.

Benötigt hier VEHICLE_SPEED und ENGINE_RPM jeweils einen buffer oder reicht einer?

Gruß

ändern doch mal die if-Verzweigungen dahin:
if (ENGINE_RPM < 2000)
{
tft.setTextColor(GREEN, BLACK);
Serial.Write(“GREEN”)
}

Usw. dann siehst Du wo er vorbei kommt

Danke für den Tipp, haut aber auch nicht hin.

      if (ENGINE_RPM < 2000) 
{
    Serial.print("GREEN: ");
    Serial.println(buffer);
}

   if (ENGINE_RPM > 2000) 
{
    Serial.print("ORANGE: ");
    Serial.println(buffer);
}

Schreibt nur GREEN und den Wert, egal wie hoch die Drehzahl ist :frowning:

gib mal statt "buffer" die Variable "ENGINE_RPM" aus. Die wird ja auch in der Verzweigung abgefragt

dann erscheint nur eine 12

Dann untersuch mal diese Stelle:

   Canbus.ecu_req(ENGINE_RPM, buffer);

genauer

Des weiteren setz man hier eine if-Verschachtlung besser ein. Bei RPM > 4000 sendest du an das Dispay einmal zu viel. Auch hat der Wert 2000 keine Auswirkungen auf die Farbe!

   if (ENGINE_RPM < 2000) tft.setTextColor(GREEN, BLACK);
    if (ENGINE_RPM > 2000) tft.setTextColor(ORANGE, BLACK);
    if (ENGINE_RPM > 4000) tft.setTextColor(RED, BLACK);
if(RPM < 2000) GREEN;
else if(RPM >= 2000 && RPM < 4000) BLACK;
else RED;

JuergenR:
Dann untersuch mal diese Stelle:

   Canbus.ecu_req(ENGINE_RPM, buffer);

genauer

Hmm, das habe ich aus dem Beispielsketch so übernommen!?

Ich benutze die LIB von Sparkfun zusammen mit dem entsprechendem Board.

@sschultewolter
Der Wert 2000 soll ja auch die ausgelesene Umdrehung des Motors darstellen.
Ich habe das mit einer anderen lib von seedstudio schon erfolgreich getestet.
Daher bin ich davon ausgegangen, man kann es hier genauso machen.

Versteh ich nicht, die fehlen da scheinbar noch einfache C-Kenntnisse. Bei deiner if-Anweisung wird für 2000 nie eine Farbe gesetzt. Es wird immer die zuletzt genutze sein. Wenn du irgendwo zwischenzeitig noch einen Text mit Textfarbe PINK auf das das Display schreibst, wird bei 2000 die Schriftfarbe auch PINK sein.

Die Funktion Canbus.ecu_req(ENGINE_RPM, buffer) liefert in der Variablen "buffer" Ziffer für Ziffer die Drehzahl; d.h. man muss aus buffer die Zahl zusammenbauen, in einer Variable speichern, mit z.B.:
Drehzahl = atoi (buffer); (Drehzahl muss als int vorher deklariert werden)
Dann im if auf die Variable "Drehzahl" abfragen.

Wenn ENGINE_RPM kleiner 2000 dann Schrift Grün
Wenn ENGINE_RPM größer 2000 dann Schrift Orange
Wenn ENGINE_RPM größer 4000 dann Schrift Rot

So habe ich es bei einem anderen Sketch mit einer anderen Lib gemacht und es hat funktioniert!

@merlini
Vielen Dank, das klappt prima!
Könntest Du mir bitte noch eine Frage beantworten?
Und zwar würde ich gerne einen weiteren Wert wie

Canbus.ecu_req(VEHICLE_SPEED, buffer);

ebenfalls mit auf das Display ausgeben. Hier stellt sich mir die Frage wie ich diesen Wert in einem "anderen" buffer speichere und ausgeben soll.

Vielen Dank Vorab

Wenn du einen Wert ausgelesen und per atoi() konvertiert hast, kannst du den gleichen Puffer für was anderes verwenden.

Serenifly:
Wenn du einen Wert ausgelesen und per atoi() konvertiert hast, kannst du den gleichen Puffer für was anderes verwenden.

Klasse, das klappt auch!

TAUSEND DANK !!!

Aber mal angenommen man möchte einen zweiten buffer erstellen, wie würde man das tun?

Gruß

Beachte dass dein erster Puffer schon 300 Bytes groß ist (wobei der vielleicht auch kleiner sein kann):

char buffer[300];

Auf einem Mega kein Problem, aber der UNO hat nicht viel RAM. Ansonsten so wie den ersten. Halt mit einem anderen Namen.

Strings in C sind lediglich Null-terminierte char Arrays. Keine eigene Klasse wie in anderen Sprachen. Also jedes Zeichen ist ein char im Array. Und am Schluss kommt ein NULL/0/'\0' um das Ende zu markieren

Pauzer:
Wenn ENGINE_RPM kleiner 2000 dann Schrift Grün
Wenn ENGINE_RPM größer 2000 dann Schrift Orange
Wenn ENGINE_RPM größer 4000 dann Schrift Rot

Dann überlege mal, welche Farbe bei RPM 2000 erfolgen soll!! Die Abfrage ist so definitiv ungeschickt. Auch wird die Farbe 2x gesetzt, wenn RPM größer 4000.

@ Serenifly

ein anderer name wäre dann ?

Char buffer1[300];

@ sschultewolter

Ok, da hast Du natürlich vollkommen recht mit!
Ich stecke da auch nicht so dolle drin, daher frage ich ja hier :wink:
Werde deinen Vorschlag aber mal versuchen umzusetzen, danke dafür!

Gruß

Ja, aber das ist Unsinn. Wieso willst du 2 x 300 Bytes nur für Puffer? Die einzige Alternative die bei sowas u.U. sinnvoll sein kann ist jeweils nur einen kleinen Puffer lokal anzulegen. Aber wenn man einen globalen Puffer hat kann man den auch immer wiederverwenden.

Bei den if-Abfragen musst du eben if-else verwenden und dafür sorgen dass alles abgedeckt ist. Also auch mal <= oder >= machen

Alles klar, vielen Dank für die ausführliche Erklärung!