Proyecto: controlador de ventiladores Cyg-1

CygnusX

Lanero Reconocido
10 Feb 2005
1,326
Parte 1

Punto de partida

Hace mucho que no entraba al foro, ya saben familia, trabajo, fiestas, deberes, en fin, llega un momento en el que no todo lo son "los fierros" y hay que despejarse un poco, pero los hobbys al fin y al cabo siguen allí. En los próximos meses iré subiendo los avances del proyecto en el que me he embarcado: construir un controlador de ventiladores, equipado con sensores NTC, control de leds RGB, analizador de espectro de audio de 2 canales, controlado por una pantalla táctil.

Para conseguir el objetivo emplearé como base una placa de desarrollo basada en procesadores ARM, aún estoy en la fase de decisión entre la plataforma Arduino, empleando un Due (84 MHz) o bien en la plataforma de STM32, tengo en la mira a la tarjeta STM32F4VGT6 (160 MHz). Lo decidiré sobre la marcha ya que tengo acceso a ambas tarjetas.

Aunque tengo algo de experiencia en programación de microchips y en el manejo de pantallas LCD, lo que estoy a punto de enfrentar, se parece en mucho al primer panel que le hice a mi primer computadora XD.

Lista 1
- Pantalla TFT LCD de 3.2", con pantalla táctil, lector de tarjetas SD.
TFT32b.png

TFT32a.png


- Cableado para desarrollo
cables.png


- Tarjeta de desarrollo Arduino Due
00_Arduino_due-1.jpg


- Versión del IDE para programar al arduino Due: 1.5.6.r2 BETA (versión para windows)
- Librerias base: UTFT, Utouch, desarrolladas por Henning Karlsen
- Librerias de apoyo SD (ver readme para creditos al autor) y SPI (contenida en el IDE de arduino)

Fin de la parte 1
Hasta aquí le dejamos. En la parte 2: conexión del TFT en la tarjeta, pantalla táctil y lector de tarjetas SD
 
  • Me gusta
Reacciones: Jamsblast
Parte 2

Conociendo el TFT


Llevo un par de semanas investigando la forma de conectar el TFT en el Due. La mayor parte de lo que hay disponible en la red hace referencia a tarjetas con micros de 16 Mhz o TFT con chipdrivers diferentes al que tengo para el proyecto y por tanto el cableado es diferente.

Creo que esta es la mejor forma de conectar el TFT en el Due y en el Mega. Tendrá que ponerse a prueba mañana que regrese del trabajo e instale el IDE que permite elaborar, depurar, compilar y subir cada programa (o sketch, en el argot Arduino) a la tarjeta.

Los datos del TFT son:

Modelo: TFT 320QVT de 3.2", 320x240 pixeles, 65K colores, RGB
Chipdriver: SSD1289
Bus: 16 bits
Interfase: 40 pines
Complementos: pantalla táctil resistiva (XPT20460) y lector de tarjetas SD
Voltaje de alimentación para la retroiluminación: 3.3 V
Voltaje de alimentación en arduino MEGA: 5 V
Voltaje de alimentación en arduino Due: 3.3V

Al parecer el TFT corresponde al diseño del modelo SainSmart 3.2" SSD1289, ya que el pinout es idéntico.

Pinout del TFT

PinoutTFT-1.png


Elementos importantes:
1. Chip controlador de la pantalla táctil: 5 pines (comunicación digital)
2. Lector SD: 4 pines, (comunicación por protocolo SPI)
3. Regulador de 5V a 3.3V. No es necesario unir el jumper J1, para puentear el regulador y alimentar los 3.3V del due, el TFT puede trabajar sin problemas con menos de 3.3V sin dañarse.

Conexión con el arduino due

conexion.png


Conexión de la pantalla táctil

La librería que permite el manejo de la pantalla táctil es la Utouch. Lo que he encontrado en la red es que funcionan perfectamente con el Mega, ya es una buena señal. Al mirar el archivo Utouch.ccp, aparece esta instrucción

Código:
UTouch::UTouch(byte tclk, byte tcs, byte din, byte dout, byte irq)
{
    T_CLK    = tclk;
    T_CS    = tcs;
    T_DIN    = din;
    T_DOUT    = dout;
    T_IRQ    = irq;
}

En ella podemos ver lo que debemos hacer para conectar la pantalla táctil en el due:
Código:
(tclk, tcs, din, dout, irq)

Dado que no hay una referencia adicional para el hardware SPI, I2C u otro parecido, creo que podemos usar 5 pines digitales del arduino y declararlos como se indica en las instrucciones complementarias:

Código:
{
    T_CLK = 6;
    T_CS = 5;
    T_DIN = 4;
    T_DOUT = 3;
    T_IRQ = 2;
}

Solo hay que averiguar como definir esas variables en el entrono de programación del arduino

Me puedo aventurar a imaginar el código para activar la pantalla táctil, quedaría a groso modo así:
Código:
Instrucción en el encabezado para llamar la libreria UTouch

Definición de las variables en la que se almacenen los datos de los pines seleccionados

UTouch(6, 5, 4, 3, 2)}

Ya veremos...

Fin parte 2

Le dejo aquí que debo ir al trabajo.
 
Última edición:
Parte 3

Debo aclarar que no me había percatado que la página de librerias de Henning Karlsen tiene un apartado para placas Arduino y otro apartado para placas chipKit, por las prisas para ver funcionando la pantalla, omití ver ese detalle.

Uniendo pantalla y Arduino mega

He conseguido varias pantallas TFT para hacer pruebas, conseguí una con pantalla táctil pero sin lector de tarjetas SD. Hace poco conseguí la TFT con táctil y lector, lo que me motivó para conseguir la placa Due y de una vez aplicarme con el proyecto. Esto me permitirá experimentar con varias plataformas a la vez y conocer su funcionamiento al mismo tiempo. Afortunadamente ambas pantallas táctiles tienen el mismo chip driver: SSD1289.

Primero haré pruebas en el entorno que conozco mejor: arduino Mega, ya que es similar al arduino Uno con el que comencé a practicar, la diferencia es que el Mega dispone de mas pines digitales y analógicos, trabajando con un microcontrolador. El due es el equivalente del Mega pero un con procesador de 32 bits.

El TFT de pruebas es un HY32D, con 34 pines, ya que no tiene lector SD. El pinout para control es el mismo que el del TFT principal del proyecto. Así es como han quedado unidos hace un momento:

1.png


2a.png


2.png


Por el momento habrá cables por todos lados, más adelante conseguiré los shields en los que se montarán las pantallas.

Pasos para instalar el entorno de desarrollo o IDE del Arduino

1. Descargar IDE mas reciente, de preferencia el comprimido -página de descarga-

Les sugiero bajar la versión Beta, ya que viene con soporte para mas placas que el release 1.0.5, e incluso trae mejoras en las librerías generales. Al momento se ha liberado la versión 1.5.6-r2 Beta para windows.

2. Extraer el contenido en el directorio raíz de su disco C (o disco principal de windows).

3. Crear la carpeta Arduino, en Documentos: C:\Users\Administrador\Documents\Arduino

4. Ir a la ruta: C:\arduino-1.5.6-r2 y copiar la carpeta llamada libraries en la ruta del paso 3

De esta forma no habrá que modificar ninguna ruta en el IDE y funcionará todo bien desde el principio.

Pasos para instalar los drivers de la placa de desarrollo arduino

En windows 8, si se conecta la placa a un puerto usb como normalmente estamos acostumbrados, simplemente no podremos actualizar los drivers desde el administrador de dispositivos, hay que hacer una serie de pasos previos.

1. Ir panel de Settings de Windows 8

2. Ubicar el botón: Change PC settings

3. Click en la opción General

4. En la opción Advanced startup, dar click en Restart now

(Para windows 8.1, Restart now hay que ubicarlo en PC settings -- Update&Recovery -- Recovery)

5. Al reiniciar en la ventana Choose an option, ir al menú Troubleshoot

6. Ubicar el menú Advanced options

7. Dar click en el menú Startup Settings y dar click en Restart

8. Luego de reiniciar nuevamente la PC, la ventana Startup Settings, desplegará una lista de opciones, desde el teclado hay que seleccionar el número 7: Disable driver signature enforcement

La PC reiniciará automáticamente por tercera vez

9. Al ingresar al escritorio, conectar el cable usb de la placa arduino. La tarjeta no la reconocerá windows.

10. Hay que ir al administrador de dispositivos

11. Ubicar la pestaña Puertos COM y LPT

12. Click con el botón derecho en el dispositivo desconocido y dar click en Actualizar software de controlador

13. Click en buscar software del controlador en el equipo

14. Ubicar la ruta: C:\arduino-1.5.6-r2\drivers

15. Activar la casilla Incluir subcarpetas

16. Dar click en siguiente

17. Dar click en la opción de instalar de todas formas el controlador

18. Esperar que se instalen los drivers. Al final aparecerá una ventana en la que se indica que se instaló correctamente el controlador y nos mostrará el nombre del dispositivo:

Arduino Mega 2560, en el caso del arduino Mega

O bien Arduino Due Programming Port, en el caso del arduino Due

19. Damos click en cerrar

Si todo salió bien veremos el administrador de dispositivos asi:

com.png


Notas:

a) Para ver el procedimiento con imagenes, por si algo no quedó claro, les sugiero visitar esta página.
b) En windows 8 hay que repetir todo el procedimiento para instalar cada placa arduino.

Configuración del IDE para usar la tarjeta

Cargamos el programa arduino.exe ubicado en la ruta C:\arduino-1.5.6-r2 (les sugiero crear un acceso directo en el escritorio para mayor comodidad). Ya es momento de conectar la placa con su TFT:

El TFT está vivo!!!!. No se ve que le salga humo por ninguna parte, el wiring teórico funciona XD.

4.png


Bien veamos como subirle algo a la pantalla para despertarla XD, (ahora entiendo porque solo suben vídeos y fotos del TFT funcionando, vaya líos en los que nos metemos solo por un hobby XD). Pero esto solo es el inicio.

En la pestaña hardware, seleccionamos la tarjeta: Arduino Mega o Arduino Mega 2560 y el puerto COM respectivo, en este caso el COM 3.

Instalando librerias en el IDE

Las librerías que vienen con el programa, son las básicas, para poder usar hardware específico como sensores de temperatura, TFT con drivers específicos, shields o placas GPS, inalámbricas, sensores de movimiento, cámaras, etc, hay que buscar en la red las librerias adecuadas y colocarlas dentro de la carpeta: C:\Users\Administrador\Documents\Arduino\libraries

En este caso usaremos las librerías para arduino (en este caso todas son compatibles con Mega y Due): UTFT, UTouch y UTFT Geometry

1. Bajamos el archivo rar respectivo.
2. Descomprimimos el contenido dentro de la carpeta: C:\Users\Administrador\Documents\Arduino\libraries

Notas:
- El nombre de la carpeta de la librería debe ser el mismo que el nombre del archivo *.h o *.ccp, de lo contrario saltará un error al cargar el IDE, luego de instalar la librería.

- A veces las librerías comprimidas que bajamos, tienen nombres largos como librería_master, hay que eliminar la parte _master y hacer que el nombre de la carpeta coincida con el nombre de la librería.

- Cuando se instala una nueva librería, hay que cerrar el IDE y volverlo a abrir, para que la librería nueva se cargue a memoria de trabajo, de lo contrario la librería aunque esté en la carpeta y correctamente identificada, no funcionará.

librerias1.png

En este caso no tenemos problemas, así como las bajamos las podemos instalar y usar XD. Casi todas las librerías traen ejemplos de como usarlas, solo hay que ajustar algunas lineas para poder adecuarlas al hardware que tenemos en la manos.

Primer prueba en el TFT

Carguemos el primer ejemplo en el TFT, para ello vamos a Archivo--Ejemplos--UTFT--Arduino AVR--UTFT Demo 320x240

ejemplo1.png

Lo he hecho así por que la librería UTFT, distingue entre placas con microcontrolador (AVR) y placas con procesador Cortex (ARM). Por lo que he podido averiguar, no hay mucha diferencia entre ambos códigos de ejemplos-UTFT para Mega o Due.

Ésta librería nos permitirá mandar todo lo que programemos a la pantalla TFT: gráficas, imágenes bmp, texto, datos de sensores, etc.

En este caso solo resta modificar una linea del ejemplo para que podamos activar el TFT con el driver SSD1289.

ejemplo2.png


La linea de código resaltada en el programa del ejemplo, indica el driver del TFT, así como los pines de control específicos que debemos dar de alta. Hay que hacer algunos ajustes para que el ejemplo funcione sin problemas en el arreglo, para ello podemos recurrir al archivo UTFT.ccp, extraje la linea y le quité lo que le sobra para poder interpretarla adecuadamente:

Código:
// UTFT(driver TFT, RS, WR, CS, RST)

En el ejemplo tenemos esta linea que coincide con la librería:

Código:
//UTFT myGLCD(ITDB32S,38,39,40,41);

De acuerdo al diagrama de conexionado entre el mega y el TFT, que se describe en la parte 2 del proyecto:

Código:
RS -----> 38
WR -----> 39
CS -----> 40
REST ---> 41

Por lo se ve la linea de comando indica que el pìnout del conexionado teórico de la parte 2, coincide con el pinout del ejemplo, solo hay que colocar el nombre del driver del TFT, en este caso SSD1289. Creo ya no no me debo preocupar por los hilos restantes, deben estar bien colocados.

Como dato curioso, en el archivo UTFT.h, podemos ver cuales son todos los chipdriver soportados por la librería. En total son 31 y cada uno tiene asignado un número equivalente, así que es posible que la linea de comando lleve el nombre del chip o bien el índice con el que la librería puede reconocerlo.

Código:
UTFT myGLCD(2,38,39,40,41);

Es equivalente a:

Código:
UTFT myGLCD(SSD1289,38,39,40,41);

Bueno demos click en en el botón para subir el programa a la tarjeta y ver de una vez el TFT en acción (crucemos los dedos...)
funcionando3.png


funcionando2.png


El trabajo ha valido la pena, el TFT funciona. El proyecto ha iniciado XD.

Hay que seguir :bookworm:.

Fin de la parte 3
 
Última edición:
  • Me gusta
Reacciones: p3loso
Parte 4

Activar pantalla táctil


Los pines del TFT para conectar la pantalla táctil al arduino son: T_CLK, T-CS, T_DIN, T_DO y T_IRQ. El orden de pines dentro de la instrucción de activación es:

Código:
 UTouch  myTouch( 6, 5, 4, 3, 2);

Solo falta conocer a que pines corresponde la instrucción con los pines del TFT. En el archivo Utouch.ccp, aparece la siguiente instrucción:

Código:
UTouch::UTouch(byte tclk, byte tcs, byte din, byte dout, byte irq)
{
    T_CLK    = tclk;
    T_CS    = tcs;
    T_DIN    = din;
    T_DOUT    = dout;
    T_IRQ    = irq;
}

Comparando el contenido de la instrucción del ccp contra la linea de activación, podemos saber como conectar los pines del TFT a los pines digitales del arduino:

Código:
UTouch(tclk, tcs, din, dout, irq)
UTouch  myTouch( 6, 5, 4, 3, 2);

Los pines del TFT se conectan a los pines digitales del arduino de acuerdo al siguiente esquema:

Código:
pin 6  --->   T_CLK
pin 5  --->   T_CS
pin 4  --->   T_DIN
pin 3  --->   T_DO
pin 2  --->   T_IRQ

Así es como quedaron conectados:

tactil.png

Calibración de la pantalla táctil

Para que la táctil responda de forma adecuada, se debe realizar una calibración. Para ello hay que cargar el ejemplo:

calibraciontactil.png


Hay que ajustar la linea de comando que activa la TFT de acuerdo con el chipdriver que tiene. Para dejar inactiva la instrucción previa basta con colocar // al inicio de la linea o simplemente sustituir el nombre del chip, ó subíndice por el que corresponda al TFT que se tenga instalado.

Cargamos el programa al arduino.

1. Para iniciar la calibración se pulsa la pantalla de presentación
cal1.jpg

2. Hay que presionar por unos segundos cada marca que aparezca en pantalla en forma de recuadro con una cruz inscrita, hasta que la pantalla nos indique que podemos dejar de presionar.

cal3.jpg


cal4.jpg


cal2.jpg


3. Realizar el paso 2 con las 7 marcas restantes, en el orden en que aparezcan resaltadas

cal5.jpg


4. Al finalizar aparecerá una ventana con la calibración para X, Y y S

cal6.jpg


5. Con el block de notas hay que abrir el archivo: UtouchCD.h, ubicado en la ruta: C:\Users\Administrador\Documents\Arduino, y capturamos los datos obtenidos.

calibraciontactil1.png


6. Guardamos el archivo y ya con eso podemos usar de forma correcta la pantalla táctil.

Nota:
Para cada pantalla táctil se debe realizar su calibración por separado, y recordarlo cada vez que se usen.

PD: le haré algo de ingeniería inversa al ejemplo UTouch_ButtonTest, para conseguir el primer programa.
 
  • Me gusta
Reacciones: p3loso
(Parte 4--Conclusión)

El primer reto es entender como funciona la librería táctil y cómo controlar cosas con ella. Miré el código del ejemplo y lo dividí en secciones para entenderlo, no fue sencillo, sinceramente camino en terrenos nuevos. En este punto me interesan dos objetivos para el controlador:
1.- Regular las RPM para un ventilador de 12 V
2.- Regular la iluminación general de la PC.

Ambos objetivos tienen como puntos en común el control PWM y el uso de relevadores o algún mecanismo que sea operado en base a 3.3 V y lo comunique a dispositivos de mas de 5V. Debo considerar los 3.3V.

Pero primero: control con la pantalla táctil del TFT.

Así se ve la pantalla del ejemplo

ejemplo4.jpg


En ella se pulsa cualquier número, y se presenta en pantalla en la parte inferior izquierda. Tiene como buffer de almacenamiento una cadena de máximo 20 elementos. Se puede borrar la cadena de caracteres, e ingresar en memoria al pulsar el botón enter, posibilitando el manejo de toda la cadena en alguna otra función (que no tiene el ejemplo). Aunque es un esquema muy simple, permite conocer varios aspectos:

- Delimitación del espacio para botones
- Control sobre la pantalla táctil en forma de segmentos bien delimitados
- Instrucciones necesarias para que un botón o campo haga una determinada acción o función

Partiendo de eso me dí a la tarea de crear un programa que me permitiera controlar cambios de colores partiendo del contenido del ejemplo, manipulando selectores de incremento y decremento para cada canal RGB. Al principio solo pensaba en tres cajas con dos selectores cada una. A medida que escribía el código se me ocurrieron varias ideas, la primera fue la de crear una especie de pizarra en la que pudiese escribir algún mensaje corto, dentro de un "sub-panel".

Como nota personal: mi mujer quiere una pecera y no he tocado mucho el tema, debido a que desconozco como controlar los cambios de iluminación entre el día y la noche, horarios de alimentación, y varias cosas más que creo son importantes, para que los "Nemos", puedan vivir de forma semi-autónoma sin estar pegado a ellos todo el tiempo. ----> Iluminación RGB (¿por que nó?)

Cómo ya estoy metido con el tema del RGB, decidí incluir de una vez, la iluminación rescatando un led SMD de un proyecto previo (fallido XD). El resultado es un menú que permite controlar la iluminación led-RGB mediante botones prefijados, con él ya tengo forma de controlar la iluminación de la PC, un pequeño mensajero, y la base para el controlador de iluminación de la pecera XD.

Este es el resultado: el primer código para la táctil XD

Vista general: sub-panel para mensajes (incluye un pequeño botón-borrador), tres canales RGB con doble selector (aumento-disminución), botones con colores predefinidos, control sobre un led RGB y botón de limpieza general.
ControlRGB1.png

Lo pensé para usar la pantalla con un lápiz para pantalla táctil pera mayor precisión.

Algunas imágenes del funcionamiento

ControlRGB3.png


ControlRGB4.png


ControlRGB5.png


ControlRGB6.png


ControlRGB8.png


Sin comentarios :bookworm:

Dejo el código, falta depurarlo, afinar el uso de funciones, quitar variables y lineas que no funcionaron al final. Es el primer programa XD

Código:
//Creditos
// UTouch, UTFT, UTFT_Geometry,
// Ejemplo de partida: UTouch_ButtonTest <<incluido en la librería Utouch>>
// (C)2010-2014 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics

// librerías
#include <UTFT.h>
#include <UTouch.h>
#include <UTFT_Geometry.h>

// Comunicación mediante el pinout del hardware específico
// UTFT myGLCD(SSD1289,38,39,40,41);
UTFT myGLCD(2,38,39,40,41);
UTouch  myTouch( 6, 5, 4, 3, 2);
UTFT_Geometry geo(&myGLCD);

// Fuentes para presentar texto y valores en pantalla
extern uint8_t BigFont[];
extern uint8_t SmallFont[];

// Lo que sigue lo hizo CygnusX XD.

// Definición de variables

// Incremento en los selectores de valor de cada canal
int intervalo = 2;

// Canal RGB
int R = 0;  // color rojo
int G = 0; //color verde
int B = 0; // color azul

// Valor del incremento en cada canal, Xup y Xdw, aun no las he usado ----> eliminar
int Rup = 0;
int Rdw = 0;

int Gup = 0;
int Gdw = 0;

int Bup = 0;
int Bdw = 0;

// Control leds RGB
//Rojo
int Rled = 9;
//Verde
int Gled = 10;
//Azul
int Bled = 11;

// control de posición bidimensional de la pantalla táctil
int x, y;

/*************************
**      Funciones       **
*************************/

//Creación de botones
void drawButtons ()
{
// Asignar tamaño de fuente
          myGLCD.setFont(SmallFont);   

//Pantalla en negro
    myGLCD.setColor(0,0,0);
    myGLCD.fillRect(0, 0, 319, 239);

//Primero el borde y luego el relleno
// Canal rojo
    myGLCD.setColor(R,0,0);
    myGLCD.fillRect(15, 15, 65, 65);
    myGLCD.setColor(255,0,0);
    myGLCD.drawRect(15, 15, 65, 65);

  //Selector superior canal rojo
    myGLCD.setColor(0,0,255);
    geo.fillTriangle(69, 30, 75, 15, 81, 30);
    myGLCD.setColor(255,255,255);
    geo.drawTriangle(69, 30, 75, 15, 81, 30);

  //Selector inferior canal rojo
    myGLCD.setColor(0,0,255);
    geo.fillTriangle(69, 48, 75, 63, 81, 48);
    myGLCD.setColor(255,255,255);
    geo.drawTriangle(69, 48, 75, 63, 81, 48);

// Canal verde
    myGLCD.setColor(0,G,0);
    myGLCD.fillRect(115, 15, 165, 65);
    myGLCD.setColor(0,255,0);
    myGLCD.drawRect(115, 15, 165, 65);

  //Selector superior canal verde
    myGLCD.setColor(0,0,255);
    geo.fillTriangle(169, 30, 175, 15, 181, 30);
    myGLCD.setColor(255,255,255);
    geo.drawTriangle(169, 30, 175, 15, 181, 30);

  //Selector inferior canal verde
    myGLCD.setColor(0,0,255);
    geo.fillTriangle(169, 48, 175, 63, 181, 48);
    myGLCD.setColor(255,255,255);
    geo.drawTriangle(169, 48, 175, 63, 181, 48);


// Canal azul
    myGLCD.setColor(0,0,B);
    myGLCD.fillRect(215, 15, 265, 65);
    myGLCD.setColor(0,0,255);
    myGLCD.drawRect(215, 15, 265, 65);

  //Selector superior canal azul
    myGLCD.setColor(0,0,255);
    geo.fillTriangle(269, 30, 275, 15, 281, 30);
    myGLCD.setColor(255,255,255);
    geo.drawTriangle(269, 30, 275, 15, 281, 30);

  //Selector inferior canal azul
    myGLCD.setColor(0,0,255);
    geo.fillTriangle(269, 48, 275, 63, 281, 48);
    myGLCD.setColor(255,255,255);
    geo.drawTriangle(269, 48, 275, 63, 281, 48);

// Limpieza de pantalla completa
    myGLCD.setColor(0,0,0);
    myGLCD.fillRect(305, 75, 319, 215);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(305, 75, 319, 215);

// Botón de limpieza del panel principal
    myGLCD.setColor(R,G,B);
    myGLCD.fillRect(200, 75, 210, 95);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(200, 75, 210, 95);


//Botones con colores predefinidos
  // Color blanco
    R=255;
    G=255;
    B=255;
    myGLCD.setColor(R,G,B);
    myGLCD.fillRect(215, 75, 255, 95);  //largo de 40 pxs
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(215, 75, 255, 95);
    // Reiniciar colores a perfil 0
    R=0;
    G=0;
    B=0;

// Color morado

    R=255;
    G=0;
    B=255;
    myGLCD.setColor(R,G,B);
    myGLCD.fillRect(260, 75, 300, 95);  //largo de 40 pxs
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(260, 75, 300, 95);
    // Reiniciar colores a perfil 0
    R=0;
    B=0;


  // Color rojo
    R=255;
    myGLCD.setColor(R,G,B);
    myGLCD.fillRect(215, 105, 300, 125);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(215, 105, 300, 125);
    // Reiniciar colores a perfil 0
    R=0;

  // Color verde
    G=255;
    myGLCD.setColor(R,G,B);
    myGLCD.fillRect(215, 135, 300, 155);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(215, 135, 300, 155);
    // Reiniciar colores a perfil 0
    G=0;

  // Color azul
    B=255;
    myGLCD.setColor(R,G,B);
    myGLCD.fillRect(215, 165, 255, 185);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(215, 165, 255, 185);
    // Reiniciar colores a perfil 0
    B=0;

  // Color azul  claro
    B=255;
    G=255;
    myGLCD.setColor(R,G,B);
    myGLCD.fillRect(260, 165, 300, 185);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(260, 165, 300, 185);
    // Reiniciar colores a perfil 0
    B=0;
    G=0;


  // Color amarillo
    R=255;
    G=255;
    myGLCD.setColor(R,G,B);
    myGLCD.fillRect(215, 195, 300, 215);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(215, 195, 300, 215);
    // Reiniciar colores a perfil 0
    R=0;
    G=0;

//Panel de colores RGB
    myGLCD.setColor(R,G,B);
    myGLCD.fillRect(15, 75, 195, 200);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(15, 75, 195, 200);
    myGLCD.printNumI(R, 15, 204);
    myGLCD.printNumI(G, 97, 204);
    myGLCD.printNumI(B, 180, 204);

//  Imprime texto y valores de inicio de cada canal en pantalla
// R       G       B, BAJO EL PANEL PRINCIPAL
    myGLCD.print("R", 22, 215);
    myGLCD.print("G", 106, 215);
    myGLCD.print("B", 188, 215);

// a la derecha de cada par de selectores de canal
    myGLCD.print("R", 73, 32);
    myGLCD.printNumI(R, 85, 32);
    myGLCD.print("G", 173, 32);   
    myGLCD.printNumI(G, 185, 32);   
    myGLCD.print("B", 273, 32);   
    myGLCD.printNumI(B, 285, 32);
}


void Panelprincipal()
{
//Panel de colores RGB

    myGLCD.setColor(R,G,B);
    myGLCD.fillRect(15, 75, 195, 200);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(15, 75, 195, 200);
    myGLCD.setColor(0,0,0);
    myGLCD.fillRect(14, 204, 200, 213);
    myGLCD.setColor(255,255,255);
    myGLCD.printNumI(R, 15, 204);
    myGLCD.printNumI(G, 97, 204);
    myGLCD.printNumI(B, 180, 204);
  ledsRGB();
}

// Dibuja un contorno rojo en cada selector cuando se activa con el puntero
void waitTriangulo(int xt1, int yt1, int xt2, int yt2,  int xt3, int yt3)
{
  myGLCD.setColor(255, 0, 0);
  geo.drawTriangle(xt1, yt1, xt2, yt2, xt3, yt3);
  while (myTouch.dataAvailable())
  myTouch.read();
  myGLCD.setColor(255, 255, 255);
  geo.drawTriangle(xt1, yt1, xt2, yt2, xt3, yt3);

  myGLCD.setColor(R,G,B);
  myGLCD.fillRect(200, 75, 210, 95);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(200, 75, 210, 95);   

  ledsRGB();

}



// Dibuja un contorno rojo en cada color de referencia cuando se activa con el puntero
void waitReferencia(int x1, int y1, int x2, int y2)
{
  myGLCD.setColor(255, 0, 0);
  myGLCD.drawRect(x1, y1, x2, y2);
  while (myTouch.dataAvailable())
  myTouch.read();
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRect(x1, y1, x2, y2);
}


void colorReferencia()
{
  // Valor del canal Rojo al costado derecho de los selectores del canal
          myGLCD.setColor(0, 0, 0);            
          myGLCD.fillRect(84,31,105,41);
          myGLCD.setColor(255, 255, 255);
          myGLCD.printNumI(R, 85, 32);

//Cambio del color del botón del canal rojo
         myGLCD.setColor(R,0,0);
         myGLCD.fillRect(15, 15, 65, 65);
         myGLCD.setColor(255,0,0);
         myGLCD.drawRect(15, 15, 65, 65);

// Valor del canal Verde al costado derecho de los selectores del canal
          myGLCD.setColor(0, 0, 0);            
          myGLCD.fillRect(184,31,205,41);
          myGLCD.setColor(255, 255, 255);
          myGLCD.printNumI(G, 185, 32);
   
//Cambio del color del botón del canal VERDE
          myGLCD.setColor(0,G,0);
          myGLCD.fillRect(115, 15, 165, 65);
          myGLCD.setColor(0,255,0);
          myGLCD.drawRect(115, 15, 165, 65);

// Valor del canal azulazul al costado derecho de los selectores del canal
          myGLCD.setColor(0, 0, 0);            
          myGLCD.fillRect(284,31,305,41);
          myGLCD.setColor(255, 255, 255);
          myGLCD.printNumI(B, 285, 32);
   
//Cambio del color del botón del canal AZUL
          myGLCD.setColor(0,0,B);
          myGLCD.fillRect(215, 15, 265, 65);
          myGLCD.setColor(0,0,255);
          myGLCD.drawRect(215, 15, 265, 65);
// Color de relleno del botón de limpieza   
           myGLCD.setColor(R, G, B);
           myGLCD.fillRect(200, 75, 210, 95);   
           myGLCD.setColor(255,255,255);
           myGLCD.drawRect(200, 75, 210, 95);
    
           ledsRGB();
    
}

// Pines digitales en los que se conecta cada canal, en este caso un solo led
void ledsRGB()
{

    analogWrite(Rled, R);
    delay(10);
    analogWrite(Gled, G);
    delay(10);
    analogWrite(Bled, B);
    delay(10);
}



// Control inicial del hardware y presentación inicial en pantalla
void setup()
{

// Iniciar TFT
    myGLCD.InitLCD();
// Limpiar TFT
    myGLCD.clrScr();
// Iniciar pantalla táctil
    myTouch.InitTouch();
// Ajustar precisión de la pantalla táctil
    myTouch.setPrecision(PREC_MEDIUM);

// Asignar tamaño de fuente
    myGLCD.setFont(SmallFont);

// Activar función para dibujar botones
// Llamarla de nuevo dentro del programa principal, asi evitamos parpadeos de pantalla
    drawButtons();

//Activar pines de leds RGB como salidas
  pinMode(Rled, OUTPUT);
  pinMode(Gled, OUTPUT);
  pinMode(Bled, OUTPUT);
}


// Instrucciones del programa
void loop() {
// Control de la entrada de pantalla
    while (true)
  {
    if (myTouch.dataAvailable())
    {

// Leer datos del puntero sobre la pantalla táctil
        myTouch.read();
        x=myTouch.getX();
        y=myTouch.getY();

// Enciende led
        ledsRGB();

// Mostrar coordenadas X y Y del puntero en la pantalla táctil, bajo el panel principal
            myGLCD.setColor(0, 0, 0);
            myGLCD.fillRect(49, 204, 95, 214);
            myGLCD.setBackColor(0, 0, 0);
            myGLCD.setColor(0, 255, 0);
            myGLCD.print("x=", 50, 215);
            myGLCD.printNumI(x, 66, 215);
            myGLCD.print("y=", 120, 215);     
            myGLCD.printNumI(y, 136, 215);


//Para el selector que incrementa el canal rojo

//Primero identificar el área donde está ubicado el selector, partiendo de la ubicación del triángulo superior
//     geo.fillTriangle(69, 30, 75, 15, 81, 30);
      if ((y>=15) && (y<=30))  // Rango en y
      {
        if ((x>=69) && (x<=81))  // Rango en x
        {
          waitTriangulo(69, 30, 75, 15, 81, 30);
          R = R + intervalo;
//          R = Rup;
   
// Previene ingreso de valores mayores a 255   
          if (R>=255)
          {
          R=255;
          Rup=255;
          }
   
// Valor del canal Rojo al costado derecho de los selectores del canal
          myGLCD.setColor(0, 0, 0);            
          myGLCD.fillRect(84,31,105,41);
          myGLCD.setColor(255, 255, 255);
          myGLCD.printNumI(R, 85, 32);

//Cambio del color del botón del canal rojo
         myGLCD.setColor(R,0,0);
         myGLCD.fillRect(15, 15, 65, 65);
         myGLCD.setColor(255,0,0);
         myGLCD.drawRect(15, 15, 65, 65);
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
        }
      }// fin de rutina del selector superior del canal rojo


//Para el selector que decrementa el canal rojo
//Primero identificar el área donde está ubicado el selector, partiendo de la ubicación del triángulo inferior
//     geo.drawTriangle(69, 48, 75, 63, 81, 48);
      if ((y>=48) && (y<=63))  // Rango en y
      {
        if ((x>=69) && (x<=81))  // Rango en x
        {
          waitTriangulo(69, 48, 75, 63, 81, 48);
          R = R - intervalo;
//          R = Rdw;
   
// Previene ingreso de valores menores a 0   
          if (R<=0)
          {
          R=0;
          Rdw=0;
          }
   
// Valor del canal Rojo al costado derecho de los selectores del canal
          myGLCD.setColor(0, 0, 0);            
          myGLCD.fillRect(84,31,105,41);
          myGLCD.setColor(255, 255, 255);
          myGLCD.printNumI(R, 85, 32);

//Cambio del color del botón del canal rojo
         myGLCD.setColor(R,0,0);
         myGLCD.fillRect(15, 15, 65, 65);
         myGLCD.setColor(255,0,0);
         myGLCD.drawRect(15, 15, 65, 65);
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
        }
      }// fin de rutina del selector inferior del canal rojo


//Para el selector que incrementa el canal verde

//Primero identificar el área donde está ubicado el selector, partiendo de la ubicación del triángulo superior
//    geo.fillTriangle(169, 30, 175, 15, 181, 30);
      if ((y>=15) && (y<=30))  // Rango en y
      {
        if ((x>=169) && (x<=181))  // Rango en x
        {
          waitTriangulo(169, 30, 175, 15, 181, 30);
          G = G + intervalo;
   
// Previene ingreso de valores mayores a 255   
          if (G>=255)
          {
          G=255;
          Gup=255;
          }
   
// Valor del canal Verde al costado derecho de los selectores del canal
          myGLCD.setColor(0, 0, 0);            
          myGLCD.fillRect(184,31,205,41);
          myGLCD.setColor(255, 255, 255);
          myGLCD.printNumI(G, 185, 32);

//Cambio del color del botón del canal VERDE
          myGLCD.setColor(0,G,0);
          myGLCD.fillRect(115, 15, 165, 65);
          myGLCD.setColor(0,255,0);
          myGLCD.drawRect(115, 15, 165, 65);
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
        }
      }// fin de rutina del selector superior del canal verde


//Para el selector que decrementa el canal VERDE
//Primero identificar el área donde está ubicado el selector, partiendo de la ubicación del triángulo inferior
//    geo.fillTriangle(169, 48, 175, 63, 181, 48);
      if ((y>=48) && (y<=63))  // Rango en y
      {
        if ((x>=169) && (x<=181))  // Rango en x
        {
          waitTriangulo(169, 48, 175, 63, 181, 48);
          G = G - intervalo;
   
// Previene ingreso de valores menores a 0   
          if (G<=0)
          {
          G=0;
          Gdw=0;
          }

// Valor del canal Verde al costado derecho de los selectores del canal
          myGLCD.setColor(0, 0, 0);            
          myGLCD.fillRect(184,31,205,41);
          myGLCD.setColor(255, 255, 255);
          myGLCD.printNumI(G, 185, 32);
   
//Cambio del color del botón del canal VERDE
          myGLCD.setColor(0,G,0);
          myGLCD.fillRect(115, 15, 165, 65);
          myGLCD.setColor(0,255,0);
          myGLCD.drawRect(115, 15, 165, 65);
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
        }
      }// fin de rutina del selector inferior del canal verde


//Para el selector que incrementa el canal AZUL

//Primero identificar el área donde está ubicado el selector, partiendo de la ubicación del triángulo superior
//    geo.fillTriangle(269, 30, 275, 15, 281, 30);
      if ((y>=15) && (y<=30))  // Rango en y
      {
        if ((x>=269) && (x<=281))  // Rango en x
        {
          waitTriangulo(269, 30, 275, 15, 281, 30);
          B = B + intervalo;
   
// Previene ingreso de valores mayores a 255   
          if (B>=255)
          {
          B=255;
          Bup=255;
          }
   
// Valor del canal Azul al costado derecho de los selectores del canal
          myGLCD.setColor(0, 0, 0);            
          myGLCD.fillRect(284,31,305,41);
          myGLCD.setColor(255, 255, 255);
          myGLCD.printNumI(B, 285, 32);

//Cambio del color del botón del canal AZUL
          myGLCD.setColor(0,0,B);
          myGLCD.fillRect(215, 15, 265, 65);
          myGLCD.setColor(0,0,255);
          myGLCD.drawRect(215, 15, 265, 65);
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
        }
      }// fin de rutina del selector superior del canal azul


//Para el selector que decrementa el canal AZUL
//Primero identificar el área donde está ubicado el selector, partiendo de la ubicación del triángulo inferior
//    geo.drawTriangle(269, 48, 275, 63, 281, 48);
      if ((y>=48) && (y<=63))  // Rango en y
      {
        if ((x>=269) && (x<=281))  // Rango en x
        {
          waitTriangulo(269, 48, 275, 63, 281, 48);
          B = B - intervalo;
   
// Previene ingreso de valores menores a 0   
          if (B<=0)
          {
          B=0;
          Bdw=0;
          }
   
// Valor del canal Azul al costado derecho de los selectores del canal
          myGLCD.setColor(0, 0, 0);            
          myGLCD.fillRect(284,31,305,41);
          myGLCD.setColor(255, 255, 255);
          myGLCD.printNumI(B, 285, 32);
   
//Cambio del color del botón del canal AZUL
          myGLCD.setColor(0,0,B);
          myGLCD.fillRect(215, 15, 265, 65);
          myGLCD.setColor(0,0,255);
          myGLCD.drawRect(215, 15, 265, 65);
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
         ledsRGB();  
        }
      }// fin de rutina del selector inferior del canal azul


// Selector de color de referencia: Blanco
//Primero identificar el área donde está ubicado el botón de referencia-Blanco
//    myGLCD.drawRect(215, 75, 255, 95);
      if ((y>=75) && (y<=95))  // Rango en y
      {
        if ((x>=215) && (x<=255))  // Rango en x
        {
          waitReferencia(215, 75, 255, 95);
//Asigna los valores RGB correspondientes al color blanco
          R=255;
          G=255;
          B=255;

// Asigna colores a la pantalla  
         colorReferencia();
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
        }
      }// fin de rutina del selector de color blanco 


// Selector de color de referencia: Morado
//Primero identificar el área donde está ubicado el botón de referencia-Morado
//    myGLCD.drawRect(260, 75, 300, 95);
      if ((y>=75) && (y<=95))  // Rango en y
      {
        if ((x>=260) && (x<=300))  // Rango en x
        {
          waitReferencia(260, 75, 300, 95);
//Asigna los valores RGB correspondientes al color morado
          R=255;
          G=0;
          B=255;

// Asigna colores a la pantalla  
         colorReferencia();
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
        }
      }// fin de rutina del selector de color morado 





// Selector de color de referencia: Rojo
//Primero identificar el área donde está ubicado el botón de referencia-Rojo
//      myGLCD.drawRect(215, 105, 300, 125);
      if ((y>=105) && (y<=125))  // Rango en y
      {
        if ((x>=215) && (x<=300))  // Rango en x
        {
          waitReferencia(215, 105, 300, 125);
//Asigna los valores RGB correspondientes al color Rojo
          R=255;
          G=0;
          B=0;

// Asigna colores a la pantalla  
         colorReferencia();
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
        }
      }// fin de rutina del selector de color rojo 



// Selector de color de referencia: Verde
//Primero identificar el área donde está ubicado el botón de referencia-Verde
//        myGLCD.drawRect(215, 135, 300, 155);
      if ((y>=135) && (y<=155))  // Rango en y
      {
        if ((x>=215) && (x<=300))  // Rango en x
        {
          waitReferencia(215, 135, 300, 155);
//Asigna los valores RGB correspondientes al color Verde
          R=0;
          G=255;
          B=0;

// Asigna colores a la pantalla  
         colorReferencia();
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
        }
      }// fin de rutina del selector de color verde


// Selector de color de referencia: Azul
//Primero identificar el área donde está ubicado el botón de referencia-Azul
//    myGLCD.fillRect(215, 165, 255, 185);
      if ((y>=165) && (y<=185))  // Rango en y
      {
        if ((x>=215) && (x<=255))  // Rango en x
        {
          waitReferencia(215, 165, 255, 185);
//Asigna los valores RGB correspondientes al color Azul
          R=0;
          G=0;
          B=255;

// Asigna colores a la pantalla  
         colorReferencia();
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
        }
      }// fin de rutina del selector de color Azul


// Selector de color de referencia: Azul claro
//Primero identificar el área donde está ubicado el botón de referencia-Azul claro
//    myGLCD.fillRect(260, 165, 300, 185);
      if ((y>=165) && (y<=185))  // Rango en y
      {
        if ((x>=260) && (x<=300))  // Rango en x
        {
          waitReferencia(260, 165, 300, 185);
//Asigna los valores RGB correspondientes al color Azul claro
          R=0;
          G=255;
          B=255;

// Asigna colores a la pantalla  
         colorReferencia();
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
        }
      }// fin de rutina del selector de color Azul claro



// Selector de color de referencia: Amarillo
//Primero identificar el área donde está ubicado el botón de referencia-Amarillo
//        myGLCD.fillRect(215, 195, 300, 215);
      if ((y>=195) && (y<=215))  // Rango en y
      {
        if ((x>=215) && (x<=300))  // Rango en x
        {
          waitReferencia(215, 195, 300, 215);
//Asigna los valores RGB correspondientes al color Amarillo
          R=255;
          G=255;
          B=0;

// Asigna colores a la pantalla  
         colorReferencia();
  
// Actualiza el color de la ventana principal  
         Panelprincipal();
        }
      }// fin de rutina del selector de color Amarillo

// Limpieza de pantalla
//Identificar el área donde está ubicado el botón limpieza de pantalla
//    myGLCD.drawRect(305, 195, 319, 215);
      if ((y>=75) && (y<=219))  // Rango en y
      {
        if ((x>=305) && (x<=319))  // Rango en x
        {
          waitReferencia(305, 75, 319, 215);
// Limpiar TFT
//    myGLCD.clrScr();

// Dibuja botones
          R=0;
          G=0;
          B=0;
          drawButtons ();
          ledsRGB();   
        }
      }

// Dibujo con el puntero dentro del panel principal
//Identificar el área donde está ubicado el panel principal
//    myGLCD.drawRect(15, 75, 195, 200);
      if ((y>=75) && (y<=200))  // Rango en y
      {
        if ((x>=15) && (x<=195))  // Rango en x
        {
// INICIO dibujar a mano alzada
// Color inverso al actual
           myGLCD.setColor(R, G, B);
           myGLCD.fillRect(200, 75, 210, 95);   
           myGLCD.setColor(255,255,255);
           myGLCD.drawRect(200, 75, 210, 95);
           myGLCD.setColor(255-R, 255-G, 255-B);

           if ((x!=-1) and (x!=-1))
           {
             myGLCD.drawPixel (x, y);
           }
        }
      }// FIN dibujar a mano alzada


// Limpieza solo del trazo dentro del panel principal
//Identificar el área del botón de limpieza del panel principal
//    myGLCD.drawRect(205, 75, 210, 95);
      if ((y>=75) && (y<=95))  // Rango en y
      {
        if ((x>=200) && (x<=210))  // Rango en x
        {
          waitReferencia(200, 75, 210, 95);
          Panelprincipal();
          myGLCD.setColor(R,G,B);
          myGLCD.fillRect(200, 75, 210, 95);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(200, 75, 210, 95);   
   
        }
      }// FIN limpieza panel principal






    }// fin de la rutina que controla las acciones de la pantalla táctil. Prevalece en modo de espera de datos de la pantalla táctil
  }// fin del menú principal
}// fin del contenido del programa

Fin de la parte 4.


Nota para algún administrador:

Me gustaría compartir el código en un archivo rar (apenas pesa 4 Kb XD) para que se quede en la página, y se pueda aprovechar en algún proyecto, luego con el paso del tiempo los sitios de alojamiento externo hacen de las suyas y se pierde la información.
 
Última edición:
  • Me gusta
Reacciones: p3loso y fdo_dr
Muy teso s le ha metido bastante la ficha. Una pregunta así como por encimita ¿cuánto lleva invertido?
 
A la orden con el proyecto, así como lo ven va saliendo del horno, así que por allí deben haberse colado varios horrores. Cualquier sugerencia o mejora será bien recibida.

Inversión

Siempre es un tema complejo, con muchas aristas, y a veces mas contras que pros, si se compara con soluciones comerciales. Pero hay que considerarlo en todo momento.

Invertido... materiales que formarán parte del proyecto: 26.5 USD del Arduino Due (clon) + 10.0 de cables + 25.5 = 62.0 USD. Y 2 meses de estar escudriñando en la red, que aunque hay mucha información, ésta se limita a aspectos visuales y largos post en los que no ponen ni una sola linea de código para desmenuzar.

Los 2 sensores NTC, los recuperaré de un viejo Zalman MFC1 que tiene dañada la pantalla, de allí obtendré las extensiones para los ventiladores. Los ventiladores que voy a controlar ya los tengo, solo me faltan los conectores, pero esos elementos también los tengo de proyectos previos, así que tampoco representarán una inversión. Mi idea es recuperar y reciclar todo lo posible antes de limpiar definitivamente el taller. Se me olvidaba, incluyo un set de 260 resistencias de 1/4, que vi como ganga en la red: 2.3 USD XD. Hasta aquí van 64.3 USD invertidos + lo que resulte de los segmentos de 3 leds RGB que hagan falta, 4 cuando mucho 5 USD más.

El arduino mega y el TFT HY320 no los cuento ya que fueron regalos, además de que son los pilotos de prueba. El TFT de 2.8 basado en un driver ILI19325D, lo voy a regresar ya que llegó con la pantalla táctil desprendida y con el LCD estrellado, seguramente le colocaron algo pesado encima, ni que hacer, a veces pasa con las paqueterías. Y sip, allí creo que habrá una pérdida de 20 USD.

Por estos lados de la tierra, un controlador de ventiladores decente como el NZXT SENTRY LXE, ronda unos 100 a 130 USD (incluyendo impuestos y gastos de envío), me gustaría poner 110 USD como un límite aceptable para el proyecto. Sin embargo en esto de la experimentación siempre hay piezas que se salen de control, como por ejemplo el acrílico, tengo algunos cortes que puedo recuperar, pero hoy me he topado con la sorpresa de que el adhesivo que solía usar para unir, ya lo han sacado de circulación comercial en varios locales grandes y solo manejan las soluciones con catalizador. Tocará buscar en los talleres pequeños y hay que considerar gastos de pasajes o de gasolina y claro el refrigerio para el camino...
 
Mis mas sinceras felicitaciones, aunque no entiendo un carajo de esto se ve que le has invertido bastante tiempo y dedicación.
 
Gracias por estar al tanto de los avances, se me ha complicado conectarme mas seguido por el trabajo, pero no se me olvida el proyecto.

En el camino algo pasó con el arduino Mega, no sé en donde estuvo la falla, no obstante hablé con el proveedor y van a revisar ambas piezas tanto el TFT como el MEGA.
Falla.png


Así que conecté un TFT de 2.8" directo en el arduino Due para ya empezar con las pruebas con el hardware que formará el controlador
ADue1.png


Parte 5

Circuito base para controlar un ventilador de 12 V
Aprovechando el tiempo he conseguido algunos integrados que permiten controlar reles, motores, lineas de varios leds RGB, y por lo que pude averiguar, también pueden controlar la velocidad de ventiladores como los que tenemos en la PC, que operan con 12 V.

El integrado es el ULN2803A, tiene 18 pines: 8 entradas PWM, alineadas con 8 salidas que pueden controlar dispositivos que operen hasta con 50 V. La alimentación del integrado va de 2.4 a 3 V (200 a 300 mA), estos niveles van perfecto con el voltaje de operación del Arduino Due, que es de 3.3 V máximo (datasheet:ULN2803A).

Este integrado es la base de los controladores de motores de paso ampliamente usados en robots, solo que los circuitos en los que viene soldado operan a 5V, que van muy bien con placas como el Arduino Uno, Mega, Leonardo, etc.

Con un solo integrado podemos controlar con el arduino Due hasta 8 ventiladores. En mi caso el controlador lo quiero para controlar 2 ventiladores y 2 lineas de leds RGB como máximo. En la práctica tendrá 2 ventiladores, una tira de leds RGB y 4 sensores NTC para medir temperatura.

Este es el esquema general de unión entre el integrado y el Arduino Due:

Código:
ULN2803A                  Arduino Due

PIN 1           --------     A cualquier pin PWM
PIN 2           --------     A cualquier pin PWM
PIN 3           --------     A cualquier pin PWM
PIN 4           --------     A cualquier pin PWM
PIN 5           --------     A cualquier pin PWM
PIN 6           --------     A cualquier pin PWM
PIN 7           --------     A cualquier pin PWM
PIN 8           --------     A cualquier pin PWM
PIN 9           --------            GND
PIN 10        --------     + linea de alimentación (50 V  máx)

Control de dispositivos, se conecta GND de cada dispositivo en cada una de las lineas de control

PIN 11           --------   salida de control PWM del pin 8
PIN 12           --------   salida de control PWM del pin 7
PIN 13           --------   salida de control PWM del pin 6
PIN 14           --------   salida de control PWM del pin 5
PIN 15           --------   salida de control PWM del pin 4
PIN 16           --------   salida de control PWM del pin 3
PIN 17           --------   salida de control PWM del pin 2
PIN 18           --------   salida de control PWM del pin 1

Para controlar un ventilador, hice el siguiente arreglo

Código:
ULN2803A                  Arduino Due

PIN 2          --------     Pin 11
PIN 9          --------     GND
PIN 10         --------     + 12 V
PIN 17         --------     GND Ventilador

Linea de alimentación del ventilador a + 12 V

No tengo una protoboard para hacer las pruebas, así que he unido todo sobre un zócalo de 16 pines. Como el Due está conectado a la PC, tomé como linea de alimentación solamente la linea de 12 V (GND entre el ventilador y el Due es la misma).

ULN2803A.png

(Perdonen las soldaduras a la carrera pero tengo poco tiempo y ya quería probar el driver)

Programa ajustado para controlar el ventilador
Hice algunos cambios en el programa inicial, para poder usar barras con botón deslizante para controlar la salida RGB y también para controlar el ventilador.

ADue5.png



Código:
// Encabezado
// UTFT, Utouch, UTFT_Geometry
// (C)2013 Henning Karlsen
//  web: http://www.henningkarlsen.com/electronics

// librerías
#include <UTFT.h>
#include <UTouch.h>
#include <UTFT_Geometry.h>
#include <SPI.h>
#include <SD.h>

// Comunicación mediante el pinout del hardware específico
// UTFT myGLCD(2,38,39,40,41);  // HY32D
UTFT myGLCD(5,38,39,40,41); // TFT 2.8" ILI9325D

UTouch  myTouch( 6, 5, 4, 3, 2);
UTFT_Geometry geo(&myGLCD);

// Fuentes para presentar texto y valores en pantalla
extern uint8_t BigFont[];
extern uint8_t SmallFont[];

// Definición de variables, perfil 0
int R = 0; //color rojo
int R1 =0;
int G = 0; //color verde
int G1=0;
int B = 0; //color azul
int Azul=0;

//Variable de control de la velocidad del ventilador: Fan 1
int T=0;
int T1=T;

// leds RGB
int Rled = 8;   //Rojo
int Gled = 9;  //Verde
int Bled = 10;  //Azul

// Fan 1, PWM-Due
int PWMFan1 = 11;
int PorcFan1;

// control de posición bidimensional de la pantalla táctil
int x, y;

/*************************
**      Funciones       **
*************************/
// Barra de slider horizontal

void BarraSliderHRojo()
{
  // Canal Rojo
  myGLCD.setColor(R,0,0);
  myGLCD.fillRect(19,10,150,20);
  myGLCD.setColor(255,0,0);
  myGLCD.drawRect(19,10,150,20);
  myGLCD.setColor(R,0,0);
}

void BarraSliderHVerde()
{
  // Canal Verde
  myGLCD.setColor(0,G,0);
  myGLCD.fillRect(19,30,150,40);
  myGLCD.setColor(0,255,0);
  myGLCD.drawRect(19,30,150,40);
  myGLCD.setColor(0,G,0);
}

void BarraSliderHAzul()
{
  // Canal Azul
  myGLCD.setColor(0,0,B);
  myGLCD.fillRect(19,50,150,60);
  myGLCD.setColor(0,0,255);
  myGLCD.drawRect(19,50,150,60);
  myGLCD.setColor(0,0,B);
}

void BarraSliderBTFT()
{
  // Control del brillo de la retroilumincación del TFT
  myGLCD.setColor(0,0,175);
  myGLCD.fillRect(290,79,300,200);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(290,79,300,200);

}

void botonSliRojo()
{
  myGLCD.setColor(R,0,0);
  myGLCD.fillRect(x,10,x+10,20);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(x,10,x+10,20);
}

void botonSliVerde()
{
  myGLCD.setColor(0,G,0);
  myGLCD.fillRect(x,30,x+10,40);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(x,30,x+10,40);
}

void botonSliAzul()
{
  myGLCD.setColor(0,0,B);
  myGLCD.fillRect(x,50,x+10,60);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(x,50,x+10,60);
}

void botonSliBTFT()
{
  myGLCD.setColor(0,255,0);
  myGLCD.fillRect(290,y,300,y+10);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(290,y,300,y+10);
}

void ledR()
{
    analogWrite(Rled, R);
//    delay(10);
}
void ledG()
{
    analogWrite(Gled, G);
//    delay(10);
}
void ledB()
{
    analogWrite(Bled, B);
//    delay(10);
}

//Renombrar la variable
void Fan1()
{
analogWrite(PWMFan1, T);
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(99,64,145,75);
  myGLCD.setColor(0,255,0);
//  myGLCD.printNumI(T, 100, 65);
  myGLCD.printNumI(PorcFan1, 100, 65);
}

void Panelprincipal()
{
    myGLCD.setColor(R1,G1,Azul);
    myGLCD.fillRect(15, 80, 195, 200);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(15, 80, 195, 200);

    // Botón de limpieza del panel principal
    myGLCD.setColor(R1,G1,Azul);
    myGLCD.fillRect(200, 80, 220, 105);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(200, 80, 220, 105);

// Gráfica RGB
//Color actual RGB
    myGLCD.setColor(R1,G1,Azul);
    myGLCD.fillRect(300, 10, 310, 20);
//Marco exterior
    myGLCD.setColor(0,0,0);
    myGLCD.fillRect(210, 10, 300, 60);

//    myGLCD.setColor(0,50,0);
    myGLCD.setColor(80,0,100);
    myGLCD.drawRect(210, 10, 300, 60);

//Divisores horizontales
    myGLCD.drawLine(210, 15, 300, 15);
    myGLCD.drawLine(210, 20, 300, 20);
    myGLCD.drawLine(210, 25, 300, 25); 
    myGLCD.drawLine(210, 30, 300, 30); 
    myGLCD.drawLine(210, 35, 300, 35); 
    myGLCD.drawLine(210, 40, 300, 40);     
    myGLCD.drawLine(210, 45, 300, 45);     
    myGLCD.drawLine(210, 50, 300, 50);     
    myGLCD.drawLine(210, 55, 300, 55);

//Divisores verticales
//    myGLCD.setColor(0,30,0);
    myGLCD.drawLine(215, 10, 215, 60);
    myGLCD.drawLine(220, 10, 220, 60);
    myGLCD.drawLine(225, 10, 225, 60);
    myGLCD.drawLine(230, 10, 230, 60);
    myGLCD.drawLine(235, 10, 235, 60);
    myGLCD.drawLine(240, 10, 240, 60);
    myGLCD.drawLine(245, 10, 245, 60);
    myGLCD.drawLine(250, 10, 250, 60);
    myGLCD.drawLine(255, 10, 255, 60);
    myGLCD.drawLine(260, 10, 260, 60);
    myGLCD.drawLine(265, 10, 265, 60); 
    myGLCD.drawLine(270, 10, 270, 60); 
    myGLCD.drawLine(275, 10, 275, 60); 
    myGLCD.drawLine(280, 10, 280, 60); 
    myGLCD.drawLine(285, 10, 285, 60); 
    myGLCD.drawLine(290, 10, 290, 60); 
    myGLCD.drawLine(295, 10, 295, 60);     

     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);     
}

void BotonReset()
{
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(160,10,195,60);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(160,10,195,60);
}

//Colores de referencia
void coloresRef()
{
  //Color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(230, 80, 280, 90);
    myGLCD.setColor(255,0,0);
    myGLCD.drawRect(230, 80, 280, 90);

  //Color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(230, 95, 280, 105);
    myGLCD.setColor(0,255,0);
    myGLCD.drawRect(230, 95, 280, 105);

  //Color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(230, 110, 280, 120);
    myGLCD.setColor(0,0,255);
    myGLCD.drawRect(230, 110, 280, 120); 

  //Color Blanco
    myGLCD.setColor(255,255,255);
    myGLCD.fillRect(230, 125, 280, 135);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(230, 125, 280, 135);     

  //Color Rosa
    myGLCD.setColor(255,0,255);
    myGLCD.fillRect(230, 140, 280, 150);
    myGLCD.setColor(255,0,255);
    myGLCD.drawRect(230, 140, 280, 150);         

  //Color Amarillo
    myGLCD.setColor(255,255,0);
    myGLCD.fillRect(230, 155, 280, 165);
    myGLCD.setColor(255,255,0);
    myGLCD.drawRect(230, 155, 280, 165);             

  //Color Azul claro
    myGLCD.setColor(0,255,255);
    myGLCD.fillRect(230, 170, 280, 180);
    myGLCD.setColor(0,255,255);
    myGLCD.drawRect(230, 170, 280, 180);                 

  //Color negro
    myGLCD.setColor(0,0,0);
    myGLCD.fillRect(230, 185, 280, 195);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(230, 185, 280, 195);                     
}

void setup() {
// Iniciar TFT
    myGLCD.InitLCD();
// Limpiar TFT
    myGLCD.clrScr();
// Iniciar pantalla táctil
    myTouch.InitTouch();
// Ajustar precisión de la pantalla táctil
    myTouch.setPrecision(PREC_HI);

// Asignar tamaño de fuente
    myGLCD.setFont(SmallFont);
    myGLCD.fillScr(0,0,0);

// Activar función para dibujar botones, si el programa corresponde solo a un menú, no es necesario
// llamarla de nuevo dentro del programa principal, asi evitamos parpadeos de pantalla
    BarraSliderHRojo();
    BarraSliderHVerde();
    BarraSliderHAzul();
    BarraSliderBTFT();
    BotonReset();
    Panelprincipal();
    coloresRef();
    Fan1();

//boton color rojo inicial
  myGLCD.setColor(R,0,0);
  myGLCD.fillRect(19,10,30,20);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,10,30,20);

//boton color verde inicial
  myGLCD.setColor(0,G,0);
  myGLCD.fillRect(19,30,30,40);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,30,30,40);

//boton color azul inicial
  myGLCD.setColor(0,0,B);
  myGLCD.fillRect(19,50,30,60);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,50,30,60);

//botón control Fan1
  myGLCD.setColor(0,255,0);
  myGLCD.fillRect(290,190,300,200);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(290,190,300,200);

// Texto bajo el panel principal
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(14, 204, 200, 213);
  myGLCD.setColor(255,255,255);
  myGLCD.printNumI(R, 15, 204);
  myGLCD.printNumI(G, 97, 204);
  myGLCD.printNumI(B, 180, 204);
}

void loop() {
// Control de la entrada de pantalla
    while (true)
  {
    if (myTouch.dataAvailable())
    {
// Aquí iría el menú principal  ---  revisar posteriormente

// Leer datos del puntero sobre la pantalla táctil
        myTouch.read();
        x=myTouch.getX();
        y=myTouch.getY();

        // Actualiza el color de la ventana principal  

// Mostrar coordenadas X y Y del puntero en la pantalla táctil, bajo el panel principal
            myGLCD.setColor(0, 0, 0);
            myGLCD.fillRect(49, 214, 180, 225);
            myGLCD.setBackColor(0, 0, 0);
            myGLCD.setColor(0, 255, 0);
            myGLCD.print("x=", 50, 215);
            myGLCD.printNumI(x, 66, 215);
            myGLCD.print("y=", 120, 215);     
            myGLCD.printNumI(y, 136, 215);

//Slider control del ventilador (Fan 1)
// Ubicar la barra del slider
//  myGLCD.fillRect(290,80,300,200);
      if ((y>=79) && (y<=190))  // Rango en y
      {
        if ((x>=290) && (x<=300))  // Rango en x
        {
            T = 0 + 255 * (190-y)/(111);
            PorcFan1 = 100*(190-y)/(111);
         // T = 255;
          Fan1();
          BarraSliderBTFT();
          botonSliBTFT();             

     myGLCD.setColor(0,0,0);
     myGLCD.fillRect(14, 204, 94, 213);
     myGLCD.setColor(255,255,255);
     T1=T;
     Panelprincipal();
                    //Barra de color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);     

          if (y<=79)
          {
            T=195;
          }
   
          if (y>>190)
          {
            T=255;
          }
        }
      }// fin slider retroiluminación del TFT

//Slider canal rojo
// Ubicar la barra del slider
//   myGLCD.fillRect(20,10,150,20);
      if ((y>=10) && (y<=20))  // Rango en y
      {
        if ((x>=19) && (x<=140))  // Rango en x
        {
          R = 255 * (x-19)/121;
          ledR();
          BarraSliderHRojo();
          botonSliRojo();
     myGLCD.setColor(0,0,0);
     myGLCD.fillRect(14, 204, 94, 213);
     myGLCD.setColor(255,255,255);
          R1=R;
     myGLCD.printNumI(R1, 15, 204);
          Panelprincipal();
                    //Barra de color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);     

          if (x<=19)
          {
            R=0;
          }
   
          if (x>>140)
          {
            R=255;
          }
        }
      }// fin slider canal rojo

//Slider canal verde
// Ubicar la barra del slider
//   myGLCD.fillRect(20,10,150,20);
      if ((y>=30) && (y<=40))  // Rango en y
      {
        if ((x>=19) && (x<=140))  // Rango en x
        {
          G = 255 * (x-19)/121;
          ledG();
          BarraSliderHVerde();
          botonSliVerde();
     myGLCD.setColor(0,0,0);
     myGLCD.fillRect(96, 204, 175, 213);
     myGLCD.setColor(255,255,255);
        G1=G;
     myGLCD.printNumI(G1, 97, 204);
               Panelprincipal();
                    //Barra de color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);         
          if (x<=19)
          {
            G=0;
          }
   
          if (x>>140)
          {
            G=255;
          }
        }
      }// fin slider canal verde

//Slider canal azul
// Ubicar la barra del slider
//   myGLCD.fillRect(20,10,150,20);
      if ((y>=50) && (y<=60))  // Rango en y
      {
        if ((x>=19) && (x<=140))  // Rango en x
        {
          B = 255 * (x-19)/121;
          ledB();
          BarraSliderHAzul();
          botonSliAzul();
     myGLCD.setColor(0,0,0);
     myGLCD.fillRect(179, 204, 200, 213);
     myGLCD.setColor(255,255,255);
          Azul=B;
     myGLCD.printNumI(Azul, 180, 204);     
          Panelprincipal();
                    //Barra de color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);         
          if (x<=19)
          {
            B=0;
          }
   
          if (x>>140)
          {
            B=255;
          }
        }
      }// fin slider canal azul

  
//Reseteo del mezclador
//  myGLCD.drawRect(160,10,195,60);
      if ((y>=10) && (y<=60))  // Rango en y
      {
        if ((x>=160) && (x<=195))  // Rango en x
        {
          x=19;
          R = 0;
          R1=0;
          ledR();
          BarraSliderHRojo();
          botonSliRojo();
          G = 0;
          G1=0;
          ledG();
          BarraSliderHVerde();
          botonSliVerde();
          B = 0;
          Azul =0;
          ledB();
          BarraSliderHAzul();
          botonSliAzul();
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(R1, 15, 204);

          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(96, 204, 175, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(G1, 97, 204);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(179, 204, 200, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(Azul, 180, 204);     
   
          Panelprincipal();
                    //Barra de color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);         
        }
      }// fin reseteo
  
  
// Referencia color Rojo  
//      myGLCD.fillRect(230, 80, 280, 90);
      if ((y>=80) && (y<=90))  // Rango en y
      {
        if ((x>=230) && (x<=280))  // Rango en x
        {
          R = 255;
          R1=R;
          G=0;
          G1=G;
          B=0;
          Azul=B;
          ledR();
          ledG();
          ledB();
          BarraSliderHRojo();
          BarraSliderHVerde();
          BarraSliderHAzul();   
//          botonSliRojo();
          myGLCD.setColor(255,0,0);
          myGLCD.fillRect(140,10,150,20);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(140,10,150,20);


//boton color verde inicial
  myGLCD.setColor(0,G,0);
  myGLCD.fillRect(19,30,30,40);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,30,30,40);

//boton color azul inicial
  myGLCD.setColor(0,0,B);
  myGLCD.fillRect(19,50,30,60);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,50,30,60);

   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(R1, 15, 204);

          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(96, 204, 175, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(G1, 97, 204);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(179, 204, 200, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(Azul, 180, 204);     
   
          Panelprincipal();
                    //Barra de color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);         
        }
      }// fin referencia color rojo
  
  
// Referencia color amarillo  
//     myGLCD.fillRect(230, 155, 280, 165);
      if ((y>=155) && (y<=165))  // Rango en y
      {
        if ((x>=230) && (x<=280))  // Rango en x
        {
          G = 255;
          G1=G;
          R=255;
          R1=R;
          B=0;
          Azul=B;
          ledR();
          ledG();
          ledB();
          BarraSliderHRojo();   
          BarraSliderHVerde();
          BarraSliderHAzul();   
//          botonSliVerde();
          myGLCD.setColor(0,G,0);
          myGLCD.fillRect(140,30,150,40);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(140,30,150,40);
   
   
//          botonSliRojo();
          myGLCD.setColor(255,0,0);
          myGLCD.fillRect(140,10,150,20);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(140,10,150,20);

//boton color azul inicial
  myGLCD.setColor(0,0,B);
  myGLCD.fillRect(19,50,30,60);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,50,30,60);

          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(R1, 15, 204);

          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(96, 204, 175, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(G1, 97, 204);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(179, 204, 200, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(Azul, 180, 204);     
   
          Panelprincipal();
                    //Barra de color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);         
        }
      }// fin referencia color amarillo  
  
// Referencia color Verde  
//      myGLCD.fillRect(230, 95, 280, 105);
      if ((y>=95) && (y<=105))  // Rango en y
      {
        if ((x>=230) && (x<=280))  // Rango en x
        {
          G = 255;
          G1=G;
          R=0;
          R1=R;
          B=0;
          Azul=B;
          ledR();
          ledG();
          ledB();
          BarraSliderHRojo();   
          BarraSliderHVerde();
          BarraSliderHAzul();   
//          botonSliVerde();
          myGLCD.setColor(0,G,0);
          myGLCD.fillRect(140,30,150,40);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(140,30,150,40);
   
//boton color rojo inicial
  myGLCD.setColor(R,0,0);
  myGLCD.fillRect(19,10,30,20);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,10,30,20);

//boton color azul inicial
  myGLCD.setColor(0,0,B);
  myGLCD.fillRect(19,50,30,60);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,50,30,60);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(R1, 15, 204);

          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(96, 204, 175, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(G1, 97, 204);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(179, 204, 200, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(Azul, 180, 204);     
   
          Panelprincipal();
                    //Barra de color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);         
        }
      }// fin referencia color verde  
// Referencia color Azul  
//          myGLCD.fillRect(230, 110, 280, 120);
      if ((y>=110) && (y<=120))  // Rango en y
      {
        if ((x>=230) && (x<=280))  // Rango en x
        {
          B = 255;
          Azul=B;
          R=0;
          R1=R;
          G=0;
          G1=G;
          ledR();
          ledG();
          ledB();
          BarraSliderHRojo();   
          BarraSliderHVerde();
          BarraSliderHAzul();   
//          botonSliAzul();
          myGLCD.setColor(0,0,B);
          myGLCD.fillRect(140,50,150,60);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(140,50,150,60);
   
//boton color rojo inicial
  myGLCD.setColor(R,0,0);
  myGLCD.fillRect(19,10,30,20);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,10,30,20);

//boton color verde inicial
  myGLCD.setColor(0,G,0);
  myGLCD.fillRect(19,30,30,40);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,30,30,40);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(R1, 15, 204);

          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(96, 204, 175, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(G1, 97, 204);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(179, 204, 200, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(Azul, 180, 204);     
   
          Panelprincipal();
                    //Barra de color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);         
        }
      }// fin referencia color azul  
  // Referencia color Azul claro  
//    myGLCD.fillRect(230, 170, 280, 180);
      if ((y>=170) && (y<=180))  // Rango en y
      {
        if ((x>=230) && (x<=280))  // Rango en x
        {
          B = 255;
          Azul=B;
          R=0;
          R1=R;
          G=255;
          G1=G;
          ledR();
          ledG();
          ledB();
          BarraSliderHRojo();   
          BarraSliderHVerde();
          BarraSliderHAzul();   
//          botonSliAzul();
          myGLCD.setColor(0,0,B);
          myGLCD.fillRect(140,50,150,60);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(140,50,150,60);
   
//boton color rojo inicial
  myGLCD.setColor(R,0,0);
  myGLCD.fillRect(19,10,30,20);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,10,30,20);

//          botonSliVerde();
          myGLCD.setColor(0,G,0);
          myGLCD.fillRect(140,30,150,40);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(140,30,150,40);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(R1, 15, 204);

          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(96, 204, 175, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(G1, 97, 204);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(179, 204, 200, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(Azul, 180, 204);     
   
          Panelprincipal();
                    //Barra de color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);         
        }
      }// fin referencia color azul claro  
  // Referencia color Blanco  
//          myGLCD.fillRect(230, 125, 280, 135);
      if ((y>=125) && (y<=135))  // Rango en y
      {
        if ((x>=230) && (x<=280))  // Rango en x
        {
          B = 255;
          Azul=B;
          R=255;
          R1=R;
          G=255;
          G1=G;
          ledR();
          ledG();
          ledB();
          BarraSliderHRojo();   
          BarraSliderHVerde();
          BarraSliderHAzul();   
//          botonSliAzul();
          myGLCD.setColor(0,0,B);
          myGLCD.fillRect(140,50,150,60);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(140,50,150,60);

//          botonSliVerde();
          myGLCD.setColor(0,G,0);
          myGLCD.fillRect(140,30,150,40);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(140,30,150,40);
//          botonSliRojo();
          myGLCD.setColor(255,0,0);
          myGLCD.fillRect(140,10,150,20);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(140,10,150,20);   
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(R1, 15, 204);

          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(96, 204, 175, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(G1, 97, 204);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(179, 204, 200, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(Azul, 180, 204);     
   
          Panelprincipal();
                    //Barra de color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);         
        }
      }// fin referencia color blanco
    // Referencia color rosa  
//    myGLCD.fillRect(230, 140, 280, 150);
      if ((y>=140) && (y<=150))  // Rango en y
      {
        if ((x>=230) && (x<=280))  // Rango en x
        {

          B = 255;
          Azul=B;
          R=255;
          R1=R;
          G=0;
          G1=G;
          ledR();
          ledG();
          ledB();
          BarraSliderHRojo();   
          BarraSliderHVerde();
          BarraSliderHAzul();   

//          botonSliAzul();
          myGLCD.setColor(0,0,B);
          myGLCD.fillRect(140,50,150,60);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(140,50,150,60);

//          botonSliRojo();
          myGLCD.setColor(255,0,0);
          myGLCD.fillRect(140,10,150,20);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(140,10,150,20);

//boton color verde inicial
  myGLCD.setColor(0,G,0);
  myGLCD.fillRect(19,30,30,40);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,30,30,40);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(R1, 15, 204);

          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(96, 204, 175, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(G1, 97, 204);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(179, 204, 200, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(Azul, 180, 204);     
   
          Panelprincipal();
                    //Barra de color Rojo
    myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);         
        }
      }// fin referencia color rosa
   // Referencia color negro  
//    myGLCD.fillRect(230, 185, 280, 195);
      if ((y>=185) && (y<=195))  // Rango en y
      {
        if ((x>=230) && (x<=280))  // Rango en x
        {

          B = 0;
          Azul=B;
          R=0;
          R1=R;
          G=0;
          G1=G;
          ledR();
          ledG();
          ledB();
          BarraSliderHRojo();   
          BarraSliderHVerde();
          BarraSliderHAzul();   

//boton color rojo inicial
  myGLCD.setColor(R,0,0);
  myGLCD.fillRect(19,10,30,20);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,10,30,20);

//boton color verde inicial
  myGLCD.setColor(0,G,0);
  myGLCD.fillRect(19,30,30,40);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,30,30,40);

//boton color azul inicial
  myGLCD.setColor(0,0,B);
  myGLCD.fillRect(19,50,30,60);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(19,50,30,60);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(R1, 15, 204);

          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(96, 204, 175, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(G1, 97, 204);
   
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(179, 204, 200, 213);
          myGLCD.setColor(255,255,255);
          myGLCD.printNumI(Azul, 180, 204);     
          Panelprincipal();
        }
      }// fin referencia color negro
// Dibujo con el puntero dentro del panel principal
//Identificar el área donde está ubicado el panel principal
//    myGLCD.drawRect(15, 80, 195, 200);
      if ((y>=81) && (y<=200))  // Rango en y
      {
        if ((x>=16) && (x<=195))  // Rango en x
        {
// INICIO dibujar a mano alzada
// Color inverso al actual
      //     myGLCD.setColor(R1, G1, Azul);
    //       myGLCD.fillRect(200, 80, 220, 105);   
  //         myGLCD.setColor(255,255,255);
//           myGLCD.drawRect(200, 80, 220, 105);
           myGLCD.setColor(255-R1, 255-G1, 255-Azul);

           if ((x!=-1) and (x!=-1))
           {
             myGLCD.drawPixel (x, y);
             myGLCD.drawPixel (x-1, y);
             myGLCD.drawPixel (x, y-1);
             myGLCD.drawPixel (x-1, y-1);
           }
        }
      }// FIN dibujar a mano alzada
// Limpieza solo del trazo dentro del panel principal
//Identificar el área del botón de limpieza del panel principal
//           myGLCD.fillRect(200, 80, 220, 95);   
      if ((y>=80) && (y<=105))  // Rango en y
      {
        if ((x>=200) && (x<=220))  // Rango en x
        {
          Panelprincipal();
          myGLCD.setColor(R1,G1,Azul);
          myGLCD.fillRect(200, 80, 220, 105);
          myGLCD.setColor(255,255,255);
          myGLCD.drawRect(200, 80, 220, 105);   
  
             myGLCD.setColor(255,0,0);
    myGLCD.fillRect(215, 60, 235, (60-(R1*50/255)));
          //Barra de color Verde
    myGLCD.setColor(0,255,0);
    myGLCD.fillRect(245, 60, 265, (60-(G1*50/255)));
          //Barra de color Azul
    myGLCD.setColor(0,0,255);
    myGLCD.fillRect(275, 60, 295, (60-(Azul*50/255)));
     myGLCD.setColor(255,0,0);
    myGLCD.drawLine(215, 60, 235, 60); 
     myGLCD.setColor(0,255,0);
    myGLCD.drawLine(245, 60, 265, 60);     
     myGLCD.setColor(0,0,255);
    myGLCD.drawLine(275, 60, 295, 60);         
        }
      }// FIN limpieza panel principal
    }
  }
}

Funciona !!!, se puede controlar de forma proporcional a la longitud de la barra deslizante.
Controlador1.png


Controlador2a.png


Controlador2.png


Para poder usar el pin del sensor de RPM del ventilador, hay que averiguar el nivel de voltaje que tiene la señal antes de poder conectarlo al Arduino Due. Por el momento me gusta el funcionamiento, ya que con solo dos hilos por cada ventilador, es posible controlarlo mediante la pantalla táctil del TFT.

Controlador5.png


Por el momento tengo solo un led RGB conectado directamente a los 3.3V del Due, con el ULN2803A, ya me será posible controlar una tira de 6 leds RGB alimentada con 12 V.

Fin de la parte 5

Solo falta ver como recuperar los NTC para medir temperatura. A leer nuevamente...
 
Última edición:
He estado batallando un rato con la implementación de menús en la pantalla. Al fin tras algunos días de experimentar he logrado entender como funcionan en grupo las pantallas individuales. Les comparto el avance, apenas es la versión 1, aún hay muchas cosas que depurar en el código. Por el momento puedo seleccionar cada canal RGB, por separado y controlar el % de velocidad de un solo ventilador.


En el proceso, encontré la forma de subir imágenes al TFT. Con un pequeño comparativo, es posible mostrar una foto del ventilador apagado cuando velocidad del ventilador es 0, y una foto del ventilador encendido cuando el ventilador se activa.

Se genera un ruido o vibración al seleccionar velocidades del ventilador bajas. Indagaré más al respecto, posiblemente se necesite un circuito entre el ventilador y la salida PWM del ULN2803A.

PD: si alguien sabe algo al respecto de ese ruido, les agradecería que me orientaran a que se debe y como sería posible eliminarlo.

Acá el código, perdonen lo burdo del mismo, aun falta aplicar mucha depuración
Código:
// Encabezado
// UTFT, Utouch, UTFT_Geometry
// (C)2013 Henning Karlsen
//  web: http://www.henningkarlsen.com/electronics

// librerías
#include <UTFT.h>
#include <UTouch.h>
#include <UTFT_Geometry.h>
// Comunicación mediante el pinout del hardware específico
// UTFT myGLCD(2,38,39,40,41);  // HY32D
UTFT myGLCD(5,38,39,40,41); // TFT 2.8" ILI9325D

UTouch  myTouch( 6, 5, 4, 3, 2);
UTFT_Geometry geo(&myGLCD);

// Fuentes para presentar texto y valores en pantalla
extern uint8_t BigFont[];
extern uint8_t SmallFont[];

// control de posición bidimensional de la pantalla táctil
int x;
int y;

//Coordenadas para botones del menú de control

//Botones del sistema de control

//Botón canal R-control
int x11=240; int y11=10; int x12=310; int y12=30;
//Botón canal G-control
int x21=240; int y21=40; int x22=310; int y22=60;
//Botón canal B-control
int x31=240; int y31=70; int x32=310; int y32=90;
//Botón Fan 1
int x41=240; int y41=100; int x42=310; int y42=120;

//Botón-Retorno a control principal
int x61=240; int y61=200; int x62=310; int y62=220;

// Definición de variables, perfil 0
//Canal R
int R = 0;
int R1 =0;
int RX; // x del canal Rojo
//Canal R
int G = 0;
int G1 =0;
int GX; // x del canal Verde
//Canal B
int B = 0;
int Az1 =0;
int BX; // x del canal Azul
//Fan 1
int Fan1 = 0;
int FanA =0;
int Fan1X; // x del set para Fan1
int menu;

//Pin de control de cada led RGB
int Rled = 8;   //Rojo
int Gled = 9;  //Verde
int Bled = 10;  //Azul

void ledR()
{
    analogWrite(Rled, R);
//    delay(10);
}  
void ledG()
{  
    analogWrite(Gled, G);
//    delay(10);  
}
void ledB()
{
    analogWrite(Bled, B);  
//    delay(10);  
}


// Pin de control del Fan 1 por PWM
int PWMFan1 = 11;
int PorcFan1;

void PinFan1()
{
analogWrite(PWMFan1, Fan1);
  myGLCD.setColor(0,0,0);
  myGLCD.fillRect(99,64,145,75);
  myGLCD.setColor(0,255,0);
//  myGLCD.printNumI(T, 100, 65);
  myGLCD.printNumI(PorcFan1, 100, 65);
}

/*************************
**      Funciones       **
*************************/

void coordenadasXY()
{
    myGLCD.setColor(0, 0, 0);
    myGLCD.fillRect(49, 214, 180, 225);
    myGLCD.setBackColor(0, 0, 0);
    myGLCD.setColor(0, 255, 0);
    myGLCD.print("x=", 50, 215);
    myGLCD.printNumI(x, 66, 215);
    myGLCD.print("y=", 120, 215);          
    myGLCD.printNumI(y, 136, 215);
}


// Control principal
void Menu1()
{
  myGLCD.clrScr();

  if (Fan1==0)
  {
    imagenoff();
  }
  if (Fan1>>0)
  {
    imagenon();
  }




// Encabezado 
  myGLCD.setBackColor(0, 0, 255);  myGLCD.setFont(SmallFont);  myGLCD.setColor(255, 255, 255);  myGLCD.print("Control principal",2,2);     
// Boton de canal Rojo
  myGLCD.setFont(SmallFont);  myGLCD.setColor(0, 0, 255);  myGLCD.setBackColor(0, 0, 255);  boton(x11,y11,x12,y12);  myGLCD.print("R set",257,14);   myGLCD.setBackColor(R, 0, 0); myGLCD.setColor(R, 0, 0); myGLCD.fillRect(211,10,236,30); myGLCD.setColor(255-R, 255, 255); myGLCD.printNumI(R,213,14);
// Boton de canal Verde
  myGLCD.setFont(SmallFont);  myGLCD.setColor(0, 0, 255);  myGLCD.setBackColor(0, 0, 255);  boton(x21,y21,x22,y22);  myGLCD.print("G set",257,44);   myGLCD.setBackColor(0, G, 0); myGLCD.setColor(0, G, 0); myGLCD.fillRect(211,40,236,60); myGLCD.setColor(255, 255-G, 255); myGLCD.printNumI(G,213,44);
// Boton de canal Azul
  myGLCD.setFont(SmallFont);  myGLCD.setColor(0, 0, 255);  myGLCD.setBackColor(0, 0, 255);  boton(x31,y31,x32,y32);  myGLCD.print("B set",257,74);   myGLCD.setBackColor(0, 0, B); myGLCD.setColor(0, 0, B); myGLCD.fillRect(211,70,236,90); myGLCD.setColor(255, 255, 255-B); myGLCD.printNumI(B,213,74);
// Color RGB resultante
myGLCD.setColor(R, G, B); myGLCD.fillRect(190,10,208,120);
myGLCD.setColor(255, 255, 255); myGLCD.drawRect(190,10,208,120);
          ledR();
          ledG();        
          ledB();        


// Control de Fan 1
  myGLCD.setFont(SmallFont);  myGLCD.setColor(0, 0, 255);  myGLCD.setBackColor(0, 0, 255);  boton(x41,y41,x42,y42);  myGLCD.print("Fan1 set",245,104);   myGLCD.setBackColor(0, 0, 0); myGLCD.setColor(0, 0, 0); myGLCD.fillRect(211,100,236,120); myGLCD.setColor(255, 255, 255); myGLCD.printNumI(PorcFan1,213,104);


  menu=1;

   while (true)
  {  
   if (myTouch.dataAvailable())
    {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();

       if (menu ==1)
      {
// Inicio-menu de control del canal Rojo      
        if ((y>=y11) && (y<=y12)) // //Intervalo en y boton control Rojo
        {    
          if ((x>=x11) && (x<=x12)) //Intervalo en x boton control Rojo
          {      
            contornoRojo(x11,y11,x12,y12);
            myGLCD.clrScr();

  if (Fan1==0)
  {
    imagenoff();
  }
  if (Fan1>>0)
  {
    imagenon();
  }


         // Encabezado   
            myGLCD.setBackColor(255, 0, 0);  myGLCD.setFont(SmallFont);  myGLCD.setColor(255, 255, 255);  myGLCD.print("Control de canal Rojo",2,150);                 
            menu =2;
          
        //barra horizontal color rojo inicial
           myGLCD.setColor(R,0,0);
           myGLCD.fillRect(19,10,150,20);
           myGLCD.setColor(255,0,0);
           myGLCD.drawRect(19,10,150,20);

       //boton color rojo inicial
          if (R==0)
            {
             myGLCD.setColor(R,0,0);
             myGLCD.fillRect(19,10,30,20);
             myGLCD.setColor(255,255,255);
             myGLCD.drawRect(19,10,30,20);
            }
         if (R>>0)
           {
            myGLCD.setColor(R,0,0);
            RX = (19+(121*R/255));
            myGLCD.fillRect(RX,10,RX+10,20);
            myGLCD.setColor(255,255,255);
            myGLCD.drawRect(RX,10,RX+10,20);
           }     

       // Texto bajo el panel principal
        myGLCD.setColor(0,0,0);
        myGLCD.fillRect(14, 204, 200, 213);
        myGLCD.setColor(255,255,255);
        myGLCD.printNumI(R, 15, 204);          
        Menu2();
       }
     }//  Fin-menu de control del canal Rojo
   
///////////////  CVerde


// Inicio-menu de control del canal Verde      
        if ((y>=y21) && (y<=y22)) // //Intervalo en y boton control Verde
        {    
          if ((x>=x21) && (x<=x22)) //Intervalo en x boton control Verde
          {      
            contornoRojo(x21,y21,x22,y22);
            myGLCD.clrScr();

  if (Fan1==0)
  {
    imagenoff();
  }
  if (Fan1>>0)
  {
    imagenon();
  }

         // Encabezado   
            myGLCD.setBackColor(0, 255, 0);  myGLCD.setFont(SmallFont);  myGLCD.setColor(0, 0, 0);  myGLCD.print("Control de canal Verde",2,150);                 
            menu =3;
          
        //barra horizontal color verde inicial
           myGLCD.setColor(0,G,0);
           myGLCD.fillRect(19,10,150,20);
           myGLCD.setColor(0,255,0);
           myGLCD.drawRect(19,10,150,20);

       //boton color verde inicial
          if (G==0)
            {
             myGLCD.setColor(0,G,0);
             myGLCD.fillRect(19,10,30,20);
             myGLCD.setColor(255,255,255);
             myGLCD.drawRect(19,10,30,20);
            }
         if (G>>0)
           {
            myGLCD.setColor(0,G,0);
            GX = (19+(121*G/255));
            myGLCD.fillRect(GX,10,GX+10,20);
            myGLCD.setColor(255,255,255);
            myGLCD.drawRect(GX,10,GX+10,20);
           }     

       // Texto bajo el panel principal
        myGLCD.setColor(0,0,0);
        myGLCD.fillRect(14, 204, 200, 213);
        myGLCD.setColor(255,255,255);
        myGLCD.printNumI(G, 15, 204);          
        Menu3();
       }
     }//  Fin-menu de control del canal Verde


//////////////  CVerde
   
   
   
///////////////  CAzul


// Inicio-menu de control del canal aZUL      
        if ((y>=y31) && (y<=y32)) // //Intervalo en y boton control AZUL
        {   
          if ((x>=x31) && (x<=x32)) //Intervalo en x boton control AZUL
          {      
            contornoRojo(x31,y31,x32,y32);
            myGLCD.clrScr();

  if (Fan1==0)
  {
    imagenoff();
  }
  if (Fan1>>0)
  {
    imagenon();
  }

         // Encabezado   
            myGLCD.setBackColor(0, 0, 255);  myGLCD.setFont(SmallFont);  myGLCD.setColor(255, 255, 255);  myGLCD.print("Control de canal Azul",2,150);                 
            menu =4;
          
        //barra horizontal color azul inicial
           myGLCD.setColor(0,0,B);
           myGLCD.fillRect(19,10,150,20);
           myGLCD.setColor(0,0,255);
           myGLCD.drawRect(19,10,150,20);

       //boton color azul inicial
          if (B==0)
            {
             myGLCD.setColor(0,0,B);
             myGLCD.fillRect(19,10,30,20);
             myGLCD.setColor(255,255,255);
             myGLCD.drawRect(19,10,30,20);
            }
         if (B>>0)
           {
            myGLCD.setColor(0,0,B);
            BX = (19+(121*B/255));
            myGLCD.fillRect(BX,10,BX+10,20);
            myGLCD.setColor(255,255,255);
            myGLCD.drawRect(BX,10,BX+10,20);
           }     

       // Texto bajo el panel principal
        myGLCD.setColor(0,0,0);
        myGLCD.fillRect(14, 204, 200, 213);
        myGLCD.setColor(255,255,255);
        myGLCD.printNumI(B, 15, 204);          
        Menu4();
       }
     }//  Fin-menu de control del canal aZUL


//////////////  CAzul   
   
   
   
/////////////// Fan 1


// Inicio-menu de control del ventilador 1      
        if ((y>=y41) && (y<=y42)) // //Intervalo en y boton control Fan 1
        {   
          if ((x>=x41) && (x<=x42)) //Intervalo en x boton control Fan 1
          {      
            contornoRojo(x41,y41,x42,y42);
            myGLCD.clrScr();

  if (Fan1==0)
  {
    imagenoff();
  }
  if (Fan1>>0)
  {
    imagenon();
  }


         // Encabezado   
            myGLCD.setBackColor(0, 0, 0);  myGLCD.setFont(SmallFont);  myGLCD.setColor(255, 255, 255);  myGLCD.print("Control Fan 1",2,150);                 
            menu =5;
          
        //barra horizontal Fan1
           myGLCD.setColor(0,0,Fan1);
           myGLCD.fillRect(19,10,150,20);
           myGLCD.setColor(0,0,255);
           myGLCD.drawRect(19,10,150,20);

       //boton color azul inicial
          if (Fan1==0)
            {
             myGLCD.setColor(0,0,Fan1);
             myGLCD.fillRect(19,10,30,20);
             myGLCD.setColor(255,255,255);
             myGLCD.drawRect(19,10,30,20);
            }
         if (Fan1>>0)
           {
            myGLCD.setColor(0,0,Fan1);
            Fan1X = (19+(121*Fan1/255));
            myGLCD.fillRect(Fan1X,10,Fan1X+10,20);
            myGLCD.setColor(255,255,255);
            myGLCD.drawRect(Fan1X,10,Fan1X+10,20);
           }     

       // Texto bajo el panel principal
        myGLCD.setColor(0,0,0);
        myGLCD.fillRect(14, 204, 200, 213);
        myGLCD.setColor(255,255,255);
//        myGLCD.printNumI(PorcFan1, 15, 204);          
        myGLCD.printNumI(Fan1, 15, 204);          
        Menu5();
       }
     }//  Fin-menu de control del canal aZUL


//////////////  Fan 1    
   
   
   
   
   
   }// Menu de contro principal
  }
}
}

// Control del Canal Rojo
void Menu2()
{
    menu=2;  
// Mostrar coordenadas X y Y del puntero en la pantalla táctil, bajo el panel principal   
  
// Boton de retorno a control principal  
    boton(x61,y61,x62,y62);   myGLCD.setFont(SmallFont);  myGLCD.setBackColor(0, 0, 255);  myGLCD.print("Back",260,204); 
  while (true)
  {  
   if (myTouch.dataAvailable())
    {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();
      coordenadasXY();  
      canalROJO();
//    botonSliRojo();

        if ((y>=y61) && (y<=y62))  // intervalo y del Boton de retotno
        {   
          if ((x>=x61) && (x<=x62))  // intervalo y del Boton de retotno
          {   
            contornoRojo(x61,y61,x62,y62);
            menu =1;
            Menu1();
          }
       }
    }
  }
}

// Barra de slider horizontal
void BarraSliderHRojo()
{
  // Canal Rojo
  myGLCD.setColor(R,0,0);
  myGLCD.fillRect(19,10,150,20);
  myGLCD.setColor(255,0,0);
  myGLCD.drawRect(19,10,150,20);
  myGLCD.setColor(R,0,0);
}

void botonSliRojo()
{
  if (R==0)
  {
  myGLCD.setColor(R,0,0);
  myGLCD.fillRect(x,10,x+10,20);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(x,10,x+10,20);
  }

  if (R>>0)
  {
    myGLCD.setColor(R,0,0);
    RX = (19+(121*R/255));
    myGLCD.fillRect(RX,10,RX+10,20);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(RX,10,RX+10,20);
  }  

}

void canalROJO()
{
//Slider canal rojo
// Ubicar la barra del slider
//   myGLCD.fillRect(20,10,150,20);
      if ((y>=10) && (y<=20))  // Rango en y
      {
        if ((x>=19) && (x<=140))  // Rango en x
        {
          R = 255 * (x-19)/121;
          ledR();
          BarraSliderHRojo();
          botonSliRojo();
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          R1=R;
          myGLCD.printNumI(R1, 15, 204);
          coordenadasXY();             

          if (x<=19)
          {
            R=0;
          }
        
          if (x>>140)
          {
            R=255;
          }
        }
      }// fin slider canal rojo
} 


//////////////////////////    Canal Verde



// Control del Canal Verde
void Menu3()
{
    menu=3;  
// Mostrar coordenadas X y Y del puntero en la pantalla táctil, bajo el panel principal   
  
// Boton de retorno a control principal  
    boton(x61,y61,x62,y62);   myGLCD.setFont(SmallFont);  myGLCD.setBackColor(0, 0, 255);  myGLCD.print("Back",260,204); 
  while (true)
  {  
   if (myTouch.dataAvailable())
    {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();
      coordenadasXY();  
      canalVerde();
//    botonSliRojo();

        if ((y>=y61) && (y<=y62))  // intervalo y del Boton de retotno
        {   
          if ((x>=x61) && (x<=x62))  // intervalo y del Boton de retotno
          {   
            contornoRojo(x61,y61,x62,y62);
            menu =1;
            Menu1();
          }
       }
    }
  }
}

// Barra de slider horizontal
void BarraSliderHVerde()
{
  // Canal Rojo
  myGLCD.setColor(0,G,0);
  myGLCD.fillRect(19,10,150,20);
  myGLCD.setColor(0,255,0);
  myGLCD.drawRect(19,10,150,20);
  myGLCD.setColor(0,G,0);
}

void botonSliVerde()
{
  if (G==0)
  {
  myGLCD.setColor(0,G,0);
  myGLCD.fillRect(x,10,x+10,20);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(x,10,x+10,20);
  }

  if (G>>0)
  {
    myGLCD.setColor(0,G,0);
    GX = (19+(121*G/255));
    myGLCD.fillRect(GX,10,GX+10,20);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(GX,10,GX+10,20);
  }  

}

void canalVerde()
{
//Slider canal verde
// Ubicar la barra del slider
//   myGLCD.fillRect(20,10,150,20);
      if ((y>=10) && (y<=20))  // Rango en y
      {
        if ((x>=19) && (x<=140))  // Rango en x
        {
          G = 255 * (x-19)/121;
          ledG();
          BarraSliderHVerde();
          botonSliVerde();
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          G1=G;
          myGLCD.printNumI(G1, 15, 204);
          coordenadasXY();             

          if (x<=19)
          {
            G=0;
          }
        
          if (x>>140)
          {
            R=255;
          }
        }
      }// fin slider canal verde
} 


/////////////////////////     Canal Verde



//////////////////////////    Canal Azul



// Control del Canal Azul
void Menu4()
{
    menu=4;  
// Mostrar coordenadas X y Y del puntero en la pantalla táctil, bajo el panel principal   
  
// Boton de retorno a control principal  
    boton(x61,y61,x62,y62);   myGLCD.setFont(SmallFont);  myGLCD.setBackColor(0, 0, 255);  myGLCD.print("Back",260,204); 
  while (true)
  {  
   if (myTouch.dataAvailable())
    {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();
      coordenadasXY();  
      canalAzul();
//    botonSliAzul();

        if ((y>=y61) && (y<=y62))  // intervalo y del Boton de retotno
        {   
          if ((x>=x61) && (x<=x62))  // intervalo y del Boton de retotno
          {   
            contornoRojo(x61,y61,x62,y62);
            menu =1;
            Menu1();
          }
       }
    }
  }
}

// Barra de slider horizontal
void BarraSliderHAzul()
{
  // Canal Azul
  myGLCD.setColor(0,0,B);
  myGLCD.fillRect(19,10,150,20);
  myGLCD.setColor(0,0,255);
  myGLCD.drawRect(19,10,150,20);
  myGLCD.setColor(0,0,B);
}

void botonSliAzul()
{
  if (B==0)
  {
  myGLCD.setColor(0,0,B);
  myGLCD.fillRect(x,10,x+10,20);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(x,10,x+10,20);
  }

  if (B>>0)
  {
    myGLCD.setColor(0,0,B);
    BX = (19+(121*B/255));
    myGLCD.fillRect(BX,10,BX+10,20);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(BX,10,BX+10,20);
  }  

}

void canalAzul()
{
//Slider canal azul
// Ubicar la barra del slider
//   myGLCD.fillRect(20,10,150,20);
      if ((y>=10) && (y<=20))  // Rango en y
      {
        if ((x>=19) && (x<=140))  // Rango en x
        {
          B = 255 * (x-19)/121;
          ledB();        
          BarraSliderHAzul();
          botonSliAzul();
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          Az1=B;
          myGLCD.printNumI(Az1, 15, 204);
          coordenadasXY();             

          if (x<=19)
          {
            B=0;
          }
        
          if (x>>140)
          {
            B=255;
          }
        }
      }// fin slider canal AZUL
} 


/////////////////////////     Canal AZUL



//////////////////////////    Fan 1



// Control del Ventilador 1
void Menu5()
{
    menu=5;  
// Mostrar coordenadas X y Y del puntero en la pantalla táctil, bajo el panel principal   
  
// Boton de retorno a control principal  
    boton(x61,y61,x62,y62);   myGLCD.setFont(SmallFont);  myGLCD.setBackColor(0, 0, 255);  myGLCD.print("Back",260,204); 
  while (true)
  {  
   if (myTouch.dataAvailable())
    {
      myTouch.read();
      x=myTouch.getX();
      y=myTouch.getY();
      coordenadasXY();  
      controlFan1();
//    botonSliAzul();

        if ((y>=y61) && (y<=y62))  // intervalo y del Boton de retotno
        {   
          if ((x>=x61) && (x<=x62))  // intervalo y del Boton de retotno
          {   
            contornoRojo(x61,y61,x62,y62);
            menu =1;
            Menu1();
          }
       }
    }
  }
}

// Barra de slider horizontal
void BarraSliderHFan1()
{
  // Fan 1
  myGLCD.setColor(0,0,Fan1);
  myGLCD.fillRect(19,10,150,20);
  myGLCD.setColor(0,0,255);
  myGLCD.drawRect(19,10,150,20);
  myGLCD.setColor(0,0,Fan1);
}

void botonSliFan1()
{
  if (Fan1==0)
  {
  myGLCD.setColor(0,0,Fan1);
  myGLCD.fillRect(x,10,x+10,20);
  myGLCD.setColor(255,255,255);
  myGLCD.drawRect(x,10,x+10,20);
  }

  if (Fan1>>0)
  {
    myGLCD.setColor(0,0,Fan1);
    Fan1X = (19+(121*Fan1/255));
    myGLCD.fillRect(Fan1X,10,Fan1X+10,20);
    myGLCD.setColor(255,255,255);
    myGLCD.drawRect(Fan1X,10,Fan1X+10,20);
  }  

}

void controlFan1()
{
//Slider canal azul
// Ubicar la barra del slider
//   myGLCD.fillRect(20,10,150,20);
      if ((y>=10) && (y<=20))  // Rango en y
      {
        if ((x>=19) && (x<=140))  // Rango en x
        {
          Fan1 = 255 * (x-19)/121;
          PorcFan1 = 100*(x-19)/121;
          PinFan1();
        
          BarraSliderHFan1();
          botonSliFan1();
          myGLCD.setColor(0,0,0);
          myGLCD.fillRect(14, 204, 94, 213);
          myGLCD.setColor(255,255,255);
          FanA=Fan1;
          myGLCD.printNumI(PorcFan1, 15, 204);
          coordenadasXY();             

          if (x<=19)
          {
            Fan1=0;
          }
        
          if (x>>140)
          {
            Fan1=255;
          }
        }
      }// fin slider Fan 1
} 


/////////////////////////     Control Fan 1







extern unsigned short Fon[0x12C00]; //320x240
extern unsigned short Foff[0x12C00]; //320x240






void setup()
{
// Iniciar TFT
    myGLCD.InitLCD();
// Limpiar TFT
    myGLCD.clrScr();
// Iniciar pantalla táctil
    myTouch.InitTouch();
// Ajustar precisión de la pantalla táctil
    myTouch.setPrecision(PREC_HI);

//    myGLCD.drawBitmap (0, 0, 320, 240, LANE3, 1); 

  Menu1();

  //coordenadasXY();

// Asignar tamaño de fuente
  //  myGLCD.setFont(SmallFont);
   // myGLCD.fillScr(0,0,0);
}

void imagenon()
{
     myGLCD.drawBitmap (0, 0, 320, 240, Fon, 1);  
}

void imagenoff()
{
     myGLCD.drawBitmap (0, 0, 320, 240, Foff, 1);  
}


void loop()
{
// Control de la entrada de pantalla
    while (true)
  {
    if (myTouch.dataAvailable())
     {
// Leer datos del puntero sobre la pantalla táctil    
        myTouch.read();
        x=myTouch.getX();
        y=myTouch.getY();

// Mostrar coordenadas X y Y del puntero en la pantalla táctil, bajo el panel principal   
        //coordenadasXY();


      if (menu ==1)
      {
        //Canal Rojo
        if ((y>=y11) && (y<=y12)) // //Intervalo en y boton control Rojo
        {    
          if ((x>=x11) && (x<=x12)) //Intervalo en x boton control Rojo
          {      
            contornoRojo(x11,y11,x12,y12);
            myGLCD.clrScr();
         // Encabezado   
            myGLCD.setBackColor(255, 0, 0);  myGLCD.setFont(SmallFont);  myGLCD.setColor(255, 255, 255);  myGLCD.print("Control de canal Rojo",2,150);                 
            menu =2;
            Menu2();
          }
        }
                  
                  
        //Canal Verde
        if ((y>=y21) && (y<=y22)) // //Intervalo en y boton control Verde
        {    
          if ((x>=x21) && (x<=x22)) //Intervalo en x boton control Verde
          {      
            contornoRojo(x21,y21,x22,y22);
            myGLCD.clrScr();
         // Encabezado   
            myGLCD.setBackColor(0, 255, 0);  myGLCD.setFont(SmallFont);  myGLCD.setColor(0, 0, 0);  myGLCD.print("Control de canal Verde",2,150);                 
            menu =3;
            Menu3();
          }
        }                  
    
        //Canal Azul
        if ((y>=y31) && (y<=y32)) // //Intervalo en y boton control aZUL
        {    
          if ((x>=x31) && (x<=x32)) //Intervalo en x boton control aZUL
          {      
            contornoRojo(x31,y31,x32,y32);
            myGLCD.clrScr();
         // Encabezado   
            myGLCD.setBackColor(0, 0, 255);  myGLCD.setFont(SmallFont);  myGLCD.setColor(255, 255, 255);  myGLCD.print("Control de canal Azul",2,150);                 
            menu =4;
            Menu4();
          }
        }                
  
  
        //Fan 1
        if ((y>=y41) && (y<=y42)) // //Intervalo en y boton control Fan 1
        {    
          if ((x>=x41) && (x<=x42)) //Intervalo en x boton control Fan 1
          {      
            contornoRojo(x41,y41,x42,y42);
            myGLCD.clrScr();
         // Encabezado   
            myGLCD.setBackColor(0, 0, 255);  myGLCD.setFont(SmallFont);  myGLCD.setColor(255, 255, 255);  myGLCD.print("Control Fan 1",2,150);                 
            menu =5;
            Menu5();
          }
        }  


     }
   }
}
}



//Dibuja botón
void boton(int x1, int y1, int x2, int y2)
{
  myGLCD.setColor(0, 0, 255);
  myGLCD.fillRoundRect (x1,y1,x2,y2);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (x1,y1,x2,y2);
}

//Contorno rojo para resaltar botón seleccionado
void contornoRojo(int x1, int y1, int x2, int y2)
{
  myGLCD.setColor(255, 0, 0);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
  myGLCD.setColor(255, 255, 255);
  myGLCD.drawRoundRect (x1, y1, x2, y2);
}

Foff.png
Fon.png


Las imágenes base están en formato BMP de 24 bits. Para usarlas dentro del código hay que convertirlas a: Fon.c y Foff.c, con ayuda de la utilería que viene incluida en la librería UTFT: ImageConverter565

conversioacuten.png

Sugiero convertir con el mismo nombre que el archivo de origen, ya que si se cambia el nombre la imagen se distorsiona al mandarla a la pantalla.

El archivo resultante se debe colocar en la carpeta del proyecto, junto con el código fuente.

El arduino Mega se queda corto con su memoria de programación y no puede procesar archivos de imagen en formato .c. El Due puede con máximo tres de estos archivos. Aún no hay soporte para el manejo de imágenes mediante la tarjeta SD, a menos que me aplique con una librería, pero ese proyecto rebasa mis dominios de programación, así que por el momento tengo suficiente con los recursos por conversión de imágenes.
 
Última edición:
  • Me gusta
Reacciones: fdo_dr y The Max
Ya hay progresos, conseguí armar el circuito para recuperar los sensores NTC que voy a reciclar de un viejo controlador, por el momento el primer sensor ya funciona en base a un circuito divisor de voltaje, aunque falta encontrar el mejor valor de la resistencia de referencia, para obtener saltos más discretos entre lecturas. Lo tengo monitoreando la parte media del radiador, cerca del tercer ventilador y parece que sus lecturas son bastante cercanas al sensor del depósito de agua del circuito y al termómetro de mercurio que uso como patrón de calibración..

AV2.jpg


Anexé una pantalla TFT SPI de 2.2", con resolución de 320x240 pxs, la usaré como monitor secundario del controlador, para que muestre algunas fotos o capturas de pantalla de los fierros y para animar el controlador en las largas horas frente a la PC, además conseguí hacer funcionar el shield del analizador de audio a 3.3V, así que el analizador de espectro de audio estéreo ya funciona en el menú principal del controlador.

AV1.jpg


Aun sigo pensando en la forma física que tendrá el controlador, igual y lo instalo en dos bahías 5 1/4 del gabinete, para no tenerlo como un dispositivo externo.

Me resta encontrar la forma de anular el ruido que genera el pulso de regulación PWM, que es el responsable del ruido en los ventiladores a baja velocidad.
 
Última edición:
  • Me gusta
Reacciones: fdo_dr y Jamsblast
Respecto al ruido en los motores por PWM, de lo que he visto la forma "económica" de solucionar el ruido es aumentando la frecuencia del PWM a mínimo 20 kHz (una frecuencia que ya no es perceptible al oído humano). Lamentablemente no conozco algun metodo para hacerlo en un arduino ya que la libreria de pwm depende de un timer(http://arduino.cc/en/Tutorial/SecretsOfArduinoPWM), del cual dependen tambien otras librerías como el de delay y probablemente el LCD; por lo tanto cambiar el registro del timer del pwm podria dejar de funcionar la parte de la lcd.

Otra de las cosas que puedes probar es poniendo un condensador a entre tierra y el pulso de salida del ULN. Esta NO es la solucion ideal ya que tendrías que probar varios condensadores y algunos de ellos se pueden calentar.

La ultima solucion que te podria dar requeriría mas hardware y mucho mas tiempo libre para probarla y otener resultados adecuados. Sería utilizar un TIP31 o TIP41 algo parecido a lo que se muestra en esta pagina: http://nima18940.tripod.com/id79.htm, y dado que el arduino due solamente da 3.3v te tocaria amplificar esa señal antes de pasarla por un condensador al TIP. Se vería algo como así:

OJixp0Y.png

La ventaja de esta configuracion es que es la que mas seguramente eliminaría el ruido, ya que no le esta llegando un pulso a los motores, sino que estarías variando la corriente (100% analoga) que le llega a la carga para controlar su velocidad. Tiene la desventaja que si el pwm es menor a 0.7 v (http://bit.ly/1kZDMe3) inmediatamente se apagaría el motor.

Me encantaría ver el producto terminado. Mucha suerte!
 
  • Me gusta
Reacciones: fdo_dr
Gracias por el dato respecto al ruido generado en el ventilador. Tampoco me agrada la idea de meterme con el ajuste de frecuencia en el Due, el CPU cortex que tiene es bastante mas complejo de un microcontrolador ordinario y parece que con cualquier mal voltaje que se escape podría quemarlo XD.

Me gusta la idea que propones en el circuito, gracias por tomarte un tiempo a averiguar alguna alternativa

Ya había probado con algunos condensadores, pero con muy baja capacitancia, se calientan mucho y con capacitancia mayor a 100 microfaradios, baja algo el ruido pero aumentan las RPM, al intentar reducir el PWM en el controlador, el ruido sigue allí.

Aumentar la señal de 3.3V a 5V, vaya tela jejeje, voy a averiguar como hacerlo sin poner en peligro al Due
 
Los deberes me mantienen lejos de los fierros. Pero en los ratos libres sigo con el proyecto. Me he visto en la disyuntiva de dejar el prototipo por las limitaciones de memoria de programación. Pero afortunadamente, la RED llegó en mi ayuda.

Parte 6: Modificación en la marcha

Como comenté previamente, el manejo de imágenes me trae en jaque con el tema del espacio de programación y casi me termino los 512 Kb del arduino Due, con apenas 2 imágenes de 320x240!!!!. Eso en el ambiente de los microcontroladores es una barbaridad La salida viable que pude encontrar navegando en la red, fue la de conseguir una segunda pantalla para que por allí se muestren las imágenes cargándolas desde una microSD. A pesar de que cumple perfectamente la función gráfica, no me permite aún manejar las imágenes en la pantalla principal como quiero.

Investigando mas opciones, me topé con esta pantalla: SmartGPU2 de 3.5" con pantalla táctil. Reuniendo algunos ahorros, me decanté por conseguir un ejemplar de ese tipo de TFT, que prácticamente tiene todo lo necesario para manejar por el lector de microSD que tiene instalado: imágenes BMP, imágenes JPG, vídeos, reproducir archivos de sonido, y además incluye un RTC al que se le puede conectar una batería para conservar la fecha cuando se apaga el sistema.

Al principio pensé que tenía soporte completo para el arduino Due, pero para mi sorpresa, la librería no era del todo compatible. Contacté a soporte y afortunadamente me escucharon, actualizaron la librería y ya es 100% compatible para el arduino Due. Debo decir que me han ayudado con todas las inquietudes y dudas. Estoy por demás contento por haber podido conseguir esta pantalla LCD. He batallado por aprender otra vez sobre la marcha en los ratos libres, lo necesario para saber como funcionan los elementos de la pantalla. He revisado a detalle todos y cada uno de los ejemplos que incluye el sofware, aunque no los domino por completo ya he podido habilitar las funciones gráficas que quería.

SGPU2.jpg


SGPU1.jpg


Otra cosa que debo resaltar es que de tener 40 hilos para manejar el TFT principal, 5 más para la pantalla táctil y 12 más para manejar la pantalla secundaria para imágenes, con el nuevo LCD, se ha reducido a solo 6 hilos: simplemente asombrioso!.

Antes (y le faltan 12 hilos más del TFT secundario):
SGPU8.jpg


Ahora:
SGPU3.jpg


El manejo de imágenes se me ha simplificado bastante y el espacio de programación se ha reducido de 475 Kb a tan solo 19 Kb. Estimo unos 25 Kb máximo para el programa completo ya que me falta incluir el manejo de ventiladores y el control de la iluminación general RGB.

Incluso tengo la posibilidad de manejar alguno que otro minivideo y también la reproducción de archivos de audio, XD.

SGPU10.jpg


Tras un par de semanas de prueba y error, pude implementar un menú desplegable, en el que cada uno de los elementos puede convertirse en un sub-menú. Por el momento tengo habilitados el RTC, Photo y R. Me falta incorporar el analizador de espectro de audio, creo que lo dejaré hasta el final.

G y B desaparecerán ya que en R pude implementar los tres canales RGB. En su lugar podré incluir un minireproductor de audio y un minireproductor de video.

Led 1, Fan 1 y 2, los tengo pendientes hasta la llegada del hardware de control y sensores de temperatura que vienen por barco desde China XD.

SGPU6.jpg


El control sobre imágenes es bastante simple, por lo que se pueden manejar tantas como lo permitan los 32 Gb max que soporta el lector de micro SD, XD. La calidad de las imágenes es muy superior a lo que he visto en el hardware previo.

SGPU7.jpg


SGPU9.jpg


Me ha permitido incluso implementar alguna que otra rutina de rotación en XY y XZ, pero eso simplemente fue una curiosidad en lo que aprendía a implementar el manejo de funciones matemáticas, así como las funciones gráficas y de texto de la pantalla
SGPU5.jpg


El potencial del SmartGPU2 me tiene asombrado.

Aun tengo limitantes en el hardware que está por llegar, ya que las librerías disponibles para el arduino Due son escasas: se trata de un shield especializado para manejar motores DC, algunos micro-NTC de montaje superficial y de un reloj RTC compensado, muchísimo más preciso que el RTC que tiene la pantalla. Esperemos que no aparezcan mas complicaciones.
 
Última edición:
  • Me gusta
Reacciones: p3loso
Bueno por fin tras unos días de bastante trabajo, por fin tengo un respiro. Aun sigo tratando de encontrar un mecanismo adecuado para controlar por PWM los ventiladores que no genere ruido por baja frecuencia. Tengo en la mira un par de shields para motores DC que parecen prometedores.

Le he dedicado algunos ratos libres afinar algunas partes del programa principal y a optimizar el código. Incluí una pantalla secundaria con la idea de que por ella se muestren datos como temperaturas o los datos de un RTC. Les dejo algunos videos con lo que llevo hasta ahora. Me faltan aun detalles como el almacenamiento de datos en una microSD, la carcasa modular que se podrá instalar en el frontal de la PC, en la pecera de mi señora y en el panel central que permitirá el control de iluminación y energía de la casa.






PD: dejaré de nuevo el proyecto algunos días, para terminar el trabajo. Trataré de avanzar en los ratos libres. Me concentro mejor con los sonidos naturales que vienen de los árboles del entorno.
 
Última edición:
  • Me gusta
Reacciones: fdo_dr
brother, no entendí ni la mitad! Tampoco me interesa realizar ese proyecto por mi mismo, pero dejeme felicitarlo por subir todo ese proceso y TAN BIEN detallado!! Es el primer proyecto de esa magnitud que veo aquí en Laneros!