4. Zegarek:
Potrzebujemy:
- 4 wyświetlacze LED 7-segmentowe ze wspólną anodą (czyli wspólnym plusem)
- 4 rejestry przesuwne 74HC595 i 4 podstawki DIL16 (nie są konieczne ale zapobiegają uszkodzeniu układów podczas lutowania)
- Moduł RTC DS1307 (poradnik jak sobie taki zrobić zamieszczałem na forum https://majsterkowo.pl/forum/modul-rtc-t873.html) ale na allegro bądź ebay’u możemy kupić gotowy za ok.5-10zł. ;)
- uniwersalna płytka PCB
- Rezystory 220Ω – 32szt.
- Diody led 3mm (kolor posiadanego wyświetlacza) – 2 szt.
- trochę przewodów z kabla internetowego “skrętka” do zrobienia przelotek
- trochę przewodów z jakiegoś innego kabla (ja wykorzystałem stary kabel od monitora) do połączenia rejestrów z wyświetlaczem
Aby wszystko upchnąć w obudowie lampki rozdzieliłem płytkę wyświetlacza z płytką z rejestrami przesuwnymi.
Schemat:
Projekt PCB:
Czerwona warstwa TOP – nie są to ścieżki tylko przewody i przelotki
Do pobrania schemat i projekt pcb w eaglu.
Płytka z rejestrami przesuwnymi:
Myślałem w jaki sposób przedstawić początkującym tą płytkę a nie znam programu do projektowania płytek uniwersalnych i wpadłem na taki oto pomysł ;)
Mam nadzieje że pomoże Wam to przy lutowaniu.
Pin D10 – dataPin
Pin D11 – latchPin
Pin D12 – clockPin
Oznaczyłem również do jakich pinów wyświetlacza wychodzą rejestry.
MD – kropkę z ostatniego wyświetlacza wykorzystałem do zrobienia sekundnika z dwóch diod 3mm zamontowanych pośrodku.
Płytka z wyświetlaczami:
Łączymy wyjścia rejestrów przesuwnych z wyświetlaczami oraz zasilanie.
Tak wygląda gotowy wyświetlacz do naszego zegarka
Moduł RTC:
Moduł czasu rzeczywistego (do nabycia na Allegro lub eBay’u).
Podłączamy [ VCC do +5V], [GND do GND], [SCL do 5 analogowego pinu Arduino], [SDA do 4 analogowego pinu Arduino]
Biblioteka do obsługi modułu RTC do pobrania tutaj.
Wypakowujemy ją do folderu “libraries” w katalogu z zainstalowanym Arduino.
Program (razem z czujnikiem ruchu i ściemniaczem) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
#include <Wire.h> #include "RTClib.h" RTC_DS1307 RTC; unsigned long ruch; // Przechowuje czas od wykrycia ruchu byte opcja = 0; // Domyślna opcja 0 byte ledsON = 0; byte ledsOFF = 0; int diody = 9; // Pin do bazy tranzystora int dioda = 13; // Dioda testowa int czujnik = 2; // Pin odczytu czujnika ruchu int fotorezystor = 1; // Pin odczytu czujnika swiatla (fotorezystora) int val = 0; // Odczytana wartosc z fotorezystora int dataPin = 10; int latchPin = 11; int clockPin = 12; byte dec_digits[] = {0b10000001,0b10110111,0b11000010,0b10010010,0b10110100,0b10011000,0b10001000,0b10110001,0b10000000,0b10010000}; byte decimal_point_mask = 0b01111111; void setup() { pinMode(czujnik, INPUT); pinMode(diody, OUTPUT); pinMode(dioda, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(13, OUTPUT); //Serial.begin(9600); // Odkomentuj aby odczytywac wartosci przez monitor portu szeregowego Wire.begin(); RTC.begin(); //RTC.adjust(DateTime(__DATE__, __TIME__)); // odkomentuj aby ustawic czas } void loop() { val = analogRead(fotorezystor); //Serial.println(val); // Odkomentuj w celu sprawdzenia wartosci odczytu fotorezystora if (digitalRead(czujnik) == (LOW)){ // Zapala diodę na pinie 13 jeśli wykryje ruch digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } if (digitalRead(czujnik) == (LOW) && opcja == 0 && val < 10){ // Jesli odczyty z fotorezystora sa mniejsze niz 10 (czyli jest ciemno) i czujnik ruchu wykryje ruch, wtedy wlacza diody opcja = 1; ledsON = 1; ruch = millis(); // startuje odliczanie od wykrycia ruchu } if (opcja == 0){ //domyślnie włączona opcja ruch = 0; //resetuje licznik } if (ledsON == 1) { // Wlacza diody (rozjasnia je od 0 do 255) ledsOFF = 0; for (int i=0; i <= 255; i++){ analogWrite(diody, i); delay(10); if (i >= 255) { ledsON = 0; } } } if (ledsOFF == 1) { // Wylacza diody (przyciemnia je od 255 do 0) for (int i=255; i >= 0; i--){ analogWrite(diody, i); delay(10); if (i >= 0) { ledsOFF = 0; } } } if (opcja == 1) { // Opcja podtrzymujaca przez 60s swiecenie diod, jesli ruch nie zostanie wykryty wylacza je a jeśli w tym czasie ruch zostal wykryty to resetuje licznik i podtrzymuje swiecenie unsigned long czasWcisniecia = millis() - ruch; if(digitalRead(czujnik) == (LOW)) { ruch=millis(); // resetuje licznik podczas wykrycia ruchu if (opcja == 0) { // wlacza ponownie diody jesli czas uplynal i zaczely sie wygaszac ledsON = 1; ledsOFF = 0; } } if(czasWcisniecia >=120000) { // wylacza diody po 120s ledsON = 0; ledsOFF = 1; // odpala opcje która wylacza diody opcja = 0; // po 120sek. powraca do opcji 0 } } DateTime now = RTC.now(); int thehour = now.hour(); // zmien 24 na 12 jesli chcesz miec format 12-godzinny if (thehour > 24 ) thehour -= 24; int hour_tens = thehour / 10; int hour_ones = thehour % 10; int minute_tens = now.minute() / 10; int minute_ones = now.minute() % 10; if (now.second()% 2 == 0) decimal_point_mask = 0b01111111; // Zapala diody sekundnika else decimal_point_mask = 0b11111111; // Gasi diody sekundnika digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, MSBFIRST, dec_digits[minute_ones] & decimal_point_mask); // Jednosci minut shiftOut(dataPin, clockPin, MSBFIRST, dec_digits[minute_tens]); // Dziesiatki minut shiftOut(dataPin, clockPin, MSBFIRST, dec_digits[hour_ones]); // Jednosci godzin shiftOut(dataPin, clockPin, MSBFIRST, dec_digits[hour_tens]); // Dziesiatki godzin digitalWrite(latchPin, HIGH); delay(250); } |
Niestety nie zdążyłem zrobić przycisków do ustawiania zegara także musimy go ustawić podczas wgrywania programu.
Aby ustawić czas z naszego komputera musimy odkomentować
1 |
RTC.adjust(DateTime(__DATE__, __TIME__)); |
i wgrać program a później z powrotem zakomentować “//” i jeszcze raz wgrać program
Brzydka okrutnie;) ale za tak staranny, kompleksowy, profesjonalny… artykuł można dać tylko 5.
Dobrze widzę że to pierwsze zdjęcie to render ?
Lampkę zaprojektowałem w programie do grafiki 3D.
Witam. czy dopisze pan do programu funkcje przycisków,do ustawienia zegara
Tak to render bo nie miałem czasu zrobić zdjęć gotowej lampki ale zaraz zbiorę wszystko do kupy i postaram się zrobić zdjęcia i filmik.
Wszystkie części są już gotowe i działają tylko musiałem wywiercić otwory pod włącznik, fotorezystor i najgorsze gniazdo zasilania. Najgorsze bo ma 11mm a nie posiadałem takiego dużego wiertła.
Witam, gratuluję projektu. Mam jednak kilka uwag – dlaczego nie zastosowaleś jakiejś mocnej diody, dedykowanej do oświetlenia? Jak dla mnie zastosowanie 4 rejestrów przesuwnych to całkowita przesada – wystarczyłby jeden i multipleksowanie lub maksymalnie 2 ( jeden do liczb a drugi do wyboru cyfry)
Dzięki :) Za mało czasu miałem od zrodzenia się pomysłu. Rozważałem 1W diody ale one chyba sporo ciepła generują bo z tego co widziałem musiał bym jeszcze radiator zastosować. Szukałem innych na allegro ale widocznie źle i w końcu wybrałem najprostsze rozwiązanie czyli kupiłem zwykłe :D
Wiem że można by zastosować multipleksowanie ale było to dla mnie trudniejsze do rozgryzienia a rejestrów mam sporo :)
Witam! Bardzo fajna lampka – pytanka dwa:
-Czy mocno trzeba skręcać ramiona, aby lampka nie opadała? Czy lepiej zastosować podkładki samozabezpieczające?
-Czy naprawdę do takich pierdół jak lampka z zegarkiem trzeba wpychać arduino? Jest to, o ile się nie mylę, wydatek rzędu 100zł, gdzie atmega 328 (bo chyba na tym opiera się arduino) kosztuje około 12zł do tego garść drobnicy za jakieś 8zł z płytką uniwersalną i nawet dokupując sobie programator ISP (który również łatwo złożyć w domu) wychodzi taniej niż użycie arduino. Proszę zatem o krótkie wytłumaczenie – jaki sens używania tego? Wiem że jest popularne i oszczędza odrobinę pracy – ale o to raczej nie o oszczędność pracy chodzi chyba?
Dzięki :) Przed polakierowaniem trzeba było mocno skręcić i nawet poprawić kombinerkami ale po polakierowaniu nie trzeba aż tak mocno :)
Napisałem we wstępie że Arduino nie jest konieczne. Arduino jest tu tylko przykładem a nie będę chyba przy każdym swoim artykule rozpisywał się jak poradzić sobie bez niego? :) Co prawda chcę w końcu napisać taki artykuł i nawet zacząłem już ale ciągle nie mam czasu go ukończyć.
Poradników jak sobie poradzić bez drogiej płytki Arduino jest wiele tylko niestety anglojęzycznych np. ten http://arduino.cc/en/Main/Standalone
Bardzo mi pomógł przy pierwszych przygodach z Arduino :)
A jak go zaprogramować znajdziecie w majsterkowie :)
Co do poradnika jak sobie poradzić z projektami na Arduino bez Arduino mogę tylko powiedzieć że postaram się go skończyć do końca roku ale niczego nie obiecuje :)
Do tego projektu możemy wykorzystać nawet Atmega8 (koszt ok.5zł) bo program się spokojnie zmieści.
Koszt takiego układu z Atmega8 to koszt ok.15zł. Programator ISP własnej roboty też nie jest trudny do zrobienia tylko trzeba umieć wytrawiać płytki. Ja poszedłem na łatwiznę i jakiś czas temu zakupiłem taki za jakieś 20zł. Chociaż płytki już wytrawiać potrafię :)
Nieźle! Pomysł niebanalny no i pewnie nie brakuje osób, które podchwycą go w swoim domu:)
jakiego programu 3d użyłeś, masz możesz sie podzielić plikami projektu?
“Google SketchUP” jak dla mnie najprostszy program do grafiki 3D bo “Blender” to katorga :D i darmowy program do renderingu “Kerkythea”
Plik z lampką https://www.dropbox.com/s/urh0botpuec3czn/lampka.skp
Google SketchUP jest jeszcze na tyle fajny że można z biblioteki użytkowników pobierać gotowe elementy i tak sobie wziąłem te motylkowe nakrętki, włącznik, fotorezystor, arduino i wyświetlacz led :)
Skąd się znasz na tym wszystkim?
W internecie można wszystkiego się nauczyć i nie koniecznie trzeba chodzić do jakiejś szkoły elektronicznej :) Gdy lubimy coś robić to wtedy wszystko przychodzi łatwo ;)
Właśnie to świetnie, że w internecie jest tyle użytecznych informacji z tak wielu dziedzin. A jak to było dokładnie z tobą, od czego zaczynałeś jeśli chodzi o elektronikę?
Ja cały czas zaczynam :) Uczę się z poradników i książek. A pierwszą elektroniczną rzeczą jaką zrobiłem z poradnika był odbiornik podczerwieni do komputera aby można było sterować nim przy pomocy pilota. Teraz się wkręciłem w mikrokontrolery (Arduino) i dzięki temu poszerzam wiedzę z elektroniki bo wcześniej nie była dla mnie taka ciekawa jak teraz. Także teraz to takie moje hobby :) Że tak spytam… książkę piszesz? :)
Sam chciałbym zacząć swoją przygodę z elektroniką, bardzo podobają mi się te projekty z arduino, właśnie dlatego tak wypytuję :PPP
Aha, spoko :) Polecam lekturę “Elektronika dla bystrzaków”. Sam ją teraz czytam hehe :D Szkoda że do samego Arduino w Polsce jest jeszcze mało poradników i książek chociaż zauważyłem że zaczyna się to powoli zmieniać bo chyba gdzieś widziałem jakąś książkę już przetłumaczoną.
Witam, jestem początkujący w programowaniu czy ktoś mógł by wyjaśnić kod odpowiedzialny za zegar ? resztę w miarę rozumiem.
Witaj, ale co tu wyjaśniać? W kodzie zamieściłem komentarze także wszystko jest opisane i nie wiem jak można by to jeszcze bardziej wyjaśnić.
Poczytałem trochę o RTC i o rejestrach przesównych i już rozumiem :)
fajne ale jak dla mnie zegarek to trochę za dużo, 5/5
Muszę przyznać, że wygląda lepiej niż odpowiedniki ze sklepowych półek.
A taki zegarek czasem się przyda czasem nie. Zależy czy będziemy pracować przy tej lampce czy też raczej czytać raczej książki w wyrku ;)
Tylko nie rozumiem jednej rzeczy po co zegar w lampie jeżeli wszyscy w domu mają komputery i właściwie zawsze są włączone. Moim zdaniem zegar bez DCF w dzisiejszych czasach to bezsens. Oczywiście czy zegar ma być w lampie czy nie to sprawa gustu. Jedna sprawa, zamiast tych diod dwukropka trzeba było odwrócić jeden wyświetlacz “do góry nogami” i powstał by samoistny dwukropek co by nadało moim zdaniem lepszego wyglądu, bardziej profesjonalnego. Co do automatycznego włączenia lampy świetny pomysł do skopiowania. Ogólnie zamiast głowicy zbudowanej z baterii diod można by było zastosować gotową głowicę led z Alledrogo za 10PLN.
Wszyscy mają komputery ale kiedy nie są włączone to jak nie masz zegarka to musisz szukać telefonu :D Z synchronizacją czasu z zegarem atomowym przez DCF to zgodzę się że przydało by się ale to można sobie dorobić :) Zegarek jest tutaj tylko dodatkiem który na szybko wymyśliłem aby go dodać. Przewinął mi się przez myśl moduł DCF ale zanim bym go zamówił na eBay’u to by konkurs dawno minął a na Alledrogo ok. 40zł. kosztuje. Nie czaje o co Ci chodzi z odwróceniem wyświetlacza ale najprostszym sposobem było by kupić wyświetlacz z dwukropkiem ale że takiego nie miałem a kupiłem sporo pojedynczych to sobie dwukropek musiałem dorobić i jest to estetyczniejsze niż odwracanie czegoś :)
Odwrócenie wyświetlacza, hmm jak mam ci to wytłumaczyć. Masz dwa wyświetlacze dwu segmentowe jeden mocujesz normalnie kropką na dół, a drugi odwracasz o 180 stopni w ten sposób kropka jest na górze po lewej stronie. Zbliżasz je do siebie i masz piękny dwukropek po tym samym skośie co wyświetlacze. Wiem tysiąc słów nie zastąpi jednego spojrzenia. :)
aa no chyba rozumiem :) noo to ciekawe rozwiązanie :)
Bardzo fajny projekt, ciekawy jestem jaki Cię wyniósł całkowity koszt tej lampki? I dokładnie z jakiej płytki Arduino korzystałeś?
Dokładnie nie wiem ale szacunkowo jakieś 40zł. bez Arduino. A jeśli chodzi o płytkę Arduino to sam zrobiłem “klona”.
Aha, czyli jak rozumiem na tym ostatnim zdjęciu, na którym są wszystkie połączenia ta płytka Arduino jest skopiowana z neta dla przykładu jak połączyć a w rzeczywistości jakich rozmiarów jest Twój klon Arduino?
Początkowo do testów użyłem płytki Arduino Duemilanove a klon jest ciut mniejszy ale nie wiele od Arduino Duemilanove.
Jak potrafisz wytrawiać płytki to to jest mój klon :D https://majsterkowo.pl/forum/jednostronny-klon-arduino-ftdi-isp-t785-25.html?hilit=majsterkuino
Jeśli nie to trzeba złożyć na uniwersalnej płytce PCB i będzie trochę większy od Arduino chociaż zależy jak się wszystko upchnie :)
obudowa + elektronika (bez Arduino) coś ok. 40zł.
Wstępnie wykorzystałem Arduino Duemilanove ale ostatecznie zrobiłem sobie klona :) Koszt klona ok. 20zł. Kwoty szacunkowe bo nie liczyłem niestety wszystkiego dokładnie
Świetna lampka. Bardzo mi się podoba sam desing. Rozwiązanie z wykonaniem oczek ze spinaczy niby banalne, ale dla mnie cenne, bo nieraz je wykorzystuje.
Witam. czy dopisze pan do programu funkcje przycisków,do ustawienia zegara
Witam analizuje panski sketch i zastanawiam sie dlacze w linijce gdzie jest warunek if chodzi o odebranie sygnalu z czujnika ustawione jest na low i potem wlaczenie diody czuli high. Czujnik jak wykryje ruch wysyla sygnal czyli high?