#include <LiquidCrystal.h> 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 Pingüino (o Arduino)
febrero 12, 2012

el famoso LM35 (datasheet). hasta la temperatura real.Interactuar con el mundo real es una de los puntos fuertes de los microcontroladores. La conexión con nuestra placa es muy sencilla. Una de las maneras de hacerlo es tomando una medida analógica que represente una magnitud real. y tenemos: 1 temperatura = lectura * 500/1024 Pero queremos un número con decimales (flotante). Es el mismo que utilicé en mi proyecto Templogger. por lo que añadimos esa “petición” al código: . vemos que por cada ºC. Su función es estabilizar la señal. En este caso. por lo que para dar los 5V máximos (que corresponderían a una lectura de 1024) necesitaríamos 500ºC. Mirando la hoja de datos del sensor. por lo que sirve para proyectos en un interior (o en exterior en zonas cálidas). que nos devolverá un valor entre 0 y 1024 directamente proporcional a la tensión recibida. pero hay un pequeño detalle importante. la tensión en el pin Vout aumenta 10mV. Conecta el pin Vout del LM35 (el que da la tensión de salida) con GND (masa). Veamos cómo se ve en una protoboard: Ese detalle importante del que hablo es la resistencia. calculamos la operación de conversión desde el valor que leemos en el pin. tanto Pingüino como Arduino tienen una orden muy simple: 1 analogRead(pin). mediante una regla de 3. Por tanto. mediremos temperatura usando un pequeño integrado. Este circuito en particular funcionará únicamente con temperaturas sobre 0. Si queréis poder medir temperaturas bajo 0. Para leer los datos. hay circuitos en su hoja de datos. lo que no vamos a alcanzar (el sensor se fundiría antes ). y sus valores pueden estar entre 10 y 100 kΩ.

03 void setup() 04 { 05 06 07 08 09 10 11 12 lcd(9. pinMode(13.5ºC).3.0. E. D4 ~ D8 for (i=0. y listo! 01 int lectura. podríamos utilizar voltajes de referencia. Por último.1 temperatura = (float) lectura * 500/1024 Si quisiéramos conseguir mayor precisión. lo que nos ayudaría a tener un rango de temperatura menor ganando en calidad de lectura. lo cargamos en nuestro micro.0. utilizamos una pantalla lcd para mostrar los resultados. lo compilamos.0.OUTPUT). } . quedando el circuito completo así: Y ahora escribimos todo el código.1.INPUT). // RS.0).2. Pero para una aplicación usual no es necesario tanto (con el método utilizado tenemos una precisión aproximada de ~0. //Usaremos el pin 13 como entrada analógica pinMode(i.i { char i=0. 02 float temperatura.0.8.

lcd. temperatura =0.i { lectura = lectura + analogRead(13).setCursor(0.13 14 15 16 17 18 19 } 20 lcd.clear(). delay(100). .print("Lector LM35").begin(2. lcd. lcd. lcd. lcd.temperatura).printf("T = %f. temperatura = (float) lectura * 500 / 1024. aprenderemos a usar dos cosas en una misma entrada.lectura). veremos como funciona el sensor de temperatura LM35 y también una pantalla LCD en la que visualizaremos la temperatura.printf("Lectura: %d". } lectura = lectura / 5. for(i=0. delay(1000). 0). 21 void loop() 22 { 23 24 25 26 27 28 29 30 31 32 33 34 35 36 } char i=0.print("elelectronlibre").clear(). lcd. lectura =0. delay(500).1). Hoy la entrada va a ser un 2x1.2". lcd.

la segunda es por donde nos dara la señal y la tercera el negativo. . La primera empezando por la izquierda es la de entrada de tensión. El pin de retroiluminación no lleva resistencia porque cogemos directamente del pin 13 de arduino que ya la lleva incorporada. Como veis el tercer pin tiene la salida de un potenciómetro.5ºC a 25ºC. un par de líneas de código y ya tendremos funcionando nuestra pantalla.El componente que vemos en la imagen es el sensor LM35 el cual nos mide una temperatura de -55ºC a 150ºC y una precisión de 0. Pantallas LCD hay de muchos tipos yo usare esta de dos líneas porque para esto es suficiente y además es la que me venia en el kit arduino que compre. Si miráis la imagen veréis que tiene tres patillas. Para usar esta pantalla bastara con hacer unas pocas conexiones. que es muy buena y suficiente para pequeños inventos que podamos hacer en casa. Con el potenciómetro lo que haremos será regular el contraste.

void setup(){ Serial. char Grados = 'º'.//www.blogspot.OUTPUT).1024.2).150).11. HIGH).5. //Definimos la pantalla LCD int Temp = 0. //Entrada analogica de LM35 LiquidCrystal lcd(12.-55.playingwitharduino.begin(16.begin(9600). lcd.h> //Incluir esta libreria para poder usar el lcd int Ana1 = A0.4.3. //Leemos el valor de la entrada analogica Temp = map(Temp. digitalWrite(13.2). } //Activamos la retroiluminacion void loop(){ Temp = analogRead(Ana1).0. pinMode(13.com #include <LiquidCrystal. //Escalamos la señal a grados centigrados .

setCursor(0. Serial.1).println("C"). delay(10000).//Mostramos los grados en el serial Serial.print("Temperatura: "). } //Al ser temperatura no hace falta leerlo tan seguido Termómetro graficador con LM35 y display HD44780 compatible El circuito integrado LM35 es muy interesante. //Mostramos los grados en la pantalla LCD lcd. //Con este comando decimos en que linea queremos escribir lcd. En la documentación figuran varios circuitos de aplicación pero para este experimento vamos a hacerlo lo más básico posible. Se comporta como un regulador de tensión controlado por temperatura.print(Temp). Serial.print(Grados). lcd.setCursor(0.0). Lo conectaremos así: . lcd. Serial. El resultado es que por su salida entrega 10 milivolts por grado celsius.print("Grados: ").print(Temp).

Aunque no lo parezca la placa genera bastante calor como para aumentar la temperatura un par de grados. Lo dividimos por 10 y listo.Para la medición. Puede tener un error de medio grado. rara vez mediremos más de 100 grados. . lo cual parece mucho pero en comparación con otras alternativas está muy bien. lo que son 110 grados. Con temperaturas normales. la temperatura es: t=a*110/1023. o sea que rara vez tendremos más de 1 volt en la salida. Dado que 1023 corresponde a 1. Otros tienen tolerancias de un grado o más. lo único que tenemos que hacer es leer la entrada analógica y calcular cuantos milivolts son. analogReference(INTERNAL). la tensión interna de 1.1 volt.1 Volt. Un detalle con respecto al montaje físico del LM35: no conviene conectarlo directamente sobre el Arduino. //referencia de 1. El conversor analógico digital mide con una precisión de 10 bits. o sea que la función analogRead nos devuelve un valor entre 0 y 1023. Aunque tampoco sería tan importante ya que el LM35 tampoco es super exacto. Así que para obtener mejor precisión en la medida podríamos usar como referencia del conversor analógico digital. Es mejor ponerle un calbe y que esté lejos.0. la fórmula para convertir la información en grados es sencilla.1V en lugar de dejarlo en la normal que son 5V? Para tener mejor precisión en la medida. Si a es el valor medido.1V ¿Por qué usar una referencia de 1.

Eso nos dará los milisegundos que han transcurrido. } a=s/c. y cuando esto de 3600 será que ha pasado una hora. Usando la rutina del post anterior.Dado que la entrada está sujeta a múltiples interferencias externas. la medición de temperatura. Ahora bien. Crearemos una variable llamada m10m donde guardaremos los milisegundos de la última barra mostrada. while(millis()-m <300) { s+=analogRead(A1). Al final dividimos s por c y tenemos la temperatura (variable a): m=millis(). Así que podríamos mostrar una barrita por hora y así graficar las últimas 24 horas. Algo así: dif=(millis()-m10m)/1000. Los vamos sumando en la variable s y contando con c. para conseguir una medición más exacta lo que vamos a hacer es promediar todos los valores medidos durante una fracción de segundo. y el tiempo transcurrido. Recordemos que la gráfica sale donde pongamos los caracteres 0 a 7.. if (dif>3600){. Una vez conformes con el resultado los datos se pueden reubicar. Si lo dividimos por 1000 lo tendremos en segundos. Entonces. Para ver que tal funcionan las cosas en la pantalla mostraremos el valor devuelto por el conversor analógico-digital. c=0. Al final a mi me ha quedado así: . s=0. tenemos 24 barritas para mostrar datos. c++. y lo compararemos con los milisegundos actuales.. la gráfica.. el valor de entrada no es totalmente estable.

0).Y el programa que lo hace es este: #include <LiquidCrystal.print('\3').7). lcd. .print('\5'). lcd.setCursor(8. 2). lcd.print('\7'). lcd.begin(9600).print('\6'). memset(grafica.print('\0').clear(). lcd.print("OK"). lcd.h> LiquidCrystal lcd(8. lcd.1V lcd.s. //referencia de 1. lcd. //valores entre 0 y 8 void setup(){ lcd.9.5.(byte)9. long m. Serial.c. byte grafica[24]. analogReference(INTERNAL).print('\2'). lcd.0).4. lcd. mostrar_grafica().setCursor(0. float t.begin(16.sizeof(grafica)). } ///////////////////////////////////////////////////////////// long a.print('\1').print('\4'). lcd.6.

c=0. ///////////////////////////////////////////////////////////// void loop(){ m=millis(). long m10m=millis(). int k. lcd. m10m=millis(). long c10m=0. memcpy(grafica. dif=(millis()-m10m)/1000. mostrar_grafica().1). lcd. lcd.setCursor(0.setCursor(0.0. lcd.print(dif). c10m=0. c10m++. //cada 10 minutos guardar el promedio s10m+=a. lcd. if (dif>3600){ //guradar valor a=s10m/c10m.print(t).0). c++. long dif.0*t-10. int i. s10m=0.1). while(millis()-m <300) { s+=analogRead(A1). } } ////////////////////////////////////////////////////// void mostrar_grafica(){ .0)/12.23).print(a).long s10m=0. //desplazar hacia la izquierda grafica[23]=8 * (1.grafica+1. lcd.indice_registro=0. s=0.print(" ").setCursor(8. t=a*110/1023. lcd.print(" "). } a=s/c. lcd..

int d.. for (fila=0. else if (fila>=9-d) bm[fila] |= 1<<columna.bm). dp=c * 3. } } . }//for fila x++.0.columna.fila++){ if (d>8) // dato invalido bm[fila] |= (fila & 1) <<columna.x. }//for columna lcd.8). //poner puntitos en la primera columna (entre 0 y 8) x=0. que comienzan por el.c++){ memset(bm.fila.posicion.c<8. int i. d=grafica[i].fila<8.. for (columna=0.createChar(c.dp. byte bm[8]. int c. for ( c=0.columna<5.//llenamos el caracter con ceros // cada caracter representa 3 datos.columna+=2){ i=dp + 2-( columna/2 ).

Sign up to vote on this title
UsefulNot useful