Display ProyEct

Embed Size (px)

Citation preview

  • 7/31/2019 Display ProyEct

    1/12

    #include

    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    float temp;int tempPin = 0;

    void setup() {lcd.begin(16, 2);lcd.print("Temperature:");

    }

    void loop() {temp = analogRead(tempPin);temp = temp * 0.48828125;lcd.setCursor(0, 1);lcd.print(temp);delay(1000);

    }

    Midiendo temperatura con LM35 y Pingino (o Arduino)febrero 12, 2012

    http://static.flickr.com/7031/6492898199_894e1fd7d2_z.jpg
  • 7/31/2019 Display ProyEct

    2/12

    Interactuar con el mundo real es una de los puntos fuertes de los microcontroladores.

    Una de las maneras de hacerlo es tomando una medida analgica que represente unamagnitud real. En este caso, mediremos temperatura usando un pequeo integrado, el famoso

    LM35 (datasheet). Es el mismo que utilic en mi proyecto Templogger.

    La conexin con nuestra placa es muy sencilla, pero hay un pequeo detalle importante.Veamos cmo se ve en una protoboard:

    Ese detalle importante del que hablo es la resistencia. Conecta el pin Vout del LM35 (el queda la tensin de salida) con GND (masa). Su funcin es estabilizar la seal, y sus valores

    pueden estar entre 10 y 100 k.

    Este circuito en particular funcionar nicamente con temperaturas sobre 0, por lo que sirve

    para proyectos en un interior (o en exterior en zonas clidas). Si queris poder medir

    temperaturas bajo 0, hay circuitos en su hoja de datos.

    Para leer los datos, tanto Pingino como Arduino tienen una orden muy simple:

    1 analogRead(pin);

    que nos devolver un valor entre 0 y 1024 directamente proporcional a la tensin recibida.

    Mirando la hoja de datos del sensor, vemos que por cada C, la tensin en el pin Voutaumenta 10mV, por lo que para dar los 5V mximos (que corresponderan a una lectura de

    1024) necesitaramos 500C, lo que no vamos a alcanzar (el sensor se fundira antes ).

    Por tanto, mediante una regla de 3, calculamos la operacin de conversin desde el valor queleemos en el pin, hasta la temperatura real, y tenemos:

    1 temperatura = lectura * 500/1024

    Pero queremos un nmero con decimales (flotante), por lo que aadimos esa peticin al

    cdigo:

    http://www.google.es/url?sa=t&rct=j&q=lm35&source=web&cd=1&ved=0CDcQFjAA&url=http%3A%2F%2Fwww.national.com%2Fds%2FLM%2FLM35.pdf&ei=GBM3T460CKqJ0AXv6KGpAg&usg=AFQjCNENZbT8LU9FiMNcj0B-2pHbkdUr4w&sig2=YaUa_aAKzOak5rWPoMxjiQhttp://elelectronlibre.wordpress.com/2011/03/10/proyectos-pinguino-templogger/http://elelectronlibre.files.wordpress.com/2012/02/dibujolm35.pnghttp://www.google.es/url?sa=t&rct=j&q=lm35&source=web&cd=1&ved=0CDcQFjAA&url=http%3A%2F%2Fwww.national.com%2Fds%2FLM%2FLM35.pdf&ei=GBM3T460CKqJ0AXv6KGpAg&usg=AFQjCNENZbT8LU9FiMNcj0B-2pHbkdUr4w&sig2=YaUa_aAKzOak5rWPoMxjiQhttp://elelectronlibre.wordpress.com/2011/03/10/proyectos-pinguino-templogger/
  • 7/31/2019 Display ProyEct

    3/12

    1 temperatura = (float) lectura * 500/1024

    Si quisiramos conseguir mayor precisin, podramos utilizar voltajes de referencia, lo que

    nos ayudara a tener un rango de temperatura menor ganando en calidad de lectura. Pero para

    una aplicacin usual no es necesario tanto (con el mtodo utilizado tenemos una precisin

    aproximada de ~0.5C).Por ltimo, utilizamos una pantalla lcd para mostrar los resultados, quedando el circuito

    completo as:

    Y ahora escribimos todo el cdigo, lo compilamos, lo cargamos en nuestro micro, y listo!

    01 intlectura;

    02 floattemperatura;

    03 voidsetup()

    04 {

    05 chari=0;

    06 pinMode(13,INPUT); //Usaremos el pin 13 como entrada analgica

    07

    08 for(i=0;i {

    09 pinMode(i,OUTPUT);

    10 }

    11

    12 lcd(9,8,0,1,2,3,0,0,0,0); // RS, E, D4 ~ D8

    http://elelectronlibre.files.wordpress.com/2012/02/lm35lcd.png
  • 7/31/2019 Display ProyEct

    4/12

    13 lcd.begin(2, 0);

    14 lcd.clear();

    15 lcd.print("Lector LM35");

    16 lcd.setCursor(0,1);

    17 lcd.print("elelectronlibre");

    18 delay(1000);

    19 }

    20

    21 voidloop()

    22 {

    23 chari=0;

    24 temperatura =0;

    25 lectura =0;

    26 for(i=0;i {

    27 lectura = lectura + analogRead(13);

    28 delay(100);

    29 }

    30 lectura = lectura / 5;

    31 temperatura = (float) lectura * 500 / 1024;

    32 lcd.clear();

    33 lcd.printf("T = %f.2",temperatura);

    34 lcd.printf("Lectura: %d",lectura);

    35 delay(500);

    36 }

    Hoy la entrada va a ser un 2x1, aprenderemos a usar dos cosas en una misma entrada,veremos como funciona el sensor de temperatura LM35 y tambin una pantalla LCD en la

    que visualizaremos la temperatura.

  • 7/31/2019 Display ProyEct

    5/12

    El componente que vemos en la imagen es el sensor LM35 el cual nos mide una temperatura

    de -55C a 150C y una precisin de 0.5C a 25C, que es muy buena y suficiente parapequeos inventos que podamos hacer en casa.

    Si miris la imagen veris que tiene tres patillas. La primera empezando por la izquierda es lade entrada de tensin, la segunda es por donde nos dara la seal y la tercera el negativo.

    Pantallas LCD hay de muchos tipos yo usare esta de dos lneas porque para esto es suficientey adems es la que me venia en el kit arduino que compre. Para usar esta pantalla bastara con

    hacer unas pocas conexiones, un par de lneas de cdigo y ya tendremos funcionando nuestra

    pantalla.

    Como veis el tercer pin tiene la salida de un potencimetro. Con el potencimetro lo que

    haremos ser regular el contraste.

    El pin de retroiluminacin no lleva resistencia porque cogemos directamente del pin 13 dearduino que ya la lleva incorporada.

    http://2.bp.blogspot.com/-tkr0XF3AF40/TwN11nTpVAI/AAAAAAAAAA4/x7JWaSXqwxo/s1600/Temperatura+LCD.jpghttp://www.modtronix.com/images/to92.jpg
  • 7/31/2019 Display ProyEct

    6/12

    //www.playingwitharduino.blogspot.com

    #include //Incluir esta libreria para poder usar el lcd

    int Ana1 = A0; //Entrada analogica de LM35

    LiquidCrystal lcd(12,11,5,4,3,2); //Definimos la pantalla LCD

    int Temp = 0;

    char Grados = '';

    void setup(){

    Serial.begin(9600);

    lcd.begin(16,2);

    pinMode(13,OUTPUT);

    digitalWrite(13, HIGH); //Activamos la retroiluminacion

    }

    void loop(){

    Temp = analogRead(Ana1); //Leemos el valor de la entrada analogica

    Temp = map(Temp,0,1024,-55,150); //Escalamos la seal a grados centigrados

    http://2.bp.blogspot.com/-exhO5QH3scU/TwN2VVri43I/AAAAAAAAABE/WK_RAfDc_ZI/s1600/DSC_0146.jpg
  • 7/31/2019 Display ProyEct

    7/12

    //Mostramos los grados en el serial

    Serial.print("Grados: ");

    Serial.print(Temp);

    Serial.print(Grados);

    Serial.println("C");

    //Mostramos los grados en la pantalla LCD

    lcd.setCursor(0,0); //Con este comando decimos en que linea queremos escribir

    lcd.print("Temperatura: ");

    lcd.setCursor(0,1);

    lcd.print(Temp);

    delay(10000); //Al ser temperatura no hace falta leerlo tan seguido}

    Termmetro graficador con LM35 y display HD44780 compatible

    El circuito integrado LM35 es muy interesante. Se comporta como un regulador

    de tensin controlado por temperatura. El resultado es que por su salida entrega

    10 milivolts por grado celsius.

    En la documentacin figuran varios circuitos de aplicacin pero para este

    experimento vamos a hacerlo lo ms bsico posible. Lo conectaremos as:

    https://lh5.googleusercontent.com/-ExBCwZ6HWJA/TXKSxV8pzrI/AAAAAAAADAM/Z2LUqURr6mM/s1600/lm35.jpg
  • 7/31/2019 Display ProyEct

    8/12

    Para la medicin, lo nico que tenemos que hacer es leer la entrada analgica y

    calcular cuantos milivolts son. Lo dividimos por 10 y listo.

    Un detalle con respecto al montaje fsico del LM35: no conviene

    conectarlo directamente sobre el Arduino. Aunque no lo parezca la

    placa genera bastante calor como para aumentar la temperatura un par

    de grados. Es mejor ponerle un calbe y que est lejos.

    Con temperaturas normales, rara vez mediremos ms de 100 grados, o sea que

    rara vez tendremos ms de 1 volt en la salida. As que para obtener mejor

    precisin en la medida podramos usar como referencia del conversor analgico

    digital, la tensin interna de 1,1 Volt.

    analogReference(INTERNAL); //referencia de 1.1V

    Por qu usar una referencia de 1,1V en lugar de dejarlo en la normal que son

    5V? Para tener mejor precisin en la medida. Aunque tampoco sera tan

    importante ya que el LM35 tampoco es super exacto. Puede tener un error de

    medio grado, lo cual parece mucho pero en comparacin con otras alternativas

    est muy bien. Otros tienen tolerancias de un grado o ms.

    El conversor analgico digital mide con una precisin de 10 bits, o sea que la

    funcin analogRead nos devuelve un valor entre 0 y 1023. Dado que 1023

    corresponde a 1.1 volt, lo que son 110 grados, la frmula para convertir la

    informacin en grados es sencilla. Si a es el valor medido, la temperatura es:

    t=a*110/1023.0;

    https://lh6.googleusercontent.com/-5GDKw59g7I8/TXKZgIJ_gWI/AAAAAAAADAQ/vUjTaYGtuDA/s1600/term1.jpg
  • 7/31/2019 Display ProyEct

    9/12

    Dado que la entrada est sujeta a mltiples interferencias externas, el valor de

    entrada no es totalmente estable. Entonces, para conseguir una medicin ms

    exacta lo que vamos a hacer es promediar todos los valores medidos durante

    una fraccin de segundo. Los vamos sumando en la variable s y contando con c.

    Al final dividimos s por c y tenemos la temperatura (variable a):

    m=millis();s=0;c=0;while(millis()-m 3600){....

    Para ver que tal funcionan las cosas en la pantalla mostraremos el valor devuelto

    por el conversor analgico-digital, la grfica, la medicin de temperatura, y el

    tiempo transcurrido.

    Una vez conformes con el resultado los datos se pueden reubicar. Recordemos

    que la grfica sale donde pongamos los caracteres 0 a 7.

    Al final a mi me ha quedado as:

    http://alejandro-anv.blogspot.com/2011/03/graficos-en-display-hd44780-1602.htmlhttp://alejandro-anv.blogspot.com/2011/03/graficos-en-display-hd44780-1602.html
  • 7/31/2019 Display ProyEct

    10/12

    Y el programa que lo hace es este:

    #include

    LiquidCrystal lcd(8,9,4,5,6,7);

    byte grafica[24]; //valores entre 0 y 8

    void setup(){lcd.begin(16, 2);

    Serial.begin(9600);

    analogReference(INTERNAL); //referencia de 1.1Vlcd.clear();lcd.setCursor(0,0);

    lcd.print("OK");

    lcd.setCursor(8,0);lcd.print('\0');lcd.print('\1');lcd.print('\2');lcd.print('\3');lcd.print('\4');lcd.print('\5');lcd.print('\6');lcd.print('\7');

    memset(grafica,(byte)9,sizeof(grafica));

    mostrar_grafica();}

    /////////////////////////////////////////////////////////////

    long a;float t;long m,s,c;

    https://lh5.googleusercontent.com/-66CYv6SdzvI/TXKb39XLfZI/AAAAAAAADAU/FvZtjHzSkd0/s1600/IMGP8809.JPG
  • 7/31/2019 Display ProyEct

    11/12

    long s10m=0;long c10m=0;long m10m=millis();int i,indice_registro=0;long dif;int k;

    /////////////////////////////////////////////////////////////

    void loop(){

    m=millis();s=0;c=0;while(millis()-m 3600){

    //guradar valor

    a=s10m/c10m;memcpy(grafica,grafica+1,23); //desplazar hacia la izquierdagrafica[23]=8 * (1.0*t-10.0)/12;

    s10m=0;c10m=0;

    m10m=millis();mostrar_grafica();}

    }

    //////////////////////////////////////////////////////

    void mostrar_grafica(){

  • 7/31/2019 Display ProyEct

    12/12

    int d,dp;byte bm[8];int c,columna,fila,posicion,x;int i;for ( c=0;c