INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Frage zu Grafik
28.12.2019, 17:41
Beitrag #1
Frage zu Grafik
Ich baue gerade ein Anzeigeinstrument mit einem ESP32 nach. Das Original sieht man hier in diesem Video:
https://www.youtube.com/watch?v=uwpnXf916gM

Der Sketch zu diesem Projekt wurde nicht veröffentlicht. Nur eine ältere Version, die die Werte statt mit dem farbigen Balken links mit einem Pfeil anzeigt.
Hier ein Video meines Projekts:
https://www.dropbox.com/s/i6tws0k2ydlymx...1.mov?dl=0

Erstens stört es mich, dass die alten Pfeile nicht entfernt werden, wenn ein neuer Wert angezeigt wird, und zweitens möchte ich das gerne mit dem Balken umsetzen.

Hier mein Sketch:
Code:
//****  Screen and SPIFFS Headers and Defines ****
//************************************************

//#include<HardwareSerial.h>
#include<TFT_eSPI.h>
#include<SPI.h>
#include "LogoJR.h"
#include "LogoOV.h"
#include "FS.h"
#include "SPIFFS.h"

#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 GREY    0x18E3
#define RXD2 16
#define TXD2 17

//HardwareSerial Serial(2);
TFT_eSPI tft = TFT_eSPI();
TFT_eSprite needle = TFT_eSprite(&tft);
TFT_eSprite Nav1 = TFT_eSprite(&tft);
TFT_eSprite Nav2 = TFT_eSprite(&tft);


//******************************************
//****  FreeRTOS Headers and Variables  ****
//******************************************

#include"freertos/FreeRTOS.h"
#include"freertos/Task.h"
//#include"freertos/semphr.h"
#include"esp_system.h"
#include<stdio.h>
TaskHandle_t Task1,Task2;


#define OuterRadius 160
#define InnerRadius 130
#define xCenter 160
#define yCenter 160


extern const unsigned char logobunny[];
extern uint16_t logoOV[];
float E;


void setup() {
  tft.init();
  tft.setRotation(0);
  splash();
  // Note the format for setting a serial port is as follows: Serial2.begin(baud-rate, protocol, RX pin, TX pin);
  Serial.begin(115200, SERIAL_8N1);
  Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
  Serial.println("");
  Serial.println("Serial Txd is on pin: "+String(TX));  // Monitorausgabe
  Serial.println("Serial Rxd is on pin: "+String(RX));  // Monitorausgabe
  SPIFFSstart();  
  listFiles();
  xTaskCreatePinnedToCore(ScreenRefresh,"Screen Refresh",2500,NULL,30,&Task1,1);
  xTaskCreatePinnedToCore(SerialScan,"Serial Scan",2500,NULL,20,&Task2,0);
  //Serial1.begin(9600,SERIAL_8N1,1,3);
  //Serial1.println("Serial Started");
}

void ScreenRefresh(void *p){
  Serial.println("Task 1 created");
  float i;
  tft.loadFont("micross20");
  Nav1.loadFont("micross15");
  Nav2.loadFont("micross50");
  while(1){
    //xSemaphoreTake(ScreenKeeper,1000);
    float angle=(E*22)+180;
    VarioNeedle(angle);
    DrawData("Avg.",E,1,85,80,true);
    DrawData("Alt.",1500,0,60,140,false);
    DrawData("Mc.",2,1,100,200,false);
  }
}

void SerialScan (void *p){
  Serial.println("Task 2 Created");
  char Data;
  String DataString,Vario;
  int pos,i;
  while(1){
    if (Serial2.available()){
      Data =Serial2.read();
      if(Data=='$'){
        while (Data != 10){
          DataString += Data;
          Data=Serial2.read();
        }
      }
    }
    if (DataString.startsWith("$POV,E")){
      //Serial2.println(DataString);
      pos=DataString.indexOf(',');
      DataString.remove(0,pos+1);
      //Serial2.println(DataString);
      if(DataString[0]=='E'){
        pos=DataString.indexOf(',');
        DataString.remove(0,pos+1);
        //Serial2.println(DataString);
        pos=DataString.indexOf('*');
        for (i=0;i<pos;i++){
         Vario+=DataString[i];
        }
        //Serial2.println(Vario);
        E=Vario.toFloat();
        Serial2.println(E);
        Vario="";
      }
    }
    DataString="";
    vTaskDelay(20);
   }
}

void loop() {  
  delay(20);
}

//*************************
//****  Splash Screen  ****
//*************************

void splash(){
  Serial.print("Splash Screen");
  tft.fillScreen(WHITE);
  tft.setWindow(20,91,20+199,91+136);
  tft.pushColors(logoOV,200*137);
  delay(3000);
  tft.fillScreen(BLACK);
  tft.fillCircle(xCenter,yCenter,InnerRadius,BLACK);  
}

//*********************************
//****  Deg to Rad conversion  ****
//*********************************

float deg2rad(float* angle){
//  float tempangle=*angle;
  *angle=*angle/180*3.141516;
//  return angle;  
}

//*********************************
//****  Vario Needle Movement  ****
//*********************************

void VarioNeedle(float inangle){
  deg2rad(&inangle);
  
  int spriteH = 30; //Sprite Height
  int spriteW = 30; //Sprite Width
  needle.createSprite(spriteW,spriteH);
  needle.fillScreen(BLACK);
  
  float MiddleRadius = ((OuterRadius-InnerRadius)/2)+InnerRadius; //Middle of Sliding Circle radius
  float SpritexCenter = MiddleRadius*cos(inangle)+xCenter; //X coordinate of the sprite's center referred to the TFT coordinates
  float SpriteyCenter = MiddleRadius*sin(inangle)+yCenter; //Y coordinate of the sprite's center referred to the TFT coordinates
  
  float xCenter1 = (spriteW/2)-MiddleRadius*cos(inangle); //x Needle Pivoting center coordinate referred to Sprite's coordinate system.
  float yCenter1 = (spriteH/2)-MiddleRadius*sin(inangle); //y Needle Pivoting center coordinate referred to Sprite's coordinate system.
    
  needle.fillCircle(xCenter1,yCenter1,InnerRadius,BLACK); //Sprite Background without needle
  
  //****  Needle Triangle point calculation  ****
    
  int x0 = 10*cos(inangle+3.14)+(spriteW/2);
  int y0 = 10*sin(inangle+3.14)+(spriteH/2);
  int x1 = 10*cos(inangle+0.4)+(spriteW/2);
  int y1 = 10*sin(inangle+0.4)+(spriteH/2);
  int x2 = 10*cos(inangle-0.4)+(spriteW/2);
  int y2 = 10*sin(inangle-0.4)+(spriteH/2);
  needle.fillTriangle(x0,y0,x1,y1,x2,y2,BLUE);
  //needle.drawLine(x0,y0,x1,y1,RED);
  
  needle.pushSprite(SpritexCenter-(spriteW/2),SpriteyCenter-(spriteH/2)); //Pushing Needle Sprite to TFT
  needle.deleteSprite();

  //****  Draw divisions and numbers  ****
  
  for(int i=70;i<=300;i+=22){
    float divangle=i;
    deg2rad(&divangle);
    int x0 = OuterRadius*cos(divangle)+xCenter;
    int y0 = OuterRadius*sin(divangle)+yCenter;
    int x1 = (MiddleRadius+10)*cos(divangle)+xCenter;
    int y1 = (MiddleRadius+10)*sin(divangle)+yCenter;
    tft.drawLine(x0,y0,x1,y1,WHITE);
  }
  tft.setTextColor(WHITE,GREY);
  tft.setCursor(12,152);
  tft.println("0");
  tft.setCursor(25,97);
  tft.println("1");
  tft.setCursor(53,52);
  tft.println("2");
  tft.setCursor(94,22);
  tft.println("3");
  tft.setCursor(148,9);
  tft.println("4");
  tft.setCursor(206,18);
  tft.println("5");
  tft.setCursor(25,203);
  tft.println("1");
  tft.setCursor(53,248);
  tft.println("2");
  tft.setCursor(94,280);
  tft.println("3");
  tft.setCursor(148,294);
  tft.println("4");
  tft.setCursor(206,287);
  tft.println("5");
}

//*******************************
//**** Draw NavBox and Data  ****
//*******************************

void DrawData(char title[],float data,int precision, int x,int y,bool sign){
  Nav1.createSprite(30,15);
  //Nav1.fillScreen(YELLOW);
  Nav1.setCursor(0,0);
  Nav1.setTextColor(WHITE,BLACK);
  Nav1.println(title);
  Nav2.createSprite(140,50);
  Nav2.setCursor(0,0);
  Nav2.setTextColor(WHITE,BLACK);
  if ((data>0) && (sign)){
    Nav2.print("+");
  }
  Nav2.println(data,precision);
  Nav1.pushSprite(x,y);
  Nav1.deleteSprite();
  Nav2.pushSprite(x+30,y);
  Nav2.deleteSprite();
}

// ************************************
// ****  Initialize SPIFFS memory  ****
// ************************************

void SPIFFSstart(){
  if (!SPIFFS.begin()){
    Serial.println("SPIFFS initialisation failed!");
    while (1) yield(); // Stay here twiddling thumbs waiting
    }
  Serial.println("\r\nInitialisation done.");
}

  
// ********************************************************
// ****  List files in ESP8266 or ESP32 SPIFFS memory  ****
// ********************************************************

void listFiles(void) {
  Serial.println();
  Serial.println("SPIFFS files found:");

#ifdef ESP32
  listDir(SPIFFS, "/", true);
#else
  fs::Dir dir = SPIFFS.openDir("/"); // Root directory
  String  line = "=====================================";

  Serial.println(line);
  Serial.println("  File name               Size");
  Serial.println(line);

  while (dir.next()) {
    String fileName = dir.fileName();
    Serial.print(fileName);
    int spaces = 25 - fileName.length(); // Tabulate nicely
    if (spaces < 0) spaces = 1;
    while (spaces--) Serial.print(" ");
    fs::File f = dir.openFile("r");
    Serial.print(f.size()); Serial.println(" bytes");
    yield();
  }

  Serial.println(line);
#endif
  Serial.println();
  delay(1000);
}

#ifdef ESP32
void listDir(fs::FS &fs, const char * dirname, uint8_t levels) {
  Serial.printf("Listing directory: %s\n", dirname);

  fs::File root = fs.open(dirname);
  if (!root) {
    Serial.println("Failed to open directory");
    return;
  }
  if (!root.isDirectory()) {
    Serial.println("Not a directory");
    return;
  }

  fs::File file = root.openNextFile();
  while (file) {

    if (file.isDirectory()) {
      Serial.print("DIR : ");
      String fileName = file.name();
      Serial.print(fileName);
      if (levels) {
        listDir(fs, file.name(), levels - 1);
      }
    } else {
      String fileName = file.name();
      Serial.print("  " + fileName);
      int spaces = 32 - fileName.length(); // Tabulate nicely
      if (spaces < 1) spaces = 1;
      while (spaces--) Serial.print(" ");
      String fileSize = (String) file.size();
      spaces = 8 - fileSize.length(); // Tabulate nicely
      if (spaces < 1) spaces = 1;
      while (spaces--) Serial.print(" ");
      Serial.println(fileSize + " bytes");
    }

    file = root.openNextFile();
  }
}
#endif

Für Tips, wie man den Sketch anpassen könnte, wäre ich sehr dankbar!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2019, 19:32 (Dieser Beitrag wurde zuletzt bearbeitet: 28.12.2019 19:44 von georg01.)
Beitrag #2
RE: Frage zu Grafik
Hallo,
die Sache ist relativ einfach. Die Art der Nadeln (needle) ist jetzt als Dreieck dargestellt.
Wenn du es als Balken möchtest, must Du die Sprite als Balken Programmieren.
In dem Codeabschnitt sind die Dreiecks programmiert;
Code:
//****  Needle Triangle point calculation  ****
    
  int x0 = 10*cos(inangle+3.14)+(spriteW/2);
  int y0 = 10*sin(inangle+3.14)+(spriteH/2);
  int x1 = 10*cos(inangle+0.4)+(spriteW/2);
  int y1 = 10*sin(inangle+0.4)+(spriteH/2);
...
ersetzte die (Sprite) als Rechtecke, oder ganz einfach als Linien.
Gruß Georg


Angehängte Datei(en) Thumbnail(s)
   

Sorry für mein nicht korrektes Deutsch. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2019, 20:56
Beitrag #3
RE: Frage zu Grafik
Ich hab jetzt mal das hier probiert, aber das ist so nicht richtig:
Code:
//****  Needle Triangle point calculation  ****
    
  int x0 = 10*cos(inangle-3.14)+(spriteW/2);
  int y0 = 10*sin(inangle-3.14)+(spriteH/2);
  int x1 = 10*cos(inangle-3.14)+(spriteW/2);
  int y1 = 10*sin(inangle-3.14)+(spriteH/2);
  int x2 = 10*cos(inangle+0.4)+(spriteW/2);
  int y2 = 10*sin(inangle+0.4)+(spriteH/2);
  int x3 = 10*cos(inangle-0.4)+(spriteW/2);
  int y3 = 10*sin(inangle-0.4)+(spriteH/2);
  //needle.fillRect(x0,y0,x2,y2,x3,y3,BLUE);

Aber ich glaub wir reden gerade an einander vorbei. Ich möchte keinen wandernden Balken, sondern einen wachsenden Balken.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2019, 21:25 (Dieser Beitrag wurde zuletzt bearbeitet: 28.12.2019 21:55 von Gerdchen03.)
Beitrag #4
RE: Frage zu Grafik
Ich denke ich müsste einen gefüllten Teilkreis zeichnen, der den Außenradius der halben Displayhöhe hat und vom linken Rand in der halben Höhe beginnt. Der Füllwinkel wäre dann quasi die Position, an der derzeit die Nadel steht

Es müsste wahrscheinlich in etwa in die Richtung gehen:
Code:
// #########################################################################
// Draw a circular or elliptical arc with a defined thickness
// #########################################################################

// x,y == coords of centre of arc
// start_angle = 0 - 359
// seg_count = number of 3 degree segments to draw (120 => 360 degree arc)
// rx = x axis radius
// yx = y axis radius
// w  = width (thickness) of arc in pixels
// colour = 16 bit colour value
// Note if rx and ry are the same then an arc of a circle is drawn

int fillArc2(160,160,180,3,145,145,15,BLUE)
{

  byte seg = 3; // Segments are 3 degrees wide = 120 segments for 360 degrees
  byte inc = 3; // Draw segments every 3 degrees, increase to 6 for segmented ring

    // Calculate first pair of coordinates for segment start
    float sx = cos((start_angle - 90) * DEG2RAD);
    float sy = sin((start_angle - 90) * DEG2RAD);
    uint16_t x0 = sx * (rx - w) + x;
    uint16_t y0 = sy * (ry - w) + y;
    uint16_t x1 = sx * rx + x;
    uint16_t y1 = sy * ry + y;

  // Draw colour blocks every inc degrees
  for (int i = start_angle; i < start_angle + seg * seg_count; i += inc) {

    // Calculate pair of coordinates for segment end
    float sx2 = cos((i + seg - 90) * DEG2RAD);
    float sy2 = sin((i + seg - 90) * DEG2RAD);
    int x2 = sx2 * (rx - w) + x;
    int y2 = sy2 * (ry - w) + y;
    int x3 = sx2 * rx + x;
    int y3 = sy2 * ry + y;

    tft.fillTriangle(x0, y0, x1, y1, x2, y2, colour);
    tft.fillTriangle(x1, y1, x2, y2, x3, y3, colour);

    // Copy segment end to sgement start for next segment
    x0 = x2;
    y0 = y2;
    x1 = x3;
    y1 = y3;
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2019, 00:36 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2019 00:40 von georg01.)
Beitrag #5
RE: Frage zu Grafik
Hallo,
Zitat:...
Ich hab jetzt mal das hier probiert, …

Es müsste wahrscheinlich in etwa in die Richtung gehen:

Programmieren ist ein Bewusstes Vorgehen und hat mit Logik und Absichten zu tun.
Klar Probiere ich auch oft verschiedene Verhältnisse einer (meiner) Funktion, Algorithmen …
Für eine 100%- gen Lösung, müsste ich Tief in meinem Archiv "rumwimmeln". Im (aus dem) Kopf -> Pseudocode habe ich auch nicht. Viele Punkte bilden eine Linie, … viele (kurzen) Linien bilden eine Figur.
Damals habe ich (was Du so möchtest) es mit Linien gemacht. Eine fillArc(..)Methode nimmt sehr viel Arbeit ab!
Suche nach dies und ähnlichem.
Gruß Georg

Sorry für mein nicht korrektes Deutsch. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2019, 14:04
Beitrag #6
RE: Frage zu Grafik
Ich denke, ich bin nahe an einer Lösung.

Dieser Sketch zeichnet mir einen Kreisbogen, dessen Länge vom Wert sc anhängig ist:
Code:
#include<TFT_eSPI.h>
#include<SPI.h>

#define DEG2RAD 0.0174532925
#define BLACK   0x0000

TFT_eSPI tft = TFT_eSPI();

void setup(void) {
  tft.begin();

  tft.setRotation(1);

  tft.fillScreen(BLACK);

}


void loop() {
  
    int sc = 35;
    fillArc(160, 80, 180, sc, 160, 160, 35, 0x07E0);
}

// #########################################################################
// Draw an arc with a defined thickness
// #########################################################################

// x,y == coords of centre of arc
// start_angle = 0 - 359
// seg_count = number of 3 degree segments to draw (120 => 360 degree arc)
// rx = x axis radius
// yx = y axis radius
// w  = width (thickness) of arc in pixels
// colour = 16 bit colour value
// Note if rx and ry are the same an arc of a circle is drawn

int fillArc(int x, int y, int start_angle, int seg_count, int rx, int ry, int w, unsigned int colour)
{

  byte seg = 3; // Segments are 3 degrees wide = 120 segments for 360 degrees
  byte inc = 3; // Draw segments every 3 degrees, increase to 6 for segmented ring

  // Draw colour blocks every inc degrees
  for (int i = start_angle; i < start_angle + seg * seg_count; i += inc) {
    // Calculate pair of coordinates for segment start
    float sx = cos((i - 90) * DEG2RAD);
    float sy = sin((i - 90) * DEG2RAD);
    uint16_t x0 = sx * (rx - w) + x;
    uint16_t y0 = sy * (ry - w) + y;
    uint16_t x1 = sx * rx + x;
    uint16_t y1 = sy * ry + y;

    // Calculate pair of coordinates for segment end
    float sx2 = cos((i + seg - 90) * DEG2RAD);
    float sy2 = sin((i + seg - 90) * DEG2RAD);
    int x2 = sx2 * (rx - w) + x;
    int y2 = sy2 * (ry - w) + y;
    int x3 = sx2 * rx + x;
    int y3 = sy2 * ry + y;

    tft.fillTriangle(x0, y0, x1, y1, x2, y2, colour);
    tft.fillTriangle(x1, y1, x2, y2, x3, y3, colour);
  }
}

Nur die Übertragung in meinen eigentlichen Sketch klappt nicht. Ich sehe auf dem Bildschirm keinen Kreisbogen.
Code:
//************************************************
//****  Screen and SPIFFS Headers and Defines ****
//************************************************

//#include<HardwareSerial.h>
#include<TFT_eSPI.h>
#include<SPI.h>
#include "LogoJR.h"
#include "LogoOV.h"
#include "FS.h"
#include "SPIFFS.h"

#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 GREY    0x18E3
#define RXD2 16
#define TXD2 17
#define DEG2RAD 0.0174532925

//HardwareSerial Serial(2);
TFT_eSPI tft = TFT_eSPI();
TFT_eSprite needle = TFT_eSprite(&tft);
TFT_eSprite Nav1 = TFT_eSprite(&tft);
TFT_eSprite Nav2 = TFT_eSprite(&tft);


//******************************************
//****  FreeRTOS Headers and Variables  ****
//******************************************

#include"freertos/FreeRTOS.h"
#include"freertos/Task.h"
//#include"freertos/semphr.h"
#include"esp_system.h"
#include<stdio.h>
TaskHandle_t Task1,Task2;


#define OuterRadius 160
#define InnerRadius 130
#define xCenter 160
#define yCenter 160

int x = 160;
int y =160;
int start_angle = 180;
int seg_count =3;
int rx =145;
int ry =145;
int w =15;
unsigned int colour = 255;
extern const unsigned char logobunny[];
extern uint16_t logoOV[];
float E;

void setup() {
  tft.init();
  tft.setRotation(0);
  splash();
  // Note the format for setting a serial port is as follows: Serial2.begin(baud-rate, protocol, RX pin, TX pin);
  Serial.begin(115200, SERIAL_8N1);
  Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);
  Serial.println("");
  Serial.println("Serial Txd is on pin: "+String(TX));  // Monitorausgabe
  Serial.println("Serial Rxd is on pin: "+String(RX));  // Monitorausgabe
  SPIFFSstart();  
  listFiles();
  xTaskCreatePinnedToCore(ScreenRefresh,"Screen Refresh",2500,NULL,30,&Task1,1);
  xTaskCreatePinnedToCore(SerialScan,"Serial Scan",2500,NULL,20,&Task2,0);
  //Serial1.begin(9600,SERIAL_8N1,1,3);
  //Serial1.println("Serial Started");
}

void ScreenRefresh(void *p){
  Serial.println("Task 1 created");
  float i;
  tft.loadFont("micross20");
  Nav1.loadFont("micross15");
  Nav2.loadFont("micross50");
  while(1){
    //xSemaphoreTake(ScreenKeeper,1000);
    float angle=(E*22)+180;
    //VarioNeedle(angle);
    DrawData("Avg.",E,1,85,80,true);
    DrawData("Alt.",1500,0,60,140,false);
    DrawData("Mc.",2,1,100,200,false);
    //delay(10);
  }
}

void SerialScan (void *p){
  Serial.println("Task 2 Created");
  char Data;
  String DataString,Vario;
  int pos,i;
  while(1){
    if (Serial2.available()){
      Data =Serial2.read();
      if(Data=='$'){
        while (Data != 10){
          DataString += Data;
          Data=Serial2.read();
        }
      }
    }
    if (DataString.startsWith("$POV")){
      //Serial2.println(DataString);
      pos=DataString.indexOf(',');
      DataString.remove(0,pos+1);
      //Serial2.println(DataString);
      if(DataString[0]=='E'){
        pos=DataString.indexOf(',');
        DataString.remove(0,pos+1);
        //Serial2.println(DataString);
        pos=DataString.indexOf('*');
        for (i=0;i<pos;i++){
         Vario+=DataString[i];
        }
      //Serial2.println(Vario);
      E=Vario.toFloat();
      Serial2.println(E);
      Vario="";
      }
    }
    DataString="";
    vTaskDelay(20);
   }
}

void loop() {
    int sc = 35;
    fillArc(160, 80, 180, sc, 160, 160, 35, 0x07E0);
}

//*************************
//****  Splash Screen  ****
//*************************

void splash(){
  Serial.print("Splash Screen");
  tft.fillScreen(WHITE);
  tft.setWindow(20,50,20+199,50+218);
  tft.pushColors(logoOV,200*219);
  delay(5000);
  tft.fillScreen(BLACK);
  tft.fillCircle(xCenter,yCenter,InnerRadius,BLACK);  
}

//*********************************
//****  Deg to Rad conversion  ****
//*********************************

float deg2rad(float* angle){
//  float tempangle=*angle;
  *angle=*angle/180*3.141516;
//  return angle;  
}

//***********************
//****  Draw an arc  ****
//***********************

// x,y == coords of centre of arc
// start_angle = 0 - 359
// seg_count = number of 3 degree segments to draw (120 => 360 degree arc)
// rx = x axis radius
// yx = y axis radius
// w  = width (thickness) of arc in pixels
// colour = 16 bit colour value
// Note if rx and ry are the same an arc of a circle is drawn

int fillArc(int x, int y, int start_angle, int seg_count, int rx, int ry, int w, unsigned int colour)
{

  byte seg = 3; // Segments are 3 degrees wide = 120 segments for 360 degrees
  byte inc = 3; // Draw segments every 3 degrees, increase to 6 for segmented ring

  // Draw colour blocks every inc degrees
  for (int i = start_angle; i < start_angle + seg * seg_count; i += inc) {
    // Calculate pair of coordinates for segment start
    float sx = cos((i - 90) * DEG2RAD);
    float sy = sin((i - 90) * DEG2RAD);
    uint16_t x0 = sx * (rx - w) + x;
    uint16_t y0 = sy * (ry - w) + y;
    uint16_t x1 = sx * rx + x;
    uint16_t y1 = sy * ry + y;

    // Calculate pair of coordinates for segment end
    float sx2 = cos((i + seg - 90) * DEG2RAD);
    float sy2 = sin((i + seg - 90) * DEG2RAD);
    int x2 = sx2 * (rx - w) + x;
    int y2 = sy2 * (ry - w) + y;
    int x3 = sx2 * rx + x;
    int y3 = sy2 * ry + y;

    tft.fillTriangle(x0, y0, x1, y1, x2, y2, colour);
    tft.fillTriangle(x1, y1, x2, y2, x3, y3, colour);
  }
}
  
//*******************************
//**** Draw NavBox and Data  ****
//*******************************

void DrawData(char title[],float data,int precision, int x,int y,bool sign){
  Nav1.createSprite(30,15);
  //Nav1.fillScreen(YELLOW);
  Nav1.setCursor(0,0);
  Nav1.setTextColor(WHITE,BLACK);
  Nav1.println(title);
  Nav2.createSprite(140,50);
  Nav2.setCursor(0,0);
  Nav2.setTextColor(WHITE,BLACK);
  if ((data>0) && (sign)){
    Nav2.print("+");
  }
  Nav2.println(data,precision);
  Nav1.pushSprite(x,y);
  Nav1.deleteSprite();
  Nav2.pushSprite(x+30,y);
  Nav2.deleteSprite();
}

// ************************************
// ****  Initialize SPIFFS memory  ****
// ************************************

void SPIFFSstart(){
  if (!SPIFFS.begin()){
    Serial.println("SPIFFS initialisation failed!");
    while (1) yield(); // Stay here twiddling thumbs waiting
    }
  Serial.println("\r\nInitialisation done.");
}

  
// ********************************************************
// ****  List files in ESP8266 or ESP32 SPIFFS memory  ****
// ********************************************************

void listFiles(void) {
  Serial.println();
  Serial.println("SPIFFS files found:");

#ifdef ESP32
  listDir(SPIFFS, "/", true);
#else
  fs::Dir dir = SPIFFS.openDir("/"); // Root directory
  String  line = "=====================================";

  Serial.println(line);
  Serial.println("  File name               Size");
  Serial.println(line);

  while (dir.next()) {
    String fileName = dir.fileName();
    Serial.print(fileName);
    int spaces = 25 - fileName.length(); // Tabulate nicely
    if (spaces < 0) spaces = 1;
    while (spaces--) Serial.print(" ");
    fs::File f = dir.openFile("r");
    Serial.print(f.size()); Serial.println(" bytes");
    yield();
  }

  Serial.println(line);
#endif
  Serial.println();
  delay(1000);
}

#ifdef ESP32
void listDir(fs::FS &fs, const char * dirname, uint8_t levels) {
  Serial.printf("Listing directory: %s\n", dirname);

  fs::File root = fs.open(dirname);
  if (!root) {
    Serial.println("Failed to open directory");
    return;
  }
  if (!root.isDirectory()) {
    Serial.println("Not a directory");
    return;
  }

  fs::File file = root.openNextFile();
  while (file) {

    if (file.isDirectory()) {
      Serial.print("DIR : ");
      String fileName = file.name();
      Serial.print(fileName);
      if (levels) {
        listDir(fs, file.name(), levels - 1);
      }
    } else {
      String fileName = file.name();
      Serial.print("  " + fileName);
      int spaces = 32 - fileName.length(); // Tabulate nicely
      if (spaces < 1) spaces = 1;
      while (spaces--) Serial.print(" ");
      String fileSize = (String) file.size();
      spaces = 8 - fileSize.length(); // Tabulate nicely
      if (spaces < 1) spaces = 1;
      while (spaces--) Serial.print(" ");
      Serial.println(fileSize + " bytes");
    }

    file = root.openNextFile();
  }
}
#endif
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2019, 20:08 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2019 20:09 von georg01.)
Beitrag #7
RE: Frage zu Grafik
Hi,
ich habe "Deine" fillArc(int x, int y, int start_angle, … Funktion am einem ILI9341 TFT Display getestet; und nur als Bestätigung die Funktioniert.
Warum die Funktion vom Typ integer ist und keinen Return beibehält lassen wir.

Zitat:Nur die Übertragung in meinen eigentlichen Sketch klappt nicht. Ich sehe auf dem Bildschirm keinen Kreisbogen.

Ja es ist korrekt. Du bist aus der Arduino- Default Schleife raus. Lerne Debuggen mit dem Seriellen.
Code:
void loop() {
    
    Serial2.println(“aus der loop“); // Meldung
    delay(2000); NUR! damit die Anzeige deutlich zu sehen ist

    int sc = 35;
    fillArc(160, 80, 180, sc, 160, 160, 35, 0x07E0);
}

Die Meldung “aus der loop“, bzw. die Ausführung der fillArc(… Funktion bekommst Du nie. Weil Du mit Tasks und Eigenen Schleifen arbeitest:

Code:
...
while(1){
    if (Serial2.available()){
...

while (file) {
...

Analysiere die Setup Funktion und gebe Dir Meldungen aus dem Sketch auf dem Seriellen Monitor aus!
Gruß Georg

Sorry für mein nicht korrektes Deutsch. Sad
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
30.12.2019, 02:17
Beitrag #8
RE: Frage zu Grafik
Danke, ich hab es hinbekommen!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Hardware Frage Hardwearhansi 10 1.098 29.02.2020 05:38
Letzter Beitrag: N1d45
  ESP32 Firmware Anfänger Frage 1971 2 731 20.01.2020 12:25
Letzter Beitrag: 1971
  Frage zu App für Esp32 goofy15 4 811 29.10.2019 08:46
Letzter Beitrag: volvodani
  Frage zum Gültigkeitsbereich einer lokalen Variablen ardu_arne 31 5.109 01.06.2019 14:02
Letzter Beitrag: ardu_arne
Sad 2,2" TFT-Display Frage phb 7 2.799 05.07.2018 07:39
Letzter Beitrag: amithlon
Question Frage zum Banggood-Board Volker3.0 4 1.716 14.05.2018 08:27
Letzter Beitrag: Volker3.0
  nodeMCU ESP 12E V3 - Frage zum Beispielsketch "Hello Server" Stargazer 2 2.898 13.08.2017 21:09
Letzter Beitrag: Stargazer
  ESP8266 ESP12-E Webserver-Frage Claus_M 8 5.789 14.11.2016 22:02
Letzter Beitrag: Claus_M

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste