Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

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

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

Relógio Analógico com Arduino Nano, DS3231 RTC e Amperímetros 1mA - Timer de Precisão em Madeira
Diagrama de ligações do relógio analógico com amperímetros

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

  1. Relógio POV com Arduino: Construa um Display LED de Persistência de Visão
  2. Relógio de Palavras DIY com Arduino – Construa um Display Elegante de Tempo Real
  3. Relógio em Tempo Real com Arduino para Horários de Oração Islâmica
  4. Construa um Relógio Mestre LED Personalizado com Alarme – Visível a 12 Metros
  5. Kit Arduino Nano: CrazyCircuits, Sensores DFRobot e Ferramentas – Crie Projetos com Confiança
  6. Relógio Analógico Estilo POV com LEDs – Projeto DIY Arduino Nano
  7. Controle de Trim Tab para FlightGear com Arduino Nano: Roda Analógica Compacta
  8. Medidores de Painel: Solução Econômica para Interface e Controle de Máquinas
  9. Escolhendo o Painel Certo: Soluções Digitais vs. Analógicas
  10. Medidores de Painel Explicados: Como Monitoram e Controlam Equipamentos Industriais