Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Ciekawy zegar z grą

Granat :) 24 Lut 2006 14:19 8270 15
  • WITAM :D

    Wiem, że różnego rodzaju zegarków było już wiele na tym forum, jednak ja chciałbym przedstawić swój ze względu na kilka ciekawych rozwiązań i funkcji, które inne zegarki z pewnością nie posiadają ;)

    Zacznę może od hardware'u a potem opiszę, które z urządzeń wykorzystuje napisany przeze mnie program. [Program będzie jeszcze rozbudowywany, dlatego narazie nie które urządzenia wewnętrzne nie zostały wykorzystane.]

    Więc tak...
    Urządzenie jest zbudowane przy użyciu dwóch mikrokontrolerów typu '8051 (89S53 oraz pomocniczy 89C2051), które komunikują się ze sobą za pomocą trzech pinów. Główny mikrokontroler wlutowany jest we wcześniej zaprojektowaną płytkę uniwersalną. Wraz z nim na pokładzie znajdują się jeszcze PCF8583, 24C64, kwarc 12MHz, buzzer, zasilacz. Większą jednak część pinów I/O zajmują gniazdka wejścia/wyjścia, które są przystosowane do podłączenia odbiornika IR, magistrali 1-Wire, klawiaturki składającej się z przycisków impulsowych, klawiatury PC, drugiego procka itp. Oprócz tego do główny procesor może jeszcze sterować wyświetlaczem LCD 20 * 4, jak i jego podświetlaniem, dwoma diodami led umieszczonymi od spodu obudowy, wyjściem 12V np. na przekaźnik. Urządzenie posiada także stacyjkę na kluczyk, która również jest podłączona do uC.
    Drugi mikrokontroler zajmuje się sterowaniem czterocyfrowego wyświetlacza LED.
    Wyprowadzone zostało gniazdo do podłączenia programatora ISP.
    Zegar RTC PCF8583 w przypadku braku zasilania z sieci jest podtrzymywany z baterii 3V.

    Teraz czas na program :D
    Głównym założeniem przy pisaniu prgoramu było wyświetlanie czasu, na kilka ciekawych sposobów.
    Mimo to nie ma możliwości ustawienia zegarka z poziomu przycisków czy pilota Rc5. Trzeba to zrobić z komputera :D
    Zaoszczędziłem w ten sposób miejsce w pamięci Flash.
    Po włączeniu zasilania, gdy kluczyk jest w pozycji odblokowanej (przekręcony w prawo) następuje wyświetlenie komunikatu powitalnego poczym odczytanie czasu i daty oraz flagi alarmu z zegarka, przekazanie godzin i minut na wyświetlacze LED i przejście do normalnej pracy. W takim stanie urządzenie pokazuje informacje o czasie (na LCD i LED), dacie, dniu tygodnia, oraz temperaturach z trzech podłączonych termometrów typu DS18B20. Ja zamontowałem po jednym termometrze w pokoju, na zewnątrz i w komputerze.
    Podczas tego trybu pracy zegara można ustawić:
    - budzik (przycisk na samym dole)
    - włączyć lub wyłączyć sygnalizację dźwiękową (ikonka głośniczka na lcd) (nie dotyczy budzika, oznacza to, że jeśli nawet sygnalizacja dźwiękowa jest wyłączona - budzik nadal może wydawać dźwięki), sygnalizacja dźwiękowa informuje odpowiednio długim sygnałem lub odpowiednią kombinacją sygnałów o równej minucie, równej godzinie, zbyt niskiej temperaturze w pokoju itp.
    - włączyć lub wyłączyć podświetlanie LCD (drugi przycisk od góry)
    - uaktywnić bądź dezaktywować budzik (ikonka dzwonka na lcd)
    Wszystkimi tymi funkcjami (oprócz ustawiania godziny budzika) można sterować z pilota RC5.
    Gdy przekręcimy kluczyk w lewo nie ma możliwości sterowania powyższymi funkcjami (nawet z pilota Rc5), wyłącza się odczyt temperatury z termometrów. NAtomiast na wyświetlaczu LCD pokazuje się ciekawy pełnoekranowy zegar wskazujący godziny i minuty :D
    W tym trybie (gdy nie dzwoni budzik :D) moża wyłączyć lub wyłączyć wyświetlacz LED. Można również sobie zagrać w dośc ciekawą grę (drugi przycisk od góry) :D
    Uruchomienie gry powoduje ukazanie się jej ekranu powitalnego. Gra polega na tym, że trzeba rozbroić bombę w ciągu 2,5s. Żeby to zrobić trzeba przycisnąć jeden z trzech przycisków. Jeden przycisk rozbraja, dwa... powodują wybuch, czemu towarzyszy dźwięk brzęczka (jesli został on wcześniej włączony ^ sygnalizacja dźwiękowa opisane wyżej). Przyciski są wybierane losowo przez mikroprocesor za pomocą licznika timer1.
    Aby wyjść z gry wystarczy kliknąć przycisk na samym dole.
    Jeśli w tym trybie (z przekręconym kluczykiem w lewo) włączy się budzik to mamy kilka wyjść :D
    Można poprostu wyłączyć budzik pierwszym przyciskiem od góry, można też opóźnić kolejny alarm o 9 minut (tak zwana drzemka). Wyłączyć budzik lub opóźnić alarm o 9 minut można także pilotem RC5.

    Program został napisany i skompilowany w BASCOM 8051 i zajmuje 9092 bajty.

    Do opisu dołączam program, zdjęcia i filmik :D

    Jeżeli chcesz to skomentuj proszę mój "wynalazek" :)

    Pozdrawiam

    PS>>
    Nie przejmujcie sie taką dużą temperaturą na zewnątrz. W jaworznie tak samo jak gdzie indziej w polsce nie ma jeszcze wiosny :D
    To tylko skutki działania promieni słonecznych na termometr ;)

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    Granat :)
    Poziom 34  
    Offline 
    Oficjalny profil. Przegląd produktów, informacje o nowościach:
    -- >> Granat-audio na FB << --

    granataudio.pl
    Specjalizuje się w: systemy nagłośnieniowe
    Granat :) napisał 2938 postów o ocenie 490, pomógł 201 razy. Mieszka w mieście Jaworzno. Jest z nami od 2004 roku.
  • #2
    wojtek279
    Poziom 15  
    bardzo ciekawy projekt , tylko to ustawianie godziny z kompa
    i zastanawiam sie po co jest ta stacyjka ;-)
  • #3
    Granat :)
    Poziom 34  
    Wychodzi na to, że stacyjka jest do zmieniania przeznaczenia przycisków :)
    Ustawianie czasu zeżarło by dużo flash'u, a tak to tylko wysyłam odpowiednie bajty do zegarka raz na pół roku i już.
  • #4
    nelik1987

    Poziom 31  
    Całkiem ciekawa konstrukcja i ładne wykonanie w środdku ttrochę bałaganu ale jak się łapiesz w tych kabelkach to good :D
  • #5
    Granat :)
    Poziom 34  
    Dzięki :)
    Bałagan powstał całkiem nie świadomie :D
    Poprostu jak to wszystko wpakowałem do takiej stosunkowo małej obudowy to nawet zabrakło miejsca na umieszczenie diod LED na panelu przednim. Stąd pomysł z umieszczeniem ich na dole :D
  • #6
    Raflles
    Poziom 13  
    Ja mam pytanie : Jak kolega zrobił, że na wyświetlaczu są wyświetlane takie duże cyfry zegara ??

    ciekawi mnie to bo też chciałbym zainstalować w swojej konstrukcji taki sposób wyświetlania.

    Pozdrawiam

    Tak wogóle to bardzo ciekawy i fajny projekt !!! Gratulacje
  • #7
    Granat :)
    Poziom 34  
    Dzięki :)
    Trzeba zdefiniować 8 znaków dla LCD poprzez definechar a potem napisać sobie odpowiedni prgoramik, który będzie wyświetlał odpowiednie kombinacje w zlażności która jest godzina. Można to zrobić np. tak jak ja zrobiłem.
    Podaję listing podprogramu, który zajmuje się wyświetlaniem pełnoekranowego zegarka w bascom 8051:
    Code:

    Sub Fullclock
    Godzina = Makedec(godzina)
    Minuta = Makedec(minuta)
    Sekunda = Makedec(sekunda)
    If Minutaspr3 <> Minuta Then
    Cls
    Minutaspr3 = Minuta
    End If
    For Inna = 0 To 3

    Select Case Inna
    Case 0:
    Iles = 1
    Zmienna = Godzina / 10
    Case 1:
    Iles = 5
    Zmienna = Godzina Mod 10
    Case 2:
    Iles = 13
    Zmienna = Minuta / 10
    Case 3:
    Iles = 17
    Zmienna = Minuta Mod 10
    End Select

    Select Case Zmienna
    Case 0:
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6) ; Chr(1)
    Locate 2 , Iles
    Lcd Chr(5) ; "  " ; Chr(5)
    Locate 3 , Iles
    Lcd Chr(5) ; "  " ; Chr(5)
    Locate 4 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(3)
    Case 1:
    Incr Iles
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(5)
    Incr Iles
    Locate 2 , Iles
    Lcd Chr(5)
    Locate 3 , Iles
    Lcd Chr(5)
    Decr Iles
    Locate 4 , Iles
    Lcd Chr(4) ; Chr(5) ; Chr(4)
    Case 2:
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6) ; Chr(1)
    Iles = Iles + 2
    Locate 2 , Iles
    Lcd Chr(0) ; Chr(3)
    Decr Iles
    Locate 3 , Iles
    Lcd Chr(0) ; Chr(3)
    Decr Iles
    Locate 4 , Iles
    Lcd Chr(0) ; Chr(7) ; Chr(4) ; Chr(4)
    Case 3:
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6) ; Chr(1)
    Incr Iles
    Locate 2 , Iles
    Lcd Chr(0) ; Chr(4) ; Chr(3)
    Locate 3 , Iles
    Lcd Chr(2) ; Chr(6) ; Chr(1)
    Decr Iles
    Locate 4 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(3)
    Case 4:
    Locate 1 , Iles
    Lcd Chr(5) ; "  " ; Chr(5)
    Locate 2 , Iles
    Lcd Chr(5) ; "  " ; Chr(5)
    Locate 3 , Iles
    Lcd Chr(2) ; Chr(6) ; Chr(6) ; Chr(5)
    Iles = Iles + 3
    Locate 4 , Iles
    Lcd Chr(5)
    Case 5:
    Locate 1 , Iles
    Lcd Chr(5) ; Chr(6) ; Chr(6) ; Chr(6)
    Locate 2 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(1)
    Iles = Iles + 3
    Locate 3 , Iles
    Lcd Chr(5)
    Iles = Iles - 3
    Locate 4 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(3)
    Case 6:
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6)
    Locate 2 , Iles
    Lcd Chr(5) ; Chr(0) ; Chr(4) ; Chr(1)
    Locate 3 , Iles
    Lcd Chr(5) ; "  " ; Chr(5)
    Locate 4 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(3)
    Case 7:
    Locate 1 , Iles
    Lcd Chr(6) ; Chr(6) ; Chr(6) ; Chr(5)
    Iles = Iles + 2
    Locate 2 , Iles
    Lcd Chr(0) ; Chr(3)
    Decr Iles
    Locate 3 , Iles
    Lcd Chr(0) ; Chr(3)
    Locate 4 , Iles
    Lcd Chr(5)
    Case 8:
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6) ; Chr(1)
    Locate 2 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(3)
    Locate 3 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6) ; Chr(1)
    Locate 4 , Iles
    Lcd Chr(2) ; Chr(4) ; Chr(4) ; Chr(3)
    Case 9:
    Locate 1 , Iles
    Lcd Chr(0) ; Chr(6) ; Chr(6) ; Chr(1)
    Locate 2 , Iles
    Lcd Chr(5) ; "  " ; Chr(5)
    Locate 3 , Iles
    Lcd Chr(2) ; Chr(6) ; Chr(3) ; Chr(5)
    Incr Iles
    Locate 4 , Iles
    Lcd Chr(4) ; Chr(4) ; Chr(3)
    End Select


    Next Inna
    If Sekunda.0 = 0 Then
    Locate 1 , 10
    Lcd Chr(0) ; Chr(1)
    Locate 2 , 10
    Lcd Chr(2) ; Chr(3)
    Locate 3 , 10
    Lcd Chr(0) ; Chr(1)
    Locate 4 , 10
    Lcd Chr(2) ; Chr(3)
    Else
    Locate 1 , 10
    Lcd "  "
    Locate 2 , 10
    Lcd "  "
    Locate 3 , 10
    Lcd "  "
    Locate 4 , 10
    Lcd "  "
    End If
    Cursor Off
    Godzina = Makebcd(godzina)
    Minuta = Makebcd(minuta)
    Sekunda = Makebcd(sekunda)
    End Sub


    :D
  • #8
    fojucik
    Poziom 10  
    kurcze jedna z lepszych konstrukcji na forum! graty
  • #9
    Granat :)
    Poziom 34  
    :D
    Dołączę jeszcze jedno zdjęcie przedstawiające jak wygląda na wyświetlaczu LCD pełnoekranowy zegarek. To dla tych, którzy nie chcą pobierać filmu ;)
  • #10
    dfgg
    Poziom 11  
    Cytat:
    Podaję listing tego podprogramu


    Programu czy podprogramu ?

    Do zegarka pelnoekranowego czy tego calego kodu ?
  • #12
    lechoo
    Poziom 39  
    Mogłeś zaimplementować w sofcie automatyczną zmianę czasu letni/zimowy (lata przestępne obsługuje PCF), wtedy byłby (prawie) całkowicie autonomiczny :) Albo - moim zdaniem najlepsze rozwiązanie - dodać obsługę odbiornika DCF-77, nie jest to wcale takie trudne.
  • #14
    TheWiktus
    Poziom 18  
    Zegarek extra ale brak mu podstawowej funkcji mianowicie ustawiania godziny czy nie można tego zrobić w pamięci szeregowej dołączonej do mikrokontrolera pozatym taki zegarek to można jeszcze rozbudować np o automatyczne ustawianie godziny ,inne gry ,informacji o czasie włączenia urządzeni ,termoregulatora(tutaj trzeba tylko programik napisać) ma ktoś jakieś lepsze pomysły
  • #15
    Granat :)
    Poziom 34  
    Zegar na dzień dzisiejszy ma już ustawianie godzin :D
    a te dodatki o których piszecie nie bardzo jest jak wgrać, bo brakuje pamięci, poprostu bascom 8051 nie chce wgrywać więcej niż 8kB mimo iż powinien obsługiwać pamięci do 64kB

    zająłem się jednak teraz procesorami AVR i na mój gust są lepsze od 8051
    nie długo coś zbuduję na bazie jakiegoś avr'a
    :D
  • #16
    Mariuszek15
    Poziom 24  
    Ku mojemu zdziwieniu program fuulclock-a nie działa :|

    Chodzi mi tylko o prosty zegarek na całym LCD 20x4 BIG.

    Widzi ktoś jakiś błąd?