18-01-2016, 10:33
Witam
Tak przeglądając swoje katalogi natknąłem się na zapomniany projekcik dość oryginalnego i za razem intrygującego zegara, który może się przydać każdemu kto chciałby ozdobić swoją twierdzę (pokój) czymś nietuzinkowym.
Wystarczy prosta obudowa i 11 LED-ów. 6 z nich pokazuje minuty w kodzie dwójkowym a 5 godziny. przy pewnej wprawie błyskawicznie potrafimy odczytać aktualny czas.
Projekcik wymaga modułu zegara RTC i jakiegoś najtańszego dowolnego klona (bo przecież szkoda oryginała na to :-)
Oto kod ze szczegółowym komentarzem - polecam umieszczać je wszędzie):
.. a w załączniku zamieszczam prototypa - kurcze nie wiem jak dołączyć tu na forum pliczek graficzny do treści posta (poza opcją http, po prostu z pliku)
Pozdrawiam
Tak przeglądając swoje katalogi natknąłem się na zapomniany projekcik dość oryginalnego i za razem intrygującego zegara, który może się przydać każdemu kto chciałby ozdobić swoją twierdzę (pokój) czymś nietuzinkowym.
Wystarczy prosta obudowa i 11 LED-ów. 6 z nich pokazuje minuty w kodzie dwójkowym a 5 godziny. przy pewnej wprawie błyskawicznie potrafimy odczytać aktualny czas.
Projekcik wymaga modułu zegara RTC i jakiegoś najtańszego dowolnego klona (bo przecież szkoda oryginała na to :-)
Oto kod ze szczegółowym komentarzem - polecam umieszczać je wszędzie):
Kod:
/*
Programik Zegar Binarny ...by wojtekizk (wojtek@warcaby.lh.pl)
Aktualny czas odzwierciedlają diody LED - 5 dla godzin i 6 dla minut, które zapalają się
odpowiednio do binarnej reprezentacji godzin i minut.
Przykłady:
godz. 23:57 10111 111001
godz. 6:35 00110 100011
godz. 13:05 01101 000101
Zastosowano moduł RTC PCF8563
*/
#include <Wire.h> // dołączamy potrzebną bibliotekę
#include <Rtc_Pcf8563.h> // biblioteka do obsługi PCF8563
Rtc_Pcf8563 rtc; // tworzymy obiekt, egzemplarz klasy Rtc_Pcf8563 o nazwie rtc
// --- zmienne ----------------------------------------------------------------------
int wartosc, a; // zmienne pomocnicze
int Gbits[5]; // tablica bitowa reprezentująca bity dla godziny (np. dla 23 - 10111)
int Mbits[6]; // tablica bitowa reprezentująca bity dla minut (np. dla 47 - 101111)
int Gleds[5]={8,9,10,11,12}; // piny Arduino dla LED-ów reprezentujących godziny
int Mleds[6]={2,3,4,5,6,7}; // piny Arduino dla LED-ów reprezentujących minuty
int godzina,minuty,sekundy; // bez komentarza
// --- funkcja zegar_binarny ---------------------------------------------------------
void zegar_binarny()
{
rtc.formatTime(); // funkcja biblioteczna do pobierania daty
//rtc.formatDate(); // funkcja biblioteczna do pobierania czasu
godzina=rtc.getHour(); // pobieramy godzinę
minuty=rtc.getMinute(); // pobieramy minuty
for(int a=4;a>=0;a--) // obliczenia w pętli dla godzin od najstarszego bitu
{
Gbits[a]=godzina/pow(2,a); // dzielenie całkowite przez 2 do potęgi a
if(godzina>=pow(2,a))godzina=godzina-pow(2,a); // obliczenie reszty z dzielenia
digitalWrite(Gleds[a],Gbits[a]); // przypisanie stanu dla odp. LED-a
}
for(int a=5;a>=0;a--) // obliczenia w pętli dla minut od najstarszego bitu
{
Mbits[a]=minuty/pow(2,a); // dzielenie całkowite przez 2 do potęgi a
if(minuty>=pow(2,a))minuty=minuty-pow(2,a); // obliczenie reszty z dzielenia
digitalWrite(Mleds[a],Mbits[a]); // przypisanie stanu dla odp. LED-a
}
}
// --- funkcja wprowadzanie_danych() --------------------------------------------------
int wprowadzanie_danych()
{
wartosc = 0;
Serial.flush();
while (Serial.available() == 0)
{
//brak dzialania
}
while (Serial.available() > 0)
{
wartosc = wartosc * 10;
a = Serial.read() - '0';
wartosc = wartosc + a;
delay(5);
}
Serial.print(" ");Serial.println(wartosc);
return(wartosc);
}
// --- funkcja ustaw_godzine ----------------------------------------------------------
void ustaw_godzine() // wywołujemy tylko raz w setupie (jeśli moduł ma własne zasilanie)
{
Serial.println("Wprowadz godzine");
wprowadzanie_danych();
godzina = wartosc;
Serial.println("Wprowadz minuty");
wprowadzanie_danych();
minuty = wartosc;
Serial.println("Wprowadz sekundy");
wprowadzanie_danych();
sekundy = wartosc;
rtc.initClock(); // inicjacja, zerowanie zawartości zegara
//dzień, nr dnia tygodnia, miesiąc, wiek(1=1900, 0=2000), rok(0-99)
//rtc.setDate(27, 4, 3, 0, 14); // dla testów
//godzina, minuty, sekundy
rtc.setTime(godzina,minuty,sekundy); // zapis godziny do pamięci zegara
}
// ------------------------------------------------------------------------------------
void setup()
{
for(int a=0;a<5;a++)pinMode(Gleds[a],OUTPUT); // konfiguracja pinów dla godzin
for(int a=0;a<6;a++)pinMode(Mleds[a],OUTPUT); // konfiguracja pinów dla minut
Serial.begin(9600);
//ustaw_godzine(); // to wywołujemy tylko raz, przy pierwszym uruchomieniu
}
// --- neverending story --------------------------------------------------------------
void loop()
{
zegar_binarny(); // wywołanie funkcji zegar_binarny
for(int a=4;a>=0;a--)Serial.print(Gbits[a]); // dla sprawdzenia
Serial.print(" ");
for(int a=5;a>=0;a--)Serial.print(Mbits[a]); // dla sprawdzenia
Serial.println();
delay(500); // opcjonalne, aby procesor za często nie komunikował się z PCF8563
}
// === KONIEC =========================================================================
Pozdrawiam