Relógio Meteorológico Arduino em Tempo Real: Display OLED para Hora, Data e Temperatura
Componentes e Materiais
| Arduino UNO | × | 1 |
| RTC Adafruit DS3231 | × | 1 |
| Pmod OLED Digilent | × | 1 |
| Sensor de Temperatura LM35 (Texas Instruments) | × | 1 |
| Jumpers (genéricos) | × | 1 |
| Protoboard (genérica) | × | 1 |
Sobre o Projeto
Vamos fazer um relógio meteorológico Arduino que nos dirá a hora, data e temperatura. O sensor LM35 nos dará a temperatura, o DS3231 nos dirá a data e a hora, e usaremos o OLED para exibir a temperatura, data e hora.
Componentes Necessários
- Arduino
- DS3231 (Módulo de relógio em tempo real)
- Display OLED (um SSD1306 foi usado aqui)
- Datasheet SSD1306.pdf
- LM35
- Fios de conexão
- Protoboard
Diagrama de Circuito
Primeiro, conecte o OLED ao Arduino. O OLED funciona com o Arduino através de comunicação SPI e I2C, mas conectamos usando comunicação SPI. Os pinos SPI no Arduino são 8, 9, 10, 11 e 13. As conexões do OLED com o Arduino são:
- Conectar CS do OLED ao pino 10 do Arduino.
- Conectar DC do OLED ao pino 9 do Arduino.
- Conectar RES do OLED ao pino 8 do Arduino.
- Conectar D1 do OLED ao pino 11 do Arduino.
- Conectar D0 do OLED ao pino 13 do Arduino.
- Conectar VCC do OLED ao pino 5V do Arduino.
- Conectar GND do OLED ao pino GND do Arduino.
Depois, conecte o módulo DS3231 ao Arduino. O módulo DS3231 funciona com o Arduino através de comunicação I2C. Os pinos para I2C no Arduino são SDA e SCL. Conecte o módulo DS3231 ao Arduino assim:
- Conectar GND do DS3231 ao pino GND do Arduino.
- Conectar VCC do DS3231 ao pino 5V do Arduino.
- Conectar SDA do DS3231 ao A4 no Arduino.
- Conectar SCL do DS3231 ao pino A5 no Arduino.
Por fim, conecte o sensor LM35 ao Arduino. Conecte o pino esquerdo do LM35 ao 5V no Arduino, o pino do meio ao A0 no Arduino e o pino esquerdo ao terra no Arduino.
Você pode encontrar um esquemático em tamanho real aqui
Explicação do Código
Primeiro, adicionamos as bibliotecas para o módulo DS3231 e o OLED. A biblioteca Adafruit para o OLED tem mais funções comparada a outras bibliotecas usadas para OLEDs.
#include <DS3231.h>
#include <Adafruit_SSD1306.h>
Em seguida, definimos os pinos onde conectamos o módulo DS3231 e o OLED. O módulo DS3231 funciona com o Arduino através de comunicação I2C, então usamos os pinos SDA e SCL do Arduino. O OLED funciona com o Arduino através de comunicação SPI. Portanto, inicializamos os pinos 8, 9, 10, 11, 13 que são para comunicações SPI. Depois, inicializamos o pino do sensor LM35 e outras variáveis.
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;
Na função setup, declaramos o pino do sensor LM35 como entrada porque o Arduino lerá a entrada do sensor. Então demos o comando para DS3231 e OLED começarem a comunicar com o Arduino.
pinMode(sensor_pin, INPUT);
rtc.begin();
display.begin(SSD1306_SWITCHCAPVCC);
As linhas abaixo estão comentadas no código, mas se você estiver usando o módulo DS3231 pela primeira vez e quiser definir o dia, data e hora, descomente estas linhas e defina.
// rtc.setDOW(WEDNESDAY); // Definir Dia-da-Semana para QUARTA-FEIRA
// rtc.setTime(19, 02, 0); // Definir hora para 19:02:00 (formato 24h)
// rtc.setDate(7, 12, 2017); // Definir data para 7 de dezembro de 2017
Então imprimimos "weather clock" no 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);
Na função loop, lemos do LM35 e calculamos a temperatura. Então obtemos a hora e data e imprimimos no 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 <DS3231.h>
#include <Adafruit_SSD1306.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); // Definir Dia-da-Semana para QUARTA-FEIRA
// rtc.setTime(19, 02, 0); // Definir hora para 19:02:00 (formato 24h)
// rtc.setDate(7, 12, 2017); // Definir data para 7 de dezembro de 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);
}
Código
Trecho de Código #4
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);
Trecho de Código #5
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());
Trecho de Código #6 (Código Completo)
#include <DS3231.h>
#include <Adafruit_SSD1306.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); // 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
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
Processo de manufatura
- Crie Efeitos de Áudio Controlados por Sensores com o Kit Satellite CCRMA
- Construa um Relógio Retrô Numitron com Arduino: Simples, Confiável e Eficiente
- Relógio em Tempo Real com Arduino para Horários de Oração Islâmica
- Construa o Clássico Jogo Pong no Arduino UNO com Display OLED – Tutorial Passo a Passo
- Relógio de Palavras de Precisão: Exibição de Tempo em Palavras com Resolução de Minuto
- Construa um Relógio Mestre LED Personalizado com Alarme – Visível a 12 Metros
- Monitor de Temperatura e Relógio Tempo Real com Arduino Due e Display TFT 3.2"
- Construa um Relógio de Berlim com Arduino UNO – Relógio DIY de Matriz LED
- Projeto HMI Interativo com Nextion, Arduino Mega e Sensores
- Construa um Relógio Despertador Confiável com RTC DS1302 e Arduino UNO