lunes, 28 de mayo de 2018

Medir temperatura e intensidad lumínica con LM35, LDR Y Arduino



Actualmente mantengo la intención de desarrollar pequeños robots y autómatas con fines didácticos y de ocio. Pero antes de acometer complejos y divertidos montajes, me encuentro con la necesidad de desarrollar e implementar sensores y actuadores. Tener las cosas bien claras a la hora de montarlos y los códigos de programa a mano para adaptarlos rápidamente a los proyectos en curso. Incluso dejarlos ya ensamblados en forma de bloques y no tener más que conectarlos.

Dos magnitudes muy comunes a la hora de aportar información a nuestros robots son la temperatura y la intensidad lumínica. Tras realizar breves consultas por internet, he visto dos componentes baratos y fáciles de usar: el LM35 y la fotocélula LDR.

En la red hay multitud de tutoriales que me han ayudado a desarrollar mi propio montaje con una tarjeta Arduino UNO y una placa protoboard. No considero malo copiar a otros, pero entendiendo lo que están haciendo y transformándolo y adaptándolo a mis necesidades y filosofía. Y por supuesto, mencionándoles debidamente.




Tanto el LM35 como la fotocélula LDR son sensores analógicos. Y dichos componentes pasivos son leídos por las tarjetas Arduino gracias a analogRead(). Se trata de una función que mide los valores de los pines analógicos especificados, que en Arduino UNO son 6, de A0 a A5. Detrás de dichos pines lo que hay es un conversor de analógico a digital de 6 canales. Tiene una resolución de 10 bits y proporciona al microcontrolador ATmega328p valores enteros entre 0 y 1023 bits. Comentar brevemente que estos pines también se pueden usar como digitales, por si nos vemos faltos de ellos.








El LM35 es un sensor de temperatura hecho con semiconductores. Puede medir temperaturas entre -55 ºC y 150 ºC. Trabaja con tensiones comprendidas entre los 4 y 30 V. Una variación de 1 ºC en la temperatura se traduce en una variación de 1 mV entre sus terminales. Pero como se ha comentado antes, el rango de valores binarios que le llega al microcontrolador va de 0 a 2023. Es decir, la señal analógica es "troceada" en 1024 valores. Para obtener la temperatura en grados Celsius hemos de escalar la lectura según la fórmula:



La fotorresistencia LDR es un componente pasivo cuya resistencia al paso de la electricidad varía en función de la intensidad de luz que incide sobre él. A medida que dicha intensidad aumenta, su resistencia óhmica disminuye. Además de la intensidad de luz, el LDR reacciona a una gama amplia de frecuencias, entre el infrarrojo y el ultravioleta. Con este transductor podemos hacer desde sistemas de encendido automático de luces hasta robots seguidores de líneas ya que es sensible a la luz emitida por un diodo led infrarrojo y reflejada en la superficie de una pista.  





De cara a programar la tarjeta Arduino UNO hay muchos tutoriales. Pero principalmente de forma separada: por un lado para LDR y por otro para LM35. Lo que he hecho ha sido un programa para obtener las lecturas de los dos sensores. En la placa  protoboard he montado un indicador de luminosidad con tres diodos led, especificando como umbrales máximos y mínimos de luz los valores de 100 y 50, respectivamente, leídos gracias a la función analogRead(). Por otro lado, para poder leer la temperatura medida en el monitor serie, he usado la función Serial.begin() configurada a la velocidad de 9600 bps. Un siguiente paso sería mostrar dicha lectura en una pantalla LCD, pero es algo que ya he practicado y prefiero dejarlo para proyectos definitivos.

Un aplicación inmediata que se me ocurre de lo realizado es la siguiente. De la misma manera que he configurado los leds, establecer una condición de luz ambiental mínima para la activación de un sistema de riego nocturno. Y con la temperatura leída, activar un ventilador o sistema de refrigeración.  

Código de programa

//declaración de las variables globales que vamos a usar

float tempC; // Variable para almacenar los valores proporcionados por LM35


const int LDRPin = A0; // Variable del pin de entrada A0 para el sensor LDR

const int LM35Pin = A1; // Variable del pin de entrada A1 para el sensor LM35

const int LED_verde = 2;

const int LED_amarillo = 3;
const int LED_rojo = 4;

const int limite_superior = 100;

const int limite_inferior = 50;

void setup() {


  Serial.begin(9600); // Configuramos el puerto serial a 9600 bps
  
   pinMode(LED_verde, OUTPUT);
   pinMode(LED_amarillo, OUTPUT);
   pinMode(LED_rojo, OUTPUT);
   pinMode(LDRPin, INPUT);
   pinMode(LM35Pin, INPUT);
}

void loop() {
  
int input = analogRead(LDRPin); // Asignamos  valores obtenidos de LDRPin a input

   // Establecemos 3 condiciones para el encendido de los diodos led

   
   if (input > limite_superior) 
   {
      digitalWrite(LED_verde, HIGH);
      digitalWrite(LED_amarillo, LOW);
      digitalWrite(LED_rojo, LOW);
   }

      if (input <= limite_superior &&  input >= limite_inferior) /

   {
      digitalWrite(LED_verde, LOW);
      digitalWrite(LED_amarillo, HIGH);
      digitalWrite(LED_rojo, LOW);
   }

       if (input < limite_inferior) 

   {
      digitalWrite(LED_verde, LOW);
      digitalWrite(LED_amarillo, LOW);
      digitalWrite(LED_rojo, HIGH);
   
   }

int input_temperatura = analogRead(LM35Pin);


 tempC = analogRead(LM35Pin); 

   
  
  tempC = (5.0 * tempC * 100.0)/1024.0; // Cálculo de la temperatura

  
  Serial.print(tempC); // Envia el dato al puerto serial
  
  Serial.print("\n"); // Salto de línea
  
  delay (1000); // Detenemos el programa 1 segundo entre cada lectura


}


Webs consultadas











No hay comentarios:

Publicar un comentario