RELOJ – TERMÓMETRO DIGITAL
Proyecto del grupo 2, compuesto por Beniamin Scrobota y Fátima Ezahra Smounat Mahidar. Presentamos nuestro proyecto “Reloj-termómetro digital” desarrollado en la asignatura de Diseño de Sistemas Empotrados del grado de Ingeniería de Computadores durante el curso 2021-2022.
Introducción
Nuestro proyecto consiste en un dispositivo que mediante el uso de distintos sensores nos ofrece información sobre la hora y fecha y sobre la temperatura, humedad y luminosidad de una habitación; todo esto en una matriz LED 8×32 que está funcionando ininterrumpidamente.
Componentes utilizados
Componente | Unidades | Precio total |
Placa Arduino | 1 | – |
Protoboard | 1 | – |
Sensor de reloj DS1302 | 1 | 6.23€ |
Sensor de temperatura y humedad DHT11 | 1 | 4.79€ |
Matriz LED 8×32 | 1 | 9.90€ |
LDR | 1 | 0.40€ |
Cables | 20 | – |
Batería para sensor de reloj | 1 | 1.50€ |
Resistencias | 3 | – |
Pila 9V | 1 | 5.60€ |
Material para caja externa | 1 | 6€ |
Herramientas
Herramienta |
Sierra de arco metálica |
Papel de lija |
Adhesivo para madera |
Hardware
Los componentes principales que hemos utilizado son:
- Sensor de reloj DS1302: es un dispositivo electrónico en forma de circuito integrado que mide y guarda la hora real.
- LDR: también llamado fotorresistor, es un componente electrónico cuya resistencia se modifica en función de la luz que incide sobre él.
- Sensor de temperatura y humedad DHT11: sensor digital consistentes en un sensor capacitivo de humedad y un termistor para medir el aire circundante.
- Matriz LED 8×32: se trata de un dispositivo de visualización consistente en una matriz de puntos donde se puede visualizar texto apagando y encendiendo puntos específicos de la matriz.
Esquema del montaje
Tenemos el siguiente circuito el cual está alimentado por una pila de 9v conectada por su polo positivo al pin Vin de la placa Arduino y conectada por su polo negativo a la parte negativa de la protoboard. A continuación tenemos el sensor de humedad y temperatura, el cual está conectado a la parte positiva y negativa de la protoboard y también al pin D8 de la placa Arduino junto a dos resistencias. El sensor de reloj está conectado a la parte positiva mediante su pin 5V, a la parte negativa mediante el pin GND y a los pines D5, D4 y D3 mediante los pines CLK, DAT (I/O) y RST (CE). El LDR está conectado mediante una resistencia a los pines positivos y negativos de la protoboard, al igual que la matriz LED mediante sus pines VCC y GND, mientras que los pines DIN, CS y CLK están conectados a los pines D11, D10 y D13 respectivamente de la placa Arduino.
Montaje
Código
// librerías utilizadas:
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <DHT.h>
#include <DS1302.h>
#include <EEPROM.h>
// Conexión de pines del modulo de reloj DS1302 a la placa arduino
//RST (CE) al pin 3 del arduino
//DAT (I/O) al pin 4 del arduino
//CLK (SCLK) al pin 5 del arduino
//inicializamos el modulo de reloj DS1302
DS1302 rtc(3, 4, 5);
//matriz led
//Vcc al positivo de la placa
//Gnd al negativo de la placa
//Din al pin 11 (Mosi)
//Cs al pin 10 (SS)
//Clk al pin 13 (Sck)
#define DHTPIN 8 // Definimos el pin digital donde se conecta el sensor DHT11
#define DHTTYPE DHT11 // Dependiendo del tipo de sensor
DHT dht(DHTPIN, DHTTYPE); // Inicializamos el sensor DHT11
const int CS = 10; // pin cs del modulo reloj a la placa del arduino
const int numMatricesVertical = 1; // Cantidad de matices led vertical
const int numMatricesHorizontal = 4; // Cantidad de matices led
const int SensorLDR= 0; //pin LDR a a0 de placa arduino
int valorLDR=0; //inicialiazamos la variable a 0 para posteriormente asignar otro valor
Max72xxPanel matriz = Max72xxPanel(CS, numMatricesHorizontal, numMatricesVertical); // Configuración de la matriz
String mensajeTotal = ".. "; //tu mensajeHora
String humedad = " H=";
String mensajeHumedad = ".. ";
String porcentajeYTemperatura = " % T=";
String mensajeTemperatura = ".. ";
String temperatura = ".C";
String despertador = " DESPIERTA";
String dia = " ..";
String mes = "..";
String anio = ".. ";
String barra = "/";
String espacio = " ";
const int rapidez = 43; //constante que representa la velocidad del paso del mensaje
const int espacioEntreLetras = 1; // Constante para calcular el espacio entre las letras
const int ancho = 5 + espacioEntreLetras; // cantitad de pixeles por cada letra escrita
byte value; // Variable de tipo byte para lectura y escritura de la memoria rom eproom del real time clock
Time t; // Variable para el tiempo
void setup() {
matriz.setIntensity(0); //configuramos el brillo de las matrices led
/*configuramos la posición de las letras y número
que se mostrarán en cada una de las cuatro matrices*/
matriz.setPosition(0, 0, 0);
matriz.setPosition(1, 1, 0);
matriz.setPosition(2, 2, 0);
matriz.setPosition(3, 3, 0);
/*configuramos el tipo de rotación de las letras y número
//que se mostrarán en cada una de las cuatro matrices*/
matriz.setRotation(0, 1);
matriz.setRotation(1, 1);
matriz.setRotation(2, 1);
matriz.setRotation(3, 1);
rtc.halt(false); // Habilita el reloj
rtc.writeProtect(false); // Deshabilita protección contra escritura
value = EEPROM.read(20); //leemos de la memoria rom eproom
if (value = ! 1) {
rtc.setDOW(FRIDAY); // configuramos del día
rtc.setTime(22, 33, 0); // configuramos de la hora
rtc.setDate(14, 12, 2021); // configuramos de la fecha
EEPROM.write(20, 1); // escribimos en la memoria rom eproom
}
dht.begin(); //Iniciamos el sensor del real time clock
}
void loop() {
t = rtc.getTime(); //metemos el valor de la hora que conseguimos con getTime() en la variable t
valorLDR = analogRead(SensorLDR); //metemos el valor de la luminusidad en la variable valorLDR
//En caso de oscuridad la intensidad descenderá a 0 y en caso de luminusidad, la intensidad subirá a valor 15
if(valorLDR<50){
matriz.setIntensity(0);
}else{
matriz.setIntensity(15);
}
// Leemos la temperatura en grados centígrados captada por el sensor de temp-hum
int tem = dht.readTemperature();
// Leemos la humedad captada por el sensor de temp-hum
int h = dht.readHumidity();
//leemos el dia
int d = t.date;
//leemos el mes
int m =t.mon;
//leemos el año
int a = t.year;
/*guardamos las lectura de los valores anteriores en las variables de tipo String declaradas
para obtener una cadena*/
mensajeHumedad = h;
mensajeTemperatura = tem;
dia = d;
mes = m;
anio = a;
//mostramos los mensajes en forma de scroll uniendo todos los strings que queremos mostrar y dependiendo de la hora te sale un mensaje u otro
if(t.hour == 7){
mensajeTotal = rtc.getTimeStr() +espacio+ dia +barra + mes +barra+ anio + humedad + mensajeHumedad + porcentajeYTemperatura + mensajeTemperatura + temperatura + despertador;
}else{
mensajeTotal = rtc.getTimeStr() +espacio+ dia +barra+ mes + barra+anio + humedad + mensajeHumedad + porcentajeYTemperatura + mensajeTemperatura + temperatura ;
}
//con este for repetimos el proceso de escritura de la cadena de caracteres de manera correcta en la matriz led
for (int i = 0; i < ancho * mensajeTotal.length() + matriz.width() - 1 - espacioEntreLetras; i++) {
matriz.fillScreen(LOW);
int letra = i / ancho;
int x = (matriz.width() - 1) - i % ancho;
int y = (matriz.height() - 8) / 2; //centrar el texto de manera vertical
while (x + ancho - espacioEntreLetras >= 0 && letra >= 0) {
if (letra < mensajeTotal.length()) {
matriz.drawChar(x, y, mensajeTotal[letra], HIGH, LOW, 1);
}
letra--;
x = x - ancho;
}
matriz.write(); //Enviamos los datos para mostrarlos en la matriz.
delay(rapidez);
}
}