Categoría | Proyecto de usuario |
---|---|
Autor | Fernán |
Fecha | 01/10/2015 |
Concepto | Estación meteorológica con reloj. |
Descripción | Un proyecto que combina un Arduino UNO, display 20x4más un sensor DHT-11 y reloj RTC para montar presentar la hora, temperatura y humedad en el display. |
Dificultad | Media |
Material requerido.
Arduino UNO o equivalente. | |
Una Protoboard más cables. | |
Un LCD de 20×4 o también se puede adaptar un display de 16×2 o de 16×4 | |
Un sensor de temperatura DHT11 | |
Un reloj Tiny RTC | |
Un potenciometro de 10k |
Descripción del proyecto
Nuestro amigo Fernán nos remite este interesante proyecto en el que combina varios componentes para montar una estación meteorológica con reloj incorporado que es ideal para aquellos que vayáis finalizando el curso de inicio y quieran ir atacando proyectos un poco más complejos.
Este es un proyecto de dificultad media pero al alcance de cualquiera que se sienta ya cómodo con la programación de Arduino y sus sensores.
Es precisamente la mezcla de diferentes componentes y sensores lo que le hace tan interesante, porque sirve magníficamente como proyecto de fin de carrera para los que estáis ya animados a finalizar el curso de iniciación.
Al final si conseguimos una caja en la que embeber todo el proyecto de Fernán, tendremos un bonito despertador y hecho por vosotros, así que ánimo.
Para los que quieran ir a por nota, seria de lo más interesante combinar el reloj I2C con un display también I2C, algo para lo que se pensó el Bus pero que exigirá un poco más de esfuerzo, porque hay que enviar comandos a diferentes direcciones I2C y eso es algo que hasta la fecha no hemos abordado.
Pero… ¿Quién dijo miedo? No hay recompensa sin osadía y tengo plena confianza en que lo podeis llevar adelante.
Esquema del circuito
Fernán incluye en su proyecto un esquema para el montaje en protoboard de todo el conjunto, con un diagrama realizado en Fritzing que podeis descargar aqui Esquema Fritzing
El montaje no es complicado pero requiere muchas conexiones, así que es importante que prestéis atención, para evitar dolores de cabeza con los componentes.
Os recomiendo que vayáis montando y probando los componentes poco a poco y asegurando todo porque si lo hacéis de un golpe, mostrareis arrojo y valentía pero la probabilidad de resbalar es notablemente alta.
El programa de control
El programa no es complicado pero tiene una moderada dificultad por lo que supone de mezcla de componentes y librerías, pero por lo demás es similar los ejemplos que hemos ido viendo previamente.
Aqui os dejo el programa y su listado: Estacion Meteo
/* Programa para crear un reloj con hora y fecha,tempertura y humedad * union de los programas RTC, DHT11 y LCD de PROMETEC */ #include <DHT11.h> #include <LiquidCrystal.h> #include <Time.h> #include <Wire.h> #include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //( RS, EN, d4, d5, d6, d7) Asignacion pines del LCD int pin=2; DHT11 dht11(pin); // Asignacion pin DHT11, el RTC tiene SDA en el A4 //(SDA del arduino) y el SCL en el A5 (SCL del arduino) void setup() { Serial.begin(115200); lcd.begin(20, 4); // Fijar numero aracteres y filas setSyncProvider(RTC.get); // Vamos a usar el RTC setTime(00,31,22,28,9,2015); // hh,mm,ss,dd,mm,yy, si en la fecha alguna cifra es de // un solo digito no añadir 0, da error // El setTime hay que comentarlo una vez que el RTC tiene ya la hora y fecha correcta if (timeStatus() != timeSet) Serial.println("Unable to sync with the RTC"); else Serial.println("RTC has set the system time"); } void loop() { digitalClockDisplay(); int err; float temp, hum; if((err = dht11.read(hum, temp)) == 0) // Si devuelve 0 es que ha leido bien { Serial.print("Temperatura: "); Serial.print(temp); lcd.setCursor(0, 2); // Tercera columna LCD lcd.print("Temperatura: "); lcd.print(temp); Serial.print(" Humedad: "); Serial.print(hum); lcd.setCursor(0, 3); // Cuarta columna LCD lcd.print("Humedad: "); lcd.print(hum); Serial.println(); } else { Serial.println(); Serial.print("Error Num :"); Serial.print(err); Serial.println(); } delay(1000); //Recordad que solo lee una vez por segundo } void digitalClockDisplay() { lcd.setCursor(0, 0); // Primera columna LCD printDigits(hour()); // Hacer que la hora tenga siempre dos digitos lcd.print(":"); printDigits(minute()); lcd.print(":"); printDigits(second()); Serial.print(" "); Serial.print(day()); lcd.setCursor(0, 1); // Segunda columna LCD lcd.print(day()); lcd.print("/"); Serial.print("/"); Serial.print(month()); lcd.print(month()); lcd.print("/"); Serial.print("/"); Serial.print(year()); lcd.print(year()); Serial.println(); } void printDigits(int digits) // Modifico esta funcion para que a la vez que imprime { Serial.print(":"); // via serie tambien lo haga via LCD //lcd.print(":"); if(digits < 10) { Serial.print('0'); lcd.print('0'); } Serial.print(digits); lcd.print(digits); }
Aquí tenéis una foto del resultado: