View
246
Download
0
Category
Preview:
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.jpg7/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.png7/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.jpg7/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.jpg7/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.jpg7/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.jpg7/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.html7/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.JPG7/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
Recommended