Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

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

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

Reloj Analógico Arduino Nano con DS3231 RTC y Amperímetro 1mA: Temporizador de Madera de Precisión

Proceso de manufactura

  1. Reloj POV con Arduino: Construye una pantalla LED de persistencia de visión
  2. Reloj de Palabras DIY con Arduino: Construye una Pantalla Elegante en Tiempo Real
  3. Construye un reloj en tiempo real con Arduino para horarios de oración islámica
  4. Construye un Reloj Maestro LED Personalizado con Alarma – Visible desde 12 Metros
  5. Vestido Inteligente con Arduino Nano: Monitor de Ritmo Cardíaco y LEDs Controlados por CrazyCircuits y DFRobot
  6. Reloj analógico por persistencia de visión (POV) con Arduino Nano – Proyecto DIY
  7. Rueda de Trimado Compacta para FlightGear con Arduino Nano: Control Analógico DIY
  8. Controla Dos Motores Paso a Paso con Arduino Nano y Joystick - Tutorial Sencillo
  9. Medidores de Panel: Una Solución Rentable para la Interfaz y el Control de Máquinas
  10. Cómo Elegir el Panel Adecuado: Soluciones Digitales vs. Analógicas
  11. Medidores de Panel Explicados: Cómo Monitorizan y Controlan Equipos Industriales