Przedstawiam wam zegarek na szafkę, który zrealizowałem za pomocą licznika samochodowego:)
Opis:
Wykonane prze zemnie gadżet ma wskazywać godzinę za pomocą prędkościomierza(0-240 = 0-24), minuty za pomocą obrotomierza (0-6 = 0-60). Kontrolka od świateł długich wskazuje sekundy z dodanym większym rezystorem aby zmniejszyć moc. Zaznaczone brązowym kółkiem mamy wyprowadzony i wpięty w oryginalną instalacje reset arduino. Zielonym kółkiem znaczony jest fotorezystor który ma za zadanie dobór mocy podświetlenia do otoczenia sterowany mosfetem. Wykorzystany układ to Arduino nano z wyprowadzonym weściem usb. Do podtrzymania godziny wykorzystałem układ zegara czasu rzeczywistego.
Zasada działania:
Wyświetlanie czasu na tarczach odbywa się za pomocą oryginalnych silników krokowych wbudowanych w licznik, odseparowałem piny od reszty układy i podłączyłem się z arduino. Następnie za pomocą arduino i prymitywnego programu obliczyłem ile wynosi cały zakres zegara, z mapowałem w arduino i działa :) Miganie od świateł długich od izolowałem od reszty układu i podpiąłem bezpośrednio do układu ds3231 i zaprogramowałem za pomocą arduino aby na wyjściu były „impulsy”. Czujnik światła w postaci fotorezystora zamontowałem aby zegar nie budził nas w nocy, ponieważ mocno świeci. Fotorezystor z rezystorem tworzą dzielnik napięcia i na wejściu analogowym jest odczytywana wartość zamieniana na czterostopniową regulacje z histerezą podświetlenia zegarów. Odszukałem ścieżki od podświetlenia podłączyłem pod wyjście od zasilacza 12V wpinając szeregowo tranzystor mosfet, aby móc sterować intensywnością za pomocą sygnału pwm. Zasilanie 12V zostało podpięte pod wejście arduino Vin. Przycisk reset został odizolowany od reszty układy i podpięty pod pin resetu. Po wciśnięciu przycisku reset bądź podłączenia zasilania układ najpierw przechodzi do zera a następnie odczytuje z modułu czasy rzeczywistego i ustawia godzinę na tarczach.
Wykaz użytych elementów:
• Licznik z samochodu AVENSIS
• Arduino Nano z Mikroprocesorem ATMEGA 328p,
• Układ czasu rzeczywistego DS3231,
• Tranzystor MOSFET 14N05L,
• Rezystory ,
• Kondensatory,
• Diody LED,
• Silniki krokowe,
• Zasilacz sieciowy 12V DC,
• Micro switch,
• Przewody połączeniowe.
Filmik:
Schemat:
Nano:
Osprzęt:
Kod programu:
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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
#include <Wire.h> // biblioteka do komunikacji I2C #include <DS3231.h> // bibliotega do odczytu z modułu DS3231 int AA1 = 8; // przypisane pinów silniczka krokowego int AA2 = 9; int BB1 = 10; int BB2 = 11; int PAA1 = 4; // przypisane pinów silniczka krokowego int PAA2 = 5; int PBB1 = 6; int PBB2 = 7; int n = 0; // wprowadzenie zmiennych int godz = 0; int preh = 0; int led = 3; int blok = 0; int tim = 10; // wprowadzenie zmiennych int i = 0; int minu = 0; int obrm = 10; DS3231 clock; RTCDateTime dt; void setup() { pinMode(AA1, OUTPUT); // Przypisanie pinów jako wyjście pinMode(AA2, OUTPUT); pinMode(BB1, OUTPUT); pinMode(BB2, OUTPUT); pinMode(PAA1, OUTPUT); pinMode(PAA2, OUTPUT); pinMode(PBB1, OUTPUT); pinMode(PBB2, OUTPUT); pinMode(led,OUTPUT); diody(); // włączenie diod clock.begin(); // inicjalizacja wyświetlacza Serial.begin(9600); // inicjalizacja odczytu danych z portu USB i serial monitora // rozjaśnienie diod for(i = 0; i <= 255 ; i++ ) {analogWrite(led,i); if (i <=100){delay (25);} else {delay(5); } } //Zerowanie obrotomierza i predkosciomierza for(i = 176; i >= 0 ; i=i-2 ) { digitalWrite(AA1, HIGH); digitalWrite(BB2, LOW); digitalWrite(PAA1, HIGH); digitalWrite(PBB2, LOW); delay(10); digitalWrite(PAA1, LOW); digitalWrite(PBB1, HIGH); digitalWrite(AA1, LOW); digitalWrite(BB1, HIGH); delay(10); digitalWrite(PBB1, LOW); digitalWrite(PAA2, HIGH); digitalWrite(BB1, LOW); digitalWrite(AA2, HIGH); delay(10); digitalWrite(AA2, LOW); digitalWrite(BB2, HIGH); digitalWrite(PAA2, LOW); digitalWrite(PBB2, HIGH); delay(10); } i = 0; n = 0; } void loop() { czas(); // podprogram odczytu czasu z DS3231 diody(); // podprogram ustawienia natężenia podświetlenia godzina(); // podprogram ustawiennia godziny minuty(); // podprogram ustawiennia minut delay(500); } void czas() // odczyt czasu z DS3231 { dt = clock.getDateTime(); godz = dt.hour; // przypisanie wartości godzinie minu = dt.minute; // przypisanie wartości minutą } void diody(){ int mm = 0 ; if (analogRead(A7)>900) // Jeżeli odczyt z pinu analogowego A7 jest większy niż 900 ustaw natęzenia w skali PWM 0-255 na 2 { analogWrite(led,2); } else if(analogRead(A7)<890&&analogRead(A7)>700){ // Jeżeli odczyt z pinu analogowego A7 jest w zakresie 890-700 ustaw natęzenia w skali PWM 0-255 na 30 analogWrite(led,30); } else if(analogRead(A7)<690&&analogRead(A7)>500){// Jeżeli odczyt z pinu analogowego A7 jest w zakresie 690-500 ustaw natęzenia w skali PWM 0-255 na 100 analogWrite(led,100); } else if(analogRead(A7)<490){// Jeżeli odczyt z pinu analogowego A7 jest mniejsze niz 490 ustaw natęzenia w skali PWM 0-255 na 200 analogWrite(led,200); } //Serial.println(analogRead(A7)); // używany do testów odczyt z pinu analogowego w zakresie 0-1023 } void godzina(){ preh = map(godz, 0 , 24, 0, 80); for ( ; preh > n ; n++ ) // jeżeli warunek został spełniony przesuń lewo wskazówke prędkościomierza { digitalWrite(PAA1, LOW); digitalWrite(PBB1, LOW); digitalWrite(PAA2, LOW); digitalWrite(PBB2, HIGH); delay(tim); digitalWrite(PAA1, LOW); digitalWrite(PBB1, LOW); digitalWrite(PAA2, HIGH); digitalWrite(PBB2, LOW); delay(tim); digitalWrite(PAA1, LOW); digitalWrite(PBB1, HIGH); digitalWrite(PAA2, LOW); digitalWrite(PBB2, LOW); delay(tim); digitalWrite(PAA1, HIGH); digitalWrite(PBB1, LOW); digitalWrite(PAA2, LOW); digitalWrite(PBB2, LOW); delay(tim); // Serial.print (n); Serial.print(" n || preh "); Serial.print (preh);Serial.print(" H ") ; Serial.println (godz); // odczyt wartości w fazie testów } if (godz == 0 && blok == 0 && minu == 0 ){ for(n = 80 ; n > 0 ; n-- ) // // jeżeli warunek został spełniony przesuń prawo { digitalWrite(PAA1, HIGH); digitalWrite(PBB1, LOW); digitalWrite(PAA2, LOW); digitalWrite(PBB2, LOW); delay(tim); digitalWrite(PAA1, LOW); digitalWrite(PBB1, HIGH); digitalWrite(PAA2, LOW); digitalWrite(PBB2, LOW); delay(tim); digitalWrite(PAA1, LOW); digitalWrite(PBB1, LOW); digitalWrite(PAA2, HIGH); digitalWrite(PBB2, LOW); delay(tim); digitalWrite(PAA1, LOW); digitalWrite(PBB1, LOW); digitalWrite(PAA2, LOW); digitalWrite(PBB2, HIGH); delay(tim); } } } void minuty (){ obrm = map(minu, 0 , 60, 0, 78); for ( ; i < obrm ; i++ ) // jeżeli warunek został spełniony przesuń lewo wskazówke obrotomierza { digitalWrite(AA1, LOW); digitalWrite(BB1, LOW); digitalWrite(AA2, LOW); digitalWrite(BB2, HIGH); delay(tim); digitalWrite(AA1, LOW); digitalWrite(BB1, LOW); digitalWrite(AA2, HIGH); digitalWrite(BB2, LOW); delay(tim); digitalWrite(AA1, LOW); digitalWrite(BB1, HIGH); digitalWrite(AA2, LOW); digitalWrite(BB2, LOW); delay(tim); digitalWrite(AA1, HIGH); digitalWrite(BB1, LOW); digitalWrite(AA2, LOW); digitalWrite(BB2, LOW); delay(tim); //Serial.print (i); Serial.print(" i M obr "); Serial.print (obrm);Serial.print(" min "); Serial.println (minu); // odczyt wartości w fazie testów } if (minu != 0) { blok = 0;} if (minu == 0 && blok == 0 ){ for(i = 80 ; i > 0 ; i-- ) // jeżeli warunek został spełniony przesuń prawo wskazówke obrotomierza { digitalWrite(AA1, HIGH); digitalWrite(BB1, LOW); digitalWrite(AA2, LOW); digitalWrite(BB2, LOW); delay(tim); digitalWrite(AA1, LOW); digitalWrite(BB1, HIGH); digitalWrite(AA2, LOW); digitalWrite(BB2, LOW); delay(tim); digitalWrite(AA1, LOW); digitalWrite(BB1, LOW); digitalWrite(AA2, HIGH); digitalWrite(BB2, LOW); delay(tim); digitalWrite(AA1, LOW); digitalWrite(BB1, LOW); digitalWrite(AA2, LOW); digitalWrite(BB2, HIGH); delay(tim); blok = 1; } } } |
EDIT:
Do Silniki krokowe należy sterować przez sterowniki!
Mam nieodparte wrażenie że bardzo podobny projekt był na majsterkowie. Poza tym brak opisu wykonania.
Było kilka projektów na zegarach, ale zegara chyba nie ;) Ale nawet jak by był, to w niczym nie przeszkadza – każdy autor zawsze może pójść nieco inną drogą przy wykonaniu.
Ale rzeczywiście zabrakło mi chociaż kilku zdań wyjaśnienia zasady działania i budowy licznika.
Nie mogę edytować/bądź nie umiem więc dodam tutaj :)
Zasada działania:
Wyświetlanie czasu na tarczach odbywa się za pomocą oryginalnych silników krokowych wbudowanych w licznik, odseparowałem piny od reszty układy i podłączyłem się z arduino. Następnie za pomocą arduino i prymitywnego programu obliczyłem ile wynosi cały zakres zegara, z mapowałem w arduino i działa :) Miganie od świateł długich od izolowałem od reszty układu i podpiąłem bezpośrednio do układu ds3231 i zaprogramowałem za pomocą arduino aby na wyjściu były “impulsy”. Czujnik światła w postaci fotorezystora zamontowałem aby zegar nie budził nas w nocy, ponieważ mocno świeci. Fotorezystor z rezystorem tworzą dzielnik napięcia i na wejściu analogowym jest odczytywana wartość zamieniana na czterostopniową regulacje z histerezą podświetlenia zegarów. Odszukałem ścieżki od podświetlenia podłączyłem pod wyjście od zasilacza 12V wpinając szeregowo tranzystor mosfet, aby móc sterować intensywnością za pomocą sygnału pwm. Zasilanie 12V zostało podpięte pod wejście arduino Vin. Przycisk reset został odizolowany od reszty układy i podpięty pod pin resetu. Po wciśnięciu przycisku reset bądź podłączenia zasilania układ najpierw przechodzi do zera a następnie odczytuje z modułu czasy rzeczywistego i ustawia godzinę na tarczach.
Edytować możesz na https://majsterkowo.pl/moje-konto/moje-projekty/ :)
Takie rozbudowane schematy, a nawet jednego zdjęcia jak to wszystko wygląda od środka. Poczekam jak rozbudujesz artykuł i wtedy ocenię, bo projekt bardzo fajny, tylko opis słaby. Szkoda aby nie wyszedł na główną, w tej formie może być ciężko.
To są schematy z elementami na płytkach z chin miedzy innymi jak na pierwszym zdjęciu oryginalna płytka nano.
Żadnej filozofia tutaj nie ma.
Na kolejnym zdjęciu podłączamy do pinu d3 przez rezystor tranzystor mosfet, który służy do sterowania diod podświetlenia na 12v.
Obok mamy podłączone silniki krokowe i pierwszy należy podłączyć do pinów d4,d5,d6,d7. Natomiast drugi silnik do pinów d8,d9,d10,d11.
Kolejny schemat to płytka z chin z zegarem czasy rzeczywistego. podłączamy ja do szyny i2c. Dodatkowo do wejścia 32KHz zegara podłączona jest dioda (sekundnik). Podtrzymanie zegara odbywa się za pomocą baterii.
Ps. Układ zrobiłem pół roku temu :) Został sprezentowany Wujkowi maniakowi motoryzacyjnemu.
Zdjęcia środka nie posiadam ale jest tam kilka kabelków i dwa układy :)
Ciekawy pomysł ale definiowanie nazw pinów lepiej zrobić przez #define ponieważ wtedy nie jest zabierana pamięć ram jak w przypadku zmiennych.
Bardzo fajny ciekawy pomysł.
Daniel (majstermania.pl)
Urządzenie bardzo ciekawe i pomysłowo stworzone. Sam takie tworzę. :) Jak zrobię swój, dam zdjęcie.
Powodzenia w dalszych projektach
Niko
Pytanie do kolegi: jakiego rodzaju kondensatora kolega użył i gdzie go podpiął? I dlaczego napisałeś “rezystory”, skoro są one bezpośrednio na Arduino? To samo “micro-switch” – jest na Arduino. Silniki krokowe są w liczniku, a zasilacz 12v dc to bzdura – to Arduino (v3) zasilane jest przez micro-usb. Do poprawy!
Rezystory
-1 Ograniczający prąd na diodzie sygnalizującej minuty
-2 Ograniczający prąd na tranzystorze :)
-3 i 4 dzielnik napięcia na rezystorze i fotorezystorze (aby regulować natężenie światłą )
Kondensatory jeden przy arduino drugi przy module czasu rzeczywistego, żeby wyrównać spadki :)
Micro switch tak jest na arduino BRAWO! ale musiałbym zdjąć obudowę aby zresetować :), a tak mam przerobiony oryginalny od licznika, który jest podpięty pod arduino i resetuje :)
Silniki krokowe są w liczniku :o. Hmm Zasilacz 12V bzdura ? no tak zasilanie oryginalnych diod na 12v zasile 5V z USb.
12V używam do zasilania diod oraz arduino poprzez wejście raw. “Zasilanie jest przez micro-usb” Nie w tym projekcie :)
Proponuje zebrać swoje zabawki i nie pleść głupot bez podstawy :#
Sory, pomyłka, Mini-USB ;d
Jaki sterownik silników krokowych zastosowałeś ? Bo ze schematu wynika że masz podłączone silniki bezpośrednio do arduino…
Rozumiem że silniki sterowane i zasilane 12V tak jak w instalacji samochodowej ?
troche mnie nie b ylo ale moze podpowiem :) nie uzylem zadnego sterownika do silnikow ale trzerba uzyc bo ja przez to upalilem arduino. tak z uwzglednienie mspadku napiecia na arduino
Czy Kolega sprzedaje takie? Zbliża mi się 40-lat mojego brata – fana motoryzacji:)
Siema, mam dwa pytania
Super pomysł! Mogłabym prosić o kontakt? Mój email: karola6371@gmail.com
Byłabym bardzo wdzięczna :)
Witam zabrałem się za tworzenie zegara z tego projektu i mam kilka pytań. W jaki sposób ustawić godzinę ? A kolejne to problem z wgrywaniem programu a dokładniej problem z RTCDateTime dt;
Zaznacza jako błąd i nie chce się skompilować
Super ale nie na moje możliwości a raczej umiejętności. Chętnie bym taki zegar kupił