Medidor de temperatura y humedad.

A continuación me dispongo a detallar la facilidad con la que podremos construirnos un medidor de temperatura y humedad  sin gastar a penas recursos monetarios.
También aprovecho esta entrada del blog para  alentar a los alumnos a hacer prácticas con placas Arduino, pues tenemos la oportunidad de tener a nuestro alcance tal tecnología que permite agudizar nuestra creatividad hasta perfeccionar nuestros conocimientos sobre programación,automatización, electrónica y demás campos tecnológicos, a la par que ver el resultado de forma inmediata y consecutiva .
Dividiremos este proceso por fases; en primer lugar especificaré los materiales necesarios , o al menos, los que yo utilicé :

  1. Placa Arduino Ethernet, (también se podría emplear cualquier tipo de placa con un módulo Ethernet Shield.)
  2. Sensor de temperatura y humedad AM2301 (DHT).
  3. Alimentador y descarnador de programas básicos (FTDI USB o TTL FT232RL).
  4. Un par de resistencias de valores comprendidso entre 100Ω  a 300Ω ( Si la pones de menos ohmios se fundirá el led, de más la luz será inapreciable)
  5. Un dioso emisor de luz o Led Rojo y otro verde.
  6. Placa protoboard.
  7. Cable USB macho- MiniUSB macho.
  8. Cable RJ45 cat5 o superior.

Una vez obtenidos los componentes descargamos de la página oficial de Arduino (https://www.arduino.cc/en/Main/Software) el software para poder programar y compilar nuestro código actualmente el programa en cuestión es «ARDUINO 1.8.7»,cabe destacar que no necesitas permisos de administrador para poder ejecutarlo,ya que no requiere instalación.Lo ajustamos y lo configuramos siguiendo los pasos de esta página no oficial : «https://leantec.es/blog/39_Como-conectar-Arduino-por-primera-vez.html«.
Si acabamos de bajarnos el programa y no hemos trabajado previamente con él deberemos incluir dos librerías para que el sensor funcione, estas librerías y su adaptación se muestran en la siguiente imagen:

Imagen procedente de los apuntes de I.S.O impartido en 1º de A.S.I.R.

A continuación verifiquemos que nuestro ordenador es capaz de comunicarse perfectamente con la placa y realizada la integración de las librerías procederemos a crear o copiar el código en nuestro entorno de programación:

#include "DHT.h"
#include <SPI.h>
#include <Ethernet.h>
#define DHTTYPE DHT21 // AM2301
#define DHTPIN 7      // PIN al que conectamos el cable amarillo del DHT
const int ledPINRojo  = 9; // PIN al que conectamos el LED rojo
const int ledPINVerde = 3; // PIN al que conectamos el LED verde
const float maxTempRojo = 29.0; // A partir de esta temperatura encendemos LED rojo
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Dirección MAC para la tarjeta de red
IPAddress ip(10,0,0,250);   // Dirección IP
EthernetServer server(80);  // Puerto
String HTTP_req;          // Para guardar la peticion del cliente
boolean LED2_status = 0;
float h, t;              // Para almacenar la humedad y la temperatura leída del sensor DHT
String colorCajaLEDHTML = "green";
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
  Serial.begin(9600);
  Serial.println("ISO - Introducción SSOO");
  dht.begin();
  pinMode(ledPINRojo , OUTPUT);   // definir pin como salida
  pinMode(ledPINVerde , OUTPUT);  // definir pin como salida
  Ethernet.begin(mac, ip);   // Configurar tarjeta de red
  server.begin();            // Inicio del servidor Web
}
void loop()
{
 h = dht.readHumidity();    // Obtener humedad
 t = dht.readTemperature(); // Obtener temperatura
 if (isnan(t) || isnan(h))  // Comprobar que no ha habido error en la obtención de datos
 {
   Serial.println("Fallo en lectura del sensor DHT, comprueba que está alimentado a 5V");
 }
 else
 {
   // Escribir datos de humedad y temperatura en la consola
   Serial.print("Humedad: ");
   Serial.print(h);
   Serial.print(" %\t");
   Serial.print("Temperatura: ");
   Serial.print(t);
   Serial.println(" *C");
   if (t>maxTempRojo) { // Encender LED rojo, apagar LED verde
     digitalWrite(ledPINRojo , HIGH);   // poner el Pin en HIGH
     digitalWrite(ledPINVerde, LOW);    // poner el Pin en LOW
     colorCajaLEDHTML = "red";
   } else { // Encender LED verde, apagar LED rojo
     digitalWrite(ledPINVerde , HIGH);   // poner el Pin en HIGH
     digitalWrite(ledPINRojo , LOW);    // poner el Pin en LOW
     colorCajaLEDHTML = "green";
   }
   EthernetClient client = server.available();  // Comprobamos si hay peticiones de conexión
                                                // desde un cliente
   if (client)                                  // En caso afirmativo
      {
         boolean currentLineIsBlank = true;
         while (client.connected())
           {
              if (client.available())    // Hay algo pendiente de leer
               {
                 char c = client.read(); // Leemos los caracteres de uno en uno
                 HTTP_req += c;          // Los añadimos al String
                 if (c == '\n' && currentLineIsBlank)
                    { client.println("HTTP/1.1 200 OK");
                      client.println("Content-Type: text/html");
                      client.println("Connection: close");
                      client.println();
                      client.println("<!DOCTYPE html>");          // Envia la pagina Web
                      client.println("<html>");
                      client.println("<head>");
client.println("<style>#led {border-radius:50%; width:50px;height:50px;background-color:"+colorCajaLEDHTML+"}</style>");
                      client.println("<title>ISO - Introducci&oacute;n a los sistemas operativos</title>");
                      client.println("</head>");
                      client.println("<body>");
                      client.println("<h1>Ejemplo lectura de temperatura<h1>");
                      client.println("<h2>TEMPERATURA: " + String(t) +  "&deg;</h2>");
                      client.println("<div id='led'></div>");
                      client.println("<h2>HUMEDAD:     " + String(h) + "%</h2>");
                      client.println("<h2><a href='javascript:location.reload()'>Refrescar</a></h2>");
                      client.println("</body>");
                      client.println("</html>");
                      Serial.print(HTTP_req);
                      HTTP_req = "";    // Una vez procesador, limpiar el string
                      break;
                    }
                 if (c == '\n')
                      currentLineIsBlank = true;
                 else if (c != '\r')
                      currentLineIsBlank = false;
              } // if (client.available
           }   // WHile
        delay(10);      // dar tiempo
        client.stop(); // Cerrar conexion
   }  // If client
 }
}

Código creado,comentado y cedido por el profesor de I.S.O impartido en 1º de A.S.I.R.

Después de haber  pegado el código en el programa y comunicado el PC con nuestra placa procedemos a volcar el código en esta; para ello pincharemos con el cursor en el siguiente botón de  la parte superior izquierda de nuestro editor de código:

 
Si todo sale como debería salir nos saldrá un mensaje parecido a este:
Nota: Este código se cargará por el cable USB no por el cable Ethernet.
Llegados a este punto conectaremos nuestro cable Ethernet al PC o nuestro switch, y cambiaremos la dirección IP del código antes expuesto por una que esté dentro de nuestro rango para así comunicarnos con el dispositivo sin problemas, si por el contrario preferimos no tocar el código deberemos cambiar la IP de nuestro equipo adaptándolo así a trabajar en el mismo rango que el declarado en el código.Si lo deseamos ya podríamos desconectarlo del PC por el cable USB, pero igualmente necesitaría una alimentación de 5 V para poder fincionar.
 
En mi caso particular me vi obligado a poner la puerta de enlace predeterminada » 10.0.0.1″ ya que de lo contrario no tenía forma de conectarme al dispositivo vía ethernet.
 

Acabado este proceso de parametrización debemos hacer el montaje de los componentes siguiendo el siguiente esquema:
 

Nota :El esquema ha sido diseñado con Multisim V11.0; es bien sabido en el mundo de la electrónica digital, que este programa es un programa de simulación, no un programa de hacer esquemas, pero he creído oportuno esquematizarlo así y no usar uno más completo y complejo como «E-Plan» ya que la sencillez del circuito no requiere tal software.
Nota 2: La alimentación ( el cable rojo) puede ser conectado a cualquier pin de salida de la placa de 5 V, o bien, a cualquier fuente externa de tal tensión (si se utilizara una fuente externa para alimentarlo deberíamos también puentear las tierras con los de la placa , o bien, utilizar únicamente en todo el circuito la fuente externa); siempre en continua.
Nota 3: Los diferentes pines de tierra de esta placa están puenteados internamente, así que igual que comenté en la nota anterior con la tensión de alimentación, da igual en qué pin de GND pinchemos el cable negro.
 
Después de haber realizado el montaje, y asegurarnos, como dije anteriormente de que tenemos corriente en la placa ( veremos uno de los led encendidos), y que tenemos el cable Ethernet conectado a nuestra red y a nuestra placa , debería verse algo así ( pero más ordenado naturalmente):

Pues bien, ya tenemos todo lo que necesitamos tal y como lo necesitamos, así que vamos a nuestro navegador e introducimos la dirección que declaramos en el código ( 10.0.0.250) y pulsamos intro y….
 

 
Veremos algo similar a esto:

 
Y si procedemos a sujetar con fuerza el sensor, ocurrirá algo así :
 


Nota: Esto ocurre porque nuestra mano es húmeda y desprende calor.
Cabe destacar, que la luz del LED variará en función de que la temperatura esté por encima o por debajo de los 29º como bien declaramos en este apartado del código:

y hasta aquí mi práctica con Arduino y este sensor , espero que os animéis a hacerlo, o mejor aún,haced algo más complicado tomando la base de esto, espero que os sirva a todos.
Un saludo y hasta la próxima.