Horizont TFT

Hallo,
ich habe mal wieder ein problem :confused: :frowning: >:(
Da muss ich eingestehen das mir dafür das wissen fehlt.
Wenn mir da jemand helfen würde, auch gegen Absprache Entgeld.

Was ich machen möchte.
Anzeige Gyro als Horizont.
Ich weiß da gibt es was in Internet, das st aber alles nur für Rollen gut.
Ich möchte Pitch und Roll
Display Größe TFT SPI 320x240

Das ganze mit einer vernünftigen Geschwindigkeit auf dem Display.
Arduino schein da probleme zu haben ( Selbst ein Teensy 3,6 )
Warum ??? keine Anhnung

Am libsten wäre mir eine Horizont Kugel die in der mitte bleibt und sich bewegt ( 2 Farben )
Aber wenn das nicht geht ein Quadraht was in der Größe bestimmt wird und wo sich der Horizont bewegt.

Danke für Hilfe oder so

Hier ein Code gekürzt ( Auf laufen getestet mit Arduino und Teensy 3,6)

#include “SPI.h”
#include “Adafruit_GFX.h”
#include “Adafruit_ILI9341.h”

#define TFT_DC 10
#define TFT_CS 4
#define TFT_RST 14
#define TFT_MOSI 11
#define TFT_CLK 13
#define TFT_MISO 12

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);

#define HOR 342 // Horizon vector linie Laenge
int XX = 160 ; // Eigen für Anzeige Linie usw
int YY = 120 ;// Eigen für Anzeige Linie usw
#define XC 160 // mitte of horizon
#define YC 120 // mitte of horizon
#define DEG2RAD 0.0174532925
int last_roll = 0; // horizon graphic lauf
int last_pitch = 0; // horizon graphic lauf

// #########################################################################

void setup() {
tft.begin();
tft.setRotation(3);
tft.fillRect(0, 0, XX2, YY2, ILI9341_BLUE);
tft.fillRect(0, YY, XX2, YY2, ILI9341_GREEN);
delay(40) ,
drawHorizon(0, 0);
}

void loop() {
int roll = random(361) - 180; // zum testen auf dem TFT
int pitch = random (161) - 80; // zum testen auf dem TFT
updateHorizon(roll, pitch);
}

// #########################################################################
// Update the horizon with a new roll (angle in range -180 to +180)
// #########################################################################
void updateHorizon(int roll, int pitch)
{

int delta_pitch = 0;
int pitch_error = 0;
int delta_roll = 0;
while ((last_pitch != pitch) || (last_roll != roll)) // wenn Winkel geaendert wurde
{
delta_pitch = 0;
delta_roll = 0;
if (last_pitch < pitch) {
delta_pitch = 1;
pitch_error = pitch - last_pitch;
}
if (last_pitch > pitch) {
delta_pitch = -1;
pitch_error = last_pitch - pitch;
}
if (last_roll < roll) delta_roll = 1;
if (last_roll > roll) delta_roll = -1;
if (delta_roll == 0) {
if (pitch_error > 1) delta_pitch *= 2;
}
drawHorizon(last_roll + delta_roll, last_pitch + delta_pitch); // CM uebergabe roll und pitch vom Gyro
}
}
// #########################################################################
void drawHorizon(int roll, int pitch)
{
// Calculate coordinates for line start
float sx = cos(roll * DEG2RAD);
float sy = sin(roll * DEG2RAD);
int16_t x0 = sx * HOR ;
int16_t y0 = sy * HOR ;
int16_t xd = 0;
int16_t yd = 1; // Weiss Linienbreite
int16_t xdn = 0;
int16_t ydn = 0;
if (roll > 45 && roll < 135) { xd = -1; yd = 0; }
if (roll >= 135) { xd = 0; yd = -1; }
if (roll < -45 && roll > -135) {xd = 1; yd = 0; }
if (roll <= -135) { xd = 0; yd = -1; }
if ((roll != last_roll) || (pitch != last_pitch))
{
xdn = 7 * xd;
ydn = 7 * yd;
tft.drawLine(XC - x0 - xdn, YC - y0 - ydn - pitch, XC + x0 - xdn, YC + y0 - ydn - pitch, ILI9341_BLUE);
tft.drawLine(XC - x0 + xdn, YC - y0 + ydn - pitch, XC + x0 + xdn, YC + y0 + ydn - pitch, ILI9341_GREEN);
xdn = 6 * xd;
ydn = 6 * yd;
tft.drawLine(XC - x0 - xdn, YC - y0 - ydn - pitch, XC + x0 - xdn, YC + y0 - ydn - pitch, ILI9341_BLUE);
tft.drawLine(XC - x0 + xdn, YC - y0 + ydn - pitch, XC + x0 + xdn, YC + y0 + ydn - pitch, ILI9341_GREEN);
xdn = 5 * xd;
ydn = 5 * yd;
tft.drawLine(XC - x0 - xdn, YC - y0 - ydn - pitch, XC + x0 - xdn, YC + y0 - ydn - pitch, ILI9341_BLUE);
tft.drawLine(XC - x0 + xdn, YC - y0 + ydn - pitch, XC + x0 + xdn, YC + y0 + ydn - pitch, ILI9341_GREEN);
xdn = 4 * xd;
ydn = 4 * yd;
tft.drawLine(XC - x0 - xdn, YC - y0 - ydn - pitch, XC + x0 - xdn, YC + y0 - ydn - pitch, ILI9341_BLUE);
tft.drawLine(XC - x0 + xdn, YC - y0 + ydn - pitch, XC + x0 + xdn, YC + y0 + ydn - pitch, ILI9341_GREEN);
xdn = 3 * xd;
ydn = 3 * yd;
tft.drawLine(XC - x0 - xdn, YC - y0 - ydn - pitch, XC + x0 - xdn, YC + y0 - ydn - pitch, ILI9341_BLUE);
tft.drawLine(XC - x0 + xdn, YC - y0 + ydn - pitch, XC + x0 + xdn, YC + y0 + ydn - pitch, ILI9341_GREEN);
}
xdn = 2 * xd;
ydn = 2 * yd;
tft.drawLine(XC - x0 - xdn, YC - y0 - ydn - pitch, XC + x0 - xdn, YC + y0 - ydn - pitch, ILI9341_BLUE);
tft.drawLine(XC - x0 + xdn, YC - y0 + ydn - pitch, XC + x0 + xdn, YC + y0 + ydn - pitch, ILI9341_GREEN);
xdn = 1 * xd;
ydn = 1 * yd;
tft.drawLine(XC - x0 - xd, YC - y0 - yd - pitch, XC + x0 - xd, YC + y0 - yd - pitch, ILI9341_BLUE);
tft.drawLine(XC - x0 + xd, YC - y0 + yd - pitch, XC + x0 + xd, YC + y0 + yd - pitch, ILI9341_GREEN);
last_roll = roll;
last_pitch = pitch;
}

Grüße
Ratlos

Echtzeit-3D? Geht schon, wenn die Qualität nicht super und die Polys sich in Grenzen halten, aber: niemalsnicht mit so ner Billigkrücke von Display. Da brauchste was, das auch in der Lage ist, so schnell zu zeichnen. Das Zauberwort heisst Grafikspeicher! Den haben diese Dinger einfach nicht- nen Würfel flüssig rotieren zu lassen, kannst du schlichtweg vergessen. Und ne Kugel schon mal gar nicht-die hat dann noch etliche Polygone mehr. Die Dinger können ja nicht mal nen Text halbwegs flüssig scrollen....

Ja würde auch mehr bezahlen. Aber welches in 2,4" mit Touch ?