#include "rectangle.h"
#include <TFT_eSPI.h> // Hardware-specific library
#include <SPI.h>
TFT_eSPI tft = TFT_eSPI(); // Invoke custom library
TFT_eSprite img = TFT_eSprite(&tft); // per impostare uno sprite
// g34 potenziometro per il controllo orizontale
int up = 35; //in base all'impostazione aumenta i valori
int sel = 32; // seleziona il tipo di impostazione
int color = 33; //Cambia il colore
int canc = 25; // cancella ultima forma
// g13 potenziometro di
int lastX = 0 ;
int lastY = 0 ;
int mOrizontal = 0;
int mVertical = 0;
int mSizeX=0;
int mSizeY=0;
byte stato = 0;
int timer = 0;
int potOrizontale=0;
int potVerticale=0;
int potSizeX=0;
int potSizeY=0;
Forma aRect[10];
int nForme = 0;
int colors[6];
int nColors = 0;
int option = 0; //seleziona il tipo di opzione
Rectangle rect;
void setup() {
colors[0] = TFT_BLACK;
colors[1] = TFT_RED;
colors[2] = TFT_YELLOW;
colors[3] = TFT_BLUE;
colors[4] = TFT_GREEN;
colors[5] = TFT_PINK;
Serial.begin(115200);
Serial.println("Initialized");
analogSetWidth(9);
pinMode(up, INPUT);
pinMode(sel, INPUT);
pinMode(color, INPUT);
pinMode(canc, INPUT);
tft.init(); // initialize a ST7735S chip
uint16_t time = millis();
tft.fillScreen(TFT_BLACK);
time = millis() - time;
}
void loop() {
int t0 = millis();
//Seleziona per disegnare forma
int btnSel = digitalRead(sel);
delay(10);
if (btnSel && timer>300) {
timer=0;
stato++;
if(stato>1) {
stato=0;
}
if (stato==1 ) {
aRect[nForme] = Rectangle(mOrizontal,mVertical, 20, 20,colors[nColors]);
nForme++;
draw(mOrizontal,mVertical);
}
}
//pulsente del colore
int btnColor = digitalRead(color);
if (btnColor && timer>300){
timer=0;
nColors++;
if (nColors>5) {
nColors=0;
}
aRect[nForme-1].color=colors[nColors];
draw(mOrizontal,mVertical);
}
//pulsente cancella
int cancella = digitalRead(canc);
if (cancella && timer>300){
timer=0;
nForme--;
if (nForme<0){
nForme=0;
aRect[nForme] = Rectangle(mOrizontal,mVertical, 20, 20,TFT_NAVY);
}
draw(mOrizontal,mVertical);
}
Serial.println(stato);
//Serial.println(potVerticale);
if(stato==0) {
potOrizontale = analogRead(34);
potVerticale = analogRead(13);
mOrizontal = map(potOrizontale, 0,511, 0 ,127);
mVertical = map(potVerticale, 0,511, 0 ,159);
if (!(mOrizontal<lastX+1 && mOrizontal>lastX-1 ) || !(mVertical<lastY+1 && mVertical>lastY-1 )) {
tft.fillScreen(TFT_NAVY);
draw(mOrizontal,mVertical);
}
delay(10);
lastX = mOrizontal;
lastY = mVertical;
}else {
if (stato==1) {
potSizeX = analogRead(34);
potSizeY = analogRead(13);
mSizeX = map(potSizeX,0,511,0,127);
mSizeY = map(potSizeY,0,511,0,159);
aRect[nForme-1].rightTopX=mSizeX;
aRect[nForme-1].rightTopY=mSizeY;
if (!(mSizeX<lastX+1 && mSizeX>lastX-1 ) || !(mSizeY<lastY+1 && mSizeY>lastY-1 )) {
tft.fillScreen(TFT_NAVY);
draw(mOrizontal,mVertical);
}
delay(10);
lastX = mSizeX;
lastY = mSizeY;
}
}
timer = timer + millis() - t0;
}
void draw(int x_, int y_) {
tft.fillScreen(TFT_NAVY);
for (int i=0; i<nForme; i++) {
tft.fillRect(aRect[i].leftButtomX,aRect[i].leftButtomY,aRect[i].rightTopX,aRect[i].rightTopY,aRect[i].color);
}
tft.fillCircle(x_, y_, 2, TFT_RED);
}
Non lo volevo postare perchè me ne vergogno.....è disordinato e inefficiente. Il mio intento è quello di fare un programmino per fare disegni con le figure geometriche fondamentali.
Il problema, che ho già affrontato in un' altro post, è che la libreria che sto usando mi da problemi ad utilizzare gli oggetti sprite e quindi per poter far scorrere il cursore sugli oggetti senza che venga disegnata una linea durante lo spostamento devo ridisegnare tutto ad ogni loop.
Peccato che la velocità non basta e quindi si vede un lampeggiamento. Per tenere ferma l'immagine, almeno quando il cursore è fermo ho scritto questo
if (!(mSizeX<lastX+1 && mSizeX>lastX-1 ) || !(mSizeY<lastY+1 && mSizeY>lastY-1 )) {
tft.fillScreen(TFT_NAVY);
draw(mOrizontal,mVertical);
}
In questo modo ridisegno l'immagine solo quando muovo il cursore per spostarmi in un'altra area dello schermo. Non è bellissimo . Ma almeno quando si sta fermi l'immagine è stabile.
Mentre quando muovo il cursore l'immagine sfarfalla.
Questo è il precedente post.
https://forum.arduino.cc/t/display-tft-con-ts7785s-e-spi-frequenza-di-aggiornamento-bassa/1008385/18
La libreria che sto usando (TFT_eSPrite) ha gli oggetti Sprite ma non funzionano come mi aspetterei.
Ho seguito i consigli di Maurotec ma gli sprite vengono disegnati ma lo scroll non funziona
e se li sposto dando una nuova posizione con pushSprite() non viene cancellata l'immagine precedente anche se uso successivamente il comando deleteSprite().
Ad un certo punto ho anche pensato di salvare i valori dei colori dell'area da sovrascrivere prima di disegnare il cursore per poi rispristinarla dopo il suo passaggio in modo che bisognava ridisegnare solo piccole porizioni di pixel a vantaggio della velocità, ma sfortunatamente l'unico comando che legge il valore del colore del pixel readPixel() restituisce un colore diverso da quello che è realmente disegnato, ed ho letto un post inglese che
La libreria TFT e GFX non mi sembra abbiano soluzioni al mio problema.
Probabilmente è Lo schermo un po limitato un AZDelivery TFT 1.8 con drive TS7735c.
Ho trovato questo compromesso che andrebbe anche bene dato che lo faccio solo per divertirmii. Il problema è che lo sfarfallio di cui parlavo ad inizio post fa in modo che a volte anche da fermo le immagini tremano perchè ridisegno tutto ogni volta che i valori cambiano.
Speravo semplicemente che ci fosse una soluzione hardware per non dover riscrivere tutto da capo.
Insomma Ale, un bel casino. Anche perchè come ti dicevo sono un dilettante e i arrabatto.
Grazie tantissimo per la pazienza.
Fabio