Área de Tecnologías de la Información
Programa Académico de Infraestructura de Redes Digitales
Materia: Electrónica para I d C
Título: Lámpara de Dormir
Profesor(a): Mario Cruz Alcaraz
Alumno(a): García López David Alessandro Hernández Guzmán Alfonso Porras Noriega Fátima Abigail Rodríguez Hernández Braulio Arturo
Grupo: IRD-401
León, Guanajuato. 02 de diciembre de 2019
INTRODUCCIÓN
En el presente documento se explicará el proceso que se desarrolló en la creación de una lámpara que no solamente tiene la funcionalidad de tal, sino también la de un despertador o alarma controlada mediante una aplicación del celular.
Se mostrarán los materiales que se utilizaron dando una breve explicación de estos. Además, se explicará el diagrama eléctrico y el programa/código que se desarrolló para el funcionamiento del proyecto en Arduino y de la aplicación.
En este proyecto implementamos varios sensores/módulos, los cuales son dispositivos capaces de detectar magnitudes físicas o químicas. Estos fueron de gran ayuda para el desarrollo del proyecto ya que con ellos pudimos darle más funciones a nuestra lámpara, como por ejemplo, la medición de temperatura y humedad, conexión bluetooth, emisión de sonido y como sería obvio, conocer la hora y la fecha además de conocer el porcentaje de iluminación de la ubicación de la lámpara. Todo lo anterior mencionado, proyectado en tiempo real.
También utilizamos una nueva manera de conectividad, que fue la de soldar en placa para poder dejar de un lado la protoboard, lo cual nos ayudó de mucho para conocer diferentes maneras de desarrollar este tipo de proyectos de IoT.
Consideramos que éste es un gran proyecto debido a que una lámpara y un despertador son cosas que normalmente no se verían relacionadas de alguna manera y sin embargo logramos combinarlas de una forma en la que es amigable, eficaz y funcional para las personas en su vida cotidiana. En las siguientes páginas se explicará en qué nos basamos para el siguiente proyecto.
JUSTIFICACIÓN
El creador de Facebook, Mark Zuckerberg desarrolló una caja que sirve como lámpara despertador para dormir mejor.
De ahí nace nuestra idea de crear un proyecto similar pero con unas cuantas diferencias implementadas. Consideramos que esta lámpara sí funciona para dormir mejor ya que normalmente las personas que tienen problemas para dormir se despiertan por las noches o en la madrugada y lo primero que se hace es ver un reloj para saber si ya es la hora de despertar.
El estrés que genera mirar la hora de madrugada y saber que quedan X horas antes de despertarse provoca que la persona se siga despertando constantemente, haciendo más difícil volver a dormir o incluso que pueda conciliar el sueño.
Esta lámpara incluye una luz tenue que se mantiene encendida durante las horas de sueño y además de apagarse al terminar las horas de sueño, se emite un sonido. Esto permite que al despertarse en la noche, ya no se vea el reloj que inevitablemente te pone en alerta sino que veas esta iluminación y puedas saber que tienes tiempo para seguir durmiendo.
El hecho de poder saber cuánta iluminación hay, cuál es la temperatura y cuál es la humedad del lugar en el que se encuentre ubicada la lámpara es de gran ayuda ya que según algunas investigaciones que realizamos, la temperatura ideal para dormir oscila entre los 15° y 21°, más calor o más frio y alguien tendría problemas para dormir. Por otro lado, la humedad ideal para dormir no debería estar por debajo del 40% ni superar el 60%. La humedad demasiado baja o alta puede ocasionar problemas de salud o dificultar conciliar el sueño. Finalmente, descubrimos que durante la noche se descansa mejor con una iluminación tenue o imperceptible ya que al estar expuestos a una luz se manda información incorrecta al cerebro de que aún no es momento de dormir.
DESARROLLO
Las tareas asignadas a cada integrante fueron las siguientes: 1.
David Alessandro García López: LÍDER Y PROGRAMADOR. Se encargó
del código, del diseño del circuito y la conexión de éste, además de la creación de la app. 2.
Alfonso Hernández Guzmán: HARDWARE. Se encargó de la parte del
hardware ya que colaboró principalmente en el armado del circuito. 3.
Fátima Abigail Porras Noriega: DOCUMENTADOR. Colaboró con parte de
la soldadura, diseñó la interfaz de la app y la lámpara física, además de documentar el proyecto. 4.
Braulio Arturo Rodríguez Hernández: HARDWARE. Se encargó también
de la parte del hardware, participando en conjunto con Alfonso para el armado del circuito.
MATERIALES: •
Arduino UNO
•
Placa PCB (Printed Circuit Board) incluyendo estaño, cautín y pasta para soldar
•
Cables Dupont
•
Módulo RTC DS3231
•
Módulo DHT11
•
Módulo Buzzer
•
Módulo HC06
•
Fotocelda de 10 khom
•
Resistencia de 5 khom
•
Leds
•
Transistor 2N22
•
Caja de madera
•
Parte superior de lámpara simulada con cartón y plástico
•
Eliminador de 9v
MÓDULO RTC DS3231 Y EEPROM Este módulo agrega fecha y hora a tus proyectos con el RTC DS3231 (evolución del DS1307) de alta precisión y oscilador interno. Permite obtener mediciones de tiempo en las unidades temporales que empleamos de forma cotidiana. Funciones del RTC: •
Fecha con segundos, minutos, horas, numero día, día de la semana, mes y año.
Especificaciones técnicas: •
Voltaje de Operación: 3.3V - 5V
•
Memoria EEPROM AT24C32 (4K * 8bit = 32Kbit = 4KByte)
•
Conexión para Arduino Uno:
•
SCL - A5
•
SDA - A4
•
VCC - 5V
•
GND - GND
MÓDULO DHT11 El DHT11 es un sensor de humedad relativa y temperatura de bajo costo y de media precisión a un bajo precio. La salida suministrada es de tipo digital utilizando solamente 1 pin de datos. Especificaciones técnicas: •
Voltaje de Operación: 3V - 5V DC
•
Rango de medición de temperatura: 0 a 50 °C
•
Rango de medición de humedad: 20% a 90% RH.
Pines: 1- Alimentación:+5V (VCC) 2- Datos (DATA) 3- No Usado (NC) 4- Tierra (GND)
MÓDULO HC06 El módulo Bluetooth HC-06 nos permite conectar nuestros proyectos con Arduino a un smartphone, celular o PC de forma inalámbrica (Bluetooth), con la facilidad de operación de un puerto serial. Especificaciones técnicas: •
Voltaje de operación: 3.3V - 5VDC
•
Alcance 10 metros
•
Interfaz de comunicación: Serial UART TTL
•
Compatible con Android
MÓDULO BUZZER Los buzzer, en ocasiones denominados zumbadores, son dispositivos que generan un sonido de una frecuencia determinada y fija cuando son conectados a tensión. Especificaciones técnicas: •
Voltaje de Operación: 3.3V - 5V DC
•
Tipo: Piezo eléctrico pasivo
•
Incluye el transistor S8550
•
Pines: VCC, GND y Señal
DIAGRAMA ELÉCTRICO / ESQUEMÁTICO
CÓDIGO / PROGRAMA (ARDUINO): En el proyecto realizamos el siguiente código para nuestro Arduino uno y los módulos mencionados anteriormente. Empezamos por importar las bibliotecas: las bibliotecas correspondientes tanto para el módulo DHT y el RTC.
Utilizamos la biblioteca de EEPROM, una función del RTC la cual nos permite poder almacenar variables en un arreglo de 250 espacios para que, cuando el Arduino sea desconectado de la fuente de energía, estas variables se queden almacenadas dentro del módulo (EEPROM). Ahora bien, el siguiente paso fue definir todas nuestras variables, determinamos el objeto para DHT y también creamos el objeto para el RTC y utilizamos el tipo de dato DATETIME.
Las siguientes variables nos ayudaron a poder configurar nuestro RTC de manera que ingresáramos los valores por el Serial.
Iniciamos los sensores DHT y RTC e indicamos los LUZD que fue nuestra fotocelda y esperaría un valor.
Como se muestra en la parte de arriba, la memoria EEPROM nos almacenó ciertas variables correspondientes a la hora de inicio de horas y minutos de sueño y fin de horas y minutos de sueño, estas variables quedaron almacenada en el arreglo antes mencionado. En la función void Loop tuvimos lo siguiente como primer paso: mandamos llamar la variable de fechaHora(DateTime) donde colocamos el valor de RTC y se lo asignamos a dicha variable.
Continuamos con nuestra primera condición if, la cual monitoreó la variable fechaHora y la comparó si es igual a las variables que ingresamos como Inicio y fin de sueño, cuando el ciclo fuera falso, se compararía si coincide exactamente con la hora de fin de sueño, si ésta fuera verdadera haría sonar la alarma con la función sonarAlarma.
Constantemente se envía la información por medio del bluetooth a la aplicación del teléfono y se hace presente la función modificar datos.
Ahora lo siguiente es hablar de las funciones de nuestro código: En primer lugar, tenemos los datos de nuestra fotocelda que nos manda la intensidad de la luz dentro de la habitación. Después tenemos los valores correspondientes a la fecha, estas se obtienen de la variable fechaHora(DateTime) que declaramos con anterioridad. Y por último los valores correspondientes a la temperatura, esto gracias a la función del módulo Dht.readTemperature (también se tuvo en cuenta el delay para que el DHT pudiera leer con eficiencia los datos).
Lectura de datos: Los datos son enviados al serial y por medio del bluetooth a la aplicación desarrollada. Esto ES enviado cada 5 segundos en base al de la que le asignamos.
La siguiente función que se implementó fue poder modificar parte de los datos que se almacenaron dentro de fechaHora(DateTime), estos con el fin de poder ser certeros y precisos con la información almacenada.
Funciona de la siguiente manera: un usuario ingresa la inicial de lo que quiere modificar, por ejemplo, si el usuario ingresa h1240, quiere decir que la hora se debe modificar a 12:40 minutos. Dependiendo de lo que se desee modificar, se debe denotar la inicial y lo que sigue de ella. Letra inicial del comando
Datos
Resultado
h + HHMM
1245
12:45 pm
d + YYYYMMDD
20191103
2019 del mes de noviembre a día 03
I + HHMM
2330
23:30 pm
f + HHMM
0530
05:30 am
La tabla describe los comandos que debemos usar e introducir en el monitor serial para poder modificar algún valor que queramos o se deba modificar
En la función de rtc.adjust se denota que toma las variables y las modifica en base a las que le hayamos ingresado en el monitor serial
Como mencionamos, utilizamos la memoria EEPROM de nuestro módulo RTC para poder almacenar los valores de inicio y fin de sueño por ello, hicimos uso del arreglo y los insertamos en las posiciones 0 y 1
Y para la hora de fin de sueño sus valores correspondientes se almacenarán en los índices 2 y 3 del arreglo de la EEPROM.
Para finalizar, la función sonarAlarma () envía el tono del Buzzer para que suene cada 5 segundos y dure solo un minuto.
CÓDIGO: #include <Wire.h>//Librería necesaria para comunicar Arduino con dispositivos co n I2C/TWO #include "RTClib.h" //Librería para el reloj en tiempo real #include <DHT.h> //Librería para el sensor de temperatura y humedad #include <EEPROM.h>
#define LUZD A3 //Constante LUZD para representar el PIN A# -- Sensor de luz #define DHTPIN 7
//Constante DHTPIN para representar el PIN 7 --
#define DHTTYPE DHT11 //Constanrte DHTTYPE para representar DHT11
DHT dht(DHTPIN,DHTTYPE); //Se crea un objeto DHT definiendo el número de PIN y e l tipo de DHT (puede ser DHT11 o DHT22)
RTC_DS1307 rtc; //Objeto para controlar al Reloj en tiempo real DateTime fechaHora; //Variavle DateTime que almacenarรก la fecha y hora en tiempo Real float luz; //variable que almacena la intensidad de la luz int panel = 8; //variable que identifica al panel led int pinBuzzer = 4; //variable para identificar al pin del -buzzer byte hInicioS; byte mInicioS; byte hFinS; byte mFinS;
void setup() { //Inicializaciรณn de los sensores y comunicaciรณn serial Serial.begin(9600); dht.begin(); rtc.begin(); pinMode(LUZD,INPUT); pinMode(panel,OUTPUT);
hInicioS = EEPROM[0]; mInicioS = EEPROM[1]; hFinS = EEPROM[2]; mFinS = EEPROM[3]; digitalWrite(panel,LOW); }
void loop() { fechaHora = rtc.now(); //fechaHora recibe fecha y hora en tiempo real que estรก en el mรณdulo RTC
if(fechaHora.hour()>= hInicioS && fechaHora.hour()<= hFinS && fechaHora.minute () >= mInicioS && fechaHora.minute() <= mFinS ){ digitalWrite(panel,HIGH); if (fechaHora.hour()==hFinS && fechaHora.minute() == mFinS){ sonarAlarma(); } }
else{ }
enviarDatos(); //Función que lee datos de todos los sensores y los imprime //Lectura de entradas para configuraciones if(Serial.available() > 0){ modificarMemoria(); } }
void enviarDatos(){ //Función para enviar datos al monitor Serial luz = analogRead(LUZD); //Se lee la intensidad de la luz, se obtendrá un valor entre 0 y 1024 luz/=10.24; //Se divide entre 10.24 para obtener un valor entre 0 y 100
//Se almacena en variables enteras, el día, mes, año, hora y minuto byte dia = fechaHora.day(); byte mes = fechaHora.month(); int anio = fechaHora.year(); byte hora = fechaHora.hour(); byte minuto = fechaHora.minute(); byte horaI,horaF; byte minI,minF; //Se almacena en variables flotantes la temperatura y el procentaje de humedad float tem = dht.readTemperature(); float hum = dht.readHumidity(); delay(200); //Se le da un pequeño retraso debido a que la lectura del DHT11 no suele ser rápida //La ausencia de un retraso, puede mandar NaN en las variables
//Se imprimen los valores en tiempo real cada 5 segundos Serial.print(dia); Serial.print("|"); Serial.print(mes); Serial.print("|"); Serial.print(anio); Serial.print("|");
Serial.print(hora); Serial.print("|"); Serial.print(minuto); Serial.print("|"); Serial.print(tem); Serial.print("|"); Serial.print(hum); Serial.print("|"); Serial.print(luz); Serial.print("|"); Serial.print(hInicioS); Serial.print("|"); Serial.print(mInicioS); Serial.print("|"); Serial.print(hFinS); Serial.print("|"); Serial.print(mFinS); Serial.println("|"); delay(5000); }
void modificarMemoria(){ //Función ejecutada en caso de querer ejectuar una modi ficación a través de la comunicación serial char opc = Serial.read(); //Según el caracter inical inicial de la cadena envi ada, será la configuración por aplicar if(opc == 'h'){ //Cambio de la hora //Se recibe una cadena en formato HHMM //A cada dígito se le van a restar 48 para retirar la codificación ASCII.
//Lectura de Horas byte digh1 = Serial.read(); //Lectura del primer dígito de la hora digh1-=48; digh1*=10; //Se multiplica por 10 para convertir el primer dígito a decenas byte digh2 = Serial.read();//Lectura del segundo dígito de la hora digh2-=48; byte hora = digh1 + digh2; //Se suman las decenas y unidaddes //Lectura de los minutos
byte digm1 = Serial.read(); digm1 -= 48; digm1 *=10; byte digm2 = Serial.read(); digm2 -= 48; byte minuto = digm1+digm2; //Se ajusta la nueva hora del sistema rtc.adjust(DateTime(fechaHora.year(),fechaHora.month(),fechaHora.day(),hora, minuto,0));//anio, mes, dia, hora, minutos, segundos }
if(opc == 'd'){ //Cambio de la fecha //Se recibe una cadena en formato YYYYMMDD y se lee cada dĂgito. //Lectura del anio int a1 = Serial.read(); a1 = (a1-48)*1000; byte a2 = Serial.read(); a2 = (a2-48)*100; byte a3 = Serial.read(); a3 = (a3-48)*10; byte a4 = Serial.read(); a4 = (a4-48); int a = a1+a2+a3+a4; //Lectura del mes byte m1 = Serial.read(); m1 = (m1-48)*10; byte m2 = Serial.read(); m2 = (m2-48); byte m = m1 + m2; //Lectura del dĂa byte d1 = Serial.read(); d1 = (d1-48)*10; byte d2 = Serial.read(); d2 = (d2-48); byte d = d1 + d2; //Se ajusta la nueva fecha del sistema
rtc.adjust(DateTime(a,m,d,fechaHora.hour(),fechaHora.minute(),0)); }
if(opc == 'i'){ //Cambio de la hora de inicio de sueño //Se recibe una cadena con formato HHMM y se lee cada dígito byte h1 = Serial.read(); h1 = (h1-48)*10; byte h2 = Serial.read(); h2 -= 48; byte h = h1 + h2;
byte m1 = Serial.read(); m1 = (m1-48)*10; byte m2 = Serial.read(); m2 -= 48; byte m = m1 + m2;
//Se guardan los valores de hora y minuto de inicio de sueño en las pocision es 0 y 1 respectivamente EEPROM.put(0,h); EEPROM.put(1,m); delay(10); hInicioS = EEPROM[0]; mInicioS = EEPROM[1]; }
if(opc == 'f'){ //Cambio de la hora de fin de sueño //Se recibe una cadena con formato HHMM y se lee cada dígito byte h1 = Serial.read(); h1 = (h1-48)*10; byte h2 = Serial.read(); h2 -= 48; byte h = h1 + h2; int m1 = Serial.read(); m1 = (m1-48)*10; int m2 = Serial.read();
m2 -= 48; byte m = m1 + m2;
//Se guardan los valores de hora y minuto de fin de sueño en las pocisiones 2 y 3 respectivamente EEPROM.put(2,h); EEPROM.put(3,m); delay(10); hFinS = EEPROM[2]; mFinS = EEPROM[3]; } }
void sonarAlarma(){ for(int i = 1; i<=15; i++){ tone(pinBuzzer, 523, 300); delay(500); } digitalWrite(panel,LOW); }
DESARROLLO DE LA APLICACIÓN: Esta parte inicializamos las variables globales que usaremos para enviar o recibir datos. Output para variables de salida e input para variables de entrada.
Esta parte de código lo que hace es mostrar la lista de conexión a bluetooth si es que no está conectado, y si lo está, nos muestra los datos de a dónde está conectado el dispositivo.
En esta captura podemos ver cómo la aplicación envía los datos al Arduino, desde el ingreso de datos del usuario, utilizando variables como minuto, hora, fecha, cómo iniciamos la hora de sueño y a qué hora debe de ser despertado el usuario.
En esta captura la parte de código es para recibir los datos desde el Arduino a la pantalla de la app donde el usuario interactúa, sacando los datos de la lista creada y mostrándolos en la app.
EVIDENCIAS:
CONCLUSIÓN Ya todos tenemos en claro que la tecnología fue creada para mejorar nuestras vidas, sin embargo, ha estado presente de distintas maneras en el mundo, ya sea en industrias, hogares o escuelas, cada uno requiriendo aparatos específicos de distintos tamaños y tipos y cantidades y capacidades diferentes. El Internet de las Cosas nos ha demostrado que puede solucionar problemas de cualquier tamaño, en cualquier lugar y en cualquier momento. Pero ¿de qué manera IoT facilita nuestras vidas? De la manera más simple, nos permite unificar toda la tecnología existente para recopilar información de lo que hay en nuestros alrededores, y hasta esta parte, la recopilación de información que constantemente se actualiza (temperatura, humedad, iluminación, ruido, etc.) no es algo tan interesante para el ser humano, pero todos los dispositivos conectados entre sí van a aprovechar esta información para ayudarnos a interpretarla, y en otros casos, tomar decisiones por sí mismas para mejorar nuestras vidas. Por ejemplo, que nuestra casa cierre puertas y ventanas cuando no detecte que estamos en ella, o que controlemos nuestros aparatos electrónicos con nuestra voz. IoT abre las puertas de nuestra imaginación para crear nuevas soluciones para la humanidad para que puedan mejorar su productividad, además da un salto hacia el futuro, abriendo el camino hacia la nueva tendencia tecnológica, que día a día, será más accesible para todas las personas en el mundo. Actualmente, formar parte del futuro y contribuir al mismo ya no es difícil, pues ya existen muchísimas herramientas de hardware y software que nos dan la facilidad de crear proyectos de IoT, y uno de los propósitos de la humanidad es que todos puedan vivir la tecnología, porque gracias a eso, más gente talentosa aprovecha su talento para desarrollar tecnología, porque con nuestra imaginación y tecnología, todo será posible. En este proyecto, esperamos haber sido un equipo inspirador para todas las personas que lo lean, y que se sientan motivadas a aprender por su cuenta y tratar de crear proyectos inimaginables, contagiar a las personas con inspiración y motivarlos a unirse a la revolución tecnológica.