Buongiorno a tutti, stavo provando unTFT da 3.5" parallelo ; è bello ma occupa parecchi pin.
Considerando quello che ho fatto con il display LCD a cui ho aggiunto la schedina ed ora funziona egregiamente con il protocollo I2C chiedevo se qualcuno sa se esiste una scheda simile anche per questo tipo o se ha fatto prove
un pò generico dire TFT da 3.5" parallelo. Modello ? Link ?
Si hai ragione, sono stato un pò affrettato, .
E' un "cinese" assomiglia molto a questo
anche se sotto ha qualche diversità
con arduino uno e mega ho usato le librerie settandolo come uno con 9341 a bordo
La scheda ha anche dei terminali SPI usati per la SD, ma si potrebbe non usando la SD utilizzarli per comandare il TFT?
NO, quel display ha un bus parallelo per la parte TFT ed un bus SPI connesso solo alla SD (non so il touch se è anche lui connesso sul SPI ho ha un altra connessione ancora).
Non mi sembra che ci siano degli adattatori I2C già fatti e ... ho idea che, se si vuole, bisogna realizzarselo da soli ...
Guglielmo
grazie per la precisazione, darò un'occhiata se trovo qualcosa di spiegato sui collegamenti del touch.
Intanto ho preso il classico convertitore I2C - parallelo che uso per gli LCD che forse potrebbe visto che i data sono 8 come per il TFT, ma mi sono arenato su tre pin : Rs-RW-E mentre su TFT trovo RS-WR-RD + CS
Considerando che Enable lo posso mettere a polarità fissa perche' solo in ricezione visto che non uso l'opzione touch non ho idea come giostrare il resto.
Pensi ci si possa arrivare con questa schedina? anche con qualche circuitino esterno? sto facendo il tutto con un NodeMCU 32S e ho a disposizione ancora 8 pin inutilizzati
grazie
Con i2c rallenti la comunIcazione, già Arduino è lento, così lo fai rallentare ancora di più, se poi vai ancora più avanti vedrai che puoi caricare le immagini in una SD sul display però avrai bisogno di un ambiente software per creare e caricare le immagini, allora praticamente ti avvicinerai al nextion, a questo punto comprati un nextion o simile, i cinesi ne hanno fatto di tutti i colori
Si quello che dici è vero, ma l'applicazione per cui viene utilizzato agiorna il TFT solo ogni 2 minuti quindi questa volta il tempo non conta.
Adesso sto usando un oled da 0,96 pollici, bellino, molto nitido, mooolto piccolo :-))
Volevo sostituirlo con quello che ho qui e diciamo che con questo tipo di componente sono alle prime armi, ho usato per la stessa applicazione un mega2560 perche' li i pin abbondano ma non c'è il wifi :-((
Sto studiandomi il NodeMECU ESP32S che ha abbondanza di pin e magari trovo la soluzione per usarlo con data parallelo ma sto ancora cercando i pin da usare perchè quelli per SPI sono occupati da una schedina per microSD.
Rieccomi, rivedendo il progetto e limando ho ridotto per il momento il tutto a un guppo pin per l’intrfaccia SPI e cioe’ GPIO5,18,19 e23 due per la I2Ce cioe’ GPIO 21 e22 piu un pin per un segnale irrinunciabile GPIO4 come da figura dove gli occupati hanno il pallino blu
Cosi’ facendo si liberano parecchi pin che posso assegnare per la gestione del TFT : LCD_CS , LCD_CD , LCD_WR , LCD_RD che assegnerei ai GPIO 25,26,32,33 mentre LCD_RESET potrebbe essere collegato al pin RESET dell’ESP mentre per i pin Data 0-7 pensavo a GPIO 12,13,14,27,34,35,36,39
quello che mi mette in crisi sono le label che trovo assegnate ai vari pin e non so se posso usarli ad esempio quelli segnati come touch.
Sono tentato di provare usando la dichiarazione #define ma non vorrei fare un doppio funerale :TFT+ESP
Qualcuno mi puo’ dare un consiglio? Prove gia’ fatte?
Io sinceramente non capisco perchè comprare TFT paralleli (sapendo che occupano un fracco di pin) se ne esistono di seriali tipo i nextion o SPI tipo questo:
Si hai ragione ma come dicevo è un riuso da altra applicazione con arduino mega e li problemi non ne ho.
Ho provato a riutilizzarlo su NodeMECU32s assegnando i pin ma non da segno di vita, forse sbaglio qualcosa?
ho assegnato
DATA 0 GPIO4----- RD GPIO32
DATA 1 GPIO0 ----- WR GPIO33
DATA2 GPIO2 ------ RS GPIO25
DATA3 GPIO15 ---- CS GPIO26
DATA4 GPI13 ------- RESET PIN RESET 32S
DATA5 GPIO12
DATA6 GPIO14
DATA7 GPIO 27
Nonostante credessi tutto ok alla fine si accende/no il led del TFT ma poi nulla, io uso questo programma preso da bibliografia internet e un po semplificato
// All the mcufriend.com UNO shields have the same pinout.
// i.e. control pins A0-A4. Data D2-D9. microSD D10-D13.
// Touchscreens are normally A1, A2, D7, D6 but the order varies
//
// This demo should work with most Adafruit TFT libraries
// If you are not using a shield, use a full Adafruit constructor()
// e.g. Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
#define LCD_CS 26 // Chip Select goes to Analog 3
#define LCD_CD 25 // Command/Data goes to Analog 2
#define LCD_WR 33 // LCD Write goes to Analog 1
#define LCD_RD 32 // LCD Read goes to Analog 0
//#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
#define D0 4
#define D1 0
#define D2 2
#define D3 15
#define D4 13
#define D5 12
#define D6 14
#define D7 27
#include "Adafruit_GFX.h"// Hardware-specific library
#include <MCUFRIEND_kbv.h>
MCUFRIEND_kbv tft;
// Assign human-readable names to some common 16-bit color values:
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
int n = 0;
#ifndef min
#define min(a, b) (((a) < (b)) ? (a) : (b))
#endif
void setup(void);
void loop(void);
unsigned long testFillScreen();
unsigned long testLines(uint16_t color);
unsigned long testFastLines(uint16_t color1, uint16_t color2);
unsigned long testRects(uint16_t color);
unsigned long testFilledRects(uint16_t color1, uint16_t color2);
unsigned long testFilledCircles(uint8_t radius, uint16_t color);
unsigned long testCircles(uint8_t radius, uint16_t color);
unsigned long testTriangles();
unsigned long testFilledTriangles();
unsigned long testRoundRects();
unsigned long testFilledRoundRects();
void runtests(void);
uint16_t g_identifier;
extern const uint8_t hanzi[];
void showhanzi(unsigned int x, unsigned int y, unsigned char index)
{
uint8_t i, j, c, first = 1;
uint8_t *temp = (uint8_t*)hanzi;
uint16_t color;
tft.setAddrWindow(x, y, x + 31, y + 31);
temp += index * 128;
for (j = 0; j < 128; j++)
{
c = pgm_read_byte(temp);
for (i = 0; i < 8; i++)
{
if ((c & (1 << i)) != 0)
{
color = RED;
}
else
{
color = BLACK;
}
tft.pushColors(&color, 1, first);
first = 0;
}
temp++;
}
}
void setup(void) {
Serial.begin(9600);
uint32_t when = millis();
uint16_t ID = tft.readID(); // assegno io id
ID = 0x8357; //OKOKOK -- 320x480
tft.begin(ID);
}
#if defined(MCUFRIEND_KBV_H_)
uint16_t scrollbuf[320]; // my biggest screen is 320x480
#define READGRAM(x, y, buf, w, h) tft.readGRAM(x, y, buf, w, h)
#else
uint16_t scrollbuf[320];
// Adafruit can read a block by one pixel at a time
int16_t READGRAM(int16_t x, int16_t y, uint16_t *block, int16_t w, int16_t h)
{
uint16_t *p;
for (int row = 0; row < h; row++) {
p = block + row * w;
for (int col = 0; col < w; col++) {
*p++ = tft.readPixel(x + col, y + row);
}
}
}
#endif
void windowScroll(int16_t x, int16_t y, int16_t wid, int16_t ht, int16_t dx, int16_t dy, uint16_t *buf)
{
if (dx) for (int16_t row = 0; row < ht; row++) {
READGRAM(x, y + row, buf, wid, 1);
tft.setAddrWindow(x, y + row, x + wid - 1, y + row);
tft.pushColors(buf + dx, wid - dx, 1);
tft.pushColors(buf + 0, dx, 0);
}
if (dy) for (int16_t col = 0; col < wid; col++) {
READGRAM(x + col, y, buf, 1, ht);
tft.setAddrWindow(x + col, y, x + col, y + ht - 1);
tft.pushColors(buf + dy, ht - dy, 1);
tft.pushColors(buf + 0, dy, 0);
}
}
void printmsg(int row, const char *msg)
{
tft.setTextColor(YELLOW, BLACK);
tft.setCursor(0, row);
tft.println(msg);
}
void loop(void) {
uint8_t aspect;
uint16_t pixel;
const char *aspectname[] = {
"--"
};
const char *colorname[] = { "BLUE", "GREEN", "RED", "GRAY" };
uint16_t colormask[] = { 0x001F, 0x07E0, 0xF800, 0xFFFF };
uint16_t dx, rgb, n, wid, ht, msglin;
tft.setRotation(1);
runtests();
delay(2000);
}
typedef struct {
PGM_P msg;
uint32_t ms;
} TEST;
TEST result[12];
#define RUNTEST(n, str, test) { result[n].msg = PSTR(str); result[n].ms = test; delay(500); }
void runtests(void)
{
uint8_t i, len = 24, cnt;
uint32_t total;
RUNTEST(0, "FillScreen ", testFillScreen());
RUNTEST(1, "Text ", testText());
RUNTEST(2, "Lines ", testLines(CYAN));
RUNTEST(3, "Horiz/Vert Lines ", testFastLines(RED, BLUE));
RUNTEST(4, "Rectangles (outline) ", testRects(GREEN));
RUNTEST(5, "Rectangles (filled) ", testFilledRects(YELLOW, MAGENTA));
RUNTEST(6, "Circles (filled) ", testFilledCircles(10, MAGENTA));
RUNTEST(7, "Circles (outline) ", testCircles(10, WHITE));
RUNTEST(8, "Triangles (outline) ", testTriangles());
RUNTEST(9, "Triangles (filled) ", testFilledTriangles());
RUNTEST(10, "Rounded rects (outline) ", testRoundRects());
RUNTEST(11, "Rounded rects (filled) ", testFilledRoundRects());
tft.fillScreen(BLACK);
tft.setTextColor(GREEN);
tft.setCursor(0, 0);
uint16_t wid = tft.width();
delay(2000);
}
// Standard tests.
unsigned long testFillScreen() {
tft.fillScreen(BLACK);
tft.fillScreen(RED);
tft.fillScreen(GREEN);
tft.fillScreen(BLUE);
tft.fillScreen(BLACK);
}
unsigned long testText() {
tft.fillScreen(BLACK);
tft.setRotation(1);
tft.setCursor(10, 10);
tft.setTextColor(WHITE);
tft.setTextSize(5);
tft.println(" ARRIGO");
tft.println(" ");
tft.setTextColor(GREEN);
tft.setCursor(10, 80);
tft.setTextSize(3);
tft.println(" Prova NodeMCU_ESP32S");
tft.setCursor(40, 150);
tft.setTextSize(2);
tft.println(" TFT comunicazione seriale");
delay(2000);
}
unsigned long testLines(uint16_t color) {
int x1, y1, x2, y2,
w = tft.width(),
h = tft.height();
tft.fillScreen(BLACK);
x1 = y1 = 0;
y2 = h - 1;
for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color);
x2 = w - 1;
for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color);
tft.fillScreen(BLACK);
x1 = w - 1;
y1 = 0;
y2 = h - 1;
for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color);
x2 = 0;
for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color);
tft.fillScreen(BLACK);
x1 = 0;
y1 = h - 1;
y2 = 0;
for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color);
x2 = w - 1;
for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color);
tft.fillScreen(BLACK);
x1 = w - 1;
y1 = h - 1;
y2 = 0;
for (x2 = 0; x2 < w; x2 += 6) tft.drawLine(x1, y1, x2, y2, color);
x2 = 0;
for (y2 = 0; y2 < h; y2 += 6) tft.drawLine(x1, y1, x2, y2, color);
}
unsigned long testFastLines(uint16_t color1, uint16_t color2) {
int x, y, w = tft.width(), h = tft.height();
tft.fillScreen(BLACK);
for (y = 0; y < h; y += 5) tft.drawFastHLine(0, y, w, color1);
for (x = 0; x < w; x += 5) tft.drawFastVLine(x, 0, h, color2);
}
unsigned long testRects(uint16_t color) {
int n, i, i2,
cx = tft.width() / 2,
cy = tft.height() / 2;
tft.fillScreen(BLACK);
n = min(tft.width(), tft.height());
for (i = 2; i < n; i += 6) {
i2 = i / 2;
tft.drawRect(cx - i2, cy - i2, i, i, color);
}
}
unsigned long testFilledRects(uint16_t color1, uint16_t color2) {
int n, i, i2,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(BLACK);
n = min(tft.width(), tft.height());
for (i = n; i > 0; i -= 6) {
i2 = i / 2;
tft.fillRect(cx - i2, cy - i2, i, i, color1);
tft.drawRect(cx - i2, cy - i2, i, i, color2);
}
}
unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;
tft.fillScreen(BLACK);
for (x = radius; x < w; x += r2) {
for (y = radius; y < h; y += r2) {
tft.fillCircle(x, y, radius, color);
}
}
}
unsigned long testCircles(uint8_t radius, uint16_t color) {
int x, y, r2 = radius * 2,
w = tft.width() + radius,
h = tft.height() + radius;
for (x = 0; x < w; x += r2) {
for (y = 0; y < h; y += r2) {
tft.drawCircle(x, y, radius, color);
}
}
}
unsigned long testTriangles() {
int n, i, cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(BLACK);
n = min(cx, cy);
for (i = 0; i < n; i += 5) {
tft.drawTriangle(
cx , cy - i, // peak
cx - i, cy + i, // bottom left
cx + i, cy + i, // bottom right
tft.color565(0, GREEN, 0));
}
}
int i, cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
unsigned long testFilledTriangles() {
tft.fillScreen(BLACK);
for (i = min(cx, cy); i > 10; i -= 5) {
tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(0, i, i));
tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
tft.color565(0, CYAN, 0));
}
}
unsigned long testRoundRects() {
int w, i, i2, red, step,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(BLACK);
w = min(tft.width(), tft.height());
red = 0;
step = (256 * 6) / w;
for (i = 0; i < w; i += 6) {
i2 = i / 2;
red += step;
tft.drawRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(red, 0, 0));
}
}
unsigned long testFilledRoundRects() {
int i, i2, green, step,
cx = tft.width() / 2 - 1,
cy = tft.height() / 2 - 1;
tft.fillScreen(BLACK);
green = 256;
step = (256 * 6) / min(tft.width(), tft.height());
for (i = min(tft.width(), tft.height()); i > 20; i -= 6) {
i2 = i / 2;
green -= step;
tft.fillRoundRect(cx - i2, cy - i2, i, i, i / 8, tft.color565(0, green, 0));
}
}
provato anche con Arduino Uno eliminando il define dei Data e funziona; penso che a qualche pin del 32S non vada a genio l'assegnazione.
Ovviamente dovro' comperarne uno SPI ma ero curioso di capire e sapere se qualcuno si era cimentato nella mia stessa avventura ;-))
si hai ragione, ne ho acquistato uno e tutto ok ma... mi sto arenando sull'uso dell'SD che si trova sul TFT.
In realtà è li solo per comodità penso perche' ha i suoi bravi pin di interfaccia e ora devo comandare la registrazione dei dati.
Nel vecchio sisteme era semplice , abilitavo scheda sd, registravo , anzi appendevo e poi disabilitavo
Ora per usare il tft e SD uso la stessa SPI abilitando e disabilitando prima uno e poi l'altro cioè ho solo un CS in piu', e giusto il ragionamento? la cosa mi sembra logica , e la sezione touch la gestisco quindi con altri pin .
Unico dubbio è l'assegnazione perche al di la di alcuni pin dedicati da non usare non so se gli altri si possono usare indifferentemente.
Potete darmi un indirizzo dove trovare notizie certe per l'uso dei pin del NodeMCU_32S che per quantita' e diverso dal 32 e riesco a trovare solo esempi e spiegazioni per il 32?
grazie
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.