Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Arduino Real-Time Clock LED Klok: Bouw een Betrouwbare Tijdweergave

Onderdelen en benodigdheden

Arduino UNO × 1
Real Time Clock (RTC) module (DS1307) × 1
Weerstand 1 kΩ × 15
Weerstand 120 Ω × 15
Lineaire regulator 7805 (5V) × 1
Condensator 22 pF × 1
Kristal 16 MHz × 1
Condensator 10 µF × 1
Knopcelbatterij CR2032 × 1
Batterijhouder CR2032 × 1
5 mm LED Groen × 190
NPN Transistor (RF) × 10
PNP Transistor (Algemeen) × 12
Tactiele schakelaar (Top Actuated) × 4
Voeding 12V 5A (60W) × 1

Benodigde tools en machines

  • Solderbout
  • Loodvrij soldeerdraad
  • Multimeter

Over dit project

Eerst moet je de volgende bibliotheken downloaden:

  1. Wire.h (standaard in Arduino IDE)
  2. RTClib.h (via Bibliotheekbeheer of GitHub)

Onderdelenlijst

Arduino Real-Time Clock LED Klok: Bouw een Betrouwbare Tijdweergave

RTC Clock Module

Arduino Real-Time Clock LED Klok: Bouw een Betrouwbare Tijdweergave

Arduino Schakeling

Arduino Real-Time Clock LED Klok: Bouw een Betrouwbare Tijdweergave

RTC Bedrading

Arduino Real-Time Clock LED Klok: Bouw een Betrouwbare Tijdweergave

RTC Schakelaars

Arduino Real-Time Clock LED Klok: Bouw een Betrouwbare Tijdweergave

Anode en Kathode identificeren

Arduino Real-Time Clock LED Klok: Bouw een Betrouwbare Tijdweergave

Schema (Common Anode)

Arduino Real-Time Clock LED Klok: Bouw een Betrouwbare Tijdweergave

Als je Common Cathode LED's gebruikt - maak deze wijzigingen

Arduino Real-Time Clock LED Klok: Bouw een Betrouwbare Tijdweergave

Voeding

Arduino Real-Time Clock LED Klok: Bouw een Betrouwbare Tijdweergave

Code

LED Klok Code

/* 4-digit 7-segment display met RTC DS1307
   Gemodificeerd door BMIAK Basnayaka
   https://www.setnfix.com */

int digit1 = 11;
int digit2 = 10;
int digit3 = 9;
int digit4 = 6;
int digit5 = 5;
int digit6 = 3;

// Segmentpinnen mapping
int segA = 0;   // Display pin 11
int segB = 1;   // Display pin 7
int segC = 2;   // Display pin 4
int segD = 4;   // Display pin 2
int segE = 7;   // Display pin 1
int segF = 8;   // Display pin 10
int segG = 12;  // Display pin 5
int segDP = 13; // Display pin 3

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

byte SW0 = A0;  // Uur instellen
byte SW1 = A2;  // Minuut instellen
byte SW2 = A1;  // Modus
byte SWT = A3;  // 12/24u wissel

int Adhr = 0;
int Admnt = 0;
int D = 0;
int Z = 0;

void setup() {
  Wire.begin();
  RTC.begin();
  // RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // Uncomment om klok in te stellen

  // SQW 1Hz inschakelen op DS1307
  Wire.beginTransmission(0x68);
  Wire.write(0x07);
  Wire.write(0x10);  // 1Hz vierkante golf
  Wire.endTransmission();

  // Pinnen instellen
  pinMode(segA, OUTPUT); pinMode(segB, OUTPUT); pinMode(segC, OUTPUT);
  pinMode(segD, OUTPUT); pinMode(segE, OUTPUT); pinMode(segF, OUTPUT);
  pinMode(segG, OUTPUT); pinMode(segDP, OUTPUT);
  pinMode(digit1, OUTPUT); pinMode(digit2, OUTPUT); pinMode(digit3, OUTPUT);
  pinMode(digit4, OUTPUT); pinMode(digit5, OUTPUT); pinMode(digit6, OUTPUT);

  pinMode(SW0, INPUT_PULLUP);
  pinMode(SW1, INPUT_PULLUP);
  pinMode(SW2, INPUT_PULLUP);
  pinMode(SWT, INPUT_PULLUP);
  digitalWrite(segDP, LOW);
}

void loop() {
  DateTime now = RTC.now();
  long HR = now.hour() * 1000;
  long timp = (HR * 10) + now.minute() * 100 + now.second();
  Adhr = now.hour();
  Admnt = now.minute();

  // 12/24 uur wisseling via SWT
  if (digitalRead(SWT) == LOW) {
    delay(300);
    D = 1 - D;
  }

  if (D == 0) {  // 24-uurs modus
    if (timp >= 130000) {
      timp -= 120000;
      digitalWrite(segDP, HIGH);  // PM indicator
    }
  } else {
    digitalWrite(segDP, LOW);
  }

  // Multiplexing display (6 digits)
  for (int i = 100; i > 0; i--) {
    if (timp >= 100000) displayNumber01(timp);
    else displayNumber02(timp);
  }
  for (int i = 100; i > 0; i--) {
    if (timp >= 100000) displayNumber03(timp);
    else displayNumber04(timp);
  }
  for (int i = 100; i > 0; i--) {
    if (timp >= 100000) displayNumber05(timp);
    else displayNumber06(timp);
  }

  // Tijd instellen met SW0
  if (digitalRead(SW0) == LOW) {
    delay(100);
    Z = 1;
    set_time();
  }
}

void set_time() {
  byte minutes = Admnt;
  byte hours = Adhr;

  while (Z == 1) {
    // Uren instellen met SW2
    while (digitalRead(SW2) == LOW) {
      hours++;
      if ((hours & 0x0F) > 9) hours += 6;
      if (hours > 0x24) hours = 1;
      // Display update...
      delay(200);
    }

    // Minuten instellen met SW1
    while (digitalRead(SW1) == LOW) {
      minutes++;
      if ((minutes & 0x0F) > 9) minutes += 6;
      if (minutes > 0x59) minutes = 0;
      // Display update...
      delay(200);
    }

    // Schrijf naar RTC
    Wire.beginTransmission(0x68);
    Wire.write(0);
    Wire.write(0x00);        // Seconden
    Wire.write(minutes);     // Minuten
    Wire.write(0x80 | hours); // Uren (24h formaat)
    Wire.write(0x06);        // Dag
    Wire.write(0x01);        // Datum
    Wire.write(0x05);        // Maand
    Wire.write(0x09);        // Jaar
    Wire.write(0x10);        // Control register (1Hz SQW)
    Wire.endTransmission();

    if (digitalRead(SW0) == LOW) Z = 0;
    delay(300);
  }
}

// Display multiplexing functies (displayNumber01 t/m 06) en lightNumber()
/* ... (volledige multiplexing code in origineel) ... */

void lightNumber(int numberToDisplay) {
  #define SEGMENT_ON HIGH
  #define SEGMENT_OFF LOW
  // Voor Common Cathode: ON=LOW, OFF=HIGH

  switch (numberToDisplay) {
    case 0: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
            digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
            digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON);
            digitalWrite(segG, SEGMENT_OFF); break;
    case 1: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON);
            digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF);
            digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF);
            digitalWrite(segG, SEGMENT_OFF); break;
    case 2: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
            digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_ON);
            digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_OFF);
            digitalWrite(segG, SEGMENT_ON); break;
    case 3: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
            digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
            digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF);
            digitalWrite(segG, SEGMENT_ON); break;
    case 4: digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_ON);
            digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF);
            digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON);
            digitalWrite(segG, SEGMENT_ON); break;
    case 5: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF);
            digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
            digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON);
            digitalWrite(segG, SEGMENT_ON); break;
    case 6: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_OFF);
            digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
            digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON);
            digitalWrite(segG, SEGMENT_ON); break;
    case 7: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
            digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_OFF);
            digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF);
            digitalWrite(segG, SEGMENT_OFF); break;
    case 8: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
            digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
            digitalWrite(segE, SEGMENT_ON); digitalWrite(segF, SEGMENT_ON);
            digitalWrite(segG, SEGMENT_ON); break;
    case 9: digitalWrite(segA, SEGMENT_ON); digitalWrite(segB, SEGMENT_ON);
            digitalWrite(segC, SEGMENT_ON); digitalWrite(segD, SEGMENT_ON);
            digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_ON);
            digitalWrite(segG, SEGMENT_ON); break;
    case 10: // Alle segmenten uit
            digitalWrite(segA, SEGMENT_OFF); digitalWrite(segB, SEGMENT_OFF);
            digitalWrite(segC, SEGMENT_OFF); digitalWrite(segD, SEGMENT_OFF);
            digitalWrite(segE, SEGMENT_OFF); digitalWrite(segF, SEGMENT_OFF);
            digitalWrite(segG, SEGMENT_OFF); break;
  }
}

Schema's

Dit is de bedrading van de SSD met LED's.

Arduino Real-Time Clock LED Klok: Bouw een Betrouwbare Tijdweergave

Productieproces

  1. Arduino POV-klok: Bouw een Persistence-of-Vision LED-display
  2. DIY Arduino Woordklok – Bouw een Elegant Real-Time Display
  3. Bouw een 20 kHz Arduino Oscilloscoop op een Nokia 5110 LCD – Eenvoudige DIY Handleiding
  4. Bouw een Aangepaste LED Hoofdklok met Alarm – Zichtbaar vanaf 12 Meter
  5. Slimme Jaloezieën: Geautomatiseerd Lichtbeheer met Arduino & Zonne-energie
  6. Bouw een Italiaanse Woordklok met Arduino Nano, NeoPixel, LCD en RTC
  7. Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
  8. Bouw een Slimme Arduino Vierpotige Robot: Stap-voor-Stap Handleiding
  9. Bouw een Precieze 7-Segment Klok met Arduino Pro Mini & DS1302 RTC
  10. Bouw een Betrouwbare Sigfox kWh Meter met Arduino MKR Fox 1200
  11. Geïsoleerde analoge ingangsschakeling voor Arduino bouwen