Capítulo 9. Sensores y actuadores Ejemplos prácticos

Imágenes

Códigos

Lectura del valor de una LDR a través del puerto Serie

//Declaramos la variable que recogerá el valor de la LDR
int valor;
void setup() {
//Inicializamos el puerto serie
Serial.begin(9600);
}
void loop() {
//Leemos A0 y se lo pasamos a la variable
valor=analogRead(A0);
//Pasamos el valor por el puerto serie
Serial.print("El valor leído es: ");
Serial.println(valor);
//El delay favorece la legibilidad
delay(100);
}

Encendido automático de un led ante la falta de luz

//Declaramos las variables valor y led
int valor;
int led=13;
//Fijamos el valor de comparación en 300, pero el usuario
//puede cambiarlo según su situación
const int valorLuz=300;
void setup() {
//Inicializamos el puerto serie
Serial.begin(9600);
//Establecemos led como salida digital
pinMode(led,OUTPUT);
}
void loop() {
//Leemos A0 y se lo pasamos a la variable
valor=analogRead(A0);
//Pasamos el valor por el puerto serie
Serial.print("El valor leído es: ");
Serial.println(valor);
//Si valor<valorLuz, significa que está oscuro
if (valor<valorLuz){
//Enciende si hay oscuridad
digitalWrite(led,HIGH);
}else{
//Apaga si hay luz
digitalWrite(led,LOW);
}
//El delay favorece la legibilidad
delay(100);
}

Uso de un sensor de ultrasonidos. Medición de distancias

//Definición de constantes para las tres patillas
const int led=8;
const int echo = 9;
const int trigger = 10;
void setup() {
//Inicializamos el puerto serie
Serial.begin(9600);
//pines de salida
pinMode(trigger, OUTPUT);
pinMode(led,OUTPUT);
digitalWrite(led,LOW);
//pin de entrada. Escribimos un 0 para evitar falsas lecturas
pinMode(echo, INPUT);
digitalWrite(trigger, LOW);
}
void loop()
{
long d=mideDistancia();
if (d<15){
digitalWrite(led,HIGH);
}else{
digitalWrite(led,LOW);
}
//Pasamos la información por el puerto serie
Serial.print("Distancia: ");
Serial.print(d);
Serial.println("cm");
//Pausa para facilitar la legibilidad del puerto serie
delay(100);
}
long mideDistancia(){
//Provocamos un impulso escribiendo un “1” en trigger
digitalWrite(trigger,HIGH);
//Esperamos un tiempo mínimo antes de cerrar trigger con un “0”
delayMicroseconds(10);
digitalWrite(trigger,LOW);
//Medimos el tiempo que tarda echo (pin de entrada) en leer un “1”
long tiempo=pulseIn(echo,HIGH);
//Hacemos el cálculo correspondiente y devolvemos el valor a la función principal
long distancia=tiempo/58.38;
return distancia;
}

Lectura de un sensor capacitivo

/*Sketch para ensayar un sensor capacitivo artesanal
Antonio Gómez García
IES Eduardo Valencia y Maestro Juan de Ávila
Esto es software abierto y podéis copiarlo, modificarlo
y distribuirlo a vuestro gusto, pero al menos mencionadme, malditos
This is Open Source Software. You can copy, modify and share it
whatever the way you choose, but you better damned mention me.
*/
//Incluir libreria
#include <CapacitiveSensor.h>
//Definimos el sensor capacitivo entre la patilla 2 (receptor) y 4 (emisor)
//a los pines 2-10 (receiver)
CapacitiveSensor tactil = CapacitiveSensor(4,2);
void setup() {
//Inicializamos puerto serie
Serial.begin(9600);
}
void loop() {
//Lectura del valor en
long valor = tactil.capacitiveSensor(30);
//Imprimimos valores
Serial.print("Valor leído: ");
Serial.println(valor);
delay(100);
}

Barrera accionada por servomotor gobernado por un sensor capacitivo

/*Barrera accionada por servomotor gobernada por un sensor capactivo
táctil
Antonio Gómez García
IES Eduardo Valencia y Maestro Juan de Ávila
Esto es software abierto y podéis copiarlo, modificarlo
y distribuirlo a vuestro gusto, pero al menos mencionadme, malditos
This is Open Source Software. You can copy, modify and share it
whatever the way you choose, but you better damned mention me.
*/
//Incluir libreria
#include <CapacitiveSensor.h>
#include <Servo.h>
//Definimos el sensor capacitivo entre la patilla 2 (receptor) y 4 (emisor)
//a los pines 2-10 (receiver)
CapacitiveSensor tactil = CapacitiveSensor(4,2);
//Definimos el servo asociado a la barrera
Servo barrera;
void setup() {
//Inicializamos puerto serie e inicializamos el servo
Serial.begin(9600);
barrera.attach(9);
barrera.write(0);
}
void loop() {
//Lectura del valor en
long valor = tactil.capacitiveSensor(30);
if (valor<3000){
barrera.write(0);
}else{
barrera.write(90);
}
//Imprimimos valores
Serial.print("Valor leído: ");
Serial.println(valor);
delay(100);
}

Efecto Hall. Encendido de un led por estar en presencia de un imán

//Definimos led y sensor
const int led = 13;
const int sensor = 5;
void setup() {
//Definimos entradas y salidas
pinMode(sensor, INPUT);
pinMode(led, OUTPUT);
}
void loop() {
if(digitalRead(sensor)==HIGH)
{
digitalWrite(led, HIGH);
}
else
{
digitalWrite(led, LOW);
}
//En esta ocasión no necesitamos ningún tipo de delay
}

Sensor DHT11. Lectura de temperatura ambiente y humedad relativa

//Incluimos la librería
#include "DHT.h"
//Declaramos un objeto de tipo DHT llamado sensor en el pin 2, modelo DHT11
DHT sensor(2,DHT11);
//Declaramos las variables que recogerán las lecturas del sensor
float h, Tc, Tf;
void setup() {
//Inicializamos el objeto DHT y el puerto serie
sensor.begin();
Serial.begin(9600);
}
void loop() {
//Hacemos las tres lecturas
h=sensor.readHumidity();
Tc=sensor.readTemperature();
Tf=sensor.readTemperature(true);
//Si alguna de las lecturas es nula, avisamos por el puerto Serie y reiniciamos el bucle principal
if (isnan(h) || isnan(Tc) || isnan(Tf)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
//Pasamos toda la información por el puerto serie
Serial.print("Humedad: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura ");
Serial.print(Tc);
Serial.print(" º C / ");
Serial.print(Tf);
Serial.println(" º F");
//Damos tiempo al sensor para que haga una nueva lectura antes de repetir
delay(2000);
}

Lectura digital de un sensor de infrarrojos

//Incluimos la librería
#include "DHT.h"
//Declaramos un objeto de tipo DHT llamado sensor en el pin 2, modelo DHT11
DHT sensor(2,DHT11);
//Declaramos las variables que recogerán las lecturas del sensor
float h, Tc, Tf;
void setup() {
//Inicializamos el objeto DHT y el puerto serie
sensor.begin();
Serial.begin(9600);
}
void loop() {
//Hacemos las tres lecturas
h=sensor.readHumidity();
Tc=sensor.readTemperature();
Tf=sensor.readTemperature(true);
//Si alguna de las lecturas es nula, avisamos por el puerto Serie y reiniciamos el bucle principal
if (isnan(h) || isnan(Tc) || isnan(Tf)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
//Pasamos toda la información por el puerto serie
Serial.print("Humedad: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura ");
Serial.print(Tc);
Serial.print(" º C / ");
Serial.print(Tf);
Serial.println(" º F");
//Damos tiempo al sensor para que haga una nueva lectura antes de repetir
delay(2000);
}

Lectura analógica de un sensor de infrarrojos

//Lectura analógica de un sensor de infrarrojos
void setup() {
//Inicializamos el sensor
Serial.begin(9600);
}
void loop() {
// Hacemos lectura analógica y la asignamos a la variable local valor
int valor=analogRead(A0);
Serial.println(valor);
delay(100);
}

Printbot Renacuajo. Programación de un robot siguelíneas

//Incluimos la librería
#include <Servo.h>
//Definimos los sensores y el valor de la velocidad por defecto
const int sDer = 2;
const int sIzq = 3;
const int velocidad=45;
Servo mDer;
Servo mIzq;
//Declaramos las funciones adelante, izquierda y derecha
void adelante (){
//Activamos ambos motores
mDer.write(90+velocidad);
mIzq.write(velocidad);
}
void izquierda (){
//Desactivamos motor izquierdo
mDer.write(90+velocidad);
mIzq.write(90);
}
void derecha(){
//Desactivamos motor derecho
mDer.write(90);
mIzq.write(velocidad);
}
//Configuración del robot
void setup(){
//Configuramos los pines de los sensores como entradas
pinMode(sDer, INPUT);
pinMode(sIzq, INPUT);
//Vinculamos los motores a las patillas 9 y 10
mDer.attach(9);
mIzq.attach(10);
}
//Bucle principal
void loop(){
//Si pisamos la linea negra por la derecha, girar a la derecha
if(digitalRead(sDer)==HIGH){
derecha();
}
//Si no se cumple la primera condición de desvío, comprobamos la contraria
else if(digitalRead(sIzq)==HIGH){
izquierda();
}
//Si no se cumple ninguna de ambas condiciones, seguimos recto
else {
adelante();
}
//Esperamos un tiempo prudencial
delay(100);
}