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.
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);
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.
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.
Ok, da hast Du natürlich vollkommen recht mit!
Ich stecke da auch nicht so dolle drin, daher frage ich ja hier
Werde deinen Vorschlag aber mal versuchen umzusetzen, danke dafür!
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