Mostrando entradas con la etiqueta SENSORES. Mostrar todas las entradas
Mostrando entradas con la etiqueta SENSORES. Mostrar todas las entradas

Tutorial - DHT11 (Sensor de temperatura y humedad)

DESCRIPCIÓN
Los sensores DHT son sensores de bajo costo que mide tanto temperatura como humedad. Estos consisten de dos partes:

# Sensor capacitivo de humedad.
# Termistor (Resistencia que cambia el valor de su resistividad con la temperatura).

El chip permite realizar una conversión de la lectura análoga a digital.

DHT11
Es un sensor de humedad y temperatura con una señal digital de salida calibrada y su uso está comprendido con microcontroladores de 8 bits.


Sus aplicaciones pueden ser:
# Deshumificadores
# Inspección y testeo de equipos.
# Productos generales.
# Automatización.
# Control automático.
# Estaciones meteorológicas.
# Uso médico.

Sus características generales son:
Humedad Relativa:
# Resolución: 16 Bits
# Repetitividad: +- 1% RH
# Precisión: a 25°C +- 5% RH

Temperatura:
# Resolución: 16 Bits
# Repetitividad: +- 0.2°C
# Rango: A 25°C +- 2°C

Características eléctricas:
# Alimentación: DC 3.5 a 5.5V
# Consumo de corriente: 0.3 mA
# Periodo de toma de datos: > 2 segundos

Para mayor información puede usar el siguiente link: "DHT11 datasheet"

USO DE LA LIBRERIA DHT (ADAFRUIT)
La librería puede ser descargada usando el siguiente link: "DHT"

Las funciones principales de esta librería son:
# DHT nombre_sensor(pin, sensor): "nombre_sensor" se refiere a la cabecera o nombre del objeto que deseamos darle al sensor, "pin" se refiere al número del pin usado en el Arduino y "sensor" se refiere al tipo de sensor que estamos usando (DHT11, DHT22 o DHT21). 

Por ejemplo: "DHT dht(2, DHT11)"

# nombre_sensor.begin(): Inicio del uso de la librería.
# nombre_sensor.readHumidity(): Lectura del valor de la humedad en porcentaje en flotante.
# nombre_sensor.readTemperature(): Lectura del valor de la temperatura en flotante en grados Celsius.
# nombre_sensor.readTemperature(true): Lectura del valor de la temperatura en flotante en grados Fahrenheit.
# nombre_sensor.computeHeatIndex(temperatura_Fahrenheit, humedad_relativa): Cálculo del índice de calor o sensación térmica en flotante.
# nombre_sensor.computeHeatIndex(temperatura_Celsius, humedad_relativa, false): Cálculo del índice de calor o sensación térmica en flotante.

APLICACIÓN DEL COMPONENTE
Las conexiones que usaremos para el experimento son las siguientes:

# PIN 2 : Arduino UNO => Pin 1 : DHT11 (Pin 2)
# GND : Los dos GND deben estar conectados (DHT11 - Pin 4)
# 5V : Los dos 5V deben estar conectados (DHT11 - Pin 1)


Con el siguiente programa mediremos la temperatura ambiental, la humedad relativa y el índice de calor.
/*
   PROGRAMA DE PRUEBA: DHT11
   
   CONEXION:
             Pin 2 (Arduino UNO): Pin 2 (DHT11)
             GND (Arduino UNO)  : Pin 4 (DHT11)
             5V (Arduino UNO)   : Pin 1 (DHT11)

   Necesita la libreria "DHT.h" de Adafruit
   
   Autor: Renato H.
   http://beetlecraft.blogspot.pe/
   
   El siguiente programa es de uso publico, cualquier modificacion o mal uso del mismo que pudiera 
   ocasionar el mal funcionamiento de la plataforma de uso de la misma no es responsabilidad del 
   autor
*/

#include "DHT.h" // Libreria DHT de Adafruit
DHT sensor(2, DHT11); // Configruacion de la libreria para usar en el pin 2 el sensor DHT11

void setup() {
  sensor.begin();     // Inicializacion de la libreria DHT
  Serial.begin(9600); // Comunicacion serial a 9600 bps 
}

void loop() {
  float humedad = sensor.readHumidity();        // Lectura de la humedad en porcentaje
  float temperatura = sensor.readTemperature(); // Lectura de la temperatura en grados Celsius

  if (isnan(humedad) || isnan(temperatura)){ // Determina si los valores son ilegales
    Serial.println("Error de medicion");
    return;
  }

  // Calculo del indice de calor usando la temperatura y humedad leidos
  float indice_calor = sensor.computeHeatIndex(temperatura, humedad, false); 

  // Mostrar en monitor serial la temperatura
  Serial.print("Temperatura: "); Serial.print(temperatura, 1); Serial.print(" C"); Serial.print(" || ");
  // Mostrar en monitor serial la humedad relativa
  Serial.print("Humedad: "); Serial.print(humedad, 1); Serial.print(" %"); Serial.print(" || ");
  // Mostrar en monitor serial el indice de calor
  Serial.print("Indice de calor: "); Serial.println(indice_calor);

  delay(2000); // Intervalo para nueva medicion
}
Los resultados son los siguientes:


ANEXOS
Podemos ver un poco más de información sobre la temperatura, humedad relativa y sensación térmica. Vamos a ver los diferentes puntos:

TEMPERATURA:
Los grados Fahrenheit es una escala de temperatura termodinámica, donde el punto de congelación del agua es 32 grados Fahrenheit (°F) y el punto de ebullición es a 212 °F, todo esto a 1 atmósfera de presión. La temperatura corporal normal está estimada a 98.6 °F, mientras que la temperatura ambiente puede ser tomada de 68 a 77 °F.

Los grados Celsius o también llamados grados centígrados es una escala de temperatura termodinámica, donde el punto de congelación de agua es 0 °C y que se define en relación directa con los grados Kelvin equivalente a 273.15 K y el punto de ebullición del agua se define como 100 °C. La temperatura ambiente se toma de 20 a 25 °C, mientras que la temperatura corporal normal equivale a 36 °C.

Fórmulas de referencia que pueden ser tomadas, se muestran a continuación:


HUMEDAD RELATIVA:
Es la cantidad de vapor de agua contenida en el aire, en cualquier momento determinado, normalmente es menor que el necesario para saturar el aire. La humedad relativa es el porcentaje de la humedad de saturación que es calcula en relación con la densidad de vapor de saturación.

La humedad relativa es la cantidad de humedad en el aire, comparado con la que el aire puede mantener a esa temperatura. Cuando el aire no se puede mantener toda la humedad, entonces se condensa como rocío.


PUNTO DE ROCÍO
Si se enfría gradualmente el aire mientras mantenemos constante el contenido de humedad, la humedad relativa se elevará hasta alcanzar el 100%. Esta temperatura a la cual el contenido de humedad en el aire saturará el aire, se llama punto de rocío. Si el aire se enfría aún más, parte de la humedad se condensará.


SENSACIÓN TÉRMICA:
Son índices que relacionan valores de temperatura y humedad con el bienestar térmico. Estos índices pueden ser graves en actividades al aire libre cuando estas son altas. También son llamados "medidas de temperatura aparente". Para determinar el valor se utiliza una tabla y como ejemplo, si la temperatura del aire es de 96 °F y la humedad relativa es de 65%, el índice de calor que se siente es 121 °F.

El índice de calor puede ser calculada usando alguna de las siguientes fórmulas:


Donde:
# IC: Índice de calor.
# T: Temperatura ambiente en grados Fahrenheit
# R: Humedad relativa en porcentaje
# c1: -42.379
# c2: 2.04901523
# c3: 10.14333127
# c4: -0.22475541
# c5: -6.83783 x 10 ^ -3
# c6: -5.481717 x 10 ^ -2
# c7: 1.22874 x 10 ^ -3
# c8: 8.5282 x 10 ^ -4
# c9: -1.99 x 10 ^ -6


Donde:
# IC: Índice de calor.
# T: Temperatura ambiente en grados Fahrenheit
# R: Humedad relativa en porcentaje

La siguiente tabla puede ser usadas para ver la sensación térmica respecto al bienestar (va de la precaución a lo extremo peligroso):


Autor: 

Tutorial - Sensor de ultrasonido HC-SR04

FUNCIONAMIENTO DE LOS SENSORES DE ULTRASONIDO

Un sensor de ultrasonido tiene el mismo principio de funcionamiento que el mecanismo que utilizan los murciélagos para maniobrar y cazar mientras vuelan, la conocida "ecolocación".


El murciélago puede procesar la distancia relativa a un objeto al emitir una onda sonora la cual rebota a un objeto y de la que obtiene el tiempo en que demora viajar de ida y vuelta. 

El siguiente video puede ilustrarnos mejor sobre el tema:


De la misma manera, los sensores de ultrasonido trabajan en frecuencias que van por encima de la capacidad de escucha de los seres humanos cuyo rango es 20 Hz a 20 kHz, y al igual que los murciélagos se uno de los sensores emite una onda en una dirección y se empieza a contar el tiempo que recorre la onda hasta llegar a un obstáculo y rebotar de nuevo al sensor receptor.

Explicado lo anterior, podemos ver más de cerca a estos sensores. El transmisor emite 8 bips a una frecuencia de 40 Khz cuando una señal llega a su pin de "Trigger" y en ese mismo momento comienza a contar un "timer". 


Al momento en que la señal rebota en un objeto y regresa a la unidad, el sensor detiene el timer. La velocidad en que la onda viaja es 340 m/s a través del aire. Basado en el conteo del timer la distancia puede ser calculada usando la fórmula "D = R (T)".

# D: Distancia medida.
# R: Es la velocidad de propagación de la onda en el aire.
# T: Es el tiempo que demora en viajar la onda dividido por 2.

Un dato importante que debemos tener en cuenta en el momento de la medición de este tipo de sensores, es su ángulo de medición que puede alcanzar varios grados de espectro, tal como se muestra en la siguiente figura:


Por lo que el usar un patrón como referencia para fijar si el sensor está bien posicionado será necesario según la aplicación del mismo. 

CARACTERÍSTICAS DEL SENSOR HC-SR04

Uno de los sensores de ultrasonido más usados es el HC - SR04 que se muestra a continuación:



Las especificaciones principales del sensor se enumeran en el siguiente listado:

# Alimentación: 5 V.
# Consumo: 15 mA.
# Frecuencia de operación: 40 kHz
# Ángulo de medición: 15°.
# Rango máximo: 4 m.
# Señal de entrada del Trigger: 10 us (TTL).
# Máximo rango de repetición: 50 us.
# Distancia en cm: us/58.
# Distancia en pulgadas: us/148

LIBRERÍA "NEW PING"

La librería que usaremos se encuentra en el siguiente link "NewPing". Sus comandos principales se explican a continuación:

# sonar.ping(): Manda un ping y retorna el valor del echo en microsegundos o 0 si no hay señal de echo según la distancia límite establecida.
# sonar.ping_in(): Manda un ping y retorna una distancia en pulgadas o 0 si no hay señal de echo según la distancia límite establecida.
# sonar.ping_cm(): Manda un ping y retorna una distancia en centímetros o 0 si no hay señal de echo según la distancia límite establecida.
# sonar.ping_median(iteraciones): Manda múltiples pings (5 por defecto), descarta los pings fuera de rango y retorna la media en microsegundos.
# sonar.convert_in(Tiempo de eco): Convierte los microsegundos a una distancia en pulgadas.
# sonar.convert_cm(Tiempo de eco): Convierte los microsegundos a una distancia en centímetros.
# sonar.ping_timer(Función): Manda un ping y llama a una función programada en caso el ping se complete.
# sonar.check_timer(): Chequea si el ping ha retornado sin contar el límite de distancia preestablecido.
# timer_us(Frecuencia, función): Llama a una función cada frecuencia en microsegundos.
# timer_ms(Frecuencia, función): Llama a una función cada frecuencia en milisegundos.
# timer_stop(): Detiene el timer.

CONEXIÓN DEL SENSOR HC - SR04

La conexión para esta prueba es la siguiente:

# Pin 12: Arduino UNO => Trigger: Sensor HC-SR04
# Pin 11: Arduino UNO => Echo: Sensor HC-SR04
# VCC: Arduino UNO => VCC: Sensor HC-SR04
# GND: Arduino UNO => GND: Sensor HC-SR04

En la siguiente figura se puede apreciar con más detenimiento:


EJEMPLO DE UTILIZACIÓN DE LA LIBRERÍA "NEW PING"

El programa de prueba es en base al ejemplo que nos da la librería "NewPing", pero para nuestro caso hemos aumentado dos variables más. La primera es una variable de almacenamiento o "cm" que graba la medición en cm del sensor; y una variable "ajuste" que es un número que debe ser modificado para calibrar el sensor, esto ante la posibilidad que el sensor nos de un valor mayor o menor a la distancia real entre el objeto y el sensor

/*
   PROGRAMA DE PRUEBA DE SENSOR HC-SR04

   CONEXION:
             TRIGGER: Pin 12 del Arduino UNO
             ECHO: Pin 11 del Arduino UNO
             GND: Conectar los dos GND
             VCC: Conectar los dos 5V
   
   En el siguiente programa probaremos el sensor HC - SR04 
   
   NOTA: Para el siguiente programa necesitamos la libreria "NewPing" se puede encontrar en el
   siguiente link https://www.dropbox.com/sh/2k5m76rxm6ew4sz/AAC4-ui2LQL9LZC30_bARyXja?dl=0
   
   Autor: Renato H.
   http://beetlecraft.blogspot.pe/

   El siguiente programa es de uso publico, cualquier modificacion o mal uso del mismo que pudiera 
   ocasionar el mal funcionamiento de la plataforma de uso de la misma no es responsabilidad del 
   autor
*/

#include <NewPing.h>

#define TRIGGER_PIN  12  // Pin designado para el pin Trigger en el Arduino UNO
#define ECHO_PIN     11  // Pin designado para el pin Echo en el Arduino UNO
#define MAX_DISTANCE 200 // Distancia máxima en cm

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // Configuracion de la libreria NewPing

const int ajuste = 4; // Medida de ajuste a la medicion que depende de cada sensor
int cm; // Dato de almacenamiento de la medicion 

void setup() {
  Serial.begin(115200); // Configuracion del puerto serial
}

void loop() {
  delay(50);            // Tiempo de espera para la medicion
  cm = sonar.ping_cm(); // Medicion del sensor
  cm = cm + ajuste;     // Ajuste a la medicion hecha  
  Serial.print("Distancia: ");
  Serial.print(cm); 
  Serial.println("cm");
}

El resultado es como el que se muestra en la siguiente figura:


Autor: 

Tutorial - GPS / Skylab SKM53

¿Qué es el GPS? 
Es un sistema de posicionamiento global, que permite determinar la posición de un objeto en todo el mundo con una precisión que va de los centímetros a los metros. Los datos para obtener dicha ubicación se determina a través de 24 satélites alrededor del mundo.

Para ubicar la posición en el mapa, usamos dos coordenadas angulares que se miden desde el centro de la Tierra.
  # Latitud: Corresponde a las coordenadas norte y sur.
  # Longitud: Corresponde a las coordenadas este y oeste.

Usaremos el mapa como referencia para determinar la ubicación aproximada de Arequipa. Trazamos dos líneas para obtener las coordenadas que son:
  # Latitud: 16 grados sur
  # Longitud: 71 grados oeste


El GPS que usamos en aplicaciones no nos proporciona las coordenadas directamente con el hemisferio. En cambio, las coordenadas se pueden reescribir de la siguiente manera:
  # Latitud: - 16 (Al estar debajo de la línea de demarcación de hemisferio norte y sur).
  # Longitud: -71 (Al estar a la izquierda de la línea de demercación del hemisferio oeste y este).

SKYLAB SKM53
El modelo usado para este tutorial es el modelo comercial SkyNav SKM53, esta placa de desarrollo contiene embebida una antena y no se necesitan mayores accesorios para hacerlo funcionar. Se aplica en:

  # Sistemas de navegación de vehículos.
  # PND - Artefactos de navegación portables.
  # Receptores GPS por Bluetooth.
  # Aplicación de temporizado.
  # Determinación de la velocidad de desplazamiento.

Algunas de las prestaciones que posee son las siguientes:
  # Sensibilidad de -165 dBM.
  # Velocidad de transferencia de datos de 9600 bps.
  # Protocolo NMEA.

Para mayor información tenemos el "Datasheet"

CONEXIÓN
Para realizar la prueba de funcionamiento usamos un Arduino Uno. La conexión que se debe realizar es de la siguiente manera:
  # RXD (GPS) ==> Pin 3 (Arduino Uno).
  # TXD (GPS) ==> Pin 2 (Arduino Uno).
  # GND (GPS) ==> GND (Arduino Uno).
  # VCC (GPS) ==> 5V (Arduino Uno).


SOFTWARE DE PRUEBA
Antes de poder escribir el programa, debemos bajar dos librerías que se adjuntan a la librería de Arduino IDE en nuestra PC. Primero bajamos la librería "TinyGPS 13" que nos permite manejar los periféricos del GPS, adquirir datos, etc. De la misma manera, debemos usar una librería especialmente hecha para poder comunicarse con este tipo de dispositivos "New Software Serial Library", esta funciona para versiones de Arduino actuales o a partir de la versión 1.0 en adelante.

Luego, implementamos el siguiente código en nuestro Arduino:
/*
   PROGRAMA DE PRUEBA: SkyNav SKM53 GPS
   CONEXION:
             RXD: Arduino Pin 3
             TXD: Arduino Pin 2
             GND: Arduino GND
             VCC: Arduino 5V
             NC y RST: Dejar sin conexion
             
   Para correr el programa se necesitan las librerias TinyGPS 13 (TinyGPS.h)
   y New Software Serial Library (NewSoftSerial.h)
   
   Se pueden encontrar en:
   https://github.com/mikalhart/TinyGPS/releases/tag/v13 
   http://arduiniana.org/libraries/newsoftserial/
   
   Tambien en el tutorial correspondiente en: http://beetlecraft.blogspot.pe/

   Autor: Renato H.
   http://beetlecraft.blogspot.pe/
   
   El siguiente programa es de uso publico, cualquier modificacion o mal uso del mismo que pudiera 
   ocasionar el mal funcionamiento de la plataforma de uso de la misma no es responsabilidad del autor
*/

#include <TinyGPS.h>        // Libreria de manejo del GPS
#include <SoftwareSerial.h> // Libreria de manejo de comunicacion serial alterna

long lat, lon;  // Variables auxiliares para lectura de longitud y latitud
float LAT, LON; // Variables auxiliares para latitud y longitud con punto decimal 

SoftwareSerial ss(2,3); // Pines usados para comunicacion con el GPS (RXD = 2, TXD = 3)
TinyGPS GPS; // Declaracion de cabecera para la funcion GPS

void setup(){
  ss.begin(9600);     // Velocidad de comunicacion del GPS (Segun hoja de datos)
  Serial.begin(9600); // Velocidad de comunicacion con la computadora
}

void loop(){
  lectura_serial(); // Lectura de la informacion del GPS
}

void lectura_GPS(){
  bool newdata = false;               // Variable auxiliar para ingreso de datos
  unsigned long start = millis();     // Variable auxiliar para refresh y update datos
  
  while (millis() - start < 1000){    // Update de lectura cada segundo
    if (feedgps ()){newdata = true;}  // Validacion de datos en la pila
  }
  if (newdata){informacion_gps(GPS);} // Ingreso de datos
}

bool feedgps(){
  while (ss.available()){      // Mientras exista informacion en la pila de datos
    if (GPS.encode(ss.read())) // Validacion de existencia de datos en la pila de datos
      return true;
  }
  return 0;
}

void informacion_gps(TinyGPS &GPS)
{
  GPS.get_position(&lat, &lon); // Byte de datos de latitud y longitud
  LAT = lat; // Adquicion de datos en decimales
  LON = lon; // Adquicion de datos en decimales  
  {
    feedgps(); // Sin esta funcion, puede causarse un error de suma
  }
}

void lectura_serial(){
  GPS.get_position(&lat, &lon);    // Adquicion de datos de latitud y longitud
  lectura_GPS();                   // Funcion de rutina de lectura del GPS
  Serial.print("Latitud : ");    
  Serial.print(LAT/1000000,10);    // Latitud en grados con diez decimales
  Serial.print(" :: Longitud : "); 
  Serial.println(LON/1000000,10);  // Longitud en grados con diez decimales
}
El resultado obtenido al abrir el puerto serial del Arduino IDE debe ser el siguiente:

 

COMPROBACIÓN DE LAS COORDENADAS OBTENIDAS
Los valores obtenidos deben ser parecidos a los siguientes (La latitud y longitud se miden de -90 a 90 grados):
  # Latitud: -16.4XXXXXXXXX
  # Longitud: -71.5XXXXXXXXX

Para visualizar los datos en Google Maps, podemos usar la siguiente página: http://itouchmap.com/latlong.html 

En la parte inferior derecha podemos ingresar estos datos, la que posee el encabezado "Show Point from Latitud and Longitude" y el resultado que se visualizado será parecido al siguiente:


ALGUNOS PROBLEMAS COMUNES
Inconvenientes comunes pueden presentarse mientras se aprende a usar este módulo. Algunos de ellos se describen a continuación:

# Insuficiente corriente en el GPS, se recomienda usar un puerto USB 3 si está alimentando el Arduino Uno al GPS. Si el caso persiste, es preferible usar una fuente de 5V separada para el GPS.
# Es posible que los valores que se miran en el visualizador del puerto serial sean "Longitud: 0.0000000000 :: Latitud: 0.0000000000", es normal mientras el GPS recibe los datos y los procesa, este proceso puede demorar unos cuantos segundos. Si los datos son los mismos es preferible realizar las mediciones cerca de una ventana abierta o en exteriores. 

Autor: