• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
DS1307 Edycja zmiennych czasu
#1
Witam, mam raczej banalny problem ale mi sprawia kłopot, a mianowicie:
Chciałbym zmieniać zmienne zegara przez naciśnięcie przycisku, obecnie gdy robię to w poniższy sposób

if (digitalRead(8) == LOW) {dt.minute ++, delay(100);}

zegar się zawiesza. Czy zmienne zegara należy traktować jakoś inaczej?

Poniższy kod dla lepszej czytelności ograniczyłem tylko do edycji minut

Kod:
#include <DS1307.h>
#include <Wire.h>
DS1307 clock;

RTCDateTime dt;
int IR_plus = 0;

void setup(){
pinMode(8, INPUT_PULLUP); //plus
Serial.begin(9600);
clock.begin();
if (!clock.isReady())
}
void loop(){
dt = clock.getDateTime();
lcd.print(dt.minute);

if (digitalRead(8) == LOW) {dt.minute ++, delay(100);}
}


Z góry dziękuję za pomoc i przepraszam za zaniżanie poziomu  Huh
 
Odpowiedź
#2
Ogólnie polecam DS3231 jest 100razy dokładniejszy.

Może spróbuj przypisać ten czas do zmiennej i potem tą zmienną regulować.
Kod:
int minuty = dt.minute;

if (digitalRead(8) == LOW) {minuty ++, delay(100);}
}

lcd.print(minuty);
 
Odpowiedź
#3
1. No niestety ten sposób nie pomaga  Huh

2. Prawdę mówiąc nie zależy mi na super dokładności ponieważ ma to być zegar sterownika nie wymagający super dokładności, ale dzięki za podpowiedź
 
Odpowiedź
#4
(06-01-2016, 11:34)rykool napisał(a): Witam, mam raczej banalny problem ale mi sprawia kłopot, a mianowicie:
Chciałbym zmieniać zmienne zegara przez naciśnięcie przycisku, obecnie gdy robię to w poniższy sposób

if (digitalRead(8) == LOW) {dt.minute ++, delay(100);}

zegar się zawiesza. Czy zmienne zegara należy traktować jakoś inaczej?

Poniższy kod dla lepszej czytelności ograniczyłem tylko do edycji minut

#include <DS1307.h>
#include <Wire.h>
DS1307 clock;

RTCDateTime dt;
int IR_plus = 0;

void setup(){
pinMode(8, INPUT_PULLUP); //plus
Serial.begin(9600);
clock.begin();
if (!clock.isReady())
}
void loop(){
dt = clock.getDateTime();
lcd.print(dt.minute);

if (digitalRead(8) == LOW) {dt.minute ++, delay(100);}
}

Z góry dziękuję za pomoc i przepraszam za zaniżanie poziomu  Huh

Witam
A  czy przypadkiem nie masz błędu przy kompilacji, bo chyba zamiast przecinka powinien być średnik po dt.minute++
Pozdrawiam
 
Odpowiedź
#5
(14-01-2016, 22:27)wojtekizk napisał(a):
(06-01-2016, 11:34)rykool napisał(a): Witam, mam raczej banalny problem ale mi sprawia kłopot, a mianowicie:
Chciałbym zmieniać zmienne zegara przez naciśnięcie przycisku, obecnie gdy robię to w poniższy sposób

if (digitalRead(8) == LOW) {dt.minute ++, delay(100);}

zegar się zawiesza. Czy zmienne zegara należy traktować jakoś inaczej?

Poniższy kod dla lepszej czytelności ograniczyłem tylko do edycji minut

#include <DS1307.h>
#include <Wire.h>
DS1307 clock;

RTCDateTime dt;
int IR_plus = 0;

void setup(){
pinMode(8, INPUT_PULLUP); //plus
Serial.begin(9600);
clock.begin();
if (!clock.isReady())
}
void loop(){
dt = clock.getDateTime();
lcd.print(dt.minute);

if (digitalRead(8) == LOW) {dt.minute ++, delay(100);}
}

Z góry dziękuję za pomoc i przepraszam za zaniżanie poziomu  Huh

Witam
A  czy przypadkiem nie masz błędu przy kompilacji, bo chyba zamiast przecinka powinien być średnik po dt.minute++
Pozdrawiam
 
Odpowiedź
#6
Nie, wszystko kompiluje się poprawnie.
Gdzieś wyczytałem, że przed edycją zmiennych czasu powinno się zatrzymać zegar przez clock.stop() i co ciekawe komendy tej nie mogę użyć bo wyskakuje błąd, ale skoro jest i działa komenda clock.begin() to czemu nie mogę zatrzymać zegara ?
 
Odpowiedź
#7
To że kompiluje się poprawnie jest zrozumiałe. Zacytuję Ci fragment książki Jerzego Grebosza "Symfonia C++" :
Cytat:Jeśli kilka wyrażeń stoi obok siebie oddzielone przecinkiem, to ta całość, jest także 
wyrażeniem, którego wartością jest wartość wyrażenia najbardziej z prawej

Zatem wartością wyrażenia

(2 + 4, a * 4, 3 < 6, 77+2)  będzie 79
... a w Twoim kodzie: w tej linii z przecinkiem funkcja if wykona tylko delay... zatem kod się zawiesi, bo będzie ciągle delay.
Kompilator nie zgłosi błędu bo to nie jest błąd składniowy tylko logiczny :-)
Musisz zamienić przecinek na średnik i wtedy testować.
Pozdrawiam 
ps. "Najważniejsze jest niewidoczne dla oczu". (Mały Książę - Antoin'e  de Saint-Exupery).  
Ta symfonia to biblia języka C++ - ma już chyba z 10 wydanie i wciąż bije rekordy popularności, mimo że raczej trzeba PRZYNAJMNIEJ przeczytać z uwagą wszystkie 3 tomy. :-)
...i jeszcze uwaga z ost. chwili - proszę sprawdźcie to Ci, którzy to czytacie... Bo grubo wydaję mi się, że inne kompilatory C++  np. ten Borlanda też nie wywala błędu przy takiej konstrukcji z przecinkiem, ale mamy tam przynajmniej warning - ostrzeżenie. Czy w opcjach IDE Arduino da się ustawić pokazywanie wszystkich warningów?
 
Odpowiedź
#8
Pomogło wreszcie się z tym uporałem - dziękuje za pomoc
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości