#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;
}
}
}
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ł