Il display LCD touch da 11,6 pollici (modello n. WTY116834A02LM) è un pannello display LCD TFT a colori con risoluzione FHD 1920×1080 e interfaccia EDP standard a 30 pin, che supporta la tecnologia IPS leggibile alla luce del sole, il collegamento ottico/il collegamento a nastro.
Il pannello tattile è un pannello tattile capacitivo con struttura G+G, composto da vetro di copertura, vetro del sensore, circuito integrato del driver e FPC. È gestito da un chip IC GOODIX GT928, che utilizza un'interfaccia I2C e supporta 10 punti di contatto.
**************************************************************************/
#includi
#includi
#includi
#includi
#define SCREEN_WIDTH 128 // Larghezza display OLED, in pixel
#define SCREEN_HEIGHT 64 // Altezza del display OLED, in pixel
// Dichiarazione per un display SSD1306 collegato a I2C (pin SDA, SCL)
#define OLED_RESET 4 // Resetta il pin # (o -1 se condividi il pin di reset di Arduino)
Display Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define NUMFLAKES 10 // Numero di fiocchi di neve nell'esempio di animazione
#definisci LOGO_HEIGHT 16
#definisci LOGO_WIDTH 16
static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000 };
impostazione nulla() {
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = genera internamente la tensione del display da 3,3 V
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Indirizzo I2C
Serial.println(F("Allocazione SSD1306 fallita"));
per(;;); // Non procedere, ripete il ciclo all'infinito
}
// Mostra il contenuto del buffer di visualizzazione iniziale sullo schermo —
// la libreria lo inizializza con una schermata iniziale di Adafruit.
display.display();
ritardo(2000); // Pausa per 2 secondi
// Cancella il buffer
display.clearDisplay();
// Disegna un singolo pixel in bianco
display.drawPixel(10, 10, SSD1306_WHITE);
// Mostra il buffer di visualizzazione sullo schermo. DEVI chiamare display() dopo
// disegna comandi per renderli visibili sullo schermo!
display.display();
ritardo(2000);
// display.display() NON è necessario dopo ogni singolo comando di disegno,
// a meno che non sia quello che vuoi... piuttosto, puoi crearne un sacco
// disegna operazioni e quindi aggiorna lo schermo tutto in una volta chiamando
// display.display(). Questi esempi dimostrano entrambi gli approcci...
testdrawline(); // Disegna molte linee
testdrawrect(); // Disegna rettangoli (contorni)
provariempimento(); // Disegna rettangoli (riempiti)
provacerchio(); // Disegna cerchi (contorni)
testfillcircle(); // Disegna cerchi (riempiti)
testdrawroundrect(); // Disegna rettangoli arrotondati (contorni)
testfillroundrect(); // Disegna rettangoli arrotondati (riempiti)
testdrawtriangolo(); // Disegna triangoli (contorni)
testfilltriangolo(); // Disegna triangoli (riempiti)
testdrawchar(); // Disegna i caratteri del carattere predefinito
testdrawstyles(); // Disegna caratteri 'stilizzati'
testscrolltesto(); // Disegna il testo scorrevole
testdrawbitmap(); // Disegna una piccola immagine bitmap
// Inverte e ripristina la visualizzazione, facendo una pausa nel mezzo
display.invertDisplay(true);
ritardo(1000);
display.invertDisplay(falso);
ritardo(1000);
testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Anima le bitmap
}
ciclo vuoto() {
}
void testdrawline() {
int16_t io;
display.clearDisplay(); // Cancella il buffer di visualizzazione
for(i=0; i
display.drawLine(0, 0, i, display.height()-1, SSD1306_WHITE);
display.display(); // Aggiorna la schermata con ogni linea appena tracciata
ritardo(1);
}
for(i=0; i
display.drawLine(0, 0, display.width()-1, i, SSD1306_WHITE);
display.display();
ritardo(1);
}
ritardo(250);
display.clearDisplay();
for(i=0; i
display.drawLine(0, display.height()-1, i, 0, SSD1306_WHITE);
display.display();
ritardo(1);
}
for(i=display.altezza()-1; i>=0; i-=4) {
display.drawLine(0, display.height()-1, display.width()-1, i, SSD1306_WHITE);
display.display();
ritardo(1);
}
ritardo(250);
display.clearDisplay();
for(i=display.larghezza()-1; i>=0; i-=4) {
display.drawLine(display.width()-1, display.height()-1, i, 0, SSD1306_WHITE);
display.display();
ritardo(1);
}
for(i=display.altezza()-1; i>=0; i-=4) {
display.drawLine(display.width()-1, display.height()-1, 0, i, SSD1306_WHITE);
display.display();
ritardo(1);
}
ritardo(250);
display.clearDisplay();
for(i=0; i
display.drawLine(display.width()-1, 0, 0, i, SSD1306_WHITE);
display.display();
ritardo(1);
}
for(i=0; i
display.drawLine(display.width()-1, 0, i, display.height()-1, SSD1306_WHITE);
display.display();
ritardo(1);
}
ritardo(2000); // Pausa per 2 secondi
}
void testdrawrect(void) {
display.clearDisplay();
for(int16_t i=0; i
display.drawRect(i, i, display.width()-2*i, display.height()-2*i, SSD1306_WHITE);
display.display(); // Aggiorna la schermata con ogni rettangolo appena disegnato
ritardo(1);
}
ritardo(2000);
}
void testfillrect(void) {
display.clearDisplay();
for(int16_t i=0; i
// Il colore INVERSO viene utilizzato in modo che i rettangoli si alternino bianco/nero
display.fillRect(i, i, display.width()-i*2, display.height()-i*2, SSD1306_INVERSE);
display.display(); // Aggiorna la schermata con ogni rettangolo appena disegnato
ritardo(1);
}
ritardo(2000);
}
vuoto testdrawcircle(vuoto) {
display.clearDisplay();
for(int16_t i=0; i
display.drawCircle(display.width()/2, display.height()/2, i, SSD1306_WHITE);
display.display();
ritardo(1);
}
ritardo(2000);
}
vuoto testfillcircle(vuoto) {
display.clearDisplay();
for(int16_t i=max(display.width(),display.height())/2; i>0; i-=3) {
// Viene utilizzato il colore INVERSO in modo che i cerchi si alternino bianco/nero
display.fillCircle(display.width() / 2, display.height() / 2, i, SSD1306_INVERSE);
display.display(); // Aggiorna la schermata con ogni cerchio appena disegnato
ritardo(1);
}
ritardo(2000);
}
void testdrawroundrect(void) {
display.clearDisplay();
for(int16_t i=0; i
display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i,
display.altezza()/4, SSD1306_WHITE);
display.display();
ritardo(1);
}
ritardo(2000);
}
void testfillroundrect(void) {
display.clearDisplay();
for(int16_t i=0; i
// Il colore INVERSO viene utilizzato in modo che i rettangoli rotondi si alternino bianco/nero
display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i,
display.altezza()/4, SSD1306_INVERSO);
display.display();
ritardo(1);
}
ritardo(2000);
}
void testdrawtriangolo(void) {
display.clearDisplay();
for(int16_t i=0; i
display.drawTriangolo(
display.larghezza()/2 , display.altezza()/2-i,
display.larghezza()/2-i, display.altezza()/2+i,
display.larghezza()/2+i, display.altezza()/2+i, SSD1306_WHITE);
display.display();
ritardo(1);
}
ritardo(2000);
}
vuoto testriempitriangolo(vuoto) {
display.clearDisplay();
for(int16_t i=max(display.width(),display.height())/2; i>0; i-=5) {
// Viene utilizzato il colore INVERSO in modo che i triangoli si alternino bianco/nero
display.fillTriangolo(
display.larghezza()/2 , display.altezza()/2-i,
display.larghezza()/2-i, display.altezza()/2+i,
display.larghezza()/2+i, display.altezza()/2+i, SSD1306_INVERSO);
display.display();
ritardo(1);
}
ritardo(2000);
}
void testdrawchar(void) {
display.clearDisplay();
display.setTextSize(1); // Scala pixel normale 1:1
display.setTextColor(SSD1306_WHITE); // Disegna il testo bianco
display.setCursor(0, 0); // Inizia dall'angolo in alto a sinistra
display.cp437(vero); // Utilizza il carattere "Code Page 437" completo da 256 caratteri
// Not all the characters will fit on the display. This is normal.
// Library will draw what it can and the rest will be clipped.
for(int16_t i=0; i<256; i++) {
if(i == ‘\n’) display.write(‘ ‘);
else display.write(i);
}
display.display();
ritardo(2000);
}
void testdrawstyles(void) {
display.clearDisplay();
display.setTextSize(1); // Normal 1:1 pixel scale
display.setTextColor(SSD1306_WHITE); // Draw white text
display.setCursor(0,0); // Start at top-left corner
display.println(F(“Hello, world!”));
display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw ‘inverse’ text
display.println(3.141592);
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.print(F(“0x”)); display.println(0xDEADBEEF, HEX);
display.display();
ritardo(2000);
}
void testscrolltext(void) {
display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 0);
display.println(F(“scroll”));
display.display(); // Show initial text
delay(100);
// Scroll in various directions, pausing in-between:
display.startscrollright(0x00, 0x0F);
ritardo(2000);
display.stopscroll();
ritardo(1000);
display.startscrollleft(0x00, 0x0F);
ritardo(2000);
display.stopscroll();
ritardo(1000);
display.startscrolldiagright(0x00, 0x07);
ritardo(2000);
display.startscrolldiagleft(0x00, 0x07);
ritardo(2000);
display.stopscroll();
ritardo(1000);
}
void testdrawbitmap(void) {
display.clearDisplay();
display.drawBitmap(
(display.width() – LOGO_WIDTH ) / 2,
(display.height() – LOGO_HEIGHT) / 2,
logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
display.display();
ritardo(1000);
}
#define XPOS 0 // Indexes into the ‘icons’ array in function below
#define YPOS 1
#define DELTAY 2
void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
int8_t f, icons[NUMFLAKES][3];
// Initialize ‘snowflake’ positions
for(f=0; f< NUMFLAKES; f++) {
icons[f][XPOS] = random(1 – LOGO_WIDTH, display.width());
icons[f][YPOS] = -LOGO_HEIGHT;
icons[f][DELTAY] = random(1, 6);
Serial.print(F(“x: “));
Serial.print(icons[f][XPOS], DEC);
Serial.print(F(” y: “));
Serial.print(icons[f][YPOS], DEC);
Serial.print(F(” dy: “));
Serial.println(icons[f][DELTAY], DEC);
}
for(;;) { // Loop forever…
display.clearDisplay(); // Clear the display buffer
// Draw each snowflake:
for(f=0; f< NUMFLAKES; f++) {
display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SSD1306_WHITE);
}
display.display(); // Show the display buffer on the screen
delay(200); // Pause for 1/10 second
// Then update coordinates of each flake…
for(f=0; f< NUMFLAKES; f++) {
icons[f][YPOS] += icons[f][DELTAY];
// If snowflake is off the bottom of the screen…
if (icons[f][YPOS] >= display.height()) {
// Reinitialize to a random position, just off the top
icons[f][XPOS] = random(1 – LOGO_WIDTH, display.width());
icons[f][YPOS] = -LOGO_HEIGHT;
icons[f][DELTAY] = random(1, 6);
}
}
}
}