Kleur tekst afhankelijk van waarde

algemene C code
Gebruikers-avatar
Berichten: 11
Geregistreerd: 06 Sep 2015, 10:22

Kleur tekst afhankelijk van waarde

Berichtdoor pjcvdpol » 11 Nov 2018, 11:53

Hoi,

Mijn CV installatie draait op een hout-CV kachel met een buffervat van 1000 liter. Ik wil de temperatuur van dit vat gaan meten en laten zien op een schermpje. De temperatuur wordt gemeten op vier plekken: bovenin, 2 x in het midden en onderin; buffervaten hebben een "gelaagdheid" in de temperatuur: boven warm, onder koud.

De temperatuurwaarde die op het TFT schermpje wordt weergegeven wil ik een kleur meegeven die afhankelijk is van de temperatuur die gemeten wordt:

> 80 graden rood
> 60 < 80 Oranje
> 40 < 60 Geel
> 30 < 40 donkerblauw
en anders (lager dan 30) lichtblauw.

Op deze manier zie ik in één oogopslag wat de temperatuur is en wanneer in kan stoppen met stoken: onderin geel/oranje/rood = stoppen.

Ik heb een Uno met 4 DS18b20 sensoren via one-wire aangesloten. Daarop een TFT schermpje dat de ILI9225 library gebruikt. Andere libraries werkten niet.

Ik heb moeite met de code om de waardes temperatuurafhankelijk te laten weergeven. Zónder afhankelijkheid werkt het perfect, maar ik heb een fout in mijn code om de waardes afhankelijk mee te geven: er verschijnt dan niets op het scherm. Ik ben géén programmeur, en denk dat het iets heel simpels is dat ik niet weet; ik heb me rot gezocht maar kan de oplossing niet vinden. Wie wil meekijken?

Ik krijg deze foutmelding met compileren:

Code: Alles selecteren
arduino-1.8.7/hardware/arduino/avr/cores/arduino/WString.h:146:16: note:   initializing argument 1 of 'unsigned char String::operator<(const String&) const'
  unsigned char operator <  (const String &rhs) const;


Het gaat om dit stukje (hele schets eronder)

Code: Alles selecteren
  tft.drawText(10, 40, "Boven:", COLOR_DARKGREEN);
//    tft.drawText(120, 40, String(temp1));

     if (temp1 > 80){
     tft.drawText(120, 40, String(temp1), COLOR_RED);
  }else if (temp1 > 60 || temp1 < 80) {
     tft.drawText(120, 40, String(temp1), COLOR_ORANGE);
  } else if(temp1 > 40 || temp1 < 60){
    tft.drawText(120, 40, String(temp1), COLOR_YELLOW);
  } else if(temp1 > 30 || temp1 < 40){
     tft.drawText(120, 40, String(temp1), COLOR_DARKBLUE);
  } else {
    tft.drawText(120, 40, String(temp1), COLOR_CYAN);
  }

 
   tft.drawText(10, 60, "Midden 1:", COLOR_DARKGREEN);
     tft.drawText(120, 60, String(temp2));



En de hele schets:

Code: Alles selecteren
// TFT Resolution 176x220 DRIVER ILI9225 Bus: SPI

// Include application, user and local libraries
#include "SPI.h"
#include "TFT_22_ILI9225.h"
#include <OneWire.h>
#include <DallasTemperature.h>

// Data Sensors to Arduino pin 2
#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);
 
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// TFT Screen
#ifdef ARDUINO_ARCH_STM32F1

#else
#define TFT_RST 8
#define TFT_RS  9
#define TFT_CS  10  // SS
#define TFT_SDI 11  // MOSI
#define TFT_CLK 13  // SCK
#define TFT_LED 3   // 0 if wired to +5V directly
#endif
#define TFT_BRIGHTNESS 100 // Initial brightness of TFT backlight (optional)

// Use hardware SPI (faster - on Uno: 13-SCK, 12-MISO, 11-MOSI)
TFT_22_ILI9225 tft = TFT_22_ILI9225(TFT_RST, TFT_RS, TFT_CS, TFT_LED, TFT_BRIGHTNESS);

// Variables and constants
uint16_t x, y, w, h;
boolean flag = false;

void setup() {
 
  // put your setup code here, to run once:
tft.begin(); 
 Serial.begin(9600);

// Set the display to Landscape
 tft.setOrientation(1);
 tft.setFont(Terminal12x16);
 tft.drawText(10, 10, "I am starting up....", COLOR_DARKGREEN);
 tft.drawText(10, 35, "Relax :)", COLOR_RED);

 // Start up the Sensors library
  sensors.begin();

   // set the Sensor resolution to 9 bit - Valid values are 9, 10, or 11 bit.
  sensors.setResolution(9);
 
  delay(500);
}

void loop() {

  // put your main code here, to run repeatedly:

  sensors.requestTemperatures(); // Get temperatures
 // String sensor4 = String(sensors.getTempCByIndex(1),DEC); //DEC returns 10 decimals Change to 1 below
 
 String sensor1 = String(sensors.getTempCByIndex(0),1);
 String sensor2 = String(sensors.getTempCByIndex(1),1);
 String sensor3 = String(sensors.getTempCByIndex(2),1);
 String sensor4 = String(sensors.getTempCByIndex(3),1);

 String temp1 = String(sensor1);
 String temp2 = String(sensor2);
 String temp3 = String(sensor3);
 String temp4 = String(sensor4);
 
  Serial.println(temp1);
 
  Serial.println(temp2);

  Serial.println(temp3);
 
  Serial.println(temp4);

  Serial.println(   );
 
    delay(1000);
 
 // clean the display
 
    tft.clear();

    // draw line block 5 pixels from the border
   
//   tft.drawLine(5,5,215,5,COLOR_NAVY);     // hor TOP
//   tft.drawLine(5,5,5,171,COLOR_NAVY);     // vert LEFT
//   tft.drawLine(215,5,215,171,COLOR_NAVY);   // vert RIGHT
//   tft.drawLine(5,171,215,171,COLOR_NAVY);   // hor BOTTOM
   
  tft.setFont(Terminal12x16);
  tft.drawText(10, 10, "Buffervat:", COLOR_OLIVE);

 
 //  tft.setFont(Terminal6x8);

  tft.drawText(10, 40, "Boven:", COLOR_DARKGREEN);
//    tft.drawText(120, 40, String(temp1));

     if (temp1 > 80){
     tft.drawText(120, 40, String(temp1), COLOR_RED);
  }else if (temp1 > 60 || temp1 < 80) {
     tft.drawText(120, 40, String(temp1), COLOR_ORANGE);
  } else if(temp1 > 40 || temp1 < 60){
    tft.drawText(120, 40, String(temp1), COLOR_YELLOW);
  } else if(temp1 > 30 || temp1 < 40){
     tft.drawText(120, 40, String(temp1), COLOR_DARKBLUE);
  } else {
    tft.drawText(120, 40, String(temp1), COLOR_CYAN);
  }

 
   tft.drawText(10, 60, "Midden 1:", COLOR_DARKGREEN);
     tft.drawText(120, 60, String(temp2));
 
   tft.drawText(10, 80, "Midden 2: ", COLOR_DARKGREEN);
     tft.drawText(120, 80, String(temp3));
 
   tft.drawText(10, 100, "Onder:", COLOR_DARKGREEN);
     tft.drawText(120, 100, String(temp4));


delay (10000);


}

Advertisement

Gebruikers-avatar
Berichten: 11
Geregistreerd: 06 Sep 2015, 10:22

Re: Kleur tekst afhankelijk van waarde

Berichtdoor pjcvdpol » 11 Nov 2018, 15:20

Opgelost! Ik zat op een heel verkeerd spoor. Hier is de werkende code voor wie met hetzelfde probleem zit:

Code: Alles selecteren
// Peter van de Pol & many others :)
// TFT Resolution 176x220 DRIVER ILI9225 Bus: SPI

// Include application, user and local libraries
#include "SPI.h"
#include "TFT_22_ILI9225.h"
#include <OneWire.h>
#include <DallasTemperature.h>

// Data Sensors to Arduino pin 2
#define ONE_WIRE_BUS 2

OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// TFT Screen
#ifdef ARDUINO_ARCH_STM32F1

#else
#define TFT_RST 8
#define TFT_RS  9
#define TFT_CS  10  // SS
#define TFT_SDI 11  // MOSI
#define TFT_CLK 13  // SCK
#define TFT_LED 3   // 0 if wired to +5V directly
#endif
#define TFT_BRIGHTNESS 100 // Initial brightness of TFT backlight (optional)

// Use hardware SPI (faster - on Uno: 13-SCK, 12-MISO, 11-MOSI)
TFT_22_ILI9225 tft = TFT_22_ILI9225(TFT_RST, TFT_RS, TFT_CS, TFT_LED, TFT_BRIGHTNESS);

// Variables and constants
//uint16_t x, y, w, h;
//boolean flag = false;

void setup()
{
  // put your setup code here, to run once:
  tft.begin();
  Serial.begin(9600);
  // Set the display to Landscape
  tft.setOrientation(1);
  tft.setFont(Terminal12x16);
  tft.drawText(10, 10, "I am starting up....", COLOR_DARKGREEN);
  tft.drawText(10, 35, "Relax :)", COLOR_RED);
  // Start up the Sensors library
  sensors.begin();
  // set the Sensor resolution to 9 bit - Valid values are 9, 10, or 11 bit.
  sensors.setResolution(9);
  delay(500);
}

void loop()
{
  // put your main code here, to run repeatedly:
  sensors.requestTemperatures(); // Get temperatures
  // String sensor4 = String(sensors.getTempCByIndex(1),DEC); //DEC returns 10 decimals Change to 1 below
  float temp1 = sensors.getTempCByIndex(0);
  float temp2 = sensors.getTempCByIndex(1);
  float temp3 = sensors.getTempCByIndex(2);
  float temp4 = sensors.getTempCByIndex(3);
  Serial.println(temp1);
  Serial.println(temp2);
  Serial.println(temp3);
  Serial.println(temp4);
  Serial.println(   );
  delay(100);
 
 
  // clean the display
  tft.clear();
 
 
  // draw line block 5 pixels from the border
  //   tft.drawLine(5,5,215,5,COLOR_NAVY);     // hor TOP
  //   tft.drawLine(5,5,5,171,COLOR_NAVY);     // vert LEFT
  //   tft.drawLine(215,5,215,171,COLOR_NAVY);   // vert RIGHT
  //   tft.drawLine(5,171,215,171,COLOR_NAVY);   // hor BOTTOM
 
 
  tft.setFont(Terminal12x16);
  tft.drawText(10, 10, "Buffervat:", COLOR_OLIVE);

 // Print temperature dependent values
  tft.drawText(10, 40, "Boven:", COLOR_DARKGREEN);
  drawTempInColour(120, 40, temp1, GetColourForTemp(temp1));
 
  tft.drawText(10, 60, "Midden 1:", COLOR_DARKGREEN);
  drawTempInColour(120, 60, temp2, GetColourForTemp(temp2));
 
  tft.drawText(10, 80, "Midden 2: ", COLOR_DARKGREEN);
  drawTempInColour(120, 80, temp3, GetColourForTemp(temp3));
   
  tft.drawText(10, 100, "Onder:", COLOR_DARKGREEN);
  drawTempInColour(120, 100, temp4, GetColourForTemp(temp4));
 
  delay (1000);
}

void drawTempInColour(byte x, byte y,float temp,unsigned int colour)
{
char buf[16];
dtostrf(temp,6,1,buf);
tft.drawText(x, y, buf,colour); 
}

unsigned int GetColourForTemp(float temp)
{
unsigned int Colour = COLOR_DARKBLUE;
if (temp > 80)
  {
    Colour = COLOR_RED;
  }
else if (temp > 60)
  {
    Colour = COLOR_ORANGE;
  }
else if (temp > 40)
  {
    Colour = COLOR_YELLOW;
  }
else if (temp > 30)
  {
    Colour = COLOR_CYAN;
  }
return Colour;
}

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 13 gasten