En algunos ejemplos que vienen con la librería dan error: HelloWorld_4bit:8: error: 'BACKLIGH_PIN' was not declared in this scope.
Para resolverlo basta con borrar la variable BACKLIGHT_PIN de la declaración :
LiquidCrystal lcd(12, 11, 5, 4, 3, 2, BACKLIGH_PIN, POSITIVE );
Las tarjetas I2C pueden tener distintas asignaciones tanto de su dirección como de los pines.
La dirección (address) se puede cambiar soldando los pines señalados en la imagen:
En la foto de arriba, se aprecian los contactos (en el circulo rojo) habilitados para direccionar el PCF8574, A0, A1 y A2, vea la tabla de direccionamiento de más arriba, para seleccionar la dirección necesaria para su caso. En principio, estos pines están al aire, es decir, los tres son uno lógico, por tanto, la dirección es 0x27 en hexadecimal (39 decimal), según la tabla, si ponemos todos a 0 lógico, tendremos 0x20 en hexadecimal. Usted puede elegir la dirección que tenga libre, si es que usa más de un PCF8574. Mi dispositivo está puesto en: A0=1, A1=0 y A2=0, le corresponde (21h).
http://hispavila.com/3ds/atmega/displaylcd.html
Dependiendo de los valores asignados a los tres pines A0, A1 y A2, permite que utilicemos hasta 8 dispositivos PCF8574, para controlar un LCD, un teclado u otro dispositivo con E/S.
NOTA: Tener presente que, los fabricantes producen dos variantes de este IC: PCF8574 y PCF8574A. La única diferencia es la dirección de llamada a I2C. Esto permite conectar hasta 16 dispositivos (8 de 8574 y otros 8 de 8574A). El PCF8574T es equivalente al PFC8574.
ID Addr. PIN's
PCF8574 b01000000 0x20h A2A1A0
PCF8574A b01110000 0x38h A2A1A0
Hay gente que, está teniendo conclusiones erróneas en su PCB (de compra), con las hoja de datos PCF8574 y la lista de direcciones. Para utilizar el PCF8574 en sus dos versiones, es la siguiente:
Para el PCF8574A. Para el PCF8574.
pin3 pin2 pin1 PCF8574A | pin3 pin2 pin1 PCF8574
A2 A1 A0 Hex Dec | A2 A1 A0 Hex Dec
L L L 0x38 56 | L L L 0x20 32
L L H 0x39 57 | L L H 0x21 33
L H L 0x40 64 | L H L 0x22 34
L H H 0x4A 74 | L H H 0x23 35
H L L 0x4B 75 | H L L 0x24 36
H L H 0x4C 76 | H L H 0x25 37
H H L 0x4D 77 | H H L 0x26 38
H H H 0x4E 78 | H H H 0x27 39
En cuanto a la conexión de la tarjeta I2C al Arduino tenemos que distinguir entre el Arduino Mega y el resto:
I2C | Arduino | Arduino Mega |
VCC | 5V | 5V |
GND | GND | GND |
SCL | A5 | D21 |
SDA | A4 | D20 |
Quedando en un Arduino Uno así:
Esta pequeña tarjeta viene provista de un conector de 4 pines (ver foto), de arriba a abajo:
GND = GND o masa < Negro >.
VCC = +Vcc de 5 Voltios < Rojo >.
SDA = Pin analógico 4 de Arduino o TX, línea de datos < Blanco > .
SCL = Pin analógico 5 de Arduino o RX, línea de reloj < Amarillo >.
Nota. Para recordar con facilidad, asocie SDA con el 4, es decir SDA = pin4, el otro pin (pin5) se corresponde con SCL.
La librería para usar los LCD 16x2 es la de fmalpartida (https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads).
Para usarla hay que descomprimirla en la carpeta libraries del IDE, borrando previamente la carpeta “Liquidcrystal” existente.
Para determinar la dirección de la tarjeta IC2 usamos el sketch de la web:
http://playground.arduino.cc/Main/I2cScanner
Nuestra tarjeta es:
Marca | YwRobot o DFRobot |
Dirección I2C | 0x27 |
Asignación pines | RS P0 |
https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/schematics
Para configurar nuestra tarjeta y que funcione hay que cambiar la asignación de los pines en los sketches. Tenemos dos formas:
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
/*-----( Declaración de constantes )-----*/ // Dirección I2C del LCD #define I2C_ADDR 0x27 // Asignación de pines para el YwRobot LCM1602 IIC V1 (PCF8574T) #define BACKLIGHT_PIN 3 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 // Iluminación ON/OFF #define LIGHT_OFF LOW #define LIGHT_ON HIGH /*----- Configurar LCD -----*/ LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); |
Podemos usar la primera forma vista en el apartado anterior en los ejemplos en los que estén definidas las variables como la segunda forma. El código quedaría así (comentando las líneas innecesarias).
///*-----( Declaración de constantes )-----*/ // // Dirección I2C del LCD //#define I2C_ADDR 0x27 // // // Asignación de pines para el YwRobot LCM1602 IIC V1 (PCF8574T) #define BACKLIGHT_PIN 3 //#define En_pin 2 //#define Rw_pin 1 //#define Rs_pin 0 //#define D4_pin 4 //#define D5_pin 5 //#define D6_pin 6 //#define D7_pin 7 // // Iluminación ON/OFF //#define LIGHT_OFF HIGH #define LIGHT_ON HIGH // ///*----- Configurar LCD -----*/ //LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address |
Como se ve es necesario declarar el pin BLACKLIGHT_PIN y la retroiluminación poniendo el LIGHT_ON en HIGH (en LOW estaría apagado el fondo de pantalla).
También se pueden comentar estas dos líneas y dejar sólo la declaración de la configuración de la LCD a cambio de comentar también las líneas del setup() en las que se activa la iluminación:
///*-----( Declaración de constantes )-----*/ // // Dirección I2C del LCD //#define I2C_ADDR 0x27 // // // Asignación de pines para el YwRobot LCM1602 IIC V1 (PCF8574T) //#define BACKLIGHT_PIN 3 //#define En_pin 2 //#define Rw_pin 1 //#define Rs_pin 0 //#define D4_pin 4 //#define D5_pin 5 //#define D6_pin 6 //#define D7_pin 7 // // Iluminación ON/OFF //#define LIGHT_OFF HIGH //#define LIGHT_ON HIGH // ///*----- Configurar LCD -----*/ //LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address void setup() /*----( SETUP: RUNS ONCE )----*/ { lcd.begin (16,2); // Inicializar LCD // Definir configuración iluminación LCD // lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); // Iluminar LCD // lcd.setBacklight(LIGHT_ON); }// END Setup |
El potenciómetro de la tarjeta I2C , permite el ajuste del contraste. Para ajustarlo, arranque un sketch , gire la pantalla y ajuste hasta que vea los caracteres brillantes y no los bloques de fondo que los contienen.
Se unen las dos tarjetas por la parte posterior, haciendo coincidir las patillas 1, que están marcadas en la LCD con un 1 y en la I2C con un cuadrado.
Tenemos dos modelos de 2 fabricantes (womarts y mcufriend), son iguales externamente, pero funcionan con dos librerías distintas.
Arduino Pin | LCD Shield Pin | Use |
3.3V | 3.3V | Power |
5V | 5V | Power |
GND | GND | Power |
A0 | LCD_RD | LCD Control |
A1 | LCD_WR TOUCH_YP | LCD Control / Touch Data |
A2 | LCD_RS TOUCH_XM | LCD Control / Touch Data |
A3 | LCD_CS | LCD Control |
A4 | LCD_RST | LCD Reset |
D2 | LCD_D2 | LCD Data |
D3 | LCD_D3 | LCD Data |
D4 | LCD_D4 | LCD Data |
D5 | LCD_D5 | LCD Data |
D6 | LCD_D6 / TOUCH XP | LCD Data/ Touch Data |
D7 | LCD_D7 / TOUCH YM | LCD Data / Touch Data |
D8 | LCD_D0 | LCD Data |
D9 | LCD_D1 | LCD Data |
D10 | SD_CS | SD Select |
D11 | SD_DI | SD Data |
D12 | SD_DO | SD Data |
D13 | SD_SCK | SD Clock |
Pantalla 2.4” comprada en Aliexpress. Mcufriends
Sólo muestra franjas de colores al poner el ejemplo tftpaint de la librería TFTLCD.h, con la línea 94 editada: cambiando Point por TSPoint.
Si descomentamos línea 55 a 66 la pantallla se pone blanca pero por el monitor serie indica el chip desconocido 7783
Funciona con la librería:
http://www.smokeandwires.co.nz/blog/a-2-4-tft-touchscreen-shield-for-arduino/
Descargar la librería (https://github.com/Smoke-And-Wires/TFT-Shield-Example-Code) y descomprimir la carpeta “SWTFT-Shield” en la carpeta libraries del IDE- También tendremos que instalar las siguientes librerías:
Para que funcione con el Arduino mega es necesario editar el archivo SWTFT.cpp, comentar línea 16 y descomentar la 15.
En el ejemplo graphictest los resultados devueltos por el monitor serie son:
(muestra los tiempos que dura cada una de las pruebas que hace en microsegundos)
TFT LCD test LCD driver chip: 0 Benchmark Time (microseconds) Screen fill 1321524 Text 191456 Lines 1075824 Horiz/Vert Lines 137028 Rectangles (outline) 99828 Rectangles (filled) 3068544 Circles (filled) 1211164 Circles (outline) 463832 Triangles (outline) 342404 Triangles (filled) 1663360 Rounded rects (outline) 221344 Rounded rects (filled) 3585636 Done! |
Si al compilar da error “PORTH was not declared in this scope” el problema puede estar en que se ha seleccionado la placa Mega en el .cpp y en el IDE esté seleccionada la placa UNO.
Librería con la que funciona el modelo womarts
http://misc.ws/2013/11/08/touch-screen-shield-for-arduino-uno/
Librería: TFTLCD.zip
Instalar la librería y ejecutar el ejemplo graphitest, muestra distintos gráficos por pantalla, pero no los botones táctiles. El botón principal reinicia la secuencia gráfica.
Con esta librería hace lo mismo pero invirtiendo la imagen
http://www.airspayce.com/mikem/TFTLCD-mikem.zip
Ver p.249 del Curso practico de formación de Arduino
Ver: https://sites.google.com/a/uniboyaca.edu.co/ingjulianvelasco/lcd-shield-arduino
En el TFTLCD.h (linea 71) están definidas las funciones de dibujo:
// drawing primitives! void drawPixel(uint16_t x, uint16_t y, uint16_t color); void fillScreen(uint16_t color); void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color); void drawFastLine(uint16_t x0, uint16_t y0, uint16_t l, uint16_t color, uint8_t flag); void drawVerticalLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color); void drawHorizontalLine(uint16_t x0, uint16_t y0, uint16_t length, uint16_t color); void drawTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color); void fillTriangle(int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t x2, int32_t y2, uint16_t color); void drawRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color); void fillRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color); void drawRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color); void fillRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color); void drawCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color); void fillCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color); void setCursor(uint16_t x, uint16_t y); void setTextColor(uint16_t c); void setTextSize(uint8_t s); virtual size_t write(uint8_t); void drawChar(uint16_t x, uint16_t y, char c, uint16_t color, uint8_t s = 1); void drawString(uint16_t x, uint16_t y, char *c, uint16_t color, uint8_t s = 1); // commands void initDisplay(void); void goHome(void); void goTo(uint16_t x, uint16_t y); void reset(void); void setRotation(uint8_t x); uint8_t getRotation(); /* low level */ void writeData(uint16_t d); void writeCommand(uint16_t c); uint16_t readData(void); uint16_t readRegister(uint16_t addr); void writeRegister(uint16_t addr, uint16_t data); |
Si quiero dibujar una línea p.e., en el sketch (ejemplo graphictest) tengo que copiar la función drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);, para eso inserto en void setup () si quiero que no se repita o en void loop() si quiero que sí se repita:
tft.drawLine(0, 0, 100, 200, RED);
el tft porque es una función definida en la librería, los 0 son las coordenadas XY del punto inicio y el 100,200 las del punto final, el RED es el color de la línea (que se puede poner en letra pq están definidas en el ejemplo, si no los incluyera habría que ponerlo en su código numérico de 16bits en RGB).
En el ejemplo myBitmapExperiment se visualizan 3 bitmaps que vienen en la carpeta de la librería (vienen 3 imagenes, con extensión bmp y lcd), hay que copiarlos en la raiz de la sd para q funcione.
El ejemplo tftpaint da error pq dice que no está definida la función Point. Hay que instalar la librería TouchScreen, en el TouchScreen,h la clase que aparece es TSPoint (linea 10), no la Point, por lo que cambiando Point por TSPoint en la línea 94, se arregla el problema y funciona el ejemplo con pantalla táctil.
Graficar una señal analógica
http://blog.bricogeek.com/noticias/electronica/video-osciloscopio-con-arduino-y-pantalla-grafica-lcd/
https://code.google.com/p/itdb02/
http://forum.arduino.cc/index.php?PHPSESSID=q9cms1v0c16bpadshnltqd8bd2&topic=281512.0
Librería para TFT con documentación
http://www.henningkarlsen.com/electronics/library.php?id=52
Descargado el archivo UTFT.zip se descomprime en la carpeta de librerías y se ejecuta alguno de los ejemplos que trae. No da error al compilar pero no funcionan, se queda la pantalla en blanco.
Advertencia: Debido al tamaño de la librería no recomienda usarla con ATmega328 (Arduino 2009/Uno) yATmega32U4 (Arduino Leonardo) porque solo tienen 32KB de memoria flash.
Funcionará, pero estaremos severamente limitados en la memoria flash disponible para nuestra aplicación.
Librería para TFT touch con documentación