Está en la página 1de 16

1.

Introduccin

Desarrollar un programa con animacin en un LCD grfico, mostrando el


comportamiento de un sistema de nivel de lquido.
Donde se tiene un Set Point y un Nivel Actual, mostrando los resultados en
el LCD grfico.
2. Objetivo
Desarrollar un programa con animacin en un LCD grfico, mostrando el
comportamiento de un sistema de nivel de lquido.
3. Desarrollo
Se dice que se tomara solamente los 45 grados para poder tomar el tope
del nivel de lquidos.
Es de ac donde se saca la primera frmula del nivel actual que es:

45= 37.8 (bits) adecuada al tanque

Es de ac donde se obtiene la frmula para el nivel de agua actual que


es:

Na=

Lcd100
37.8

Y para el valor del Set Point es:

Sp=
3.1.

Lcd100
255

Animaciones

Para poder realizar la animacin del tanque llenndose con sensor de


nivel del potencimetro se utiliza la frmula de una parbola, ya que
el movimiento de este es similar a la funcin de una parbola.
Recordando cual es la funcin se muestra:

Y = A x 2 +Bx +C
Donde como resultado obtuvimos:
2

Y =0.25 x 19.75 x+ 390


Y tenemos el tao de x con la siguiente formula:

x=27+

a 2 dConvert 8 bit ( 1 )12


127.5

Donde se utiliza los dos ejes de coordenadas para el dibujado de la


recta y la circunferencia.
Con las siguientes coordenadas
DrawCircle(x,y,2,1);
DrawLine(39,15,x,y,1);
4. Programa
/* includes */
#include <avr/io.h>
// access to controller I/O
#include <inttypes.h> // integer types
#include <avr/pgmspace.h>// access to program memory
#include "global.h"
#include "uart.h" // include uart function library
#include "rprintf.h"
// include printf function library
#include "a2d.h"// include A/D converter function library
#include "timer.h"// include timer function library (timing, PWM, etc)
#include "t6963c.h"// definitions and prototypes
#include "menu_nivel.h" // menu
#include "tanque.h"
#include "pot.h"
#include "math.h"
#include <util/delay.h>
#include <avr/interrupt.h>
/* Global Variables */
void muestra(int xp,int yp,int xq,int yq);
void oscope(void);
void oscope_1(void);
void tanq(void);
void rprintfFloatG(char numDigits, double x);
void lcd_bitmap(char imag) ;
void lcd_printIcono8x8(int xp,int yp,int fil,int col,char tipo);
void lcd_printIcono24x24(int xp,int yp,int fil,int col,char tipo);
void lcd_clearIcono8x8(int xp,int yp);
void lcd_clearIcono24x24(int xp,int yp);
volatile float sx=0.1,sy=0.1;
volatile int fila=0,col=0, pal=1,op,fer=1;
u08 imag=0,x=0,z=0,ser=0;
int main(void)
{
u08 j=5,k=8,l=0,m=0;
u08 carl=0;
a2dInit();
DDRB=0x03;
outb(DDRA,0xFC);
DDRD=0x03;

DDRC = 0xE0; // configurando el PORTC como entrada


//PORTC = 0x1F; // activando los PULLUPS
outb(DDRD, 0xFF);
PORTD=0x0C;
lcd_initialise();
lcd_clear_graphics();
lcd_clear_text();
MCUCR=0x0a;
cbi(MCUCSR,6);
sbi(GICR,5);
sbi(GICR,6);
sbi(GICR,7);
sei();
lcd_write_command(LCD_DISPLAY_MODES_GRAPHICS_ON |
LCD_DISPLAY_MODES_TEXT_ON);
rprintfInit(lcd_write_char);
lcd_bitmap(imag);
lcd_delay100ms();
lcd_clear_graphics();
lcd_gotoxy(0,0);rprintf("
Menu ");
lcd_printIcono24x24(5,8,0,0,0);
lcd_printIcono24x24(35,8,0,3,1);
lcd_printIcono24x24(65,8,0,6,1);
lcd_printIcono24x24(5,38,3,6,1);
lcd_printIcono24x24(35,38,3,3,1);
lcd_printIcono24x24(65,38,3,0,1);
while (1)
{
while(fer==0)
{
if (carl==0)
{
lcd_clear_graphics();
lcd_clear_text();
carl=1;
}
if(fila==0)
{
switch(col)
{
case 0:{
imag=2;
lcd_bitmap(imag);
tanq();

muestra(7,2,9,6);
break;}
case 1:{
muestra(6,2,8,6);
break;}
case 2:{
oscope();
muestra(7,2,9,6);
break;}
}
}
else
{
switch (col)
{
case 2:{
imag=1;
lcd_bitmap(imag);
oscope_1();
muestra(7,2,9,6);
break;}
}
}
}
if(carl==1)
{
lcd_clear_text();
lcd_clear_graphics();
lcd_gotoxy(0,0);rprintf("Menu");
lcd_printIcono24x24(5,8,0,0,0);
lcd_printIcono24x24(35,8,0,3,1);
lcd_printIcono24x24(65,8,0,6,1);
lcd_printIcono24x24(5,38,3,6,1);
lcd_printIcono24x24(35,38,3,3,1);
lcd_printIcono24x24(65,38,3,0,1);
fila=0;
col=0;

pal=1;
j=5;
k=8;
l=0;
m=0;
carl=0;
}
if(fila==0)
{
switch (col)
{
case 0:{ if(pal==0)
{lcd_clearIcono24x24(j,k);
lcd_printIcono24x24(j,k,l,m,1);
j=5;
k=8;
l=0;
m=0;
lcd_clearIcono24x24(j,k);
lcd_printIcono24x24(j,k,l,m,0);
pal++;
}
else
{
lcd_printIcono24x24(j,k,l,m,0);
}
break;}
case 1:{ if(pal==0)
{lcd_clearIcono24x24(j,k);
lcd_printIcono24x24(j,k,l,m,1);
j=35;
k=8;
l=0;
m=3;
lcd_clearIcono24x24(j,k);
lcd_printIcono24x24(j,k,l,m,0);
pal++;
}
else
{
lcd_printIcono24x24(j,k,l,m,0);
}

break;}
case 2:{ if(pal==0)
{lcd_clearIcono24x24(j,k);
lcd_printIcono24x24(j,k,l,m,1);
j=65;
k=8;
l=0;
m=6;
lcd_clearIcono24x24(j,k);
lcd_printIcono24x24(j,k,l,m,0);
pal++;
}
else
{
lcd_printIcono24x24(j,k,l,m,0);
}
break;}
}
}
else
{
switch (col)
{
case 0:{ if(pal==0)
{lcd_clearIcono24x24(j,k);
lcd_printIcono24x24(j,k,l,m,1);
j=5;
k=38;
l=3;
m=6;
lcd_clearIcono24x24(j,k);
lcd_printIcono24x24(j,k,l,m,0);
pal++;
}
else
{
lcd_printIcono24x24(j,k,l,m,0);
}
break;}
case 1:{ if(pal==0)
{lcd_clearIcono24x24(j,k);
lcd_printIcono24x24(j,k,l,m,1);

j=35;
k=38;
l=3;
m=3;
lcd_clearIcono24x24(j,k);
lcd_printIcono24x24(j,k,l,m,0);
pal++;
}
else
{
lcd_printIcono24x24(35,38,3,3,0);
}
break;}
case 2:{ if(pal==0)
{lcd_clearIcono24x24(j,k);
lcd_printIcono24x24(j,k,l,m,1);
j=65;
k=38;
l=3;
m=0;
lcd_clearIcono24x24(j,k);
lcd_printIcono24x24(j,k,l,m,0);
pal++;
}
else
{
lcd_printIcono24x24(65,38,3,0,0);
}
break;}
}
}
}
}
void lcd_bitmap(char tipo)
{
uint8_t x,xi,xf,y,yi,yf,c,ccc;
uint8_t bitmap;
uint8_t i;
uint16_t cbitmap=0;
yi=0;

yf=7;
for(ccc=0; ccc < 8; ccc++)
{
for(i=0; i < 16; i++)
{
xi= i*8;
xf= (i+1)*8-1;
for(y=yi;y<=yf;y++)
{
c=0x80;
switch(imag)
{
}
case 1:
{
bitmap =
pgm_read_byte(&(pot[cbitmap++]));
break;
}
case 2:
{
bitmap =
pgm_read_byte(&(tanque[cbitmap++]));
break;
}
}
for(x=xi;x<=xf;x++)
{
if((bitmap&c)==c)
lcd_set_pixel(x,y);
c=c>>1;
}
}
}
yi=yi+8;
yf=yf+8;
}
}
void lcd_printIcono24x24(int xp,int yp,int fil,int col,char tipo)
{
lcd_printIcono8x8(xp,yp,fil,col,tipo);
lcd_printIcono8x8(xp,yp+8,fil+1,col,tipo);
lcd_printIcono8x8(xp,yp+16,fil+2,col,tipo);

lcd_printIcono8x8(xp+8,yp,fil,col+1,tipo);
lcd_printIcono8x8(xp+8,yp+8,fil+1,col+1,tipo);
lcd_printIcono8x8(xp+8,yp+16,fil+2,col+1,tipo);
lcd_printIcono8x8(xp+16,yp,fil,col+2,tipo);
lcd_printIcono8x8(xp+16,yp+8,fil+1,col+2,tipo);
lcd_printIcono8x8(xp+16,yp+16,fil+2,col+2,tipo);
}
void lcd_printIcono8x8(int xp,int yp,int fil,int col,char tipo)
{
uint8_t x,xi,xf,y,yi,yf,c;
uint8_t bitmap;
uint8_t i;
uint16_t cbitmap=0;
cbitmap=fil*16*8+8*col;
yi=0;
yf=7;
i=fil*8*16;
xi= i*8;
xf= (i+1)*8-1;
for(y=yi;y<=yf;y++)
{
c=0x80;
bitmap = pgm_read_byte(&(menu_nivel[cbitmap++]));
for(x=xi;x<=xf;x++)
{
if(tipo==1)
{ if((bitmap&c)==c)
lcd_set_pixel(x+xp,y+yp);}
else { if((bitmap&c)!=c) lcd_set_pixel(x+xp,y+yp);}
c=c>>1;
}
}
}
void lcd_clearIcono8x8(int xp,int yp)
{
FillRect(xp,yp,xp+8,yp+8,0);
}
void lcd_clearIcono24x24(int xp,int yp)
{
FillRect(xp,yp,xp+24,yp+24,0);
}
void oscope(void)
{
double y,y_1,sp,na,h;

y=40-(a2dConvert8bit(0)*40/255);
y_1=40-(a2dConvert8bit(1)*40/37.8);
lcd_set_pixel(ser,y_1);
DrawLineFormat(1,y,100,y,1,1);
lcd_delay100ms();
DrawLine(1,y,100,y,0);
ser++;
if(x==100)
{
ser=0;
lcd_clear_graphics();
}
sp=(a2dConvert8bit(0)*100/255);
na=(a2dConvert8bit(1)*100/37.8);
if(sp<na)
{
DrawLine(z,45,x,45,1);
lcd_delay100ms();
x=x+1;
z=x;
if(x==100)
{
x=0;
}
}
if(sp>na)
{
DrawLine(z,55,x,55,1);
lcd_delay100ms();
x=x+1;
z=x;
if(x==100)
{
x=0;
}
}
}
void rprintfFloatG(char numDigits,double x)
{
unsigned char firstplace = FALSE;
unsigned char negative;
unsigned char i, digit;
double place = 1.0;
// save sign
negative = (x<0);
// convert to absolute value
x = (x>0)?(x):(-x);

// find starting digit place


for(i=0; i<15; i++)
{
if((x/place) < 10.0) break;
else place =place*10.0;
}
// print polarity character
if(negative)
rprintfChar('-');
else
rprintfChar('+');
// print digits
for(i=0; i<numDigits; i++)
{
digit =(int)(x/place);
if(digit | firstplace | (place == 1.0))
{
firstplace = TRUE;
rprintfChar(digit+0x30);
}
else rprintfChar(' ');
if(place == 1.0)
{ rprintfChar('.'); }
x=x-digit*place;
place =place/10.0;
}
}
void oscope_1(void)
{
double x_1,y_1;
x_1=(a2dConvert8bit(1)*71)/255;
y_1=(0.03239*x_1*x_1)-(2.2998*x_1)+47;
DrawLine(35,24,x_1,y_1,1);
lcd_delay100ms();
DrawLine(35,24,x_1,y_1,0);
}
void tanq(void)
{
double x,y,i;
x=27+((a2dConvert8bit(1)*12)/(127.5));
y=(0.25*x*x)-(19.75*x)+390;
DrawCircle(x,y,2,1);
DrawLine(39,15,x,y,1);
for(i=47;i>=y+3;i--)

{
DrawLine(10,i,37,i,1);
}
lcd_delay100ms();
for(i=47;i>=y+3;i--)
{
DrawLine(10,i,37,i,0);
}
DrawCircle(x,y,2,0);
DrawLine(39,15,x,y,0);
}
void muestra(int xp,int yp,int xq,int yq)
{
double sp, na;
lcd_gotoxy(xp,yp);
sp=(a2dConvert8bit(0)*100/255);
na=(a2dConvert8bit(1)*100/37.8);
lcd_gotoxy(xp,yp);rprintf("NA");
lcd_gotoxy(xp,yq);rprintf("SP");
lcd_gotoxy(xq,yq);
rprintfFloatG(3,sp);
lcd_gotoxy(xq,yp);
rprintfFloatG(3,na);
if(sp<na)
{
PORTB=0x1;
lcd_gotoxy(13,7);rprintf("PI2");
DrawLine(45,50,45,52,1);
lcd_delay100ms();
DrawLine(45,50,45,52,0);
}
if(sp>na)
{
PORTB=0x2;
lcd_gotoxy(13,7);rprintf("PI1");
DrawLine(11,16,11,18,1);
lcd_delay100ms();
DrawLine(11,16,11,18,0);
}
}
SIGNAL (SIG_INTERRUPT0)
{
if(col==0&&fila==0)
{col=2;fila=1;
pal=0;
}
else if(fila==1&&col==0)
{

fila=0;
col=2;
pal=0;
}
else
{
col--;pal=0;
}
}
SIGNAL (SIG_INTERRUPT1)
{
if(col==2&&fila==0)
{
col=0;
fila=1;
pal=0;
}
else if(fila==1&&col==2)
{
col=0;
fila=0;
pal=0;
}
else
{
col++;
pal=0;
}
}
SIGNAL (SIG_INTERRUPT2)
{
if(fer==1)
{
fer=0;
}
else
{
fer=1;
}
}
4. Simulacin en proteus

5. Conclusion

Un bitmap impreso en la pantalla grafica puede llegarse a


sobrescribir juntos con las funciones preestablecidas como
drawline o set pixel, lo que se tiene que tener en cuenta es
delimitar el grafico con las variables establecidas en el programa.

UNIVERSIDAD PRIVADA DEL VALLE


FACULTAD DE INFORMATICA Y ELECTRONICA
INGENIERIA ELECTRONICA
CAMPUS MIRAFLORES

NIVEL DE LIQUIDOS

Evaluacin

Estudiantes:
Adrin Mita Carlo
Eduardo Tern Sevilla
Vctor Mamani Zarate
Docente:
Ing. German Pereira
Materia:
Microcontroladores ll

La Paz 19 de Junio del 2015


Gestin I 2015

También podría gustarte