• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Zegar binarny
#1
Photo 
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):
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 =========================================================================
.. 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


Załączone pliki Miniatury
   
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości