I purchased from ebay a cheap 2.4" touch TFT LCD shield for Arduino Uno:
First, I tryed examples from SWTFT library and I made a movie:
VIDEO
and few pics:
For understund the example from SWTFT library, I change the sketch and my results are:
VIDEO
VIDEO
Finally, I try this:
and my sketch is:
// Original code provided by Smoke And Wires
// http://www.smokeandwires.co.nz
// This code has been taken from the Adafruit TFT Library and modified
// by us for use with our TFT Shields / Modules
// For original code / licensing please refer to
// https://github.com/adafruit/TFTLCD-Library
// adapted sketch by niq_ro from http://arduinotehniq.blogspot.com/
// ver. 1m5 - 13.11.2014, Craiova - Romania
#include <Adafruit_GFX.h> // Core graphics library
#include "SWTFT.h" // Hardware-specific library
// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
// #define LCD_CS A3 // Chip Select goes to Analog 3
// #define LCD_CD A2 // Command/Data goes to Analog 2
// #define LCD_WR A1 // LCD Write goes to Analog 1
// #define LCD_RD A0 // LCD Read goes to Analog 0
// #define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
// When using the BREAKOUT BOARD only, use these 8 data lines to the LCD:
// For the Arduino Uno, Duemilanove, Diecimila, etc.:
// D0 connects to digital pin 8 (Notice these are
// D1 connects to digital pin 9 NOT in order!)
// D2 connects to digital pin 2
// D3 connects to digital pin 3
// D4 connects to digital pin 4
// D5 connects to digital pin 5
// D6 connects to digital pin 6
// D7 connects to digital pin 7
// For the Arduino Mega, use digital pins 22 through 29
// (on the 2-row header at the end of the board).
#include <Adafruit_GFX.h> // Core graphics library
#include <SWTFT.h> // Hardware-specific library
#include <TouchScreen.h>
#define YP A1 // must be an analog pin, use "An" notation!
#define XM A2 // must be an analog pin, use "An" notation!
#define YM 7 // can be a digital pin
#define XP 6 // can be a digital pin
#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940
// For better pressure precision, we need to know the resistance
// between X+ and X- Use any multimeter to read it
// For the one we're using, its 300 ohms across the X plate
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
// 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
//#define ROZ 0xFD20
#define ROZ 0xFBE0
#define GRI 0xBDF7
// http://stackoverflow.com/questions/13720937/c-defined-16bit-high-color
// http://wiibrew.org/wiki/U16_colors
SWTFT tft;
#define BOXSIZE 40
#define PENRADIUS 3
int oldcolor, currentcolor;
int ics;
void setup (void ) {
Serial .begin (9600);
Serial .println (F("Paint!" ));
tft.reset ();
uint16_t identifier = tft.readID();
Serial .print (F("LCD driver chip: " ));
Serial .println (identifier, HEX );
tft.begin (identifier);
tft.fillScreen(BLACK);
tft.fillRect(0, 0, 320, 240, BLACK);
tft.setRotation(3);
tft.setCursor (30, 100);
tft.setTextColor(RED); tft.setTextSize(3);
tft.println ("LCD driver chip: " );
tft.setCursor (100, 150);
tft.setTextColor(BLUE);
tft.println (identifier, HEX );
delay (2000);
tft.fillRect(0, 0, 320, 240, BLACK);
tft.setRotation(0);
tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
tft.fillRect(0, BOXSIZE, BOXSIZE, BOXSIZE, YELLOW);
tft.fillRect(0, BOXSIZE*2, BOXSIZE, BOXSIZE, GREEN);
tft.fillRect(0, BOXSIZE*3, BOXSIZE, BOXSIZE, CYAN);
tft.fillRect(0, BOXSIZE*4, BOXSIZE, BOXSIZE, BLUE);
tft.fillRect(0, BOXSIZE*5, BOXSIZE, BOXSIZE, MAGENTA);
tft.fillRect(0, BOXSIZE*6, BOXSIZE, BOXSIZE, GRI);
tft.fillRect(0, BOXSIZE*7, BOXSIZE, BOXSIZE, ROZ);
//tft.fillRect(BOXSIZE, BOXSIZE, BOXSIZE, BOXSIZE, WHITE);
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
currentcolor = RED;
cifre (WHITE);
pinMode (13, OUTPUT );
}
#define MINPRESSURE 10
#define MAXPRESSURE 1000
void loop ()
{
digitalWrite (13, HIGH );
// Recently Point was renamed TSPoint in the TouchScreen library
// If you are using an older version of the library, use the
// commented definition instead.
// Point p = ts.getPoint();
TSPoint p = ts.getPoint();
digitalWrite (13, LOW );
// if sharing pins, you'll need to fix the directions of the touchscreen pins
//pinMode(XP, OUTPUT);
pinMode (XM, OUTPUT );
pinMode (YP, OUTPUT );
//pinMode(YM, OUTPUT);
// we have some minimum pressure we consider 'valid'
// pressure of 0 means no pressing!
if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {
/*
Serial.print("X = "); Serial.print(p.x);
Serial.print("\tY = "); Serial.print(p.y);
Serial.print("\tPressure = "); Serial.println(p.z);
*/
if (p.y < (TS_MINY-5)) stergere();
// scale from 0->1023 to tft.width
p.x = tft.width()-(map (p.x, TS_MINX, TS_MAXX, tft.width(), 0));
p.y = tft.height()-(map (p.y, TS_MINY, TS_MAXY, tft.height(), 0));
/*
Serial.print("("); Serial.print(p.x);
Serial.print(", "); Serial.print(p.y);
Serial.println(")");
*/
if (p.x < BOXSIZE) {
oldcolor = currentcolor;
if (p.y < BOXSIZE) {
currentcolor = RED;
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
// text (currentcolor);
} else if (p.y < BOXSIZE*2) {
currentcolor = YELLOW;
tft.drawRect(0, BOXSIZE, BOXSIZE, BOXSIZE, WHITE);
// text (currentcolor);
} else if (p.y < BOXSIZE*3) {
currentcolor = GREEN;
tft.drawRect(0, BOXSIZE*2, BOXSIZE, BOXSIZE, WHITE);
// text (currentcolor);
} else if (p.y < BOXSIZE*4) {
currentcolor = CYAN;
tft.drawRect(0, BOXSIZE*3, BOXSIZE, BOXSIZE, WHITE);
// text (currentcolor);
} else if (p.y < BOXSIZE*5) {
currentcolor = BLUE;
tft.drawRect(0, BOXSIZE*4, BOXSIZE, BOXSIZE, WHITE);
// text (currentcolor);
} else if (p.y < BOXSIZE*6) {
currentcolor = MAGENTA;
tft.drawRect(0,BOXSIZE*5, BOXSIZE, BOXSIZE, WHITE);
// text (currentcolor);
} else if (p.y < BOXSIZE*7) {
currentcolor = GRI;
tft.drawRect(0,BOXSIZE*6, BOXSIZE, BOXSIZE, WHITE);
// text (currentcolor);
} else if (p.y < BOXSIZE*8) {
currentcolor = ROZ;
tft.drawRect(0,BOXSIZE*7, BOXSIZE, BOXSIZE, WHITE);
stergere();
}
text (currentcolor);
//cifre (currentcolor);
if (oldcolor != currentcolor) {
if (oldcolor == RED) tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
if (oldcolor == YELLOW) tft.fillRect(0, BOXSIZE, BOXSIZE, BOXSIZE, YELLOW);
if (oldcolor == GREEN) tft.fillRect(0, BOXSIZE*2, BOXSIZE, BOXSIZE, GREEN);
if (oldcolor == CYAN) tft.fillRect(0, BOXSIZE*3, BOXSIZE, BOXSIZE, CYAN);
if (oldcolor == BLUE) tft.fillRect(0, BOXSIZE*4, BOXSIZE, BOXSIZE, BLUE);
if (oldcolor == MAGENTA) tft.fillRect(0, BOXSIZE*5, BOXSIZE, BOXSIZE, MAGENTA);
if (oldcolor == GRI) tft.fillRect(0, BOXSIZE*6, BOXSIZE, BOXSIZE, GRI);
if (oldcolor == ROZ) tft.fillRect(0, BOXSIZE*7, BOXSIZE, BOXSIZE, ROZ);
cifre (currentcolor);
}
}
// if (((p.y-PENRADIUS) > BOXSIZE) && ((p.y+PENRADIUS) < tft.height())) {
/*
if (((p.y-PENRADIUS) > 5) && ((p.y+PENRADIUS) < tft.height())) {
tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor);
}
*/
if (((p.x-PENRADIUS) > BOXSIZE) && ((p.x+PENRADIUS) < tft.width())) {
tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor);
}
}
}
void text (int culoare)
{
tft.setRotation(3);
tft.setCursor (70, 80);
tft.setTextColor(culoare); tft.setTextSize(5);
/* tft.println("niq_ro");
tft.setCursor(12, 130); tft.setTextSize(3);
tft.println("www.tehnic.go.ro");
tft.setCursor(20, 165); tft.setTextSize(2);
tft.println("nicuflorica.blogspot.ro");
*/
tft.setCursor (5, 220); tft.setTextSize(2);
tft.println ("arduinotehniq.blogspot.com" );
tft.setRotation(0);
}
void cifre (int culoare)
{
// number for "buttons"
tft.setRotation(3);
tft.setTextColor(culoare);
tft.setTextSize(3);
tft.drawLine(0, 0, 40, 40, culoare);
tft.drawLine(0, 40, 40, 0, culoare);
// tft.setCursor(15, 10);
// tft.println("1");
tft.setCursor (55, 10);
tft.println ("1" );
tft.setCursor (95, 10);
tft.println ("2" );
tft.setCursor (135, 10);
tft.println ("3" );
tft.setCursor (175, 10);
tft.println ("4" );
tft.setCursor (215, 10);
tft.println ("5" );
tft.setCursor (255, 10);
tft.println ("6" );
tft.setCursor (295, 10);
tft.println ("7" );
tft.setRotation(0);
}
void stergere ()
{
Serial .println ("erase" );
// press the bottom of the screen to erase
// tft.fillRect(0, BOXSIZE, tft.width(), tft.height()-BOXSIZE, BLACK);
tft.fillRect(0, 0, 240, 320, BLACK);
tft.setRotation(0);
tft.fillRect(0, 0, BOXSIZE, BOXSIZE, RED);
tft.fillRect(0, BOXSIZE, BOXSIZE, BOXSIZE, YELLOW);
tft.fillRect(0, BOXSIZE*2, BOXSIZE, BOXSIZE, GREEN);
tft.fillRect(0, BOXSIZE*3, BOXSIZE, BOXSIZE, CYAN);
tft.fillRect(0, BOXSIZE*4, BOXSIZE, BOXSIZE, BLUE);
tft.fillRect(0, BOXSIZE*5, BOXSIZE, BOXSIZE, MAGENTA);
tft.fillRect(0, BOXSIZE*6, BOXSIZE, BOXSIZE, GRI);
tft.fillRect(0, BOXSIZE*7, BOXSIZE, BOXSIZE, ROZ);
//tft.fillRect(BOXSIZE, BOXSIZE, BOXSIZE, BOXSIZE, WHITE);
tft.drawRect(0, 0, BOXSIZE, BOXSIZE, WHITE);
currentcolor = RED;
cifre (WHITE);
}