blogy logo
login PRIHLÁS SA
BLOG deadawp
ČLÁNKY
DISKUSIE
2
SLEDOVAŤ BLOG
PHP, Arduino programátor
deadawp



Hodiny - 74HC595 - 7-segmentový displej
pridal deadawp 26.7. 2020 o 18:22



Nadviažeme na posledný článok v blogu, ktorý sa zaoberal využitím posuvného registra 74HC595 a 7-segmentového displeja. Dnes si to rozšírime na komplexnejší ale jednoduchý projekt v podobe hodín využívajúcich 4 posuvné registra 74HC595 zapojené do kaskády a z 4 7-segmentových displejov. Hodiny sú navrhnuté pre formát času: HH:MM.

Zapojenie posuvných registrov s Arduinom využíva 3 signály  - dátový (SER), hodinový (SRCLK) a preklápací (RCLK). 74HC595 je 8-bitový register. Nakoľko sa využíva iba 7 vstupov (ôsmy je pre ovládanie bodky - DP), využíva sa iba bitová hodnota 0 až 127 pre výpis číslic na displej. 

Pri zápise hodnôt na jednotlivé displeje - na každý vždy postupnosť 8 bitov. Dáta sa zapisujú a aplikujú na displej na posledného displeja po prvý. Dáta až do aplikovania na výstupy ostávajú uložené v pamäti posuvných registrov.

Zapojenia a tabuľkové hodnoty platia iba pre bit order MSB FIRST!

Kompletné zapojenie 74HC595 --> Arduino (Uno, R3):

Vcc 5V
GND GND
SER (Data) D6
RCLK (Preklápací --> Latch) D7
SRCLK (Clock) D8
OE GND
SRCLR 5V

Zapojenie 74HC595 --> 7-segmentový displej:

Vývod 74HC595 Vstup 7-segmentového displeja
QA G
QB F
QC A
QD B
QE E
QF D
QG C

 

 

Hodnoty pre bajt (osmicu bitov) a vizualizované číslo na 7-segmentovom displeji:

00000001 == 1 (DEC) 0
00110111 == 55 (DEC) 1
01000010 == 66 (DEC) 2
00010010 == 18 (DEC) 3
00110100 == 52 (DEC) 4
00011000 == 24 (DEC) 5
00001000 == 8 (DEC) 6
00110011 == 51 (DEC) 7
00000000 == 0 (DEC) 8
00010000 == 16 (DEC) 9

Projekt je navrhnutý a otestovaný v cloudovom simuláre TinkerCAD. Využíva sa zapojenie 7-segmentového displeja so spoločnou anódou. Pri zapojení so spoločnou katódou sa na katódu privádza GND.

Logika hodín:

Nakoľko simulátor TinkerCAD neobsahuje RTC moduly DS1307 respektíve DS3231, ktoré sú schopné udržiavať čas, Arduino riadi aj počítadlo hodín. Celé hodiny sú naprogramované fixne so začínajúcim časom 12 hodín 30 minút. Počítadlo sa spúšťa každých 1000ms a pripočítava sekundu. V sústave podmienok sa overuje pretečenie sekúnd, minút a hodín, ktoré nastáva. 

Počítadlo pri výpise času používa sústavu vetvenia, ktoré obsahuje konkrétny znak pre každé číslo, ktoré môže nastať - pre hodiny 0 až 23, pre minúty 0 až 59. Prekreslovanie displejov sa realizuje každú sekundu pri inkrementácii počítadla. Výpis môže byť vykonaný aj raz za 60 000ms. Nakoľko je počítadlo millis() typu unsigned long veľkosti 4B - 32bit, pretečie po 49 dňoch. S pretečením počíta aj programová implementácia.  

Projekt má výslovne edukatívny charakter. Funkcia millis() sa môže za 24 hodín oneskoriť aj o 10 minút. Odporúča sa preto využívať RTC modul DS3231.

Hodiny za behu - 12:43:

Projekt je možné vyskúšať a postaviť si vlastný návrh pre hodiny s posuvnými registrami na TinkerCAD-e: https://www.tinkercad.com/things/1oPWbzxAfXa

Programová implementácia pre Arduino IDE (s predmetnou schémou zapojenia):

//Hodiny - 74HC595 + 7-segment display - Clock
//Author: Martin Chlebovec (martinius96)
//Web: https://arduino.php5.sk
//Donate: https://paypal.me/chlebovec

int pinData = 6;
int pinLatch = 7;
int pinClock = 8;
int hour = 12;
int minute = 30;
int second = 0;
unsigned long cas = 0;
void ledWrite(int hodina, int minuta) {
switch (hodina) {
case 0:
shiftOut(pinData, pinClock, MSBFIRST, 1);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 1:
shiftOut(pinData, pinClock, MSBFIRST, 55);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 2:
shiftOut(pinData, pinClock, MSBFIRST, 66);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 3:
shiftOut(pinData, pinClock, MSBFIRST, 18);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 4:
shiftOut(pinData, pinClock, MSBFIRST, 52);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 5:
shiftOut(pinData, pinClock, MSBFIRST, 24);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 6:
shiftOut(pinData, pinClock, MSBFIRST, 8);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 7:
shiftOut(pinData, pinClock, MSBFIRST, 51);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 8:
shiftOut(pinData, pinClock, MSBFIRST, 0);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 9:
shiftOut(pinData, pinClock, MSBFIRST, 16);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 10:
shiftOut(pinData, pinClock, MSBFIRST, 1);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 11:
shiftOut(pinData, pinClock, MSBFIRST, 55);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 12:
shiftOut(pinData, pinClock, MSBFIRST, 66);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 13:
shiftOut(pinData, pinClock, MSBFIRST, 18);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 14:
shiftOut(pinData, pinClock, MSBFIRST, 52);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 15:
shiftOut(pinData, pinClock, MSBFIRST, 24);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 16:
shiftOut(pinData, pinClock, MSBFIRST, 8);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 17:
shiftOut(pinData, pinClock, MSBFIRST, 51);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 18:
shiftOut(pinData, pinClock, MSBFIRST, 0);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 19:
shiftOut(pinData, pinClock, MSBFIRST, 16);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 20:
shiftOut(pinData, pinClock, MSBFIRST, 1);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 21:
shiftOut(pinData, pinClock, MSBFIRST, 55);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 22:
shiftOut(pinData, pinClock, MSBFIRST, 66);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 23:
shiftOut(pinData, pinClock, MSBFIRST, 18);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
default:
// statements
break;
}

switch (minuta) {
case 0:
shiftOut(pinData, pinClock, MSBFIRST, 1);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 1:
shiftOut(pinData, pinClock, MSBFIRST, 55);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 2:
shiftOut(pinData, pinClock, MSBFIRST, 66);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 3:
shiftOut(pinData, pinClock, MSBFIRST, 18);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 4:
shiftOut(pinData, pinClock, MSBFIRST, 52);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 5:
shiftOut(pinData, pinClock, MSBFIRST, 24);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 6:
shiftOut(pinData, pinClock, MSBFIRST, 8);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 7:
shiftOut(pinData, pinClock, MSBFIRST, 51);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 8:
shiftOut(pinData, pinClock, MSBFIRST, 0);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 9:
shiftOut(pinData, pinClock, MSBFIRST, 16);
shiftOut(pinData, pinClock, MSBFIRST, 1);
break;
case 10:
shiftOut(pinData, pinClock, MSBFIRST, 1);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 11:
shiftOut(pinData, pinClock, MSBFIRST, 55);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 12:
shiftOut(pinData, pinClock, MSBFIRST, 66);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 13:
shiftOut(pinData, pinClock, MSBFIRST, 18);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 14:
shiftOut(pinData, pinClock, MSBFIRST, 52);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 15:
shiftOut(pinData, pinClock, MSBFIRST, 24);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 16:
shiftOut(pinData, pinClock, MSBFIRST, 8);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 17:
shiftOut(pinData, pinClock, MSBFIRST, 51);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 18:
shiftOut(pinData, pinClock, MSBFIRST, 0);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 19:
shiftOut(pinData, pinClock, MSBFIRST, 16);
shiftOut(pinData, pinClock, MSBFIRST, 55);
break;
case 20:
shiftOut(pinData, pinClock, MSBFIRST, 1);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 21:
shiftOut(pinData, pinClock, MSBFIRST, 55);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 22:
shiftOut(pinData, pinClock, MSBFIRST, 66);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 23:
shiftOut(pinData, pinClock, MSBFIRST, 18);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 24:
shiftOut(pinData, pinClock, MSBFIRST, 52);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 25:
shiftOut(pinData, pinClock, MSBFIRST, 24);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 26:
shiftOut(pinData, pinClock, MSBFIRST, 8);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 27:
shiftOut(pinData, pinClock, MSBFIRST, 51);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 28:
shiftOut(pinData, pinClock, MSBFIRST, 0);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 29:
shiftOut(pinData, pinClock, MSBFIRST, 16);
shiftOut(pinData, pinClock, MSBFIRST, 66);
break;
case 30:
shiftOut(pinData, pinClock, MSBFIRST, 1);
shiftOut(pinData, pinClock, MSBFIRST, 18);
break;
case 31:
shiftOut(pinData, pinClock, MSBFIRST, 55);
shiftOut(pinData, pinClock, MSBFIRST, 18);
break;
case 32:
shiftOut(pinData, pinClock, MSBFIRST, 66);
shiftOut(pinData, pinClock, MSBFIRST, 18);
break;
case 33:
shiftOut(pinData, pinClock, MSBFIRST, 18);
shiftOut(pinData, pinClock, MSBFIRST, 18);
break;
case 34:
shiftOut(pinData, pinClock, MSBFIRST, 52);
shiftOut(pinData, pinClock, MSBFIRST, 18);
break;
case 35:
shiftOut(pinData, pinClock, MSBFIRST, 24);
shiftOut(pinData, pinClock, MSBFIRST, 18);
break;
case 36:
shiftOut(pinData, pinClock, MSBFIRST, 8);
shiftOut(pinData, pinClock, MSBFIRST, 18);
break;
case 37:
shiftOut(pinData, pinClock, MSBFIRST, 51);
shiftOut(pinData, pinClock, MSBFIRST, 18);
break;
case 38:
shiftOut(pinData, pinClock, MSBFIRST, 0);
shiftOut(pinData, pinClock, MSBFIRST, 18);
break;
case 39:
shiftOut(pinData, pinClock, MSBFIRST, 16);
shiftOut(pinData, pinClock, MSBFIRST, 18);
break;

case 40:
shiftOut(pinData, pinClock, MSBFIRST, 1);
shiftOut(pinData, pinClock, MSBFIRST, 52);
break;
case 41:
shiftOut(pinData, pinClock, MSBFIRST, 55);
shiftOut(pinData, pinClock, MSBFIRST, 52);
break;
case 42:
shiftOut(pinData, pinClock, MSBFIRST, 66);
shiftOut(pinData, pinClock, MSBFIRST, 52);
break;
case 43:
shiftOut(pinData, pinClock, MSBFIRST, 18);
shiftOut(pinData, pinClock, MSBFIRST, 52);
break;
case 44:
shiftOut(pinData, pinClock, MSBFIRST, 52);
shiftOut(pinData, pinClock, MSBFIRST, 52);
break;
case 45:
shiftOut(pinData, pinClock, MSBFIRST, 24);
shiftOut(pinData, pinClock, MSBFIRST, 52);
break;
case 46:
shiftOut(pinData, pinClock, MSBFIRST, 8);
shiftOut(pinData, pinClock, MSBFIRST, 52);
break;
case 47:
shiftOut(pinData, pinClock, MSBFIRST, 51);
shiftOut(pinData, pinClock, MSBFIRST, 52);
break;
case 48:
shiftOut(pinData, pinClock, MSBFIRST, 0);
shiftOut(pinData, pinClock, MSBFIRST, 52);
break;
case 49:
shiftOut(pinData, pinClock, MSBFIRST, 16);
shiftOut(pinData, pinClock, MSBFIRST, 52);
break;
case 50:
shiftOut(pinData, pinClock, MSBFIRST, 1);
shiftOut(pinData, pinClock, MSBFIRST, 24);
break;
case 51:
shiftOut(pinData, pinClock, MSBFIRST, 55);
shiftOut(pinData, pinClock, MSBFIRST, 24);
break;
case 52:
shiftOut(pinData, pinClock, MSBFIRST, 66);
shiftOut(pinData, pinClock, MSBFIRST, 24);
break;
case 53:
shiftOut(pinData, pinClock, MSBFIRST, 18);
shiftOut(pinData, pinClock, MSBFIRST, 24);
break;
case 54:
shiftOut(pinData, pinClock, MSBFIRST, 52);
shiftOut(pinData, pinClock, MSBFIRST, 24);
break;
case 55:
shiftOut(pinData, pinClock, MSBFIRST, 24);
shiftOut(pinData, pinClock, MSBFIRST, 24);
break;
case 56:
shiftOut(pinData, pinClock, MSBFIRST, 8);
shiftOut(pinData, pinClock, MSBFIRST, 24);
break;
case 57:
shiftOut(pinData, pinClock, MSBFIRST, 51);
shiftOut(pinData, pinClock, MSBFIRST, 24);
break;
case 58:
shiftOut(pinData, pinClock, MSBFIRST, 0);
shiftOut(pinData, pinClock, MSBFIRST, 24);
break;
case 59:
shiftOut(pinData, pinClock, MSBFIRST, 16);
shiftOut(pinData, pinClock, MSBFIRST, 24);
break;
default:
// statements
break;
}
digitalWrite(pinLatch, HIGH);
digitalWrite(pinLatch, LOW);
}

void setup() {
Serial.begin(9600);
pinMode(pinData, OUTPUT);
pinMode(pinLatch, OUTPUT);
pinMode(pinClock, OUTPUT);
ledWrite(hour, minute);
//HODNOTA --> DISPLEJ
//1 == 0
//55 == 1
//66 == 2
//18 == 3
//52 == 4
//24 == 5
//8 == 6
//51 == 7
//0 == 8
//16 == 9
//PRECHADZANIE CELEHO INTERVALU
/*
for(int i=0; i<=127; i++){
ledWrite(i);
delay(1000);
}
*/
}

void loop() {
if (millis() - cas >= 1000) {
cas = millis();

if (second == 59) {
second = 0;
minute++;

} else {
second++;
}

if (minute == 60) {
minute = 0;
hour++;

}
ledWrite(hour, minute);
}
}



Prístupov 1594
Kvalita článku
hlasov 0

PRÍSPEVKY
SLEDUJETE
Prosím prihláste sa pre možnosť pridania komentáru.
Prihláste sa, alebo použite facebook login facebook login
ĎALŠIE ČLÁNKY V BLOGU
Ovládanie Arduina cez UART z počítača
[ 19.11.2020] (príspevkov 0)
ArduinoJson - knižnica pre parsovanie JS...
[ 15.11.2020] (príspevkov 0)
Overenie kradnutých vozidiel - Arduino +...
[ 11.11.2020] (príspevkov 0)
Hladinomer + Zrážkomer - Arduino / ESP82...
[ 2.11.2020] (príspevkov 0)
RFID vrátnik - update Október 2020
[ 29.10.2020] (príspevkov 0)
Digitálny potenciometer, prerušenie, deb...
[ 28.10.2020] (príspevkov 0)
Integrácia zrážkomera RG-11 do projektu ...
[ 22.10.2020] (príspevkov 0)
WiFi Termostat - ESP8266 - WiFiManager -...
[ 28.9.2020] (príspevkov 0)
Izbový termostat - Portovanie programu -...
[ 22.9.2020] (príspevkov 0)
RFID vrátnik - Ukončenie projektu
[ 9.9.2020] (príspevkov 0)