Introduction: Domótica Básica Con Arduino

About: Somos el espacio de imaginación, experimentación y prototipado de la PUCV.

¡Hola a tod@s! En esta sección revisaremos como crear un sistema básico de domótica para que nos muestre la temperatura del lugar, si hay movimiento en un lugar donde no debería y si hay gases tóxicos o no, para ver el proyecto ya terminado puedes dirigirte a nuestra página de Tinkercad acá.

¿List@ para aprender?

Supplies

Los materiales a usar son:

  • 1 x Arduino UNO (o equivalente).
  • 1 x Sensor TMP36.
  • 1 x Sensor MQ-6.
  • 1 x Sensor PIR.
  • 1 x LCD 16x2.
  • 1 x Buzzer.
  • 1 x Resistencia 20k Ohm.
  • 1 x Resistencia 220 Ohm.
  • 2 x Pulsador.
  • 2 x Resistencia 1k Ohm.
  • 2 x Condensador 100 nF.

Step 1: ¡Preparemos La Base Para Trabajar!

Es momento de preparar la base para trabajar, entonces:

  1. Primero que nada debemos cambiar a la pestaña de "todos los elementos" tal cual muestra la imagen 1.
  2. Una vez ahí hay que buscar la sección de protoboards y arrastrar la pequeña y la normal al espacio de trabajo como aparece en la imagen 2.
  3. Luego debemos conectar las lineas de alimentación.

¡Listo! Ahora pasaremos a armar la siguiente parte.

Step 2: ¡Agreguemos Los Componentes! - Botones + Buzzer

Los pasos a seguir para esta sección son:

  1. Buscar el buzzer y arrastrarlo a la protoboard pequeña (imagen 1).
  2. Buscar el condensador y arrastrar dos a la protoboard pequeña en las posiciones especificadas en la imagen 2, ambos deben ser e 100 nF, luego arrastrar dos pulsadores al lado de estos.
  3. Encontrar la resistencia en la lista de componentes para luego arrastrala al espacio de trabajo, rotarla mediante el botón de giro (apretalo 3 veces) tal cual se ve en la imagen 3, el valor de la resistencia debe ser de 1k Ohm.
  4. Poner dos de estos en la posición indicada en la imagen 4.
  5. Luego arrastrar otras dos resistencias al lugar indicado en la imagen 5, debes cambiar los valores de ambas a 10k Ohm.
  6. Por último se realizan las conexiones a tierra (cables negros de la imagen 6) ya la Arduino (cables verdes de la imagen 6).

¡Listo! ¿Qué sigue?

Step 3: ¡Agreguemos Los Componentes! - LCD

Para poner el LCD lo que debemos hacer es:

  1. Buscar el LCD 16x2 y arrastrarlo al lado izquierdo de la protoboard grande (imagen 1).
  2. Arrastrar una resistencia, cambiarla de valor a 220 Ohm y ponerla en el pin led de la derecha (imagen 2).
  3. Conectar la resistencia a la linea de 5 V y el otro pin led a tierra, además conectar el pin LCD db6 y db7 a os A4 y A5 de la Arduino respectivamente (imagen 3).
  4. Conectar los pines del LCD RS, E, db4 y db5 a los pines digitales 5, 4, 3 y 2 de la Arduino (imagen 4).

¡Listo!

Step 4: ¡Agreguemos Los Componentes! - Sensores

Para agregar los sensores debemos:

  1. Buscar el sensor TMP36 y arrastrarlo a la protoboard (imagen 1).
  2. Conectarlo a las lineas de alimentación y al pin A1 de la Arduino (imagen 2).
  3. Buscar y arrastrar el sensor PIR a la proboard (imagen 3).
  4. Conectarlo a las lineas de alimentación y al pin A2 de la Arduino (imagen 4).
  5. Buscar y posicionar el sensor de gas (MQ-6) en la protoboard (imagen 5).
  6. Arrastrar una resistencia al espacio de trabajo, cambiar su valor a 20k Ohm y cambiar su orientación apretando el botón de giro 2 veces (iamgen 6).
  7. Posicionar la resistencia en el sensor, conectar los pines a las lineas de alimentación y conectar el sensor al pin A0 del Arduino (imagen 7).

¡Listo! Ahora revisemos la programación.

Step 5: ¡Hora De Programar!

El programa que implementaremos es:

#include <LiquidCrystal.h>

int gas = 0;
float movimiento = 0;
int LCDRow = 0;
int temperatura = 0;

LiquidCrystal lcd(5, 4, 3, 2, A4, A5);

void setup()
{
pinMode(13,INPUT);
pinMode(12,INPUT);
pinMode(11,INPUT);
pinMode(10,INPUT);
lcd.begin(16, 2);
lcd.setCursor(LCDRow, 0);
}

void loop()
{
lcd_sensors();
alarma();
}

void lcd_sensors()
{
delay(200); //Solo para mejorar el desempeño del simulad
lcd.clear();
movimiento = analogRead(A2)/1023.0 ;
gas = map(analogRead(A0),660,940,0,100) ;
temperatura = map(analogRead(A1),20,358,-40,125);
lcd.setCursor(0, 0);
lcd.print("Movimiento:");
if(movimiento >= 0.5) lcd.print("Si");
else lcd.print("No");
lcd.setCursor(0, 1);
lcd.print("gas[%]:");
lcd.print(gas);
lcd.setCursor(11, 1);
lcd.print(temperatura);
lcd.print(" C");
}

void alarma()
{
if(digitalRead(11) == LOW || gas >= 80 || temperatura >= 30)
{
tone(9,220);
}
if(digitalRead(10) == LOW)
{
noTone(9);
}
}

En la primera sección tenemos una librería y la declaración de variables:

#include <LiquidCrystal.h>

int gas = 0;
float movimiento = 0;
int LCDRow = 0;
int temperatura = 0;

LiquidCrystal lcd(5, 4, 3, 2, A4, A5);

Con #include agregamos el archivo LiquidCrystal.h, el cual posee las funciones necesarias para poder manejar el led de manera sencilla, luego tenemos la declaración de tres variables tipo int donde guardaremos las mediciones de temperatura, porcentaje de gas y la posición inicial del cursor en el lcd, la otra variable es tipo float, en esta se almacenará si hay o no movimiento (en un rango de 0.0 a 1.0). En lo que respecta a LiquidCrystal lcd(5, 4, 3, 2, A4, A5), esta función lo que nos quiere decir es: "el pin 5 se va a conectar a rs, el pin 4 se va a conectar a e (enable), el pin 3 se va a conectar a d4, el pin 2 se va a conectar a d5, el pin A4 se va a conectar a d6, y el pin A5 se va a conectar a d7"

Luego nos encontramos con las instrucciones que solo se van a ejecutar una vez en void setup():

void setup()
{
pinMode(13,INPUT);
pinMode(12,INPUT);
pinMode(11,INPUT);
pinMode(10,INPUT);
lcd.begin(16, 2);
lcd.setCursor(LCDRow, 0);
}

Primero que nada nos encontramos con las funciones pinkode(A,B), las cuales nos sirven para establecer si queremos usar el pin A como salida (B = OUTPUT) o entrada (B = INPUT), luego nos topamos con lcd.begin(A, B), esta función es útil para establecer el tamaño del lcd que vamos a usar, en este caso es de 2 (B) filas por 16 (A) columnas, finalmente tenemos lcd.setCursor(C, D) con la cual establecemos la posición del cursor en la fila C y columna D.

Una de las funciones que nosotros generamos es:

void lcd_sensors()
{
delay(200); //Solo para mejorar el desempeño del simulad
lcd.clear();
movimiento = analogRead(A2)/1023.0 ;
gas = map(analogRead(A0),660,940,0,100) ;
temperatura = map(analogRead(A1),20,358,-40,125);
lcd.setCursor(0, 0);
lcd.print("Movimiento:");
if(movimiento >= 0.5) lcd.print("Si");
else lcd.print("No");
lcd.setCursor(0, 1);
lcd.print("gas[%]:");
lcd.print(gas);
lcd.setCursor(11, 1);
lcd.print(temperatura);
lcd.print(" C");
}

En void lcd_sensors() tenemos las instrucciones que van a asignar un valor a las variables de los sensores, para el movimiento tenemos analogRead(A2)/1023.0 el cual mide la señal en el pin análogo 2 y lo escala por 1023.0, para el gas tenemos map(analogRead(A0),660,940,0,100) el cual toma los valores medidos en el pin análogo 0 que van desde 660 a 940 para transformarlos de manera tal vayan de 0 a 100, por último tenemos la temperatura la cual es transformada de la misma manera que el gas.

Otro set de instrucciones presentes son las usadas para manipular el lcd:

  • lcd.clear() - Sirve para borrar las cosas de la pantalla.
  • lcd.setCursor(A,B) - Sirve para poner el cursor en la columna A y fila B.
  • lcd.print(C) - Sirve para escribir C en la posición indicada por setCursor.

En una parte hay una estructura de decisión if-else la cual es usada para indicar si hay movimiento mediante un Si o No, lo cual va a depender de si la variable movimiento es mayor o igual a 0.5.

Otra de las funciones generadas es:

void alarma()
{
if(digitalRead(11) == LOW || gas >= 80 || temperatura >= 30)
{
tone(9,220);
}
if(digitalRead(10) == LOW)
{
noTone(9);
}
}

En void alarma() tenemos dos estructuras de decisión if, la primera es usada para emitir un tono en el buzzer conectado al pin 9 si hay una temperatura mayor a 30º C, hay presencia de gas mayor al 80%, o se aprieta un botón de emergencia, la segunda se usa solamente para apagar a alarma si el otro botón es pulsado.

Por último tenemos a void loop(), donde las funciones alarma() y sensors() serán ejecutadas repetidamente hasta que la Arduino se apague o deje de funcionar:

void loop()
{
lcd_sensors();
alarma();
}

Step 6: ¡Veamos El Resultado!