Arduino - TVOUT y VGAx PDF
Arduino - TVOUT y VGAx PDF
Arduino - TVOUT y VGAx PDF
TVOut
Hola a todos, en este tutorial vamos a estar viendo como darle vida a monitores VGA y TVs
analógicos que, dada la acelerada implementación de nuevos estándares en materia de calidad de
señal, han comenzado a abundar como e-waste (aunque en realidad funcionen). La idea va a ser la
de darles una nueva vida para nuestros proyectos. Es una buena forma de combatir la obsolescencia
programada y de conseguir una forma barata (y a veces, mucho mas atractiva) de mostrar
información útil sobre nuestros proyectos. En ese sentido, estaremos usando las
librerías TVOut y VGAx para Arduino (UNO en el caso de VGAx, aunque recientemente salió
un port para el ESP8266 con mucha más resolución, pero con problemas de flickereo y la
imposibilidad de usar el Serial y el Wifi del micro). En los ejemplos finales, yo utilizo ambas
librerías con dos Arduino Nano, pero funcionan bien en la UNO, y en el caso de TVOut, en la
Mega2560. Quedará en ustedes probar como anda en el ESP8266 (con mas resolución). Quieren
ver ejemplos andando? Esto hice hace un tiempo en VGAx
VGAx y TVOut corriendo en Arduino Nano
Este tutorial se va a dividir en dos partes. En esta primera parte vamos a estar viendo el
funcionamiento básico de TVOut. En el segundo estaremos viendo VGAx, y en ambos casos
veremos ejemplos de las principales funcionalidades de ambas librerías. La idea de los tutoriales no
es entrar de forma extensiva en la generacion de video compuesto (TVOut) o señal VGA, para eso
pueden consultar tanto los repositorios de ambas librerias o ver proyectos que anteceden a esto
como el de Nick Gammon. Tampoco vamos a estar inventando la rueda (video compuesto se
genera con microcontroladores hace tiempo). La idea es reutilizar, a bajo costo, y darle una
alternativa visual a los proyectos que realicen. Mirá el resultado final .
TVOut
TVOut es una libreria que ya tiene bastante tiempo entre nosotros, pero que no deja de ser
interesante. En el ejemplo final que vamos a ver acá, la idea va a ser msotrar los usos que puede
tener para visualizar datos en pantalla, como los de un sensor de Humedad y Temepratura DHT11.
Pero en este punto tengo que aclarar que en las nuevas versiones del IDE de Arduino (y del core del
mismo), no pude compilar las librerias SimpleDHT y TVOut si utilizaba al mismo tiempo el
Hardware Serial para debugguear. Pero no importa. Sigamos.
1. Bajar la librería.Lo primero que hay que hacer es bajar la librería, ya sea desde su
repositorio e instalarla manualmente o desde el gestor de librerias. Tambien les recomiendo
instalar SimpleDHT desde el mismo gestor, si van a hacer elejemplo con el sensor DHT11.
2. Un paso importante: la libreria nos permite trabajar con fuentes tipograficas pre armadas -muy
util para mostrar datos-, pero para poder usarlas tenemos que entrar a la carpeta
de Arduino\libraries\TVOut\TVoutfonts y mover su contenido a Arduino\libraries\TVOut
3. Diagrama de conexion.Este es el diagrama de conexión que utilizaremos en el tutorial.Las
resistencias se sueldan al pin central de un cable RCA, y son de 470ohms y 1000ohms (1K). El
buzzer es opcional,dado que tanto TVOut como VGAx permiten generar tonos. El pin 9
corresponde al Sync, y el 7 al Video. Pueden prescindir tanto del DHT11 como del buzzer para las
pruebas.
4. La estructura básica. Normalmente, todo programa que utiliza TVOut debe tener la sigueinte
estructura:
#include <TVout.h> //Incluimos la librería.
#include <fontALL.h> // Si vamos a utilzar fuentes tipograficas
TVout TV; //Creamos nuestra instancia de la libreria TVOut.
void setup(){
// Inicializamos la salida devideo compuesta:
void loop(){
//Para una mejor visualización, reflejamos respecto a la resolución total de pantalla vertical.
y= TV.vres()-map_pix;
if (linea_punteada)
{
x_temp=x_temp+1;
TV.set_pixel(x_temp,y,1);
x_temp=x_temp+1;
TV.set_pixel(x_temp,y,0);
}
else
{
x_hum=x_hum+1;
TV.set_pixel(x_hum,y,1);
x_hum=x_hum+1;
TV.set_pixel(x_hum,y,1);
}
if(x_temp>110 || x_hum>110)
{
x_temp= 3;
x_hum=3;
TV.clear_screen();
}
}
Finalmente algunos comentarios sobre la función que grafica (la parte mas relevante del código).
La misma toma como parámetros la variable a medir y si la misma se graficará con linea punteada
o no. Por un lado, las funciones draw_line grafican los ejes cartesianos donde dibujaremos. Luego
mapeamos los valores leidos por el sensor a la región en pantalla donde los mostraremos.
Con TV.vres() obtenemos la resolución vertical en pixeles, a la cual le restamos el valor mapeado.
Esto nos dará la posición en pantalla en la región «desde abajo» (es decir, en relación a los ejes
cartesianos que graficamos). Luego tenemos dos casos: si llamamos a la función
con linea_punteada=true, se graficaran dos pixeles por valor, uno blanco y otro negro. De lo
ccontrario, ambos serán blancos. Finalmente, cuando las variables que cuentan la cantidad de pixels
en X superen el valor 110 (120 es el maximo de ancho de pantalla), la pantalla se limpia y las
variables que cuentan los pixels en X vuelven a la altura X de los ejes graficados, X=3 en este caso.
Ahora sí, el código completo, algunas fotos y en la próxima parte, VGAx.
/ / DEM O P ARA EL TUTOR I AL DE TVOUT - CI RUJ A DI GI TA L 2 01 8
/ / RESI STENCI A DE 4 70 R: AL P I N 7
/ / RESI STENCI A DE 1 K : AL PI N 9
I NT P I NDHT11 = A0 ; / / PI N
B YTE HUMI DI TY = 0 ;
B YTE M AP _P I X;
B YTE X_ HUM =3 ;
B YTE Y;
VOI D SETUP ()
I NTRO();
VOI D LOOP ()
leer_sensor();
escribir_datos();
TV.DELAY(1 5 0 0 );
//Dibujamos
TV.draw_line(2,93,2,14,WHITE); //eje Y
TV.draw_line(2,93,110,93,WHITE); //ejeX
if (linea_punteada)
{
x_temp=x_temp+1;
//y= TV.vres()-map_pix;
}
else
{
x_hum=x_hum+1;
TV.set_pixel(x_hum,y,1);
x_hum=x_hum+1;
TV.set_pixel(x_hum,y,1);
}
I F (X_ TEM P>11 0 || X_H UM >1 10 )
X_ TEMP = 3 ;
X_ HUM =3 ;
TV.CLEAR_ SC REEN();
TV.SET_ CURSOR(0 ,0 );
TV.SET_ CURSOR(4 ,1 0 );
TV.P RI NT(« T: « );
TV.P RI NT(» OC H: « );
TV.P RI NTLN(» O/ O « );
RETURN ;
VOI D I NTRO(){
TV.DELAY(1 0 0 0 );
TV.DELAY(2 0 0 0 );
TV.DELAY(2 0 0 0 );
TV.CLEAR_ SC REEN();
TV.DELAY(2 0 0 0 );
VGAx
En la entrega anterior, pudimos visualizar en un TV de TRC, mediante una señal de video
compuesto generada por Arduino, el gráfico de un sensor DHT11. Ahora vamos a explorar
las potencialidades de VGAx. La librería, en su versión para Arduino UNO al menos, soporta
una resolución de 120×60 y ofrece la posibilidad de brindar imágenes a color en Video
graphics array (osea, vga) en monitores que soporten este formato de imagen. La versión para
ESP8266 soporta más resolución, pero aún así limita otras funciones como la conectividad
Wifi. A fines de no complejizar de más este tutorial, es una visita obligada la documentación
que figura en el repositorio del proyecto VGAx, dado que allí está explicada la forma en la que
trabaja la librería, el esquema de conexiones, qué podemos hacer y que no, cómo generar el
color (no se pueden generar todos los colores, hay que elegir en grupos de a 4 según las
resistencias que pongamos). Desde el vamos, vamos a neceistar un conector hembra
DSUB15 para VGA, 2 resistencias de 470ohms y 2 de 68ohms.
En esta parte, si bien Sandro Maffiodo lo explica bastante bien en la documentación, no está
de más volverlo a escribir. La libreria se incluye y se inicializa de la siguiente manera:
#include <VGAX.h>
void setup() {
vga.begin(); //Inicializamos la generacion de imagen VGA
A partir de acá, podemos empezar a hablar de las funciones principales que tiene la librería:
Así:
VGA.P RI NTP ROGM EM ((B Y TE* )F NT_ NANOF ONT_ DAT A, F NT_ NANOF ONT_ SYMB OLS_COUNT, F NT_ NANOF ONT_ HEI GHT, 2 , 3 ,
CADEN A_ TEXTO, 1 0 , 1 0 , 0 );
El primer parámetro nos pide el nombre del array donde esta guardada la fuente, el segundo
las definiciones donde guardamos la cantidad de símbolos del array y la altura en pixeles de
los mismos, luego el espacio horizontal y vertical entre ambos, el char array a mostrar, la
posición X e Y, y finalmente el color. En este caso la fuente está guardada en el arrayde
bytes fnt_nanofont_data, la cantidad de símbolos en la
definición FNT_NANOFONT_SYMBOLS_COUNT, la altura en FNT_NANOFONT_HEIGHT, el
espaciado horizontal es 2 pixeles, el vertical 3, la cadena de texto sale de la constante de
caracteres cadena_texto, y la posición X e Y es 10 en ambos casos. El color en este caso es
negro (ocupa la posición 0 en todos los casos).
¿Y si queremos mostrar una variable? Primero tenemos que convertirla a un char array. En
este caso, usamos sprintf para convertir una variable byte a un char array:
Algo muy importante: Si actualizan texto en un mismo lugar, tengan en cuenta que si no
borran el fondo, el texto comienza a pisarse hasta no entenderse nada. Una opción sería
utilizar vga.clear(0), pero nos borraría toda la pantalla. ¿Que se puede hacer? En el ejemplo
final, usamos vga.putpixel4 dentro un bucle for y llenamos todo el espacio ocupado por el texto,
pero con el color de fondo, justo antes de reescribirlo. Esto nos «limpia» el espacio de escritura
en cada ciclo, sin borrar toda la pantalla.
Desplegando bitmaps
Como se ve en la primera imagen de esta entrada, podemos desplegar bitmaps según la
escala de colores elegida. Primero tenemos que ir a Arduino\libraries\vgax\tools y abrir
2bitimage en un browser. Luego tendremos que elegir la imagen a transformar en un array
de bits. La imagen debe contener o parecerse lo mayor posibles a la combinación de colores
elegida.
Como output nos dará el array de bytes de la imagen, junto con definiciones sobre el alto,
ancho y el ancho en bytes (BWIDTH).
vga.copy((byte*)varname);
¿Y como centramos la imagen? Si ponen una imagen menor al tamaño de la resolución, les
saldra en la esquina superior izquierda. Si quieren centrarla, tienen que crear una imagen del
ancho de la pantalla (y del alto), y centrar en el medio o donde sea la imagen que desean
(todo esto con otro software). Y luego generar el array. Con esa imagen que ocupe toda la
pantalla.
¿Sprites? Se los dejo a ustedes, no es muy difícil, sólo que deberan indagar sobre masked blit y
otras cosas.
Nuestro ejemplo completo
Para nuestro ejemplo vamos a necesitar un LDR conectado de A2 a +5V, y una resistencia de
10K (o de otro valor) conectada de A2 a GND. Acá pueden ver la conexión tanto de TVOut
como de VGAx en Arduino Nano. Miralos andando.
Chaos, pero funciona
El código del ejemplo:
# I NCLUDE <VGAX.H>
CONST UNSI GNED CHAR F N T_ NANOF ONT_ DATA[F N T_ NANOF ONT_ SYMB OLS_ C OUNT][1 +F NT_ NANOF ONT _ HEI GHT]
P ROGM EM ={
{ 5 , 80 , 2 48 , 80 , 2 4 8 , 80 , 0 , }, / /GLYP H ‘# ’ CODE=2
{ 5 , 12 0, 16 0 , 1 12 , 4 0 , 2 40 , 0 , }, / / GLY P H ‘$ ’ CODE=3
{ 5 , 13 6, 16 , 32 , 6 4 , 1 36 , 0 , }, / /GLYP H ‘% ’ CODE=4
{ 2 , 12 8, 64 , 0, 0 , 0 , 0 , }, / / GLYP H » ’ CODE=6
{ 3 , 0, 16 0 , 6 4, 16 0 , 0 , 0 , }, / / GLYP H ‘ * ’ CODE=9
{ 3 , 0, 0 , 2 24 , 0 , 0 , 0 , }, // GLYPH ‘ -‘ CODE=1 2
{ 5 , 8, 16 , 32 , 6 4 , 1 28 , 0 , }, / / GLYP H ‘ / ’ CODE=1 4
{ 4 , 96 , 1 44 , 14 4, 1 4 4 , 9 6, 0 , }, // GLYP H ‘0 ’ CODE=1 5
{ 4 , 22 4, 16 , 96 , 1 2 8 , 24 0, 0 , }, // GLYP H ‘2 ’ CODE=1 7
{ 4 , 22 4, 16 , 96 , 1 6 , 2 24 , 0 , }, / /GLYP H ‘3 ’ CODE=18
{ 4 , 14 4, 14 4 , 2 40 , 1 6 , 1 6, 0 , }, // GLYP H ‘4 ’ CODE=1 9
{ 4 , 24 0, 12 8 , 2 24 , 1 6 , 2 24 , 0 , }, / / GLY P H ‘5 ’ CODE=20
{ 4 , 96 , 1 28 , 22 4, 1 4 4 , 9 6, 0 , }, // GLYP H ‘6 ’ CODE=2 1
{ 4 , 24 0, 16 , 32 , 6 4 , 6 4, 0 , }, // GLYP H ‘7 ’ CODE=22
{ 4 , 96 , 1 44 , 96 , 1 4 4 , 96 , 0 , }, / /GLYP H ‘8 ’ CODE=23
{ 4 , 96 , 1 44 , 11 2, 1 6 , 96 , 0 , }, / /GLYP H ‘9 ’ CODE=24
{ 4 , 22 4, 16 , 96 , 0 , 64 , 0 , }, / / GLYP H ‘? ’ CODE=30
{ 4 , 96 , 1 44 , 17 6, 1 2 8 , 1 12 , 0 , }, / / GLYP H ‘@ ’ CO DE=31
{ 4 , 22 4, 14 4 , 2 24 , 1 44 , 22 4, 0 , }, / / GL YP H ‘B ’ CODE=3 3
{ 4 , 11 2, 12 8 , 1 28 , 1 28 , 11 2, 0 , }, / / GL YP H ‘C’ CODE=3 4
{ 4 , 22 4, 14 4 , 1 44 , 1 44 , 22 4, 0 , }, / / GL YP H ‘D’ CODE=3 5
{ 4 , 24 0, 12 8 , 2 24 , 1 28 , 24 0, 0 , }, / / GLYP H ‘E’ CODE=3 6
{ 4 , 24 0, 12 8 , 2 24 , 1 28 , 12 8, 0 , }, / / GL YP H ‘F ’ CODE=37
{ 4 , 11 2, 12 8 , 1 76 , 1 44 , 11 2, 0 , }, / / GL YP H ‘G’ CODE=3 8
{ 4 , 14 4, 14 4 , 2 40 , 1 44 , 14 4, 0 , }, / / GL YP H ‘H’ CODE=3 9
{ 3 , 22 4, 64 , 64 , 6 4 , 2 24 , 0 , }, / /GLYP H ‘I ’ CODE=40
{ 4 , 24 0, 16 , 16 , 1 4 4 , 96 , 0 , }, / /GLYP H ‘J ’ CODE=41
{ 4 , 14 4, 16 0 , 1 92 , 1 60 , 14 4, 0 , }, / / GL YP H ‘K’ CODE=4 2
{ 4 , 12 8, 12 8 , 1 28 , 1 28 , 24 0, 0 , }, / / GL YP H ‘L’ CODE=4 3
{ 5 , 13 6, 21 6 , 1 68 , 1 36 , 13 6, 0 , }, / / GL YP H ‘M ’ CODE=4 4
{ 4 , 22 4, 14 4 , 2 24 , 1 28 , 12 8, 0 , }, / / GL YP H ‘P ’ CODE=47
{ 4 , 22 4, 14 4 , 2 24 , 1 60 , 14 4, 0 , }, / / GL YP H ‘R’ CODE=4 9
{ 2 , 19 2, 12 8 , 1 28 , 1 28 , 19 2, 0 , }, / / GL YP H ‘[‘ CODE=5 8
{ 5 , 12 8, 64 , 32 , 1 6 , 8 , 0 , }, / / GLYP H ‘ \ ’ CODE=5 9
{ 5 , 32 , 8 0 , 1 36 , 0 , 0, 0 , }, // GLYP H ‘^ ’ CODE=6 1
{ 4 , 0, 0 , 0 , 0 , 24 0 , 0 , }, // GLYPH ‘_ ’ CODE=6 2
{ 3 , 12 8, 22 4 , 1 60 , 1 60 , 22 4, 0 , }, / / GL YP H ‘B ’ CODE=6 5
{ 2 , 64 , 1 28 , 19 2, 12 8 , 1 28 , 0 , }, / / GLYP H ‘F ’ CODE= 69
{ 1 , 12 8, 0 , 1 28 , 1 2 8 , 12 8, 0 , }, // GLYP H ‘I ’ CODE=72
{ 2 , 0, 19 2 , 6 4, 64 , 64 , 1 28 , }, / /GLYP H ‘J ’ CODE=73
{ 3 , 12 8, 16 0 , 1 92 , 1 60 , 16 0, 0 , }, / / GL YP H ‘K’ CODE=7 4
{ 1 , 12 8, 12 8 , 1 28 , 1 28 , 12 8, 0 , }, / / GL YP H ‘L’ CODE=7 5
{ 5 , 0, 24 8 , 1 68 , 1 6 8 , 16 8, 0 , }, // GLYP H ‘M ’ CODE=7 6
{ 3 , 0, 22 4 , 1 60 , 1 6 0 , 22 4, 12 8 , }, / / GL YP H ‘P ’ CODE=79
{ 1 , 12 8, 12 8 , 1 28 , 1 28 , 12 8, 0 , }, / / GL YP H ‘|’ CODE=9 1
{ 4 , 48 , 6 4 , 2 24 , 6 4 , 2 40 , 0 , }, / /GLYP H ‘£ ’ CODE=94
};
CONST UNSI GNED CHAR I M G_ CI RUJ A_ DATA[I M G_ CI RUJ A_ HEI GHT][IM G_ C I RUJ A_BWI DTH] P ROGM E M ={
{ 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 7 0, 17 0 , 1 71 ,
2 5 5, 25 5 , 2 55 , 2 55 , 25 5, 25 5 , 2 55 , 19 2 , 0 , 0 , 0, 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0, 0 , 1 0, 17 0 , 1 70 , 1 70 , 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 1 7 0, 17 0 , 1 70 ,
1 7 0, 17 0 , 1 28 , 0 , 0, 0 , 0 , 0 , 0, }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0 , 17 0 , 1 7 0, 17 0 , 1 70 , 1 70 , 17 0, 1 7 0 , 1 70 , 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 1 2 8, 0 , 0 , 0 , 0,
0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0, 1 70 , 17 0, 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 1 7 0, 17 0 , 1 70 , 1 70 , 1 7 0, 1 70 , 12 8, 0 , 0 , 0 , 0, 0 , 0 , }, { 0, 0 , 0, 0 , 0 , 0 ,
0 , 0 , 1 0, 17 0 , 1 70 , 1 70 , 17 0, 17 0, 1 70 , 17 0, 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 17 0, 12 8 , 0 , 0 , 0, 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0 , 17 0 , 1 70 , 17 0,
1 7 0, 17 0 , 1 70 , 1 70 , 17 0, 17 8 , 1 70 , 17 0 , 1 70 , 1 70 , 17 0, 12 8 , 0 , 0 , 0 , 0 , 0 , 0 , }, { 0 , 0 , 0 , 0, 0 , 0 , 0 , 0 , 10 , 1 70 , 17 0 , 17 0 , 1 70 , 1 70 , 1 7 0, 17 0 , 1 71 ,
2 5 0, 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 28 , 0 , 0 , 0 , 0, 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 10 , 1 70 , 17 0, 17 0 , 1 70 , 17 0 , 1 70 , 1 60 , 2 5 5, 25 0 , 1 70 , 1 7 0, 1 7 0 , 1 70 ,
1 7 0, 12 8 , 0 , 0 , 0, 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0, 0 , 0 , 1 0 , 1 70 , 1 70 , 1 7 0, 17 0 , 1 70 , 1 28 , 42 , 1 91 , 2 4 2, 1 70 , 17 0, 17 0 , 1 70 , 1 70 , 12 8, 0, 0 , 0, 0 , 0 , 0 ,
}, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 10 , 17 0, 1 7 0 , 17 0, 17 0 , 1 68 , 4 2 , 1 70 , 1 70 , 24 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 1 2 8, 0 , 0 , 0 , 0, 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,
1 0 , 1 70 , 17 0, 17 0 , 1 70 , 1 62 , 17 0, 1 70 , 1 7 0, 16 0 , 4 2, 17 0 , 1 70 , 1 70 , 17 0 , 1 28 , 0 , 0, 0 , 0 , 0 , 0, }, { 0 , 0 , 0 , 0 , 0, 0 , 0 , 0 , 10 , 1 70 , 170 , 17 0 , 1 70 ,
1 0 , 1 70 , 17 0, 17 0 , 1 70 , 1 30 , 17 0, 1 70 , 1 7 0, 17 0 , 1 28 , 0 , 0, 0 , 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0, 1 70 , 17 0, 17 0 , 1 68 , 4 2 , 1 70 , 1 70 , 17 0 , 1 70 ,
1 6 8, 17 0 , 1 70 , 1 70 , 17 0, 12 8 , 0 , 0 , 0 , 0 , 0 , 0, }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0, 17 0 , 1 70 , 1 70 , 16 8, 17 0, 1 70 , 17 0, 17 0 , 1 70 , 1 70 , 42 , 1 70 , 17 0 , 1 70 ,
1 2 8, 0 , 0 , 0 , 0, 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, 10 , 17 0, 17 0 , 1 70 , 1 6 2, 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 42 , 17 0, 17 0 , 1 70 , 1 28 , 0, 0 , 0 , 0 , 0 , 0 , }, {
0 , 0 , 0 , 0 , 0, 0 , 0 , 0 , 10 , 1 70 , 170 , 42 , 13 0, 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 13 8, 17 0 , 1 70 , 1 70 , 12 8, 0 , 0, 0 , 0 , 0 , 0, }, { 0 , 0 , 0 , 0 , 0, 0 , 0, 0 , 1 0,
1 7 0, 17 0 , 5 8, 17 8 , 1 70 , 1 70 , 17 0, 1 70 , 1 7 0, 17 0 , 1 62 , 1 70 , 1 7 0, 17 0 , 1 28 , 0, 0 , 0 , 0 , 0 , 0 , }, { 0 , 0, 0 , 0 , 0 , 0 , 0 , 0, 10 , 17 0, 17 0 , 19 1 , 2 50 , 17 0,
1 7 0, 17 1 , 2 34 , 1 70 , 17 0, 16 2 , 1 70 , 17 0 , 1 70 , 1 28 , 0, 0 , 0 , 0 , 0, 0 , }, { 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 10 , 170 , 17 0 , 1 75 , 2 34 , 17 0, 17 0 , 2 55 , 2 5 0, 17 0 , 1 70 ,
1 7 0, 17 0 , 1 70 , 1 70 , 12 8, 0 , 0 , 0 , 0 , 0 , 0 , }, { 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 1 0 , 1 70 , 1 7 0 , 17 5 , 23 4 , 1 70 , 1 7 1 , 25 5 , 2 55 , 2 55 , 17 0, 16 8 , 1 70 , 1 7 0, 17 0 , 1 28 ,
0 , 0 , 0 , 0 , 0, 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0 , 1 70 , 1 70 , 17 5, 23 4 , 1 7 0, 17 5 , 2 51 , 2 55 , 25 5, 23 4 , 1 68 , 17 0 , 1 70 , 1 70 , 12 8, 0 , 0 , 0 , 0, 0 , 0 , }, { 0 , 0,
0 , 0 , 0 , 0 , 0, 0 , 1 0 , 17 0 , 1 70 , 1 71 , 17 0 , 1 70 , 1 91 , 17 0, 25 0 , 1 75 , 2 5 0, 16 8 , 1 70 , 1 70 , 17 0, 12 8 , 0 , 0 , 0 , 0 , 0 , 0, }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0, 17 0 ,
1 7 0, 17 1 , 1 70 , 1 71 , 25 4, 17 0 , 2 50 , 17 1 , 2 50 , 1 68 , 17 0, 17 0 , 1 70 , 1 2 8, 0 , 0 , 0 , 0, 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, 10 , 17 0, 17 0 , 1 68 , 1 7 0, 17 1 , 2 50 ,
1 7 0, 25 0 , 1 91 , 2 34 , 16 8, 17 0 , 1 70 , 17 0 , 1 28 , 0 , 0, 0 , 0 , 0 , 0, }, { 0 , 0 , 0 , 0 , 0, 0 , 0 , 0 , 10 , 1 70 , 170 , 16 8 , 1 70 , 1 75 , 23 4, 17 0 , 2 51 , 2 5 5, 17 0 , 1 71 ,
1 7 0, 17 0 , 1 70 , 1 28 , 0, 0 , 0 , 0 , 0, 0 , }, { 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 1 0 , 1 7 0, 17 0 , 1 68 , 1 70 , 19 1, 17 0 , 1 70 , 25 5 , 2 50 , 1 70 , 17 1, 23 4 , 1 70 , 1 7 0, 12 8 , 0 , 0 ,
0 , 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 10 , 17 0, 17 0 , 1 68 , 1 70 , 19 1, 23 8 , 1 71 , 2 5 5, 23 4 , 1 70 , 1 75 , 2 3 4, 1 70 , 17 0, 12 8 , 0 , 0 , 0, 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 10 , 1 70 , 17 0, 17 0 , 1 70 , 17 5 , 2 55 , 1 75 , 25 4, 17 0 , 1 70 , 1 7 5, 23 4 , 1 70 , 1 70 , 12 8, 0 , 0 , 0 , 0 , 0 , 0 , }, { 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 1 0 , 1 70 , 1 70 ,
1 7 0, 42 , 17 1, 25 5 , 1 75 , 2 50 , 17 0, 1 70 , 1 7 5, 25 0 , 1 70 , 1 70 , 1 2 8, 0, 0 , 0, 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0, 0 , 0, 10 , 17 0, 17 0 , 1 70 , 4 2 , 1 70 , 17 0 , 1 70 ,
1 7 0, 17 0 , 1 70 , 1 91 , 25 0, 17 0 , 1 70 , 12 8 , 0 , 0 , 0, 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0, 0 , 1 0, 17 0 , 1 70 , 1 70 , 13 8 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 1 7 0, 10 , 16 2,
1 7 0, 17 0 , 1 28 , 0 , 0, 0 , 0 , 0 , 0, }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0 , 17 0 , 1 7 0, 17 0 , 1 38 , 1 70 , 17 0, 17 0 , 1 70 , 17 0 , 1 70 , 1 0 , 1 70 , 1 70 , 17 0, 12 8 , 0 , 0, 0 , 0 ,
0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0, 1 70 , 17 0, 17 0 , 1 62 , 1 70 , 17 0, 17 0 , 1 70 , 1 7 0, 17 0 , 4 2, 17 0 , 1 7 0 , 1 7 0, 12 8 , 0 , 0 , 0 , 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0,
0 , 0 , 1 0, 17 0 , 1 70 , 1 70 , 16 8, 17 0, 1 70 , 17 0, 17 0 , 1 70 , 1 68 , 17 0, 17 0 , 1 70 , 17 0, 12 8 , 0 , 0 , 0, 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0 , 17 0 , 1 70 , 17 0,
1 7 0, 42 , 17 0, 17 0 , 1 70 , 1 70 , 16 2, 1 70 , 1 7 0, 17 0 , 1 70 , 1 28 , 0 , 0 , 0 , 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 10 , 17 0, 17 0 , 1 70 , 1 70 , 13 8, 17 0 , 1 70 , 17 0,
1 7 0, 13 8 , 1 70 , 1 70 , 17 0, 17 0 , 1 28 , 0 , 0 , 0 , 0, 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 10 , 1 70 , 17 0, 17 0 , 1 70 , 16 0 , 5 8, 17 0 , 1 7 0 , 1 68 , 42 , 1 70 , 17 0 , 1 70 ,
1 7 0, 12 8 , 0 , 0 , 0, 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0, 0 , 0 , 1 0 , 1 70 , 1 70 , 1 7 0, 17 0 , 1 70 , 6 3 , 1 70 , 1 70 , 13 0, 1 70 , 1 7 0, 17 0 , 1 70 , 1 70 , 1 2 8, 0, 0 , 0, 0 , 0 , 0 ,
}, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 10 , 17 0, 1 7 0 , 17 0, 17 0 , 1 70 , 1 9 1 , 25 2, 0, 4 2 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 1 28 , 0 , 0 , 0 , 0, 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 10 ,
1 7 0, 17 0 , 1 70 , 1 70 , 17 0, 19 1 , 2 50 , 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 1 7 0, 12 8 , 0 , 0 , 0, 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0, 0 , 0 , 1 0 , 1 70 , 1 70 , 1 7 0, 1 7 0 , 1 70 ,
1 9 0, 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 17 0 , 1 70 , 1 28 , 0, 0 , 0 , 0 , 0, 0 , }, { 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 10 , 170 , 17 0 , 1 70 , 1 70 , 17 0, 42 , 17 0, 17 0 , 1 70 , 17 0,
1 7 0, 17 0 , 1 70 , 1 70 , 12 8, 0 , 0 , 0 , 0 , 0 , 0 , }, { 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 1 0 , 1 70 , 1 70 , 17 0 , 17 0 , 1 70 , 1 70 , 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 1 7 0, 17 0 , 1 28 ,
0 , 0 , 0 , 0 , 0, 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0 , 1 70 , 1 7 0 , 17 4, 17 0 , 1 7 0, 17 0 , 1 70 , 1 70 , 23 4, 17 0 , 1 70 , 17 0 , 1 70 , 1 7 0 , 12 8, 0 , 0 , 0 , 0, 0 , 0 , }, { 0 , 0,
0 , 0 , 0 , 0 , 0, 0 , 1 0 , 17 1 , 2 38 , 2 55 , 23 5 , 1 70 , 2 34 , 23 4, 17 5 , 2 51 , 1 7 5, 23 9 , 2 54 , 1 75 , 18 6, 12 8 , 0 , 0 , 0 , 0 , 0 , 0, }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0, 17 4 ,
2 3 8, 23 9 , 2 39 , 1 71 , 23 5, 2 3 4 , 1 71 , 18 7 , 1 91 , 1 74 , 25 0, 19 0 , 2 50 , 1 2 8, 0 , 0 , 0 , 0, 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, 10 , 18 6, 19 0 , 2 39 , 1 7 4, 18 7 , 1 75 ,
2 3 4, 17 5 , 1 91 , 2 50 , 19 0, 23 4 , 2 54 , 23 4 , 1 28 , 0 , 0, 0 , 0 , 0 , 0, }, { 0 , 0 , 0 , 0 , 0, 0 , 0 , 0 , 10 , 2 50 , 187 , 25 1 , 1 74 , 2 51 , 25 5, 23 4 , 1 74 , 2 5 4, 23 9 , 1 86 ,
2 3 5, 25 4 , 2 34 , 1 28 , 0, 0 , 0 , 0 , 0, 0 , }, { 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 1 0, 2 5 0, 18 7 , 1 87 , 1 90 , 23 9, 25 1 , 1 70 , 19 1 , 2 39 , 2 39 , 18 7, 17 1 , 1 91 , 2 5 4, 12 8 , 0 , 0 ,
0 , 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 10 , 25 4, 19 1 , 1 87 , 2 50 , 25 4, 17 1 , 1 70 , 19 1, 17 5 , 2 54 , 2 35 , 17 0, 1 91 , 25 4, 12 8 , 0 , 0 , 0, 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 10 , 1 70 , 17 0, 17 0 , 1 70 , 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 1 7 0, 17 0 , 1 70 , 1 70 , 12 8, 0 , 0 , 0 , 0 , 0 , 0 , }, { 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 1 0 , 1 70 , 1 70 ,
1 7 0, 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 17 0 , 1 70 , 1 70 , 17 0 , 17 0 , 1 28 , 0 , 0 , 0 , 0 , 0, 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 7 0, 17 0 , 1 70 ,
1 7 0, 17 0 , 1 70 , 1 70 , 17 0, 17 0 , 1 70 , 12 8 , 0 , 0 , 0, 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0, 0 , 1 0, 17 0 , 1 70 , 1 70 , 17 0 , 1 70 , 1 7 0 , 17 0, 17 0 , 1 70 , 1 7 0, 17 0 , 1 70 ,
1 7 0, 17 0 , 1 28 , 0 , 0, 0 , 0 , 0 , 0, }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 0 , 0 , 0 , 0, 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0,
0 , 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 0, 0 , 0 , 0 , 0, 0 , }, { 0 , 0 , 0 , 0, 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , }, { 0 , 0 ,
0 , 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 0 , 0 , }, { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 0 , 0 , 0, 0 , 0, 0 , 0 , 0 ,
0 , 0 , 0 , 0 , }, };
I NT LDR;
I NT M AP_ PI X;
I NT X_ TEMP =36 ;
I NT Y;
VOI D SETUP () {
VGA.COP Y((B YTE* )IM G_ CI RUJ A_ DATA); / / M OST RAM OS UNA I M AGEN GUAR DA DA E N UN A RRA Y DE B YTES
VGA.P RI NTP ROGM EM ((B Y TE* )F NT_ NANOF ONT_ DAT A, F NT_ NANOF ONT_ SYMB OLS_COUNT, F NT_ NANOF ONT_ HEI GHT, 1 , 1 ,
STR0 , 2 , 5 5 , 1 ); // T EXTO I NI CI AL
VGA.DELAY(6000);
VGA.CLEAR(0);
}
VOI D LOOP () {
LDR = ANALOGREAD(A2);
ESCRIBIR_DATOS();
GRAFICO_SENSOR(LDR);
VGA.DELAY(100);
}
VOI D GRAF I CO_ SENSOR( I NT SENSOR){
/ / DIB UJ AM OS LOS EJ ES
M AP _P I X= M AP (SENSOR, 0 ,10 2 3, 2 ,6 0 );
Y= VGAX_WIDTH-MAP_PIX;
IF(X_TEMP>154) {
X_TEMP= 36;
VGA.CLEA R(0 );
F OR (I NT I =1 2 ; I < =16 ;I ++) / /CON ESTO LI MP I AMOS CONSTANTEM ENTE LOS P I XELS DOND E SE ACT UALI ZA LA V A RI AB LE.
SP RI NTF (CHAR_ TEMP ,»% 03U» ,LDR); / / C ONVI ERTO EL BYTE AL CHAR ARR AY CO N EL QU E ANDA P RI NTSR AM .
VGA.PRINTSRAM((BYTE*)FNT_NANOFONT_DATA,
FNT_NANOFONT_SYMBOLS_COUNT, FNT_NANOFONT_HEIGHT, 1, 1, CHAR_TEMP,
50, 10, 2); //VALOR