Documentos de Académico
Documentos de Profesional
Documentos de Cultura
LED1=Rojo
LED2= Verde
Cabe resaltar que utilizamos un motor para realizar una representación del
ventilador.
#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
void loop() {
float t = dht.readTemperature();
if (t >=Temp){
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
}
digitalWrite(8,LOW);
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
}
delay(3000);
Espero que esta información sea de gran utilidad para ustedes.
Entre las desventajas pues, el DHT11 solo lee enteros, no podemos leer
temperaturas con decimales por lo que tenemos que pensarlo muy bien
a la hora de utilizar este sensor para trabajos en los que se requieran
lecturas precisas de temperatura y/o humedad. En fin, vamos a lo que
vamos. Para poder leer datos desde este sensor de una forma sencilla
necesitamos descargar una librería que ha sido escrita para este
propósito.
Hay tutoriales que explican como leer este sensor sin dicha librería, sin
embargo el tema es bastante complicado para alguien que no esté
acostumbrado a programar. Se necesita leer una onda cuadrada en la
cual se envían los bits con separaciones de unos cuantos
microsegundos. La verdad prefiero usar la librería DHT11.
void setup() {
void loop() {
//Se imprimen las variables
Serial.println("Humedad: ");
Serial.println(h);
Serial.println("Temperatura: ");
Serial.println(t);
.
Cuando subamos el código al micro, vamos al Monitor Serial y
obtenemos el siguiente resultado:
Cada 2 segundos obtendremos una nueva lectura.
Herramientas de control para Arduino: El
BJT o Transistor de Unión Bipolar (NPN y
PNP)
Una breve reseña sobre lo que es el transistor BJT, tanto el NPN como
el PNP y los usos que le podemos dar a estos dispositivos con nuestro
Arduino, como una herramienta potenciadora de las capacidades de
corriente y voltaje de nuestro microcontrolador.
Transistor NPN
El colector del transistor se coloca a una carga, por ejemplo un LED. El
emisor se coloca a GND. Cuando se aplique voltaje a la base, se creará
un puente entre el emisor y el colector, haciendo que la carga quede
conectada a GND y se cierre el cieruito. Veamos:
Como vemos, cuando se aplica un voltaje a la base, el “switch” se cierra.
Nótese que en la base sólo se aplican 5 voltios, pero el LED está
funcionando con 9 voltios. Esto quiere decir que se pueden manipular
tensiones mucho mayores a las soportadas por algún dispositivo de
control (como Arduino) con solo un pequeño pulso.
Transistor PNP
Funciona casi como el transistor NPN, sin embargo se conecta entre la
fuente de poder y la carga, no entre la carga y el GND como el transistor
NPN. Veamos:
Lo que haremos es encender un LED utilizando un transistor NPN. En el
siguiente video se muestra el funcionamiento del BJT y su posterior
implementación con Arduino.
Transistor NPN
LEDs
JUN
29
Material Necesario
1. Arduino Uno
2. Breadboard con Puentes de Conexion
3. Sensor de Temperatura DHT22
4. Display LCD 16x2 LMB162HBC
5. Resistencia variable de 10K Ohm
6. Resistencia 1/4w 10K Ohm
7. Tira de 40 Pines Macho
Esquema de Montaje
Sketch Arduino
#include <LiquidCrystal.h>
//Llamamos a la libreria para controlar el LCD incluida en el IDE de A
rduino
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);
//Definimos los pines asignados al LCD según el esquema de conexión
#include "DHT.h"
//Llamamos a la libreria de los sensores DHT instalada previamente
#define DHTPIN 2
#define DHTTYPE DHT22
//Definimos el pin de Arduino al que conectamos el pin de datos del s
ensor e indicamos el tipo de sensor (DHT22)
DHT dht(DHTPIN, DHTTYPE);
void setup(){
Serial.begin(9600);
Serial.println("Prueba DHT22");
//Iniciamos la comunicacion Monitor Serial y editamos un texto descrip
tivo
dht.begin();
//Iniciamos el sensor
}
void loop(){
delay(2000);
//Establecemos un retraso porque el DHT22 solo realiza una lectura ca
da 2 segundos
float h = dht.readHumidity();
float t = dht.readTemperature();
//Establecemos dos variables, una para la temperatura en ºC y otra pa
ra la humedad relativa en %
if (isnan(h) || isnan(t)) {
Serial.println("Error al Leer Sensor DHT¡");
return;
//Con la funcion isnan controlamos que el valor recibido del sensor se
a un número, sino dara error
}
Serial.print("Humedad: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.println(" *C ");
//Mostramos la información obtenida (temperatura y humedad) en el Mo
nitor Serial
//El \t es equivalente al tabulador (separa los datos)
//El Serial.prinln nos cambia de linea en la siguiente lectura recibida
lcd.begin(16, 2);
//Indicamos el LCD que usamos: 16 caracteres y 2 lineas
lcd.setCursor(0,0);
//Situamos el cursor en la posicion 0 de la primera linea
lcd.write("Temperatura: ");
lcd.setCursor(12,0);
lcd.print(t);
lcd.setCursor(14,0);
lcd.write((char)223);
//Editamos el simbolo de los grados º
lcd.setCursor(15,0);
lcd.write("C");
lcd.setCursor(0,1);
lcd.write("Humedad: ");
lcd.setCursor(9,1);
lcd.print(h);
lcd.setCursor(14,1);
lcd.write("%");
}
float f = dht.readTemperature(true);
float hi = dht.computeHeatIndex(f, h);
3
OBJETIVOS
MATERIAL REQUERIDO
Una Protoboard más cables.
Hemos ido viendo hasta ahora como utilizar un sensor de temperatura y también como usar
un pequeño transistor para mover un motor de CC, pero no los habíamos mezclado.
Como no disponemos de ningún sistema a refrigerar, nos conformaremos con enfriar el propio
sensor, lo que no resulta especialmente provechoso, pero sin duda, nos servirá para
mostraros un ejemplo de control y reacción, en el mejor espíritu de un sistema automático, tal
como un regulador de temperatura con nuestros Duinos.
Veremos que la regulación de un sistema tan sencillo no tiene grandes problemas y por eso
esta sesión esta mas pensada como un ejercicio de control sencillo y que como una
regulación en toda regla.
Además el parámetro que buscamos controlar, la temperatura, tiene la virtud de variar con
lentitud, lo que nos deja mucho tiempo para reaccionar y no tener que preocuparnos por
cuestión de reaccionar con precisión en tiempo real.
Vamos a montar un pequeño circuito que lea la temperatura de un sensor, imprima el valor en
la consola y encienda un diodo cuando esta sobrepase un cierto umbral.
Para conectar el sensor de temperatura LM35DZ y el transistor 2N2222, os incluyo el detalle
de sus pines aquí
Ya hemos visto en sesiones previas como usar un sensor LM35DZ, pero si alguno queréis
revisarlo podéis hacerlo aquí: Sensor de temperatura.
Vamos a empezar probando el sensor para comprobar que funciona correctamente, y para
ello vamos a usar este programa:
void setup()
void loop()
Serial.println(temp) ;
delay(200);
samos la puerta Analog0 que definimos como una constante sensor, y en el loop leemos la
puerta y convertimos el valor de la lectura a grados centígrados (Recordad que la razón de
hacerlo así la vimos en la sesión de los sensores de temperatura) e imprimimos sin más el
valor de la temperatura. Deberías ver algo parecido a esto:
:
El sensor LM35DZ tiene un margen de error de alrededor de ± 0,5 grados y por eso las
lecturas tienen oscilación, dando diferencias de hasta un grado.
El baile de las lecturas se debe a que el mundo real nunca es perfecto y hay cosas que van
desde la incertidumbre de la medida causada por el propio sensor hasta los errores en los
convertidores de nuestro Arduino (Que no son los mejores del mundo) e incluso interferencias
electromagnéticas espurias.
Todo ello se confabula para que tengamos ese molesto baile de cifras en la medida y aunque
en este caso no tiene importancia puede convenirnos filtrar este tipo de errores y para ello
podemos promediar las n ultimas lecturas y presentar esto como el valor de la temperatura.
Para ello podemos guardarlas digamos 8 últimas lecturas y promediarlas, con lo que
aplanaremos fuertemente los errores, y la manera más sencilla es usar un buffer circular (O
Ring Buffer)
La forma de apuntar a la posición a escribir es una variable llamada Índex que empieza en 0 y
cada vez que escribe en la posición correspondiente se incrementa en 1 ¿Y cómo evitamos
que pase del valor máximo aceptable? Pues tomando el resto del valor de Índex con respecto
al número de posiciones del array.
index = ++index % 8 ;
Una vez que apuntamos correctamente a la posición a escribir y después de los N valores
iniciales en los que la temperatura promedio será falsa (Porque aún no hemos leído N valores)
tendremos en Buffer las ultimas N lecturas y el resto es aritmética:
int index = 0 ; // Posicion a escribir
index = ++index % N ;
float Tmedia = 0 ;
Serial.println( Tmedia / N) ;
Aquí os dejo el programa complete, por si quieres jugar con el: Prog_130_2. Para N = 32
podéis ver algo así:
Podéis ver que la temperatura baila mucho menos y el baile desciende a medida que
aumentáis el número de muestras que promediáis, pero cuidado, cuanto más crece N también
crece el tiempo que tardáis en responder a los cambios ( Para N = 32 a 5 muestras por
segundo hay más de 6 segundos de tiempo de reacción).
INCLUYENDO EL VENTILADOR
void setup()
{ Serial.begin(115200);
pinMode(control, OUTPUT) ;
}
void loop()
Serial.println(temp) ;
digitalWrite(control, HIGH);
else
digitalWrite(control, LOW);
delay(200);