Nie dawała mi spokoju pewna idea. zegar o odczycie analogowym czasu.
Więc go wykonałem. na razie w formie "pająka"
Załącznik:
20150204_190251.jpg [ 1.83 MiB | Przeglądane 12116 razy ]
Listing:
// **************BAXTER**************
//Zegarek cyfrowy wyswietlajacy czas w formie analogowj i cyfrowej,
//przy użyciu dwurzędowego wyswietlacza LCD sterowanego przez układ
//M74HC595. dzieki zastosowanemu okładowi uzywam tylko trzech pinów Arduino.
// Do ustawienia czzasu używamy cztero przyciskowej klawiatury podłączonej do portów cyfrowych.
// Połaczenia jak w opisie do niezbednej biblioteki: LiquidCrystal595n library.
#include <LiquidCrystal595.h>
LiquidCrystal595 lcd(7,8,9);
int czas = 0 ;
int czas1 = 0 ;
int sekunda = 0 ;
int minuta = 0 ;
int godzina = 0 ;
int dodajgodzina = 0;
int odejmijgodzina = 0;
int dodajminuta = 0;
int odejmijminuta = 0;
//Tablice tekstowe dla godzin i minut.
char* godztxt[] = {
"","Pierwsza", "Druga", "Trzecia","Czwarta",
"Piata","Szosta","Siodma","Osma","Dziewiata","Dziesiata","Jedynasta","Dwunasta","Pierwsza"}
;
char* pogodztxt[] = {
"","Pierwszej","Drugiej","Trzeciej","Czwartej","Piatej","Szostej","Siodmej","Osmej",
"Dziewiatej","Dziesiatej","Jedynastej","Dwunastej","Pierwszej"}
;
char* minutatxt[] = {
"Punktualnie","Piec po","Dziesiec po","Pietnascie po","Dwadziescia po","Za piec wpol","Wpol do",
"Piec po wpol do","Za dwadziescia","Za pietnascie","Za dziesiec","Za piec"};
const int godzinadodajPin = 4; // Numery pinów klawiatury
const int godzinaodejmijPin = 3;
const int minutadodajPin = 5;
const int minutaodejmijPin = 2;
void setup() {
lcd.begin(16,2) ; // Inicjalizacja wyswietlacza
lcd.clear() ;
czas = millis() ; // Odczytanie czasu z zegara systemowego. - liczby milisekund od uruchomienia procesora
pinMode(godzinadodajPin, INPUT); // Piny wejscia dla klawiatury
pinMode(godzinaodejmijPin, INPUT);
pinMode(minutadodajPin, INPUT);
pinMode(minutaodejmijPin, INPUT);
}
void loop() {
// Odczyt z klawiatury
if (digitalRead(godzinadodajPin) == HIGH) {
// turn LED on:
delay (200) ;
tone(13, 100, 500);
godzina = godzina + 1 ;
}
if (digitalRead(godzinaodejmijPin) == HIGH) {
// turn LED on:
delay (200) ;
tone(13, 100, 500);
godzina = godzina - 1 ;
}
if (godzina == 0) {
godzina = 12 ;
} // Zabezpieczenie przed zerowa lub ujemna godziną.
if (digitalRead(minutadodajPin) == HIGH) {
// turn LED on:
delay (200) ;
tone(13, 100, 500);
minuta = minuta + 1 ;
}
if (digitalRead(minutaodejmijPin) == HIGH) {
// turn LED on:
delay (200) ;
tone(13, 100, 500);
minuta = minuta - 1 ;
}
if (minuta == 0 ) {
minuta = 60 ;
} // Zabezpieczenie przed ujemna lub zerową minutą.
czas1 = millis(); //Obliczenie czasu który w którym procesor wykonał petlę.
if (czas1 - czas >= 1000) // jeżeli więcaj niz sekunde to doliczamy ją.
{
czas = czas1 ;
sekunda = sekunda + 1 ;
// Poniżej przeliczamy sekundy na minuty i godziny.
if (sekunda >= 60) {
sekunda = 0 ;
minuta = minuta + 1 ;
}
if (minuta >= 60 ) {
minuta = 0 ;
godzina = godzina + 1 ;
}
if (godzina >= 13 ) {
godzina = 1 ;
minuta = 0 ;
sekunda = 0 ;
}
// Wyswietlanie czasu:
lcd.clear() ; // Czyszczenie ekranu
lcd.setCursor (11,1) ; // pozycja kursora do wyswietlenia czasu cyfrowo
if (godzina <= 9 ) {
lcd.print (" ") ;
}
lcd.print (godzina) ;
lcd.print (":") ;
if (minuta <= 9) { // Jezeli minuta jest jednocyfrowa dodajemy zero z przodu coby ładniej wygladała.
lcd.print ("0") ;
}
lcd.print (minuta) ;
lcd.setCursor (0,0) ; // Ustawienie kursora do wyswietlania analogowego.
if (minuta <= 4) { //Jeżeli minuta jest mniejsza od 4 to minuty = 0 a godzina jest
lcd.print(minutatxt[minuta/5]);
lcd.print (" ") ; // podawana w formanie "trzecia"
lcd.setCursor (0,1) ;
lcd.print(godztxt[godzina]);
}
if (minuta <= 24 and minuta >= 5) { // W tym zakresie minut używamy formy "trzeciej".
lcd.print(minutatxt[minuta/5]);
lcd.print (" ") ; // ta linia pobiera pierwsza wartość z tabeli
// minutatxt czyli " Punktualnie "
lcd.setCursor (0,1) ; // Kursor o jeden wiersz niżej i wyswietlamy godzinę.
lcd.print(pogodztxt[godzina]);
}
if (minuta >= 25 and minuta <= 39) {
lcd.print(minutatxt[minuta/5]);
lcd.setCursor (0,1) ;
lcd.print(pogodztxt[godzina + 1]);
}
if (minuta>=40) {
lcd.print (minutatxt[minuta/5]) ;
lcd.setCursor (0,1) ;
lcd.print (godztxt[godzina + 1]);
}
}
}
// END
I to tyle, dziękuje za uwagę.
aha zegar mierzy czas używając zegara wewnętrznego Atmegi i po tygodniu uważam że jego dokładność jest wystarczająca. będzie chodził ok 50 dni, potem bufor atmegi się przepełni i wyzeruje, wiec prawdopodobnie zegar trzeba będzie ustawiać od nowa.