Relógio Analógico com Arduino Nano, DS3231 RTC e Amperímetros 1mA - Timer de Precisão em Madeira
Componentes e Materiais Necessários
| Componente | Quantidade | Observações |
|---|---|---|
| Arduino Nano R3 | 1 | Microcontrolador principal |
| DS3231M - RTC I2C ±5ppm (Maxim Integrated) | 1 | Relógio de tempo real de alta precisão |
| Amperímetro analógico 1mA | 3 | Para horas, minutos e segundos |
| Resistor 5kΩ | 3 | Um para cada amperímetro (pode variar conforme o medidor) |
| Resistor 10kΩ | 2 | Para botões de ajuste |
| Chave táctil 12mm (SparkFun) | 2 | Botões para ajuste de hora (cima/baixo) |
Aplicativos e Serviços Online
- Arduino IDE
Sobre o Projeto
Construí este relógio analógico de aparência elegante com um Arduino Nano e amperímetros de 1mA. A ideia original veio daqui. Para exibir os segundos, uma parte do código foi adicionada. Também foi incluída uma parte que, ao iniciar, percorre toda a escala de zero ao valor máximo para fins de calibração. Dependendo dos amperímetros que usamos, o valor dos resistores de 5kΩ pode ser diferente. Como todos os medidores são ligeiramente diferentes, os valores PWM precisam ser ajustados com base no seu design. Você terá que alterar alguns valores porque o código está configurado para funcionar especificamente com meus medidores.
Código
/* Analog Panel Meter - Clock ONLY Mode
Instructables Link: https://www.instructables.com/id/Analog-VU-meter-and-Clock-Arduino-Powered/
Credits: bildr - DS1307 RTC code https://bildr.org/2011/03/ds1307-arduino/
_____________________
Ligações:
- Fio vermelho USB (5v) para VCC
- Fio preto USB para GND
- Botões
- Esquerda/Baixo para Digital 2 (siga tutorial Arduino: https://arduino.cc/en/uploads/Tutorial/button.png)
- Direita/Cima para Digital 3
- DS1307 RTC
- SDA para Analógico 4
- SCL para Analógico 5
- Medidor Analógico Esquerdo para Digital 5 (PWM)
- Medidor Analógico Direito para Digital 6 (PWM)
- Medidor Analógico Segundos para Digital 9 (PWM)
_____________________
Nota: Como todos os medidores são ligeiramente diferentes, os valores PWM precisam ser ajustados baseados no seu design.
Sinta-se à vontade para usar meu código, mas você terá que mudar alguns valores porque está configurado para funcionar especificamente com meus medidores.
*/
#include <Wire.h>
#define DS1307_ADDRESS 0x68
byte zero = 0x00; // workaround para issue #527
int downButton = 2; // botão para diminuir hora (pino 2)
int upButton = 3; // botão para aumentar hora (pino 3)
int hours = 0;
int minutes = 0;
int seconds = 0;
int lastMinute = 0;
int lastSecond = 0;
int leftMeter = 5; // medidor esquerdo (horas) no pino 5
int rightMeter = 6; // medidor direito (minutos) no pino 6
int secMeter = 9; // medidor de segundos no pino 9
void setup() {
Wire.begin();
Serial.begin(9600); // ver hora no monitor serial
pinMode(leftMeter, OUTPUT);
pinMode(rightMeter, OUTPUT);
pinMode(secMeter, OUTPUT);
// Testa medidores na inicialização
digitalWrite(leftMeter, HIGH);
digitalWrite(rightMeter, HIGH);
digitalWrite(secMeter, HIGH);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(leftMeter, LOW);
digitalWrite(rightMeter, LOW);
digitalWrite(secMeter, LOW);
digitalWrite(13, LOW);
delay(1000);
}
void loop() {
printDate();
delay(75);
// Alterando a hora com botões
if (digitalRead(downButton) == HIGH) {
byte second = seconds;
byte minute = minutes;
byte hour = hours;
if (minutes > 0) {
--minute;
} else {
minute = 59;
if (hours > 0) {
--hour;
} else {
hour = 23;
}
}
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); // stop Oscillator
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(zero); // start
Wire.endTransmission();
}
if (digitalRead(upButton) == HIGH) {
byte second = 0;
byte minute = minutes;
byte hour = hours;
if (minutes < 59) {
++minute;
} else {
minute = 0;
if (hours < 23) {
++hour;
} else {
hour = 0;
}
}
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero); // stop Oscillator
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(zero); // start
Wire.endTransmission();
}
}
byte decToBcd(byte val) {
// Converte números decimais normais para decimal codificado em binário
return ((val / 10 * 16) + (val % 10));
}
byte bcdToDec(byte val) {
// Converte decimal codificado em binário para números decimais normais
return ((val / 16 * 10) + (val % 16));
}
void printDate() {
// Reset do ponteiro do registrador
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(zero);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
seconds = bcdToDec(Wire.read());
minutes = bcdToDec(Wire.read());
hours = bcdToDec(Wire.read() & 0b111111); // tempo 24 horas
// Imprime a data
Serial.print(hours);
Serial.print(":");
// Serial.println(minutes);
// Níveis específicos do medidor para cada hora
// Você provavelmente terá que ajustar estes valores.
// Brinque com os valores até obter o que deseja.
if (lastMinute != minutes) {
// Configuração do medidor de horas (esquerdo)
if (hours == 1 || hours == 13) { analogWrite(leftMeter, 0); }
if (hours == 2 || hours == 14) { analogWrite(leftMeter, 29); }
if (hours == 3 || hours == 15) { analogWrite(leftMeter, 52); }
if (hours == 4 || hours == 16) { analogWrite(leftMeter, 75); }
if (hours == 5 || hours == 17) { analogWrite(leftMeter, 98); }
if (hours == 6 || hours == 18) { analogWrite(leftMeter, 130); }
if (hours == 7 || hours == 19) { analogWrite(leftMeter, 152); }
if (hours == 8 || hours == 20) { analogWrite(leftMeter, 172); }
if (hours == 9 || hours == 21) { analogWrite(leftMeter, 192); }
if (hours == 10 || hours == 22) { analogWrite(leftMeter, 213); }
if (hours == 11 || hours == 23) { analogWrite(leftMeter, 234); }
if (hours == 0 || hours == 12) { analogWrite(leftMeter, 255); }
// Medidor de minutos (direito) - aumenta PWM em 4.75 a cada minuto
if (minutes * 4.75 < 255) {
analogWrite(rightMeter, minutes * 4.75);
} else {
analogWrite(rightMeter, 255);
}
lastMinute = minutes;
// Medidor de segundos
if (seconds * 4.25 < 255) {
analogWrite(secMeter, seconds * 4.25);
} else {
analogWrite(secMeter, 255);
}
lastSecond = seconds;
}
}
Esquemático
Nota importante: Como todos os medidores analógicos têm características ligeiramente diferentes, você deverá calibrar os valores PWM no código para que os ponteiros apontem corretamente para cada hora, minuto e segundo. Use a função de calibração na inicialização (varredura completa da escala) para determinar os valores corretos para seus medidores específicos.
Processo de manufatura
- Relógio POV com Arduino: Construa um Display LED de Persistência de Visão
- Relógio de Palavras DIY com Arduino – Construa um Display Elegante de Tempo Real
- Relógio em Tempo Real com Arduino para Horários de Oração Islâmica
- Construa um Relógio Mestre LED Personalizado com Alarme – Visível a 12 Metros
- Kit Arduino Nano: CrazyCircuits, Sensores DFRobot e Ferramentas – Crie Projetos com Confiança
- Relógio Analógico Estilo POV com LEDs – Projeto DIY Arduino Nano
- Controle de Trim Tab para FlightGear com Arduino Nano: Roda Analógica Compacta
- Medidores de Painel: Solução Econômica para Interface e Controle de Máquinas
- Escolhendo o Painel Certo: Soluções Digitais vs. Analógicas
- Medidores de Painel Explicados: Como Monitoram e Controlam Equipamentos Industriais