Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino Nano Analog-Uhr mit DS3231 RTC & 1-mA-Amperemeter – Präziser Holz-Timer

Komponenten und Zubehör

Arduino Nano R3 ×1
Maxim Integrated DS3231M – ±5ppm, I2C Echtzeituhr ×1
1-mA-Amperemeter ×3
5-kΩ-Widerstand ×3
10-kΩ-Widerstand ×2
SparkFun Taster 12 mm ×2

Apps und Online-Dienste

Über dieses Projekt

Ich habe diese schöne, im Holz-Look gestaltete analoge Uhr mit einem Arduino Nano und 1-mA-Amperemetern gebaut. Die Idee stammt von hier. Für die Anzeige der Sekunden wurde ein Code-Teil hinzugefügt. Ebenfalls hinzugefügt ist ein Teil, der beim Start die gesamte Skala von Null bis Maximalwert durchläuft, um Kalibrierungszwecke zu erfüllen. Je nach verwendetem Amperemeter können die Werte der 5-kΩ-Widerstände variieren. Da alle Messgeräte leicht unterschiedlich sind, müssen die PWM-Werte an dein Design angepasst werden. Du musst einige Werte ändern, da der Code speziell für meine Messgeräte eingestellt ist.

Code

/* 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/
_____________________
Verkabelung:
- USB rotes Kabel (5V) zu VCC
- USB schwarzes Kabel zu GND
- Taster: Links/Runter an Digital 2 (folge Arduino Tutorial: https://arduino.cc/en/uploads/Tutorial/button.png)
- Rechts/Hoch an Digital 3
- DS1307 RTC: SDA an Analog 4, SCL an Analog 5
- Linkes Analog-Meter an Digital 5 (PWM)
- Rechtes Analog-Meter an Digital 6 (PWM)
- Sekunden Analog-Meter an Digital 9 (PWM)
_____________________
Hinweis: Da alle Messgeräte leicht unterschiedlich sind, müssen die PWM-Werte an dein Design angepasst werden.
Fühle dich frei, meinen Code zu nutzen, aber du musst einige Werte ändern, da er speziell für meine Messgeräte funktioniert.
*/
#include "Wire.h"
#define DS1307_ADDRESS 0x68
byte zero = 0x00; // Workaround für Issue #527
int downButton = 2; // Runter-Taster für Zeit-Einstellung (Pin 2)
int upButton = 3;   // Hoch-Taster für Zeit-Einstellung (Pin 3)
int hours = 0;
int minutes = 0;
int seconds = 0;
int lastMinute = 0;
int lastSecond = 0;
int leftMeter = 5;   // linkes Meter (Stunden) an Pin 5
int rightMeter = 6;  // rechtes Meter (Minuten) an Pin 6
int secMeter = 9;    // Sekunden-Meter an Pin 9

void setup() {
  Wire.begin();
  Serial.begin(9600); // Zeit im Serial Monitor anzeigen
  pinMode(leftMeter, OUTPUT);
  pinMode(rightMeter, OUTPUT);
  pinMode(secMeter, OUTPUT);
  digitalWrite(leftMeter, HIGH);  // Messgeräte beim Start testen
  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);

  // Zeit mit Tastern ändern
  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); // Oszillator stoppen
    Wire.write(decToBcd(second));
    Wire.write(decToBcd(minute));
    Wire.write(decToBcd(hour));
    Wire.write(zero); // starten
    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); // Oszillator stoppen
    Wire.write(decToBcd(second));
    Wire.write(decToBcd(minute));
    Wire.write(decToBcd(hour));
    Wire.write(zero); // starten
    Wire.endTransmission();
  }
}

byte decToBcd(byte val) {
  // Normale Dezimalzahlen in BCD umwandeln
  return ((val/10*16) + (val%10));
}

byte bcdToDec(byte val) {
  // BCD in normale Dezimalzahlen umwandeln
  return ((val/16*10) + (val%16));
}

void printDate() {
  // Register-Zeiger zurücksetzen
  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); // 24-Stunden-Format

  // Zeit im Serial Monitor ausgeben
  Serial.print(hours);
  Serial.print(":");
  // Serial.println(minutes); // Auskommentieren für Serial Monitor

  // Spezifische Messgeräte-Pegel für jede Stunde
  // Du wirst diese Werte wahrscheinlich anpassen müssen.
  // Spiele mit den Werten, bis du das gewünschte Ergebnis erhältst.
  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); // 4.75 für exakte 30-Minuten-Mitte
    } else {
      analogWrite(rightMeter, 255);
    }
    lastMinute = minutes;

    if (seconds * 4.25 < 255) {
      analogWrite(secMeter, seconds * 4.25);
    } else {
      analogWrite(secMeter, 255);
    }
    lastSecond = seconds;
  }
}

Schaltplan

Arduino Nano Analog-Uhr mit DS3231 RTC & 1-mA-Amperemeter – Präziser Holz-Timer

Herstellungsprozess

  1. Arduino POV-Uhr: Persistence-of-Vision LED-Display selbst bauen
  2. DIY Arduino Word Clock – Elegante Wortuhr mit RTC & Schieberegistern
  3. Arduino Echtzeituhr für islamische Gebetszeiten bauen
  4. Einen eigenen LED-Master-Clock mit Alarm bauen – aus 12 Metern Entfernung ablesbar
  5. Arduino Nano Bundle: CrazyCircuits, DFRobot Sensoren & Werkzeuge – Projekte mit Vertrauen umsetzen
  6. Analog-Style LED Persistence-of-Vision Uhr – DIY Arduino Nano Projekt
  7. Kompaktes Trim-Rad für FlightGear mit Arduino Nano
  8. Panel-Meter: Kosteneffiziente Lösung für Maschinen-Interface und Steuerung
  9. Digital vs. Analog: Das richtige Panel-Meter wählen
  10. Panel-Meter verstehen: Überwachung & Steuerung industrieller Anlagen