Reloj Meteorológico Arduino en Tiempo Real: Pantalla OLED para Hora, Fecha y Temperatura
Componentes y Suministros
| Componente | Cantidad |
|---|---|
| Arduino UNO | 1 |
| RTC DS3231 (Adafruit) | 1 |
| Pantalla OLED (Digilent Pmod OLED / SSD1306) | 1 |
| Sensor de Temperatura LM35 (Texas Instruments) | 1 |
| Cables jumper (genéricos) | 1 |
| Protoboard (genérica) | 1 |
Descripción del Proyecto
Vamos a hacer un reloj meteorológico Arduino que nos indicará la hora, fecha y temperatura. El sensor LM35 nos dará la temperatura, el DS3231 nos dará la fecha y la hora, y usaremos el OLED para mostrar la temperatura, fecha y hora.
Componentes Requeridos
- Arduino
- DS3231 (Módulo reloj en tiempo real)
- Pantalla OLED (se usó SSD1306)
- Datasheet SSD1306.pdf
- LM35
- Cables de conexión
- Protoboard
- Datasheet LM35.pdf
Diagrama de Circuito
Primero, conecte el OLED con el Arduino. El OLED funciona con Arduino mediante comunicación SPI e I2C, pero lo hemos conectado usando SPI. Los pines SPI en Arduino son 8, 9, 10, 11 y 13. Las conexiones son:
- CS del OLED → Pin 10 Arduino
- DC del OLED → Pin 9 Arduino
- RES del OLED → Pin 8 Arduino
- D1 del OLED → Pin 11 Arduino
- D0 del OLED → Pin 13 Arduino
- VCC del OLED → 5V Arduino
- GND del OLED → GND Arduino
Luego, conecte el módulo DS3231 con Arduino. Funciona mediante I2C. Los pines I2C en Arduino son SDA y SCL:
- GND del DS3231 → GND Arduino
- VCC del DS3231 → 5V Arduino
- SDA del DS3231 → A4 Arduino
- SCL del DS3231 → A5 Arduino
Finalmente, conecte el sensor LM35 con Arduino: pin izquierdo → 5V, pin central → A0, pin derecho → GND.
Puede encontrar un esquemático a tamaño completo aquí.
Explicación del Código
Primero, añadimos las librerías para el módulo DS3231 y el OLED. La librería Adafruit para OLED tiene más funciones que otras librerías para OLEDs.
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <DS3231.h>
Definimos los pines de conexión. El DS3231 usa I2C (pines SDA/SCL). El OLED usa SPI, así que inicializamos pines 8, 9, 10, 11, 13. Luego inicializamos el pin del LM35 y otras variables.
DS3231 rtc(SDA, SCL);
#define OLED_MOSI 11
#define OLED_CLK 13
#define OLED_DC 9
#define OLED_CS 10
#define OLED_RESET 8
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
const int sensor_pin = A0;
float temp;
float output;
En setup(), declaramos el pin del LM35 como entrada. Iniciamos comunicación con DS3231 y OLED.
pinMode(sensor_pin, INPUT);
rtc.begin();
display.begin(SSD1306_SWITCHCAPVCC);
Las líneas siguientes están comentadas pero si usa el DS3231 por primera vez y quiere configurar día, fecha y hora, descoméntelas y ajústelas.
// rtc.setDOW(WEDNESDAY); // Set Day-of-Week to SUNDAY
// rtc.setTime(19, 02, 0); // Set the time to 12:00:00 (24hr format)
// rtc.setDate(7, 12, 2017); // Set the date to June 6th, 2017
Imprimimos "Weather Clock" en el OLED por 5 segundos.
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.print(" Weather ");
display.setCursor(0,17);
display.print(" Clock ");
display.display();
delay(5000);
En loop(), leemos del LM35 y calculamos la temperatura. Obtenemos hora y fecha e imprimimos en el OLED.
output = analogRead(sensor_pin);
temp = (output * 500) / 1023;
display.clearDisplay();
display.setTextSize(2);
display.setCursor(20,0);
display.print(rtc.getTimeStr());
display.setTextSize(1);
display.setCursor(0,15);
display.print(rtc.getDateStr());
display.setTextSize(1);
display.setCursor(70,15);
display.print(rtc.getDOWStr());
display.setTextSize(1);
display.setCursor(20,25);
display.print("Temp: ");
display.print(temp);
display.print("C");
display.display();
delay(1000);
Código Arduino Completo
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <DS3231.h>
DS3231 rtc(SDA, SCL);
#define OLED_MOSI 11
#define OLED_CLK 13
#define OLED_DC 9
#define OLED_CS 10
#define OLED_RESET 8
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
const int sensor_pin = A0;
float temp;
float output;
void setup() {
pinMode(sensor_pin, INPUT);
rtc.begin();
display.begin(SSD1306_SWITCHCAPVCC);
// rtc.setDOW(WEDNESDAY);
// rtc.setTime(19, 02, 0);
// rtc.setDate(7, 12, 2017);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(0,0);
display.print(" Weather ");
display.setCursor(0,17);
display.print(" Clock ");
display.display();
delay(5000);
}
void loop() {
output = analogRead(sensor_pin);
temp = (output * 500) / 1023;
display.clearDisplay();
display.setTextSize(2);
display.setCursor(20,0);
display.print(rtc.getTimeStr());
display.setTextSize(1);
display.setCursor(0,15);
display.print(rtc.getDateStr());
display.setTextSize(1);
display.setCursor(70,15);
display.print(rtc.getDOWStr());
display.setTextSize(1);
display.setCursor(20,25);
display.print("Temp: ");
display.print(temp);
display.print("C");
display.display();
delay(1000);
}
Esquemáticos
Diagrama de conexiones disponible en el proyecto original.
Proceso de manufactura
- Construya Efectos de Audio Controlados por Sensores con el Kit Satellite CCRMA
- Construye un reloj Numitron retro con Arduino: Simple, fiable y eficiente energéticamente
- Construye un reloj en tiempo real con Arduino para horarios de oración islámica
- Construya el clásico juego Pong en Arduino UNO con pantalla OLED: Tutorial paso a paso
- Reloj de Palabras de Precisión: Visualización del Tiempo en Palabras Minuto a Minuto
- Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
- Monitor de Temperatura y Reloj en Tiempo Real con Arduino Due y Pantalla TFT 3.2"
- Construye un Reloj Berlín con Arduino UNO – Reloj de Matriz LED DIY
- Proyecto HMI Interactivo con Nextion, Arduino Mega y Múltiples Sensores
- Reloj Digital TM1637 con Configuración de Hora y Alarma - Prototipo Arduino Nano
- Construye un reloj despertador fiable con RTC DS1302 y Arduino UNO