Potreste indicarmi qualche bella libreria da usare su schermi TFT da 3" o 4" ??
Attualmente uso la UTFT, utile per certi aspetti, ma secondo me un po limitata.
Ci sono altre librerie per fare grafica sui display tft?
Tipo grafica di manometri analogici, grafici a barre o istogrammi...e cosi' via?
TNX
Hai provato a vedere le u8glib ?
https://code.google.com/p/u8glib/
Ti ringrazio, ci ho dato una occhiata, ma sembra + una libreria per lcd grafici e OLED, supporta una trasmissione dati al massimo a 8 bit.
Io uso TFT a 16bit a 65K colori e oltre.
non mi va bene questa libreria.
Arduino Uno?
Questa libreria sembra carina ma per Arduino Due (si chiama DueGui)
http://forum.arduino.cc/index.php?topic=164788.0
Interessante, in effetti hanno implementato alle librerie che gia' uso (UTFT,UButton,UTouch) altre funzioni.
Ora ci do uno sguardo.
A me serve soprattutto per il Mega, per il 1284 ecc... ma anche per il DUE.
Purtroppo per il lavoro che sto facendo ora, sull' ATMega 1284p questa libreria non posso usarla.
Attendo altre segnalazioni.
Se hai queste esigenze, ti conviene usare display dotati di un proprio processore, come quelli della 4Dsystems.
Accidenti, bei display davvero, pero' costano una cifra.
Ormai il progetto e' quasi finito, l' hardware ormai e' pronto con tanto di stampato, il tutto per display 3,2" a 16bit.
Per ora non posso piu' tornare indietro, quindi quei display non posso usarli per questo progetto, pero' li valutero' per idee future.
Al momento uso le librerie suindicate, pero' vorrei qualche funzione in piu' .
nulla ? non ne conoscete altre?
domanda intrinseca....
come posso fare, per esempio, a far spostare un oggetto sul display e far ricomparire lo sfondo senza dover aggiornare completamente tutto il display?
mi spiego meglio: se carico un' immagine come sfondo e ho un oggetto(qualunque cosa, tipo linea, quadrato pieno ecc) che voglio spostare, come posso far ricomparire cio' che era coperto precedentemente (parte dello sfondo) dall' oggetto che sposto?
Ad esempio se volessi creare un manometro o voltmetro analogico, potrei creare un' immagine del manometro e una linea che funge da lancetta che si muove, pero' quando la lancetta si muove devo ricreare la parte che era coperta precedentemente senza riaggiornare il tutto.
In caso di fondo unico e' semplice, prima creo lo stesso oggetto con il colore dello sfondo sulla posizione iniziale e poi creo l' oggetto nuovo sulla posizione successiva, ma in caso di sfondo colorato?
Help please...
TNX
L'unica cosa che mi viene in mente al momento è:
crei una immagine dello strumento analogico, priva di ago, ma con tutto il resto (tacche, scritte, sfondo, ...)
questa immagine sarà di forma rettangolare, come tutte le immagini, anche se all'interno c'è il disegno dello strumento privo di lancetta che può avere anche forma qualsiasi
Per aggiornare la posizione dell'ago:
posizioni l'immagine alle coordinate opportune così sovraimponi l'immagine dello strumento vuoto a quello che c'era prima (strumento + ago)
disegni la linea che funge da ago
così avrai lo strumento con l'ago nella corretta posizione senza riaggiornare tutta la schermata ma semplicemente facendogli ridisegnare una immagine
come ti ho detto, io mi sto trovando bene con i 4DSystems che hanno già gli strumenti (e tanto altro) e mi basta inviare il dato della posizione dell'ago allo strumento e poi fa tutto da solo... certo questi 4DSystems costano un po' ma vengono fuori delle interfacce veramente belle
si ma infatti come detto sopra e' la soluzione a cui sono arrivato anche io, il problema e' che se il manometro prende mezzo display devo aggiornare molto velocemente tutta quella parte, e in caso di manometri molto veloci, tipo giri rpm ad esempio, la mcu non gli sta dietro, l' aggiornamento e' lento e viene una schifezza, forse solo con il DUE si ha un buon risultato.
la vedo dura, forse mettendo tutta l' immagine un una eeprom velocizzo un po, ma comunque in caso di piu' manometri sul display avrei comunque rallentamenti troppo significativi.
Ma come sfondo del manometro (o quello che è), hai una immagine?
Mi viene in mente solo una soluzione, complicatissima:
stabilisci un numero fisso di posizioni per l'ago dello strumento, N = ....
quindi l'ago potrà assumere solo una delle N posizioni.
Associa ad ogni valore che vuoi indicare una delle N posizioni, i valori saranno anche di più, fai degli intervalli
N = 100
valore = 0 ... 1000
valore = 0 --> N = 1
valore da 2 a 10 --> N = 2
valore da 10 a 20 --> N = 3
e così via
per avere una indicazione numerica, puoi associare un numero da visualizzare, da 0 a 1000, e lo scrivi sotto.
Così hai sia la lancetta che il numero.
Il numero è facilissimo da aggiornare.
Per la lancetta... ecco la parte complicata...
per ogni posizione N = i associ un insieme di punti colorati, ciascuno dello stesso colore che incontri sullo sfondo congiungendo il centro dello strumento con il bordo, per la lunghezza della lancetta. Questo sarà l'array che ti servirà per CANCELLARLA facendo riapparire lo sfondo... quindi per disegnare l'ago in posizione N ti basta fare una linea che congiunge il centro con il bordo (ovviamente finirà un po' prima ma è la stessa cosa). Per spostare l'ago da N=i ad N=j dovrai tracciare la linea per N=j e tracciare i punti per N=i in modo da cancellare la linea che prima era su N = i.
In pratica devi memorizzare i colori dei singoli pixel che compongono ciascuna delle N linee e poi ridisegnarli col loro colore originario.
Puoi anche farlo dinamicamente, se nella libreria hai una funzione che ti restituisce il colore di un pixel. Prima di tracciare la linea ti memorizzi i colori dei pixel da cui passerà, per cancellarla rimetti questi colori al loro posto.
Un po' complicato ma dovrebbe dare l'effetto giusto...
Scusa Lock abbiamo risposto assieme.
questo era per Paulus1969:
Si ammettiamo che lo sfondo sia un' immagine.
Si capito perfettamente, l' idea non e' male e la velocita' di aggiornamento sarebbe ottima. Il problema e' che le librerie che conosco non hanno nessun comando che mi restituiscono il valore del colore di un pixel specifico sul display, o almeno io non conosco questa funzione.
Mettere gia' in memoria 100 array di n. pixel (fattibile gia' alla partenza) forse e' troppo dispendioso in termini di memoria disponibile, ma si potrebbe espandere con eeprom.
Invece forse la soluzione di mettere in memoria l' array di pixel prima di disegnare la linea per poi rimpiazzarla prima di spostarla sarebbe meno dispendiosa e credo che come velocita' non dovrebbe appesantire.
Il problema primario e' sapere il colore dei pixel....esiste questa funzione? tipo un getpixel!
lock:
premesso che
-1- per sfondo si intende una bitmap con tacchette e numerini, quindi non un flat background mono colore
-2- ogni lancetta e' un insieme di una o più linee, ed ogni linea e' il luogo geometrico della soluzione di una equazione discretadirei che per la -1- la soluzione qui sopra proposta va bene
quando devi disegnare la lancetta:
plotPixel(x, y, coloreLancetta);
mentre per cancellarla prima di aggiornare alla nuova posizione:
plotPixel(x, y, getColoreSfondo(x, y));
direi anche per la -2- a parità di algoritmo di tracciatura e condizioni al contorno non ci solo problemi di densità numerica tra i luoghi geometrici di diverse tracciature: ovvero a parità di algoritmo e di coordinate i pixel che compongono la linea saranno sempre gli stessi, di conseguenza e' possibile il giochino del cancella-la-vecchia linea e ritraccia-la-nuova.
perdonami, non ho ben capito, il comando
plotPixel(x, y, getColoreSfondo(x, y));
cancella la vecchia linea riportando i colori che c'erano dello sfondo(immagine)?
e dove li ha memorizzati per poterli ristampare a display?
inoltre il comando plotPixel non e' riconosciuto dall' ide, fa parte di una libreria specifica?
????
Grande l' idea!!
Capito perfettamente il meccanismo....ma troppo complicato per me realizzarlo.
Desisto su questa soluzione e resto in attesa, se esiste, di una soluzione per me piu' semplice.
Grazie mille lock!
Ma qui siamo con segmenti...
Secondo me toglierà lo sfondo ...
paulus1969:
Secondo me toglierà lo sfondo ...
Mi sa proprio che rinuncio allo sfondo....
da come ho capito e' troppo complicato.
ad ogni modo mi confermi che su quei display di cui parlavi questo lavoro lo si fa con facilita' ??
Sui 4DSystems dici...
Lo si fa con facilità infatti fa tutto il display.
Hai un programma con il quale disegni le schermate e puoi inserire elementi come - appunto - strumenti ad ago.
Carichi la libreria e tramite quella dici allo strumento quale valore deve indicare. Lo strumento indicherà quel valore.
Più semplice di così...
Gli altri elementi sono altrettanto semplici da gestire (pulsanti, slider, led, ...)
Al primo impatto devi prenderci la mano con le librerie. Ma imparato quello, poi vai veloce.
L'unico difetto...
... costano un po'.
si si, imparare i comandi delle librerie non e' un problema.
Sto buttando giù un po di codice, sto provando con sfondo unico, pero' il problema c'e' lo stesso.
Nel senso che comunque all' interno del manometro ci saranno dei numeri, delle linee, delle tacchette ....che comunque la lancetta va a coprire passandoci sopra, quindi non risolvo nulla.
Dovrei fermare la lancetta molto prima, accorciandola, oppure portare fuori i numeri e fare delle tacchette piccole...ma viene proprio uno schifo... accidenti.
E se io ricreassi in memoria una matrice grande quanto il manometro con all' interno il valore booleano di Sfondo o ColoreStrumentazione (utilizzando 2 colori soli) e per rimpiazzare lo sfondo dove era lancetta vado a prelevare semplicemente il valore corrispondente nella matrice?
Il problema sarebbe conoscere il treno di coordinate della linea stessa, ma qui con un po di matematica si potrebbe ottenere.
Inoltre potrei usare non la funzione "line(x1,y1,x2,y2)" ma una funzione pixel(x,y) associata ad una funzione lineare che va da(x1,y1,x2,y2). In questo modo avrei tutte le coordinate di tutti i pixel che compongono la linea...che ne dite? un po' incasinato, ma credo si capisca...