Reloj Analógico Arduino Nano con DS3231 RTC y Amperímetro 1mA: Temporizador de Madera de Precisión
Componentes y Suministros
| Componente | Cantidad |
|---|---|
| Arduino Nano R3 | 1 |
| Maxim Integrated DS3231M - RTC I2C ±5ppm | 1 |
| Amperímetro 1mA | 3 |
| Resistencia 5kΩ | 3 |
| Resistencia 10kΩ | 2 |
| Pulsador 12mm (SparkFun) | 2 |
Aplicaciones y Servicios Online
- Arduino IDE
Sobre este Proyecto
He construido este reloj analógico de aspecto agradable con un Arduino Nano y amperímetros de 1mA. La idea la obtuve de otro proyecto. Para mostrar los segundos, se ha añadido una parte del código. También se ha añadido una parte que, al ejecutarse, recorre toda la escala de cero al valor máximo para fines de calibración. Dependiendo de los amperímetros que usemos, el valor de las resistencias de 5k puede ser diferente. Como todos los medidores son ligeramente diferentes, los valores PWM deben ajustarse según tu diseño. Tendrás que cambiar algunos valores porque está configurado para funcionar específicamente con mis 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/
_____________________
Conexiones:
- Cable USB rojo (5v) a VCC
- Cable USB negro a GND
- Pulsadores
- Izquierda/Abajo a Digital 2 (seguir tutorial Arduino: https://arduino.cc/en/uploads/Tutorial/button.png )
- Derecha/Arriba a Digital 3
- DS1307 RTC
- SDA a Analógico 4
- SCL a Analógico 5
- Medidor Analógico Izquierdo a Digital 5 (PWM)
- Medidor Analógico Derecho a Digital 6 (PWM)
- Medidor Analógico Segundos a Digital 9 (PWM)
_____________________
Nota: Como todos los medidores son ligeramente diferentes, los valores PWM
necesitan ser ajustados según tu diseño. Siéntete libre de usar mi código,
pero tendrás que cambiar algunos valores porque está configurado para
funcionar específicamente con mis medidores.
*/
#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; // solución para issue #527
int downButton = 2; // pulsador abajo para ajustar hora (pin 2)
int upButton = 3; // pulsador arriba para ajustar hora (pin 3)
int hours = 0;
int minutes = 0;
int seconds = 0;
int lastMinute = 0;
int lastSecond = 0;
int leftMeter = 5; // medidor izquierdo (horas) en pin 5
int rightMeter = 6; // medidor derecho (min) en pin 6
int secMeter = 9; // medidor segundos (seg) en pin 9
void setup(){
Wire.begin();
Serial.begin(9600); // ver hora en monitor serial
pinMode(leftMeter, OUTPUT); // Inicializar salidas e entradas
pinMode(rightMeter, OUTPUT);
pinMode(secMeter, OUTPUT);
digitalWrite(leftMeter, HIGH); // Probar medidores al inicio
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);
// Cambiar la hora con botones
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); // detener oscilador
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(zero); // iniciar
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); // detener oscilador
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(zero); // iniciar
Wire.endTransmission();
}
}
byte decToBcd(byte val){
// Convertir números decimales normales a decimal codificado en binario
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val) {
// Convertir decimal codificado en binario a números decimales normales
return ( (val/16*10) + (val%16) );
}
void printDate(){
// Resetear el puntero de registro
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); // hora 24h
// Imprimir la fecha
Serial.print(hours);
Serial.print(":");
// Niveles específicos del medidor para cada hora
// Probablemente tendrás que ajustar estos valores.
// Juega con los valores hasta que obtengas lo que quieres.
if (lastMinute != minutes){
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); }
if (minutes * 4.75 < 255){
analogWrite(rightMeter, minutes * 4.75);
}else{
analogWrite(rightMeter, 255);
}
lastMinute = minutes;
if (seconds * 4.25 < 255){
analogWrite(secMeter, seconds * 4.25);
}else{
analogWrite(secMeter, 255);
}
lastSecond = seconds;
}
}
Esquemático
Proceso de manufactura
- Reloj POV con Arduino: Construye una pantalla LED de persistencia de visión
- Reloj de Palabras DIY con Arduino: Construye una Pantalla Elegante en Tiempo Real
- Construye un reloj en tiempo real con Arduino para horarios de oración islámica
- Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
- Vestido Inteligente con Arduino Nano: Monitor de Ritmo Cardíaco y LEDs Controlados por CrazyCircuits y DFRobot
- Reloj analógico por persistencia de visión (POV) con Arduino Nano – Proyecto DIY
- Rueda de Trimado Compacta para FlightGear con Arduino Nano: Control Analógico DIY
- Controla Dos Motores Paso a Paso con Arduino Nano y Joystick - Tutorial Sencillo
- Medidores de Panel: Una Solución Rentable para la Interfaz y el Control de Máquinas
- Cómo Elegir el Panel Adecuado: Soluciones Digitales vs. Analógicas
- Medidores de Panel Explicados: Cómo Monitorizan y Controlan Equipos Industriales