Go Down

Topic: Wer kann Helfen?  (Read 184 times) previous topic - next topic

andy06m

May 23, 2016, 09:03 pm Last Edit: May 23, 2016, 10:35 pm by uwefed Reason: add [CODE] TAGs </>
Hallo zusammen
Ich wollte mal Höflich fragen ob einer Zeit hatt mir einen Code zu modifizieren?

Es geht darum das ich ein Demo - Sketch habe von einem analogen Meter der Automatisch Hoch und Runter leuft.
Ich möchte aber das er einen Wert von einem Pin anzeigt.(Temp.)

Ich weis leider nicht wie ich da vorgehen soll.

Währe nett wenn einer das mir umschreibt damit ich da weiss was zu ändern ist.
Danke schon mal im voraus.

Original Sketch:

Code: [Select]
/*
An example analogue meter using a HX8357 TFT LCD screen

Needs Font 2 (also Font 4 if using large scale label)

Make sure all the required fonts are loaded by editting the
User_Setup.h file in the TFT_HX8357 library folder.

 #########################################################################
 ###### DON'T FORGET TO UPDATE THE User_Setup.h FILE IN THE LIBRARY ######
 ######       TO SELECT THE FONTS AND PINS YOU USE, SEE ABOVE       ######
 #########################################################################

Updated by Bodmer for variable meter size
*/

// Define meter size as multiplier ot 240 pixels wide 1.0 and 1.3333 work OK
#define M_SIZE 1.3333

// #include <avr/dtostrf.h> // Only needed by Due

#include <TFT_HX8357.h> // Hardware-specific library

TFT_HX8357 tft = TFT_HX8357();       // Invoke custom library

#define TFT_GREY 0x5AEB

float ltx = 0;    // Saved x coord of bottom of needle
uint16_t osx = M_SIZE*120, osy = M_SIZE*120; // Saved x & y coords
uint32_t updateTime = 0;       // time for next update

int old_analog =  -999; // Value last displayed

int value[6] = {0, 0, 0, 0, 0, 0};
int old_value[6] = { -1, -1, -1, -1, -1, -1};
int d = 0;

void setup(void) {
 tft.init();
 tft.setRotation(1);
 Serial.begin(57600); // For debug
 tft.fillScreen(TFT_BLACK);

 analogMeter(); // Draw analogue meter

 updateTime = millis(); // Next update time
}


void loop() {
 if (updateTime <= millis()) {
   updateTime = millis() + 100; // Update emter every 35 milliseconds

   // Create a Sine wave for testing
   d += 4; if (d >= 360) d = 0;
   value[0] = 50 + 50 * sin((d + 0) * 0.0174532925);

   plotNeedle(value[0], 0); // It takes between 2 and 12ms to replot the needle with zero delay
 }
}


// #########################################################################
//  Draw the analogue meter on the screen
// #########################################################################
void analogMeter()
{

 // Meter outline
 tft.fillRect(0, 0, M_SIZE*239, M_SIZE*126, TFT_GREY);
 tft.fillRect(5, 3, M_SIZE*230, M_SIZE*119, TFT_WHITE);

 tft.setTextColor(TFT_BLACK);  // Text colour

 // Draw ticks every 5 degrees from -50 to +50 degrees (100 deg. FSD swing)
 for (int i = -50; i < 51; i += 5) {
   // Long scale tick length
   int tl = 15;

   // Coodinates of tick to draw
   float sx = cos((i - 90) * 0.0174532925);
   float sy = sin((i - 90) * 0.0174532925);
   uint16_t x0 = sx * (M_SIZE*100 + tl) + M_SIZE*120;
   uint16_t y0 = sy * (M_SIZE*100 + tl) + M_SIZE*140;
   uint16_t x1 = sx * M_SIZE*100 + M_SIZE*120;
   uint16_t y1 = sy * M_SIZE*100 + M_SIZE*140;

   // Coordinates of next tick for zone fill
   float sx2 = cos((i + 5 - 90) * 0.0174532925);
   float sy2 = sin((i + 5 - 90) * 0.0174532925);
   int x2 = sx2 * (M_SIZE*100 + tl) + M_SIZE*120;
   int y2 = sy2 * (M_SIZE*100 + tl) + M_SIZE*140;
   int x3 = sx2 * M_SIZE*100 + M_SIZE*120;
   int y3 = sy2 * M_SIZE*100 + M_SIZE*140;

   // Yellow zone limits
   //if (i >= -50 && i < 0) {
   //  tft.fillTriangle(x0, y0, x1, y1, x2, y2, TFT_YELLOW);
   //  tft.fillTriangle(x1, y1, x2, y2, x3, y3, TFT_YELLOW);
   //}

   // Green zone limits
   if (i >= 0 && i < 25) {
     tft.fillTriangle(x0, y0, x1, y1, x2, y2, TFT_GREEN);
     tft.fillTriangle(x1, y1, x2, y2, x3, y3, TFT_GREEN);
   }

   // Orange zone limits
   if (i >= 25 && i < 50) {
     tft.fillTriangle(x0, y0, x1, y1, x2, y2, TFT_ORANGE);
     tft.fillTriangle(x1, y1, x2, y2, x3, y3, TFT_ORANGE);
   }

   // Short scale tick length
   if (i % 25 != 0) tl = 8;

   // Recalculate coords incase tick lenght changed
   x0 = sx * (M_SIZE*100 + tl) + M_SIZE*120;
   y0 = sy * (M_SIZE*100 + tl) + M_SIZE*140;
   x1 = sx * M_SIZE*100 + M_SIZE*120;
   y1 = sy * M_SIZE*100 + M_SIZE*140;

   // Draw tick
   tft.drawLine(x0, y0, x1, y1, TFT_BLACK);

   // Check if labels should be drawn, with position tweaks
   if (i % 25 == 0) {
     // Calculate label positions
     x0 = sx * (M_SIZE*100 + tl + 10) + M_SIZE*120;
     y0 = sy * (M_SIZE*100 + tl + 10) + M_SIZE*140;
     switch (i / 25) {
       case -2: tft.drawCentreString("0", x0, y0 - 12, 2); break;
       case -1: tft.drawCentreString("25", x0, y0 - 9, 2); break;
       case 0: tft.drawCentreString("50", x0, y0 - 7, 2); break;
       case 1: tft.drawCentreString("75", x0, y0 - 9, 2); break;
       case 2: tft.drawCentreString("100", x0, y0 - 12, 2); break;
     }
   }

   // Now draw the arc of the scale
   sx = cos((i + 5 - 90) * 0.0174532925);
   sy = sin((i + 5 - 90) * 0.0174532925);
   x0 = sx * M_SIZE*100 + M_SIZE*120;
   y0 = sy * M_SIZE*100 + M_SIZE*140;
   // Draw scale arc, don't draw the last part
   if (i < 50) tft.drawLine(x0, y0, x1, y1, TFT_BLACK);
 }

 tft.drawString("%RH", M_SIZE*(5 + 230 - 40), M_SIZE*(119 - 20), 2); // Units at bottom right
 tft.drawCentreString("%RH", M_SIZE*120, M_SIZE*70, 4); // Comment out to avoid font 4
 tft.drawRect(5, 3, M_SIZE*230, M_SIZE*119, TFT_BLACK); // Draw bezel line

 plotNeedle(0, 0); // Put meter needle at 0
}

// #########################################################################
// Update needle position
// This function is blocking while needle moves, time depends on ms_delay
// 10ms minimises needle flicker if text is drawn within needle sweep area
// Smaller values OK if text not in sweep area, zero for instant movement but
// does not look realistic... (note: 100 increments for full scale deflection)
// #########################################################################
void plotNeedle(int value, byte ms_delay)
{
 tft.setTextColor(TFT_BLACK, TFT_WHITE);
 char buf[8]; dtostrf(value, 4, 0, buf);
 tft.drawRightString(buf, M_SIZE*40, M_SIZE*(119 - 20), 2);

 if (value < -10) value = -10; // Limit value to emulate needle end stops
 if (value > 110) value = 110;

 // Move the needle until new value reached
 while (!(value == old_analog)) {
   if (old_analog < value) old_analog++;
   else old_analog--;

   if (ms_delay == 0) old_analog = value; // Update immediately if delay is 0

   float sdeg = map(old_analog, -10, 110, -150, -30); // Map value to angle
   // Calcualte tip of needle coords
   float sx = cos(sdeg * 0.0174532925);
   float sy = sin(sdeg * 0.0174532925);

   // Calculate x delta of needle start (does not start at pivot point)
   float tx = tan((sdeg + 90) * 0.0174532925);

   // Erase old needle image
   tft.drawLine(M_SIZE*(120 + 20 * ltx - 1), M_SIZE*(140 - 20), osx - 1, osy, TFT_WHITE);
   tft.drawLine(M_SIZE*(120 + 20 * ltx), M_SIZE*(140 - 20), osx, osy, TFT_WHITE);
   tft.drawLine(M_SIZE*(120 + 20 * ltx + 1), M_SIZE*(140 - 20), osx + 1, osy, TFT_WHITE);

   // Re-plot text under needle
   tft.setTextColor(TFT_BLACK);
   tft.drawCentreString("%RH", M_SIZE*120, M_SIZE*70, 4); // // Comment out to avoid font 4

   // Store new needle end coords for next erase
   ltx = tx;
   osx = M_SIZE*(sx * 98 + 120);
   osy = M_SIZE*(sy * 98 + 140);

   // Draw the needle in the new postion, magenta makes needle a bit bolder
   // draws 3 lines to thicken needle
   tft.drawLine(M_SIZE*(120 + 20 * ltx - 1), M_SIZE*(140 - 20), osx - 1, osy, TFT_RED);
   tft.drawLine(M_SIZE*(120 + 20 * ltx), M_SIZE*(140 - 20), osx, osy, TFT_MAGENTA);
   tft.drawLine(M_SIZE*(120 + 20 * ltx + 1), M_SIZE*(140 - 20), osx + 1, osy, TFT_RED);

   // Slow needle down slightly as it approaches new postion
   if (abs(old_analog - value) < 10) ms_delay += ms_delay / 5;

   // Wait before next update
   delay(ms_delay);
 }
}

michael_x

Quote
Ich weis leider nicht wie ich da vorgehen soll.
1. musst du sagen, welche Library du verwendest.  Ich rate mal, diese:
    https://github.com/Bodmer/TFT_HX8357

2. Sind die Beispiele dafür da, dass du verstehst, wie die Library verwendet wird.

3. Wenn du sie nicht komplett verstehst, ist das halb so wild. 

4. Ich rate mal, das Beispiel hat etwas Müll drin, der gar nicht verwendet wird.
4.1 Die Variable  int old_value[6] = { -1, -1, -1, -1, -1, -1}; kann ersatzlos raus
4.2 Die Variable    int value[6] = {0, 0, 0, 0, 0, 0}; wird auch kaum verwendet, value[0] scheint schon der Wert zu sein, den du willst. Schmeiss int value[6] auch raus und ersetze die zwei Stellen, wo value[0] vorkommt, folgendermassen:

Code: [Select]
    // Create a Sine wave for testing
    d += 4; if (d >= 360) d = 0;
   
    int tmpval = 50 + 50 * sin((d + 0) * 0.0174532925);
 
    plotNeedle(tmpval, 0); // It takes between 2 and 12ms to replot the needle with zero delay


Geht alles noch wie vorher?

Dann kannst du tmpval auch andere Werte geben ...
 

andy06m

#2
May 24, 2016, 09:28 pm Last Edit: May 24, 2016, 11:28 pm by uwefed Reason: add [CODE] TAGs </>
HI
Danke für die schnelle Antwort.
Hab es jetzt so wie du beschrieben hast gemacht:
Code: [Select]

#define M_SIZE 1.3333

// #include <avr/dtostrf.h> // Only needed by Due

#include <TFT_HX8357.h> // Hardware-specific library

TFT_HX8357 tft = TFT_HX8357();       // Invoke custom library

#define TFT_GREY 0x5AEB

float ltx = 0;    // Saved x coord of bottom of needle
uint16_t osx = M_SIZE*120, osy = M_SIZE*120; // Saved x & y coords
uint32_t updateTime = 0;       // time for next update

int old_analog =  -999; // Value last displayed

int value[0];

int d = 0;

void setup(void) {
 tft.init();
 tft.setRotation(1);
 Serial.begin(57600); // For debug
 tft.fillScreen(TFT_BLACK);

 analogMeter(); // Draw analogue meter

 updateTime = millis(); // Next update time
}

void loop() {
 if (updateTime <= millis()) {
   updateTime = millis() + 35; // Update emter every 35 milliseconds

   // Create a Sine wave for testing
   d += 4; if (d >= 360) d = 0;
 
   int tmpval = 50 + 50 * sin((d + 0) * 0.0174532925);

   plotNeedle(tmpval, 100); // It takes between 2 and 12ms to replot the needle with zero delay

wenn ich jetzt in ((tmpval, 100)) den Wert ändere verändere ich die Geschwindigkeit des Zeigers mit dem er von 0 auf 100 und wieder zurück leuft.
Ich möchte aber das er z.B. bei einem Wert von 50 auch auf der Anzeige bei 50 stehen bleibt bis ein neuer Wert wieder übermitelt wird.

andy06m

Sorry hab es jetzt geschnallt
Danke michael_x

uwefed

welche sinnhat:
Code: [Select]

int value[0];

?

Grüße Uwe

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy