Sensor de luz con Arduino UNO

En esta página se muestra el uso del sensor de luz (Light Sensor Brick) con Arduino UNO. Este sensor puede funcionar como sensor analógico o sensor digital. Aquí se ejemplifica el uso analógico, con valores entre 0 y 1023.

Material usadoLightSensorBrick

1 Arduino UNO
1 Sensor de luz (Ligth Sensor Brick)
3 Cables hembra-macho

El sensor tiene una fotorresistencia, la cual se usa para detectar la cantidad de luz en el ambiente. También tiene un interruptor, con el cual se configura el sensor para enviar valores digitales o analógicos. Para el programa siguiente debe estar en la posición A (analógico).

Programa LightSensorBrick.ino

/* LightSensorBrick.ino
* Julio C. Sandria Reynoso - 24-Mayo-2017
* Este programa monitorea un sensor de luz del tipo
* Light Sensor Brick
*/

int lightValue = 0; // Muy iluminado 0..1023 Muy obscuro
 
void setup() {
  pinMode(A0, INPUT);
  Serial.begin(9600);
  Serial.println("Iniciando programa...");
  Serial.println("Valor\tSituacion");
}

void loop() {
  lightValue = analogRead(A0);
  Serial.print(lightValue);
  Serial.print("\t");
  if( lightValue < 205 )
    Serial.println("Muy iluminado");
  else if( lightValue < 410 )
    Serial.println("Iluminado");
  else if( lightValue < 615 )
    Serial.println("Sombreado");
  else if( lightValue < 820 )
    Serial.println("Obscuro");
  else
    Serial.println("Muy obscuro");
  delay(1000);
}

 

Sensor de presión BMP180 con Arduino UNO

BMP180En esta página se muestra el uso del sensor de presión barométrica BMP180 con Arduino UNO. Con este sensor también se puede obtener la temperatura y altura sobre el nivel del mar.

Material usado

1 Arduino UNO
1 Sensor BMP180
4 Cables hembra-macho

Libería

SFE_BMP180.zip que se puede descargar de esta misma página. La página oficial de la librería está en la dirección https://github.com/sparkfun/BMP180_Breakout.

El programa que se muestra aquí está basado en el Tutorial sensor de presión barométrica, en el cual se hace una muy buena explicación de la librería.

Diagrama de conexión del sensor BMP180 con Arduino UNO:

UNO-and-BMP180

Programa SensorBMP180.ino

/* 
* SensorBMP180.ino
* Julio C. Sandria Reynoso - 23-Mayo-2017
* Este programa toma la Temperatura y Presión de un sensor
* BMP180 conectado a Arduino UNO
* Esta basado en el Tutorial sensor de presion barometrica
* http://www.naylampmechatronics.com/blog/43_Tutorial-sensor-de-presi%C3%B3n-barom%C3%A9trica-BMP180.html
*/

#include <SFE_BMP180.h>
#include <Wire.h>

SFE_BMP180 bmp180;
char statusBmp180;
double P,T,A,PNivelMar=1013.25; //presion sobre el nivel del mar en mbar

void setup() {
  Serial.begin(9600);
  Serial.println("Iniciando programa...");
  delay(1000);

  if (bmp180.begin()) {
    Serial.println("Sensor BMP180 iniciado correctamente");
    Serial.println();
    Serial.println("  P mbar = Presion barometrica en milibares");
    Serial.println("  T *C = Temperatura en grados Celcius");
    Serial.println("  A msnm = Altura en metros sobre el nivel del mar");
    Serial.println();
  } else {
    Serial.println("Error al iniciar sensor BMP180");
  }
  Serial.println("P mbar\tT *C\tA msnm");
}

void loop() {
  delay(1000);
  if( leerBmp180() ) {
    Serial.print(P,2);
    Serial.print("\t");
    Serial.print(T,2);
    Serial.print("\t");
    Serial.println(A,2);
  } else
    Serial.println("pp.pp\ttt.tt\taa.aa?");
}

boolean leerBmp180() {
  //Inicio de lectura de temperatura
  statusBmp180 = bmp180.startTemperature(); 
  if (statusBmp180 != 0) {
    //Pausa para que finalice la lectura
    delay(statusBmp180); 
    //Obtener la temperatura
    statusBmp180 = bmp180.getTemperature(T); 
    if (statusBmp180 != 0) {
      // Inicio lectura de presión
      statusBmp180 = bmp180.startPressure(3); 
      if (statusBmp180 != 0) {
        //Pausa para que finalice la lectura
        delay(statusBmp180); 
        //Obtenemos la presión
        statusBmp180 = bmp180.getPressure(P,T); 
        if (statusBmp180 != 0) {
          A = bmp180.altitude(P,PNivelMar);
          return true; // Se tomo lectura de Temperatura, Presion y Altitud
        }      
      }      
    }   
  }
  return false; // No se tomo lectura de Temperatura, Presion y Altitud
} // leerBmp180

Ejemplo de corrida

Iniciando programa...
Sensor BMP180 iniciado correctamente
  T *C = Temperatura en grados Celcius
  P mbar = Presion barometrica en milibares
  A msnm = Altura en metros sobre el nivel del mar
T *C	P mbar	A msnm
26.11	866.66	1298.90
26.10	866.64	1299.06
26.10	866.61	1299.38
26.10	866.60	1299.45
26.08	866.61	1299.37
26.09	866.63	1299.15
26.09	866.64	1299.08
26.09	866.65	1298.94
26.10	866.65	1298.97
26.10	866.63	1299.17

 

Sensores de humedad y temperatura DHT11 y DHT22 con Arduino UNO

En este artículo se ejemplifica el uso de los sensores de humedad y temperatura DHT11 y DHT22 con Arduino UNO. El segundo sensor es más preciso en las mediciones, aunque, un poco más caro.

Material usado:

1 Arduino UNO
1 Sensor DHT11
1 Sensor DHT22
1 Protoboard
6 Cables hembra-macho
2 Cables macho-macho

Los ejemplos que se muestran aquí están basados en la libreria DHT de Mark Ruys disponible en https://github.com/markruys/arduino-DHT. Una característica de esta librería es que autodetecta el modelo de sensor, por lo que con el mismo programa se puede usar cualquiera de los dos sensores.

Conectores

En la siguiente imagen se muestran los cuatro conectores de ambos sensores.

DHT11-DHT22-v1-ch

En los programas mostrados a continuación los pines se conectan de la siguiente forma:

  1. VCC: al Pin 5V de Arduino.
  2. Data: al Pin 2 ó 3 de Arduino.
  3. NC: No conectado.
  4. Gnd: al Pin Gnd de Arduino.

Programa DHTxx_Ejemplo.ino

Programa ejemplo que obtiene la humedad y temperatura del sensor DHT11 o DHT22.

/*
* DHTxx_Ejemplo.ino
* Julio C. Sandria Reynoso - 22-Mayo-2017
* Ejemplo de uso de sensores de humedad y temperatura 
* DHT11 y DHT22
*
* Basado en la libreria DHT de Mark Ruys disponible en
* https://github.com/markruys/arduino-DHT
*/

#include "DHT.h"

DHT dht;

void setup() {
  dht.setup(2); // Pin data del DHT en Pin 2 de Arduino
  Serial.begin(9600);
  Serial.println("Iniciando DHTxx_Ejemplo...");
  Serial.println("Humedad\tTemperatura");
}

void loop() {
  delay(2000); // Pausa de 2 segundos
  Serial.print(dht.getHumidity());
  Serial.print("\t");
  Serial.println(dht.getTemperature());
}

Teniendo conectado a Arduino el sensor DHT11, este programa envió al Monitor Serie lo siguiente:

Iniciando DHTxx_Ejemplo...
Humedad Temperatura
57.00   29.00
57.00   30.00
57.00   30.00
57.00   30.00
57.00   29.00

Cuando se conectó el sensor DHT22 a Arduino, el resultado fue el siguiente:

Iniciando DHTxx_Ejemplo...
Humedad Temperatura
58.40   29.50
58.50   29.60
64.70   29.60
69.80   29.60
74.10   29.80
77.70   30.00
80.40   30.30
82.50   30.50

A diferencia del sensor DHT11, el DHT22 es más preciso, ya que también obtiene decimales para humedad y temperatura. A partir de la línea 7 empezaron a subir los valores de humedad y temperatura porque el sensor se sujetó dentro del puño cerrado.

Programa DHTxx_Ejemplo2.ino

En este ejemplo se usaron ambos sensores para comparar sus mediciones. El pin Data del DHT11 está conectado al pin 3 de Arduino, mientras que el pin Data del DHT22 está conectado al pin 2 de Arduino.

Arduino_UNO-DHT11-DHT22

Este programa toma la lectura de ambos sensores, DHT11 y DHT22 conectados a una tarjeta Arduino UNO.

/*
* DHTxx_Ejemplo2.ino
* Julio C. Sandria Reynoso - 22-Mayo-2017
* Ejemplo de uso de sensores de humedad y temperatura
* DHT11 y DHT22
*
* Basado en la libreria DHT de Mark Ruys disponible en
* https://github.com/markruys/arduino-DHT
*/
#include "DHT.h"
DHT dht11;
DHT dht22;

void setup() {
  dht22.setup(2); // Pin data del DHT22 en Pin 2 de Arduino
  dht11.setup(3); // Pin data del DHT11 en Pin 3 de Arduino
  Serial.begin(9600);
  Serial.println("Iniciando DHTxx_Ejemplo2...");
  Serial.println("DHT11\t\tDHT22\t");
  Serial.println("Hum\tTemp\tHum\tTemp");
}

void loop() {
  delay(2000); // Pausa de 2 segundos
  Serial.print(dht11.getHumidity());
  Serial.print("\t");
  Serial.print(dht11.getTemperature());
  Serial.print("\t");
  Serial.print(dht22.getHumidity());
  Serial.print("\t");
  Serial.println(dht22.getTemperature());
}

Para este programa, el Monitor Serie mostró los siguiente:

Iniciando DHTxx_Ejemplo2...
DHT11	     	DHT22	
Hum  	Temp 	Hum  	Temp
55.00	29.00	58.20	29.60
56.00	29.00	58.20	29.60
56.00	29.00	58.10	29.50
55.00	29.00	58.10	29.50
55.00	29.00	58.10	29.50
56.00	29.00	58.10	29.50
56.00	29.00	58.10	29.50
56.00	29.00	58.10	29.50
55.00	29.00	58.20	29.50
56.00	28.00	58.30	29.60

Referencias

  • Libreria DHT de Mark Ruys.
  • Ficha técnica del sensor DHT22.

Sensor infrarrojo (IR) TSOP1100

El sensor infrarrojo de la serie TSOP1100 tiene un receptor miniaturizado diseñado para sistemas de control remoto infrarrojo. Documentación técnica: Sensor-IR-TSOP1100.

Sensor-IR-TSOP1100

Jairo Herrera muestra el uso de este sensor con una tarjeta Arduino UNO y un control remoto en la página Arduino + Sensor IR + Ctrl Remoto.

En robótica, se puede usar este sensor para enviarle comandos a un robot mediante un control remoto o con cualquier otro dispositivo que emita una señal infrarroja, por ejemplo, la pelota IR usada con robots futbolistas en RoboCupJunior Soccer.

 

Robot Sanduino – Busca negro

El programa siguiente, hace que el robot Sanduino avance mientras detecta el suelo blanco. Cuando en el suelo detecta el color negro se detiene.

/* Programa: SanduinoBuscaNegro.ino
   Autor:    Julio Sandria (Enero 2015)
             Taller de Robótica 2015
   Robot Sanduino usando un sensor de luz 
*/

int pinSensorLuz = 2;
int valorSensorLuz = 0;
int tAvanza = 50;
int tAlto = 40;

void setup() {
  pinMode(pinSensorLuz,INPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  delay(3000);
}

void loop() {
  valorSensorLuz = digitalRead(pinSensorLuz);

  if( valorSensorLuz == 0 ) avanza(tAvanza);

  alto(tAlto);
}

/* Se define la función avanza()
   ms = tiempo en milisegundos */
void avanza(int ms) {
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  delay(ms);
}

/* Se define la función alto()
   ms = tiempo en milisegundos */
void alto(int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  delay(ms);
}

Copia el programa en el software Adruino y cárgalo a la tarjeta Arduino del Robot Sanduino. El robot debe tener conectado el sensor de luz izquierdo al pin 2 de Arduino.

Prueba el robot colocándolo en una superficie blanca o clara y déjalo avanzar hacia un superficie negra u obscura.

Observa el uso de las funciones avanza() y alto(), las cuales permiten unir cierta funcionalidad que siempre se repite.

De este ejemplo se deriva el programa para el Robot Sanduino Seguidor de línea.

Robot Sanduino seguidor de línea

En el siguiente video se muestra el Robot Sanduino A01 seguidor de línea.

El programa siguiente, es la versión inicial para lograr que el robot siga la línea como se muestra en el video.

/* Programa: SanduinoSigueLinea.ino
   Autor:    Julio Sandria (Enero 2015)
             Taller Robótica 2015
   Robot Sanduino seguidor de línea 
   con dos sensores de luz             
*/

int pinSensorLuzI = 2;
int pinSensorLuzD = 4;
int valorSensorLuzI = 0;
int valorSensorLuzD = 0;
int tAvanza = 50;
int tGiro = 50;
int tAlto = 50;

void setup() {
  pinMode(pinSensorLuzI,INPUT);
  pinMode(pinSensorLuzD,INPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  delay(3000);
}

void loop() {
  valorSensorLuzI = digitalRead(pinSensorLuzI);
  valorSensorLuzD = digitalRead(pinSensorLuzD);

  if( valorSensorLuzI == 0 && valorSensorLuzD == 0 ) {
    avanza(tAvanza); 
  } 
  
  if( valorSensorLuzI == 1 ) {
    izquierda(tGiro);
  } 
  
  if( valorSensorLuzD == 1 ) {
    derecha(tGiro);
  }  
  
  alto(tAlto);
}

void avanza(int ms) {
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  delay(ms);
}

void retrocede(int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(ms);  
}

void izquierda(int ms) {
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(ms);  
}

void derecha(int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  delay(ms);
}

void alto(int ms) {
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  delay(ms);
}

Copia el programa en el software Arduino y cárgalo a la tarjeta Arduino del Robot Sanduino A01.

¿Quieres aumentar la velocidad del robot? Prueba cambiando poco a poco las variables tAvanza, tGiro y tAlto.

 

Robot Sanduino – Sensor ultrasónico

El robot Sanduino A01 está equipado con un sensor ultrasónico HC-SR04 como el de la figura siguiente.

sensor-ultrasonico-hc-sr04_3

Para usar este sensor debes descargar la librería NewPing que está en esta dirección: http://playground.arduino.cc/Code/NewPing.

Es un archivo comprimido en formato zip que debes descomprimir, y la carpeta NewPing copiarla a la carpeta Arduino\libraries que debe estar en tu carpeta Documentos.

Este sensor lo puedes probar con el siguiente programa.

/* Programa: SensorUltrasonico.ino
 Autor: Julio Sandria (Enero 2015)
 Taller Robótica 2015 
*/

// Descargar NewPing: http://playground.arduino.cc/Code/NewPing
// Copia la carpeta NewPing en la carpeta ..\Arduino\libraries
#include <NewPing.h>

// PIN TRIGGER de sensor ultrasónico a PIN 11 de Arduino.
#define PIN_TRIGGER 11
// PIN ECHO de sensor ultrasónico a PIN 12 de Arduino:
#define PIN_ECHO 12
// Máxima distancia a medir en centímetros:
#define MAX_DISTANCIA 200 
// La distancia máxima del sensor es 400-500 cm. 

// La siguiente linea configura pines y distancia.
NewPing sonar(PIN_TRIGGER, PIN_ECHO, MAX_DISTANCIA);

int uS, distancia;

void setup() {
 // Abrir monitor serial a 9600 bauds/seg para ver resultados:
 Serial.begin(9600); 
}

void loop() {
 // Esperar 500ms entre pings (cerca de 20 pings/sec).
 // 29ms debe ser el menor tiempo entre pings.
 delay(500); 
 
 // Envía ping, obtiene tiempo ping en microsegundos (uS): 
 uS = sonar.ping();
 
 // Convertir tiempo ping a distancia.
 // (0 = distancia fuera de rango, no hay eco de ping).
 distancia = uS / US_ROUNDTRIP_CM; 
 
 Serial.print("Distancia: ");
 Serial.print(distancia); // Imprimir distancia 
 Serial.println("cm");
}

Copia el programa en el software Arduino y cárgalo a la tarjeta Arduino. Una vez cargado el programa y con la tarjeta aún conectada a la computadora, abre el Monitor Serial, en el cual podrás ver la lectura del sensor ultrasónico.

Acerca un objeto al sensor para verificar que esté funcionando apropiadamente.

Robot Sanduino – Sensores de luz

El robot Sanduino A01 está equipado con dos sensores de luz TCRT5000. Este sensor emite una luz infrarroja y detecta la cantidad de luz que se refleja en los objetos.

Sensor-de-luz-TCRT5000-300x200

Al colocar el emisor/receptor hacia el piso, puede detectar una línea negra colocada sobre un piso claro. Al usarlo así se le llama también sensor de línea. El emisor/receptor debe estar a una distancia aproximada de 5mm del piso y colocado como lo muestra la siguiente figura.

Sensores-de-linea-Sanduino-800x400

Cada sensor de luz tiene cuatro conectores, ambos sensores se deben conectar así en el robot Sanduino:

  • VCC – Al positivo del protoboard, que está conectado a 5V de Arduino.
  • GND – Al negativo del protoboard, que está conectado a GND de Arduino.

Para el sensor izquierdo:

  • DO (Data Output) – Al pin 2 de Arduino.
  • AO (Analog Output) – No lo usamos.

Para el sensor derecho:

  • DO (Data Output) – Al pin 4 de Arduino.
  • AO (Analog Output) – No lo usamos.

Con estas conexiones, se puede probar este programa ejemplo:

/* Programa: SensorLuz1.ino 
   Autor:    Julio Sandria (Enero 2015)
   Requiere un sensor de luz TCRT5000 conectado al
   pin 2 de Arduino.
*/

int pinSensorLuz1 = 2;
int valorSensorLuz1 = 0;
int valorSensorLuz1anterior = -1;

void setup() {
  pinMode(pinSensorLuz1,INPUT);
  Serial.begin(9600);
  Serial.println("Esperando 3 segundos...");
  delay(3000);
}

void loop() {
  valorSensorLuz1 = digitalRead(pinSensorLuz1);
  if( valorSensorLuz1 != valorSensorLuz1anterior ) {
    Serial.print( "valorSensorLuz1 = " );
    Serial.println( valorSensorLuz1 ); 
  }
  valorSensorLuz1anterior = valorSensorLuz1;
  delay(1000);
}

Copia el programa en el software Arduino y cárgalo a la tarjeta Arduino. Una vez cargado en Arduino, abre el Monitor Serial.

Observa lo que se muestra en el Monitor Serial cuando apuntas el sensor a una superficie clara y a una superficie obscura.

Robot Sanduino – Motores CD

El Robot Sanduino A01 usa dos motores de Corriente Directa (CD), los cuales se pueden conectar como se muestra en la siguiente figura.

SanduinoA01-MotoresCD

El puente H y la tarjeta Arduino UNO deben estar atornillados a la base superior del Robot Sanduino A01, usando un espaciador entre cada tarjeta de circuitos y la base superior, para evitar que las tarjetas se tuerzan al apretar los tornillos.

Las líneas de colores que unen conectores representan cables, que no necesariamente son de los colores mostrados.

Con el siguiente programa, puedes probar que todo el sistema esté apropiadamente conectado.

/* Programa: Sanduino_Motores.ino
   Autor: Julio Sandria (Enero 2015)
   Requiere: Robot Sanduino A01, con puente H
   y Arduino UNO conectados.
   Mueve el motor izquierdo con pines 6 y 7
   Mueve el motor derecho con pines 8 y 9
*/

void setup() {
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
}

void loop() {
  // Robot avanza 2 segundos
  digitalWrite(6,HIGH);
  digitalWrite(7,LOW);
  digitalWrite(8,HIGH);
  digitalWrite(9,LOW);
  delay(2000);
  
  // Robot retrocede 2 segundos
  digitalWrite(6,LOW);
  digitalWrite(7,HIGH);
  digitalWrite(8,LOW);
  digitalWrite(9,HIGH);
  delay(2000);  
}

Carga el programa en la tarjeta Arduino UNO del robot.

NOTA: Asegúrate de conectar una fuente de energía al interruptor y otra fuente de energía a Arduino UNO.

Al iniciar el programa, el robot debe avanzar dos segundos. Si en lugar de esto el robot retrocede, entonces hay que cambiar la polaridad de los cables conectados a los motores y al puente H.

Si al iniciar el programa, el robot gira hacia un lado dos segundos, hay que invertir la polaridad de los cables del motor conectado hacia el lado que gira.

Riego automatizado de plantas con Arduino

El cuidado de las plantas que tenemos en el jardín o macetas en nuestra casa, escuela u oficina, es muchas veces una actividad relajante y que nos da un rato de distracción de nuestras actividades rutinarias. Pero esto ya no es relajante cuando no tenemos el “don” o el tiempo para cuidarlas y vemos cómo se van muriendo poco a poco las pobres plantitas por falta o exceso de agua, luz o temperatura.

De modo que a quienes nos gusta hacer uso de la tecnología, generalmente aprovechamos cuanta ocasión se nos presenta para hacerlo…

Puedes leer más información de este proyecto en la página siguiente:

Cómo mimar tus plantas con tecnología digital