- Componenten vereist
- 4-cijferig 7-segment display
- 74HC595 Schakelregister IC
- DS3231 RTC-module
- Schakelschema
- Arduino UNO programmeren voor multiplexing van zeven segmenten
Digitale wandklokken worden tegenwoordig populairder en ze zijn beter dan analoge klokken, omdat het nauwkeurige tijd in uren, minuten en seconden biedt en de waarden gemakkelijk af te lezen zijn. Sommige digitale klokken hebben ook veel faciliteiten, zoals het weergeven van temperatuur, vochtigheid, het instellen van meerdere alarmen enz. De meeste digitale klokken gebruiken een zeven-segment display.
We hebben eerder veel digitale klokcircuits gebouwd met 7-segmentdisplays of met 16x2 LCD. Hier kunt u de complete PCB-ontwerpen van op AVR gebaseerde digitale klok bekijken. Deze tutorial gaat over het maken van een digitale klok door displays met vier tot zeven segmenten te multiplexen met Arduino UNO en de tijd weer te geven in HH: MM-indeling.
Componenten vereist
- 4-cijferig 7-segment display
- 74HC595 IC
- DS3231 RTC-module
- Arduino UNO
- Breadboard
- Draden aansluiten
4-cijferig 7-segment display
4-cijferig 7-segment display heeft vier zeven-segment display samengevoegd of we kunnen zeggen multiplex samen. Ze worden gebruikt om numerieke waarden weer te geven en ook enkele alfabetten met decimalen en dubbele punten. Het display kan in beide richtingen worden gebruikt. Vier cijfers zijn handig voor het maken van digitale klokken of voor het tellen van getallen van 0 tot 9999. Hieronder ziet u het interne diagram voor een 4-cijferig 7-segmentdisplay.
Elk segment heeft een LED met individuele LED-bediening. Er zijn twee soorten displays met zeven segmenten, zoals Common Anode en Common Cathode. De bovenstaande afbeelding toont het gewone 7-segment display van het anodetype.
Veel voorkomende Anode
In Common Anode zijn alle positieve terminals (anodes) van alle 8 LED's met elkaar verbonden, genaamd COM. En alle negatieve aansluitingen worden met rust gelaten of zijn verbonden met de pinnen van de microcontroller. Door de microcontroller te gebruiken, als logica LAAG is ingesteld om het specifieke LED-segment te verlichten en logica Hoog is ingesteld om LED UIT te schakelen.
Gemeenschappelijke kathode
In Common Cathode zijn alle negatieve aansluitingen (kathode) van alle 8 LED's met elkaar verbonden, genaamd COM. En alle positieve terminals worden met rust gelaten of verbonden met de microcontroller-pinnen. Door de microcontroller te gebruiken, als de logica HIGH is ingesteld om de LED te verlichten en LAAG om de LED UIT te schakelen.
Lees hier meer over 7-segmentdisplays en bekijk hoe deze kunnen worden gekoppeld aan andere microcontrollers:
- 7-segment display interface met Arduino
- 7-segment display interface met Raspberry Pi
- Koppeling van zeven segmenten display met ARM7-LPC2148
- 7-segment display interface met PIC-microcontroller
- 7-segment display interface met 8051 microcontroller
74HC595 Schakelregister IC
De IC 74HC595 ook wel bekend als 8-Bit Serial IN - Parallel OUT Shift Register. Dit IC kan gegevensinvoer in serie ontvangen en kan 8 outputpinnen parallel aansturen. Dit is handig om het aantal gebruikte pinnen van een microcontroller te verminderen. Alle 74HC595-schuifregister-gerelateerde projecten vindt u hier.
Werking van 74HC595 IC:
Dit IC gebruikt drie pinnen zoals Clock, Data & Latch met de microcontroller om de 8 outputpinnen van het IC te besturen. De klok wordt gebruikt om continu pulsen van de microcontroller te leveren en de gegevenspin wordt gebruikt om de gegevens te verzenden, zoals welke uitgang op de respectieve kloktijd AAN of UIT moet worden gezet.
Pinout:
Pincode |
Pin Naam |
Omschrijving |
1,2,3,4,5,6,7 |
Uitgangspinnen (Q1 tot Q7) |
De 74HC595 heeft 8 output pinnen waarvan 7 deze pinnen. Ze kunnen serieel worden aangestuurd |
8 |
Grond |
Verbonden met de grond van microcontroller |
9 |
(Q7) Seriële uitgang |
Deze pin wordt gebruikt om meer dan één 74HC595 als cascade aan te sluiten |
10 |
(MR) Master reset |
Reset alle uitgangen als laag. Moet hoog worden gehouden voor normaal gebruik |
11 |
(SH_CP) Klok |
Dit is de klokpen waarnaar het kloksignaal moet worden geleverd door MCU / MPU |
12 |
(ST_CP) Vergrendeling |
De Latch-pin wordt gebruikt om de gegevens naar de output-pinnen bij te werken. Het is actief hoog |
13 |
(OE) Uitgang inschakelen |
De Output Enable wordt gebruikt om de outputs uit te schakelen. Moet laag worden gehouden voor normaal gebruik |
14 |
(DS) Seriële gegevens |
Dit is de pin waarnaar gegevens worden verzonden, op basis waarvan de 8 uitgangen worden aangestuurd |
15 |
(Q0) Uitgang |
De eerste outputpin. |
16 |
Vcc |
Deze pin voedt de IC, meestal wordt + 5V gebruikt. |
DS3231 RTC-module
DS3231 is een RTC-module. RTC staat voor Real Time Clock. Deze module wordt gebruikt om de tijd en datum te onthouden, zelfs als het circuit niet onder stroom staat. Het heeft een batterij-backup CR2032 om de module te laten werken zonder externe voeding. Deze module bevat ook een temperatuursensor. De module kan gebruikt worden in embedded projecten zoals het maken van een digitale klok met temperatuurindicator etc. Hier zijn enkele handige projecten om er gebruik van te maken:
- Automatische voerautomaat met Arduino
- Koppeling van RTC-module (DS3231) met PIC-microcontroller: digitale klok
- Koppeling van RTC-module (DS3231) met MSP430: digitale klok
- ESP32 Real Time Clock met DS3231-module
- Digitale wandklok op printplaat met behulp van AVR Microcontroller Atmega16 en DS3231 RTC
Pinout van DS3231:
Pin Naam |
Gebruik |
VCC |
Verbonden met positief van stroombron |
GND |
Verbonden met aarde |
SDA |
Seriële gegevenspin (I2C) |
SCL |
Seriële klokpen (I2C) |
SQW |
Square Wave-uitgangspen |
32K |
32K oscillator-uitgang |
Kenmerken en specificaties:
- RTC telt seconden, minuten, uren en jaar
- Digitale temperatuursensor met een nauwkeurigheid van ± 3ºC
- Schrijf u in voor Ageing trim
- 400 Khz I2C-interface
- Laag energieverbruik
- CR2032-batterijback-up met een levensduur van twee tot drie jaar
- Bedrijfsspanning: 2,3 tot 5,5 V.
Schakelschema
Circuitverbinding tussen DS3231 RTC en Arduino UNO:
DS3231 |
Arduino UNO |
VCC |
5V |
GND |
GND |
SDA |
A4 |
SCL |
A4 |
Circuitverbindingen tussen 74HC595 IC & Arduino Uno:
74HC595 IC |
Arduino UNO |
11-SH_CP (SRCLK) |
6 |
12-ST_CP (RCLK) |
5 |
14-DS (gegevens) |
4 |
13-OE (vergrendeling) |
GND |
8-GND |
GND |
10-MR (SRCLR) |
+ 5V |
16-VCC |
+ 5V |
Circuitverbindingen tussen IC 74HC595 en 4-cijferige zeven segmenten en Arduino UNO:
4-cijferig zeven segment |
IC 74HC595 |
Arduino UNO |
EEN |
Q0 |
- |
B. |
V1 |
- |
C |
Q2 |
- |
D |
Q3 |
- |
E. |
V4 |
- |
F. |
V5 |
- |
G |
V6 |
- |
D1 |
- |
10 |
D2 |
- |
11 |
D3 |
- |
12 |
D4 |
- |
9 |
Arduino UNO programmeren voor multiplexing van zeven segmenten
De volledige code en werkvideo zijn aan het einde van deze tutorial bijgevoegd. In het programmeergedeelte wordt uitgelegd hoe de tijd (uur en minuut) wordt overgenomen van de RTC-module in 24-uursformaat en vervolgens wordt geconverteerd naar het respectieve formaat voor weergave in het 4-cijferige 7-segmentdisplay.
Om de DS3231 RTC-module te koppelen aan Arduino UNO wordt de I2C-bus van Arduino UNO gebruikt. Een bibliotheek heeft gebeld
In dit concept worden eerst uur en minuut uit RTC gehaald en ze worden gecombineerd zoals 0930 (21:30 uur) en vervolgens worden de afzonderlijke cijfers gescheiden zoals duizend, honderd, tientallen, eenheid en de individuele cijfers omgezet in binair formaat zoals 0 in 63 (0111111). Deze binaire code wordt naar een schuifregister gestuurd en vervolgens van het schuifregister naar het zeven segmenten, waarbij met succes het cijfer 0 wordt weergegeven in het zeven segmenten display. Op deze manier worden de vier cijfers gemultiplexed en worden uur en minuut weergegeven.
In eerste instantie is de benodigde bibliotheek inbegrepen, zoals DS3231-bibliotheek en Wire-bibliotheek (I2C-bibliotheek).
# omvatten
De pinnen zijn gedefinieerd voor de zeven segmentenbesturing. Deze bedieningselementen zullen een belangrijke rol spelen bij het multiplexen van het scherm.
#define latchPin 5 #define clockPin 6 #define dataPin 4 #define punt 2
De variabelen worden gedeclareerd om het geconverteerde of onbewerkte resultaat van de RTC op te slaan.
int h; // Variabele gedeclareerd voor uur int m; // Variabele gedeclareerd voor minuut int duizenden; int honderden; int tientallen; int eenheid; bool h24; bool PM;
Vervolgens wordt het object voor de klasse DS3231 gedeclareerd als RTC om het gebruik in verdere regels te vereenvoudigen.
DS3231 RTC;
Omdat de RTC-module is gekoppeld aan Arduino door middel van I2C-communicatie. Dus, wire.begin () wordt gebruikt om I2C-communicatie te starten in het standaardadres van RTC, aangezien er geen andere I2C-modules zijn.
Wire.begin ();
De pin-modus is gedefinieerd, of de GPIO zich zal gedragen als uitvoer of invoer.
pinMode (9, UITGANG); pinMode (10, UITGANG); pinMode (11, UITGANG); pinMode (12, UITGANG); pinMode (latchPin, OUTPUT); pinMode (clockPin, OUTPUT); pinMode (dataPin, OUTPUT); pinMode (punt, UITGANG);
De lus loopt oneindig en het kost de tijd in uur en minuten van de RTC DS3231-module. 'h24' geeft de 24-uurs formaatvariabele aan.
int h = RTC.getHour (h24, PM); int m = RTC.getMinute ();
Vervolgens worden het uur en de minuut gecombineerd tot één getal (als uur bijvoorbeeld 10 is en min is 60, dan is het getal 10 * 100 = 1000 + 60 = 1060).
int nummer = h * 100 + m;
De individuele cijfers van het nummer worden verkregen (voorbeeld 1060-1 is duizend, 0 is hundered, 1 is tiende en 0 is het laatste cijfer). Om de cijfers te scheiden, wordt de modulus-operator gebruikt. Bijvoorbeeld, in 1060 om 1 te krijgen, dan is 1060/1000 = 1,06% 10 = 1). Dus afzonderlijke cijfers worden opgeslagen in afzonderlijke variabelen.
int duizenden = aantal / 1000% 10; int honderden = aantal / 100% 10; int tientallen = aantal / 10% 10; int eenheid = aantal% 10;
Daarna wordt een switch-case-instructie voor elk afzonderlijk cijfer gedefinieerd om ze om te zetten in het respectieve formaat (binair formaat) en via een schuifregister te verzenden om in 7 segmenten weer te geven. Bijvoorbeeld (voor 1 cijfer wordt dit gewijzigd in 06 (0000 0110)). Zodat het via shift wordt verzonden en 1 cijfer wordt weergegeven in 7-segmenten (0 voor LOW, 1 voor HIGH).
schakelaar (t) { geval 0: eenheid = 63; breken; geval 1: eenheid = 06; breken; geval 2: eenheid = 91; breken; geval 3: eenheid = 79; breken; geval 4: eenheid = 102; breken; geval 5: eenheid = 109; breken; geval 6: eenheid = 125; geval 7: eenheid = 07; breken; geval 8: eenheid = 127; breken; geval 9: eenheid = 103; breken; }
Vervolgens wordt het individuele cijfer in binair formaat verzonden via de 'shiftout'-functie met MSB eerst en wordt de respectieve cijferpin HOOG gemaakt en de latchpin wordt HOOG gemaakt.
digitalWrite (9, LOW); digitalWrite (latchPin, LOW); shiftOut (dataPin, clockPin, MSBFIRST, duizenden); digitalWrite (latchPin, HIGH); digitalWrite (9, HIGH); vertraging (5);
Hiermee is de volledige code voltooid. De meeste functie-uitleg wordt gegeven in het codecommentaargedeelte net naast de coderegel. De frequentie van de klok bepaalt de weergave van de tijd en de kwaliteit van multiplexen. Ie als een lage klok wordt gebruikt, is het flikkeren te zien, alsof de kloksnelheid hoog is, zal er niet zo'n flikkering zijn en kan een constante tijd worden gezien.
Merk op dat om toegang te krijgen tot de RTC-module, de I2C-busspanning moet worden gehandhaafd. Om suggesties te doen of als u twijfelt, kunt u hieronder reageren.