gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Zbiór tutoriali związanych z Arduino.
ODPOWIEDZ
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 309
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: wojtekizk » 20 lut 2014, 09:55

Witam
Zapoczątkuję tym tutorialem pewien cykl, w którym będę umieszczał gotowe rozwiązania dot. mniej lub bardziej prozaicznych problemów z jakimi borykamy się podczas także mniej lub bardziej poważnej zabawy z Arduino :-)
Docelowo jeśli admin pozwoli to wspólnymi siłami możemy utworzyć coś w rodzaju chmury z poradami.
Na początek moduł RTC i ustawianie czasu za pomocą przycisków. (zdaje się że kolega zbyszek_m1 czegoś takiego poszukuje :-)
Do rzeczy:
Przykładowy tutorial przeznaczony do ustawiania daty i czasu za pomocą zdefiniowanych 3 klawiszy:
up_key, down_key, ok_key ...które służą do ustawień poszczególnych członów daty i czasu.
W tym przykładzie zastosowano moduł RTC oparty na PCF8583, ale nic nie stoi na przeszkodzie
aby zaadoptować ten kod do dowolnego modułu. Musisz tylko dołączyć odpowiednią bibliotekę,
oraz podmienić funkcje odczytu i zapisu daty/czasu na funkcje biblioteczne Twojego modułu
i oczywiście zmodyfikować nazwy zmiennych odpowiednich dla Twojej biblioteki.
W przykładzie prezentację ustawień zobaczysz na Serialu. Jeśli chcesz zastosować
np. wyświetlacz LCD, to musisz zmienić ciało funkcji pokaz_time().
Obsługa:
1) klawisz up_key - zmiana parametru (członu daty - rok, m-c, dzień, godzina, min., sek) w górę
2) klawisz down_key - zmiana parametru (członu daty - rok, m-c, dzień, godzina, min., sek) w dół
3) klawisz ok_key - przejście do ustawień kolejnego członu daty/czasu
UWAGA :Dwukrotne wybranie klawisza ok_key ustawia aktualną datę/czas i wracamy do pętli loop()

Kod: Zaznacz cały

/* 
Zmiana ustawień daty i czasu ...by wojtekizk ([email protected]) ...dla forum majsterkowo.pl
Przykładowy tutorial ustawiania daty i czasu za pomocą zdefiniowanych 3 klawiszy:
up_key, down_key, ok_key ...które służą do ustawień poszczególnych członów daty i czasu 
W tym przykładzie zastosowano moduł RTC oparty na PCF8583, ale nic nie stoi na przeszkodzie
aby zaadoptować ten kod do dowolnego modułu. Musisz tylko dołączyć odpowiednia bibliotekę,
oraz podmienić funkcje odczytu i zapisu daty/czasu na Twoje funkcje biblioteczne 
i oczywiście zmodyfikować nazwy zmiennych odpowiednich dla Twojej biblioteki.
W przykładzie prezentację ustawień zobaczysz na Serialu. Jesli chcesz zastosować 
np. wyświetlacz LCD, to musisz zmienić ciało funkcji pokaz_time().
Obsługa:
1) klawisz up_key   - zmiana parametru (członu daty - rok, m-c, dzień, godzina, min., sek) w górę
2) klawisz down_key - zmiana parametru (członu daty - rok, m-c, dzień, godzina, min., sek) w dół
3) klawisz ok_key - przejście do ustawień kolejnego członu daty/czasu
   UWAGA :Dwukrotne wybranie klawisza ok_key ustawia aktualną datę/czas i wracamy do pętli loop()
*/   
#include <Wire.h> 
#include <PCF8583.h>
PCF8583 p (0xA0);                    //powołujemy do życia obiekt klasy PCF8553 o nazwie p
// definicje klawiszy up, down, ok ( u mnie to odpowiednio 2,3 i 4 - piny cyfrowe Arduino)
#define up_key 2
#define down_key 3
#define ok_key 4
// --- funkcja prezentacji czasu --------------------------------------/
void pokaz_time()
{
  char time[50];                  // bufor znakowy na przygotowanie danych do wyswietlenia
  memset(time,0,sizeof(time));    // czyścimy ów bufor i poniżej ładujemy jego zawartość
  sprintf(time, "20%02d/%02d/%02d %02d:%02d:%02d", p.year, p.month, p.day, p.hour, p.minute,p.second);
  Serial.println(time);           // wyświetlany tak sformatowany bufor
  delay(30);                      // kosmetyka 
}
// --- funkcja odczytu stanu klawiszy (up_key, down_key, ok_key)-------/
int odczyt_klawiszy()
{
if(digitalRead(up_key)==0){delay(30);if(digitalRead(up_key)==0);return 1;}     // funkcja zwraca 1
if(digitalRead(down_key)==0){delay(30);if(digitalRead(down_key)==0);return 0;} // funkcja zwraca 0
if(digitalRead(ok_key)==0){delay(30);if(digitalRead(ok_key)==0);return 2;}     // funkcja zwraca 2
return -1;                                             // jeśli nic nie wciśnięto funkcja zwraca -1
// dwukrotne sprawdzenie stanu + delay ogranicza nam efekt drgania styków do przyzwoitego minimum :-)
}
// --- funkcja ustawienia daty -----------------------------------------/
void ustaw_date()
{
  p.get_time();  // funkcja biblioteki PCF8583 , dla innego modułu zastosuj jego funkcję biblioteczną
  // również składniki: p.year, p.month, p.day, p.hour, p.minute, p.second trzeba będzie podmienić
  // na odpowiednie dla Twojej biblioteki (wszystkie ich wystąpienia w kodzie!)
  int zm=-1;int akcja=-1;  // zm jest po to aby przy dłuzszym wciśnięciu klawisza nie generować "autozmiany"
  boolean ust=false;       //jesli kolejno 2 razy wsiśniesz OK to ust=true i wychodzimy z ustawień daty
  int k_OK=0;              // zmienna kontrolujaca wciśnięcie klaiwsza ok_key
  int w=1;                 // zmienna okreslająca który człon daty/czasu jest aktywny
  
  while(ust==false)        // dopóki nie wciśnięto dwukrotnie klawisza ok_key to wykonuj to, co poniżej 
    {
    akcja=odczyt_klawiszy(); 
    if(akcja !=-1 && akcja!=zm) // jeżeli coś wcisnięto i jest to coś innego niż w poprzednim "rozdaniu" 
    {
      switch (akcja) 
        {  
        case 1: if(w==1)p.year++;
                if(w==2){p.month++;if(p.month>12)p.month=1;}
                if(w==3){p.day++;if(p.day>31)p.day=1;}
                pokaz_time();break;
        case 0: if(w==1){if(p.year>2000)p.year--;}
                if(w==2){p.month--;if(p.month<1)p.month=12;}
                if(w==3){p.day--;if(p.day<1)p.day=31;}
                pokaz_time();break;
        case 2: w++;if(w>3)w=1;break; // zmieniamy także człon daty do ustawiania: z roku na miesiąc lub dzień
        }
      delay(50);  // kosmetyka 
      if(akcja==2 && k_OK==1) // jeśli wciśnieto wcześniej OK i teraz także, to wychodzimy z pętli while
       {
       ust=true;              // de facto 2 razy OK = koniec ustawień
       zm=-1;akcja=-1;        // na pożegnanie
       }
      if(akcja==2) k_OK=1;   // po pojedynczym OK
      else k_OK=0;           // dla porządku 
    }zm=akcja;               // po to aby reagować tylko na zmiane stanu klawiatury
  }
  p.set_time();              // ustawiamy czas w module PCF8583 ( lub odp. funkcja z Twojej biblioteki)
}
// --- funkcja ustawienia czasu -------------------------------------------/
void ustaw_czas()  // ta funkcja bez komentarzy, bo działanie jest identyczne jak ustaw_date
                   // zmienia się tylko obsługa na człony: hour, minute i second
{                    
  p.get_time();
  int zm=-1;int akcja=-1;
  boolean ust=false;   
  int k_OK=0;  
  int w=1;
  
  while(ust==false)
    {
    akcja=odczyt_klawiszy(); 
    if(akcja !=-1 && akcja!=zm) 
    {
      switch (akcja) 
        {  
        case 1: if(w==1){p.hour++;if(p.hour>23)p.hour=0;}
                if(w==2){p.minute++;if(p.minute>59)p.minute=0;}
                if(w==3){p.second++;if(p.second>59)p.second=0;}
                pokaz_time();break;
        case 0: if(w==1){p.hour--;if(p.hour<0)p.hour=23;}
                if(w==2){p.minute--;if(p.minute<0)p.minute=59;}
                if(w==3){p.second--;if(p.second<0)p.second=59;}
                pokaz_time();break;
        case 2: w++;if(w>3)w=1;break; 
        }
      delay(50);  
      if(akcja==2 && k_OK==1) 
       {
       ust=true;              
       zm=-1;akcja=-1; 
       }
      if(akcja==2) k_OK=1; 
      else k_OK=0;
    }zm=akcja; 
  }
  p.set_time();
}
// --- startuje setup -------------------------------------------------/
void setup(void)
{
  Serial.begin(9600);  // standard dla Seriala
  //konfiguracja pinów cyfrowych jako wejścia, klawisze zwierają do MASY!
  pinMode(up_key,INPUT);digitalWrite(up_key,HIGH); //
  pinMode(down_key,INPUT);digitalWrite(down_key,HIGH);
  pinMode(ok_key,INPUT);digitalWrite(ok_key,HIGH);
}
// --- ... i startuje program glowny ----------------------------------/
void loop()
{
 // przykładowo na Serialu programik pokazuje czas a potem czeka na zmiany
 Serial.println(" Aktualna data: ");
 pokaz_time();  delay(1000);
 ustaw_date();  Serial.println(" DATA Ustawiona !!!");delay(2000);pokaz_time();
 ustaw_czas();  Serial.println(" CZAS Ustawiony !!!");delay(2000);pokaz_time();
}
// === KONIEC ==========================================================/
Jeśli znajdziesz w kodzie błędne działania lub masz jakieś pytania, propozycje lub czegoś tu nie zakumasz to pisz proszę na forum.
Pozdrawiam

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
kubica14
Młodszy majsterkowicz
Posty: 9
Rejestracja: 27 lut 2014, 11:35
Lokalizacja: Bielsko-Biała

Re: gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: kubica14 » 27 lut 2014, 14:24

Witam serdecznie ;)
Bardzo by mnie interesowało takie rozwiązanie, szukam czegoś sensownego do mojego zegara (docelowo sterownik do akwa) na LCD. Różnica jest taka, że moim modułem RTC jest DS1307 i ni jak nie wiem jak takie rozwiązanie zaimplementować. Dopiero się uczę, szukam jakichś sensownych rozwiązań ale niestety idzie to dość topornie.
Stąd moje nieśmiałe pytanie, jak coś takiego zaimplementować w powyższym układzie? Być może nie zrobię tego na obecnie wykorzystywanej bibliotece - RTClib, widziałem inne, np. DS1307. Tak jak mówię, przygodę z Arduino zacząłem niedawno i nie potrafię tego samodzielnie przeskoczyć. Potrzebuję aby nie ktoś nakierował ;)

Dołączę mój program. LCD jest sterowany przez 74HC595.

Kod: Zaznacz cały

#include <Wire.h>
#include <RTClib.h>
#include <ShiftLCD.h>
ShiftLCD lcd(2, 4, 3);
RTC_DS1307 RTC;
 
void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();
     lcd.begin(16, 2);
    
   pinMode(8,OUTPUT);
 
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
   //RTC.adjust(DateTime(__DATE__, __TIME__));
  }
}
 
void loop () {
    DateTime now = RTC.now();
    lcd.setCursor(0, 1);
    lcd.print(now.day(), DEC);
     if (now.day()<10)
    lcd.print('0');
    lcd.print('/');
     if (now.month()<10)
    lcd.print('0');
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.year(), DEC);
    lcd.print(' ');
    lcd.setCursor(0, 0);
     if (now.hour()<10)
    lcd.print('0');
    lcd.print(now.hour(), DEC);
    lcd.print(':');
     if (now.minute()<10)
    lcd.print('0');
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    if (now.second()<10)
    lcd.print('0');
    lcd.print(now.second(), DEC);
    lcd.setCursor(11, 1);
   int dayofweek = now.dayOfWeek();
   switch(dayofweek){
     case 1:
     lcd.print("Pon");
     break;
     case 2:
     lcd.print("Wt");
     break;
     case 3:
     lcd.print("Sr");
     break;
     case 4:
     lcd.print("Czw");
     break;
     case 5:
     lcd.print("Pt");
     break;
     case 6:
     lcd.print("Sob");
     break;
     case 0:
     lcd.print("Nd");
     break; 
    delay(1000);
}
 
}
    
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 309
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: wojtekizk » 28 lut 2014, 08:26

Witam
Kurcze tak z ciekawości szperałem po necie w sprawie Twojej biblioteki ShiftLCD ... i okazuje się, że jest ona już "deprecated" czyli oględnie mówiąc przedawniona-niezalecana. Zamiast tego polecana NewLiquidCrystal lub LiquidCrystal_I2C. Ta Twoja jest podobno dobra dla IDE 1.0 (nie zalecają stosować do nowszych).
Nie mam możliwości przetestowania na żywca Twojego kodu, ale nie szkodzi... Z tego co widzę, to Twój programik na razie nie robi niczego poza wyświetlaniem w "neverending story" samej daty :-)
Co do wyświetlania, to widzę że meczysz się ze wstawianiem '0' :-)Spróbuj zastosować funkcję snprintf(...), która ładnie formatuje dane do wyswietlenia. Zamień swoją funkcję loop na tę tutaj i porównaj:

Kod: Zaznacz cały

void loop () 
  {
   DateTime now = RTC.now();
   char buf[50];
   memset(buf,0,sizeof(buf));
   snprintf(buf, sizeof(buf), "    %02d:%02d:%02d", now.hour(), now.minute(), now.second());
   lcd.setCursor(0,0); lcd.print(buf);
   memset(buf,0,sizeof(buf));
   snprintf(buf, sizeof(buf), " %02d/%02d/%02d ", now.day(), now.month(), now.year());
   lcd.setCursor(0,1); lcd.print(buf);
   int dayofweek = now.dayOfWeek();
   switch(dayofweek)
     {
     case 1: lcd.print("Pon"); break;
     case 2: lcd.print("Wt"); break;
     case 3: lcd.print("Sr"); break;
     case 4: lcd.print("Czw"); break;
     case 5: lcd.print("Pt");  break;
     case 6: lcd.print("Sob"); break;
     case 0: lcd.print("Nd");  break; 
     }
   delay(1000);
  }
... albo jeszcze prościej:

Kod: Zaznacz cały

char dni[7][4]={"Nd", "Pon", "Wt", "Sr", "Czw", "Pt", "Sob"};
char buf[50];
void loop () 
  {
   DateTime now = RTC.now();
   memset(buf,0,sizeof(buf));
   snprintf(buf, sizeof(buf), "    %02d:%02d:%02d", now.hour(), now.minute(), now.second());
   lcd.setCursor(0,0); lcd.print(buf);
   memset(buf,0,sizeof(buf));
   snprintf(buf, sizeof(buf), " %02d/%02d/%02d ", now.day(), now.month(), now.year());
   lcd.setCursor(0,1); lcd.print(buf);
   lcd.print(dni[now.dayOfWeek()]);
   delay(1000);
  }
... co do obsługi klawiszy to w moim tutorialu korzystam co prawda z innej biblioteki RTC ale gdybyś poświęcił nieco uwagi na analizę pliku .h Twojej biblioteki to w mig zauważysz, że obie są bardzo podobne:
- Twój egzempalrz klasy DS1307 ma nazwę: RTC_DS1307 RTC a mój: PCF8583 p (0xA0);
- Ty tworzysz obiekt klasy DateTime: DateTime now = RTC.now(); .. a ja nie muszę tego robić w swojej klasie :-)
- W DS1307 np. godzinę zwraca Ci funkcja now.hour() a w PCF8583 zmienna p.hour i anaalogicznie dla innych składników.
- Ty odczytujesz czas w DS1307 za pomocą konstrukcji: DateTime now = RTC.now();
a w PCF8583 za pomocą: p.get_time();
... same podobieństwa przecież :-)
Pokombinuj trochę z modyfikacją sam... jak sobie nie poradzisz, wróć tutaj
Pozdrawiam
ps. mała uwaga... różne biblioteki różnie wyświetlają rok i może się okazać, że Twoja wyświetla go jako 2 znaki, więc w zapisie: " %02d/%02d/%02d " można dodać "20" czyli: "%02d/%02d/20%02d " :-)
Awatar użytkownika
kubica14
Młodszy majsterkowicz
Posty: 9
Rejestracja: 27 lut 2014, 11:35
Lokalizacja: Bielsko-Biała

Re: gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: kubica14 » 3 mar 2014, 18:57

No więc tak: poszedłem za twoją radą i pozmieniałem odpowiadające sobie funkcje. Nie jestem tylko pewien tej w linii 85 i 124 (RTC.adjust(DateTime()) zamiast p.set_time). Owszem zaglądałem do pliku .h w bibliotece ale ja tam niestety nic nie widzę :/
Druga sprawa to to, że niestety Arduino sypie błędami, więc nie wiem czy to w ogóle działa.

Oto kod:

Kod: Zaznacz cały

/* 
Zmiana ustawieĹ„ daty i czasu ...by wojtekizk ([email protected]) ...dla forum majsterkowo.pl
Przykładowy tutorial ustawiania daty i czasu za pomocą zdefiniowanych 3 klawiszy:
up_key, down_key, ok_key ...które służą do ustawień poszczególnych członów daty i czasu 
W tym przykładzie zastosowano moduł RTC oparty na PCF8583, ale nic nie stoi na przeszkodzie
aby zaadoptować ten kod do dowolnego modułu. Musisz tylko dołączyć odpowiednia bibliotekę,
oraz podmienić funkcje odczytu i zapisu daty/czasu na Twoje funkcje biblioteczne 
i oczywiście zmodyfikować nazwy zmiennych odpowiednich dla Twojej biblioteki.
W przykładzie prezentację ustawień zobaczysz na Serialu. Jesli chcesz zastosować 
np. wyświetlacz LCD, to musisz zmienić ciało funkcji pokaz_time().
Obsługa:
1) klawisz up_key   - zmiana parametru (członu daty - rok, m-c, dzień, godzina, min., sek) w górę
2) klawisz down_key - zmiana parametru (członu daty - rok, m-c, dzień, godzina, min., sek) w dół
3) klawisz ok_key - przejście do ustawień kolejnego członu daty/czasu
   UWAGA :Dwukrotne wybranie klawisza ok_key ustawia aktualną datę/czas i wracamy do pętli loop()
*/   
#include <Wire.h> 
#include <RTClib.h>
#include <ShiftLCD.h>
ShiftLCD lcd(2, 4, 3);
RTC_DS1307 RTC;                   //powołujemy do życia obiekt klasy PCF8553 o nazwie p
// definicje klawiszy up, down, ok ( u mnie to odpowiednio 2,3 i 4 - piny cyfrowe Arduino)
#define up_key 5
#define down_key 6
#define ok_key 7
// --- funkcja prezentacji czasu --------------------------------------/
void pokaz_time()
{
  DateTime now = RTC.now();
  char buf[50];
   memset(buf,0,sizeof(buf));
   snprintf(buf, sizeof(buf), "    %02d:%02d:%02d", now.hour(), now.minute(), now.second());
   lcd.setCursor(0,0); lcd.print(buf);
   memset(buf,0,sizeof(buf));
   snprintf(buf, sizeof(buf), " %02d/%02d/%02d ", now.day(), now.month(), now.year());
   lcd.setCursor(0,1); lcd.print(buf);
}
// --- funkcja odczytu stanu klawiszy (up_key, down_key, ok_key)-------/
int odczyt_klawiszy()
{
if(digitalRead(up_key)==0){delay(30);if(digitalRead(up_key)==0);return 1;}     // funkcja zwraca 1
if(digitalRead(down_key)==0){delay(30);if(digitalRead(down_key)==0);return 0;} // funkcja zwraca 0
if(digitalRead(ok_key)==0){delay(30);if(digitalRead(ok_key)==0);return 2;}     // funkcja zwraca 2
return -1;                                             // jeśli nic nie wciśnięto funkcja zwraca -1
// dwukrotne sprawdzenie stanu + delay ogranicza nam efekt drgania stykĂłw do przyzwoitego minimum :-)
}
// --- funkcja ustawienia daty -----------------------------------------/
void ustaw_date()
{
  DateTime now = RTC.now();  // funkcja biblioteki PCF8583 , dla innego modułu zastosuj jego funkcję biblioteczną
  // również składniki: p.year, p.month, p.day, p.hour, p.minute, p.second trzeba będzie podmienić
  // na odpowiednie dla Twojej biblioteki (wszystkie ich wystÄ…pienia w kodzie!)
  int zm=-1;int akcja=-1;  // zm jest po to aby przy dłuzszym wciśnięciu klawisza nie generować "autozmiany"
  boolean ust=false;       //jesli kolejno 2 razy wsiśniesz OK to ust=true i wychodzimy z ustawień daty
  int k_OK=0;              // zmienna kontrolujaca wciśnięcie klaiwsza ok_key
  int w=1;                 // zmienna okreslająca który człon daty/czasu jest aktywny
  
  while(ust==false)        // dopóki nie wciśnięto dwukrotnie klawisza ok_key to wykonuj to, co poniżej 
    {
    akcja=odczyt_klawiszy(); 
    if(akcja !=-1 && akcja!=zm) // jeżeli coś wcisnięto i jest to coś innego niż w poprzednim "rozdaniu" 
    {
      switch (akcja) 
        {  
        case 1: if(w==1)now.year()++;
                if(w==2){now.month()++;if(now.month()>12)now.month()=1;}
                if(w==3){now.day()++;if(now.day()>31)now.day()=1;}
                pokaz_time();break;
        case 0: if(w==1){if(now.year()>2000)now.year()--;}
                if(w==2){now.month()--;if(now.month()<1)now.month()=12;}
                if(w==3){now.day()--;if(now.day()<1)now.day()=31;}
                pokaz_time();break;
        case 2: w++;if(w>3)w=1;break; // zmieniamy także człon daty do ustawiania: z roku na miesiąc lub dzień
        }
      delay(50);  // kosmetyka 
      if(akcja==2 && k_OK==1) // jeśli wciśnieto wcześniej OK i teraz także, to wychodzimy z pętli while
       {
       ust=true;              // de facto 2 razy OK = koniec ustawień
       zm=-1;akcja=-1;        // na poĹĽegnanie
       }
      if(akcja==2) k_OK=1;   // po pojedynczym OK
      else k_OK=0;           // dla porzÄ…dku 
    }zm=akcja;               // po to aby reagować tylko na zmiane stanu klawiatury
  }
  RTC.adjust(DateTime());              // ustawiamy czas w module PCF8583 ( lub odp. funkcja z Twojej biblioteki)
}
// --- funkcja ustawienia czasu -------------------------------------------/
void ustaw_czas()  // ta funkcja bez komentarzy, bo działanie jest identyczne jak ustaw_date
                   // zmienia się tylko obsługa na człony: hour, minute i second
{                    
  DateTime now = RTC.now();
  int zm=-1;int akcja=-1;
  boolean ust=false;   
  int k_OK=0;  
  int w=1;
  
  while(ust==false)
    {
    akcja=odczyt_klawiszy(); 
    if(akcja !=-1 && akcja!=zm) 
    {
      switch (akcja) 
        {  
        case 1: if(w==1){now.hour()++;if(now.hour()>23)now.hour()=0;}
                if(w==2){now.minute()++;if(now.minute()>59)now.minute()=0;}
                if(w==3){now.second()++;if(now.second()>59)now.second()=0;}
                pokaz_time();break;
        case 0: if(w==1){now.hour()--;if(now.hour()<0)now.hour()=23;}
                if(w==2){now.minute()--;if(now.minute()<0)now.minute()=59;}
                if(w==3){now.second()--;if(now.second()<0)now.second()=59;}
                pokaz_time();break;
        case 2: w++;if(w>3)w=1;break; 
        }
      delay(50);  
      if(akcja==2 && k_OK==1) 
       {
       ust=true;              
       zm=-1;akcja=-1; 
       }
      if(akcja==2) k_OK=1; 
      else k_OK=0;
    }zm=akcja; 
  }
  RTC.adjust(DateTime());
}
// --- startuje setup -------------------------------------------------/
void setup(void)
{
  Serial.begin(9600);  // standard dla Seriala
  //konfiguracja pinów cyfrowych jako wejścia, klawisze zwierają do MASY!
  pinMode(up_key,INPUT);digitalWrite(up_key,HIGH); //
  pinMode(down_key,INPUT);digitalWrite(down_key,HIGH);
  pinMode(ok_key,INPUT);digitalWrite(ok_key,HIGH);
}
// --- ... i startuje program glowny ----------------------------------/
void loop()
{
 // przykładowo na Serialu programik pokazuje czas a potem czeka na zmiany
 Serial.println(" Aktualna data: ");
 pokaz_time();  delay(1000);
 ustaw_date();  Serial.println(" DATA Ustawiona !!!");delay(2000);pokaz_time();
 ustaw_czas();  Serial.println(" CZAS Ustawiony !!!");delay(2000);pokaz_time();
}
// === KONIEC ==========================================================/

A to błędy:

Kod: Zaznacz cały

zegar2___switche.ino: In function 'void ustaw_date()':
zegar2___switche:65: error: lvalue required as increment operand
zegar2___switche:66: error: lvalue required as increment operand
zegar2___switche:66: error: lvalue required as left operand of assignment
zegar2___switche:67: error: lvalue required as increment operand
zegar2___switche:67: error: lvalue required as left operand of assignment
zegar2___switche:69: error: lvalue required as decrement operand
zegar2___switche:70: error: lvalue required as decrement operand
zegar2___switche:70: error: lvalue required as left operand of assignment
zegar2___switche:71: error: lvalue required as decrement operand
zegar2___switche:71: error: lvalue required as left operand of assignment
zegar2___switche.ino: In function 'void ustaw_czas()':
zegar2___switche:104: error: lvalue required as increment operand
zegar2___switche:104: error: lvalue required as left operand of assignment
zegar2___switche:105: error: lvalue required as increment operand
zegar2___switche:105: error: lvalue required as left operand of assignment
zegar2___switche:106: error: lvalue required as increment operand
zegar2___switche:106: error: lvalue required as left operand of assignment
zegar2___switche:108: error: lvalue required as decrement operand
zegar2___switche:108: error: lvalue required as left operand of assignment
zegar2___switche:109: error: lvalue required as decrement operand
zegar2___switche:109: error: lvalue required as left operand of assignment
zegar2___switche:110: error: lvalue required as decrement operand
zegar2___switche:110: error: lvalue required as left operand of assignment
Arturr300
Starszy majsterkowicz
Posty: 307
Rejestracja: 16 paź 2013, 17:24

Re: gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: Arturr300 » 3 mar 2014, 21:40

Kod: Zaznacz cały

now.year()++
Nie można bezpośrednio zwiększyć wartości zwracanej przez funkcję. Dlatego sypie błędami.
Musisz zrobić np. tak:

Kod: Zaznacz cały

int year = now.year();
year++;
Oczywiście nie wiem czy tam powinien być int, czy inny typ bo nie znam się na tej bibliotece.
Awatar użytkownika
kubica14
Młodszy majsterkowicz
Posty: 9
Rejestracja: 27 lut 2014, 11:35
Lokalizacja: Bielsko-Biała

Re: gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: kubica14 » 3 mar 2014, 23:17

Poprawiłem, errory dot. wartości zniknęły. Niestety pojawiły się inne w przypadkach :/

Kod: Zaznacz cały

zegar2___switche.ino: In function 'void ustaw_date()':
zegar2___switche:73: error: case label '0' not within a switch statement
zegar2___switche:77: error: case label '2' not within a switch statement
Arturr300
Starszy majsterkowicz
Posty: 307
Rejestracja: 16 paź 2013, 17:24

Re: gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: Arturr300 » 3 mar 2014, 23:45

Wklej poprawiony kod. Jednak lepiej w ten sposób: zaznacz wszystko w Arduino > ppm> kopiuj na forum i wklej kod, będzie czytelniejszy
Awatar użytkownika
kubica14
Młodszy majsterkowicz
Posty: 9
Rejestracja: 27 lut 2014, 11:35
Lokalizacja: Bielsko-Biała

Re: gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: kubica14 » 4 mar 2014, 09:31

Proszę bardzo, nawet nie wiedziałem, że jest taka opcja ;)
/* 
Zmiana ustawieĹ„ daty i czasu ...by wojtekizk ([email protected]) ...dla forum majsterkowo.pl
PrzykĹ‚adowy tutorial ustawiania daty i czasu za pomocÄ… zdefiniowanych 3 klawiszy:
up_key, down_key, ok_key ...ktĂłre sĹ‚uĹĽÄ… do ustawieĹ„ poszczegĂłlnych czĹ‚onĂłw daty i czasu 
W tym przykĹ‚adzie zastosowano moduĹ‚ RTC oparty na PCF8583, ale nic nie stoi na przeszkodzie
aby zaadoptować ten kod do dowolnego moduĹ‚u. Musisz tylko doĹ‚Ä…czyć odpowiednia bibliotekÄ™,
oraz podmienić funkcje odczytu i zapisu daty/czasu na Twoje funkcje biblioteczne 
i oczywiĹ›cie zmodyfikować nazwy zmiennych odpowiednich dla Twojej biblioteki.
W przykĹ‚adzie prezentacjÄ™ ustawieĹ„ zobaczysz na Serialu. Jesli chcesz zastosować 
np. wyĹ›wietlacz LCD, to musisz zmienić ciaĹ‚o funkcji pokaz_time().
Obsługa:
1) klawisz up_key   - zmiana parametru (czĹ‚onu daty - rok, m-c, dzieĹ„, godzina, min., sek) w gĂłrÄ™
2) klawisz down_key - zmiana parametru (czĹ‚onu daty - rok, m-c, dzieĹ„, godzina, min., sek) w dół
3) klawisz ok_key - przejĹ›cie do ustawieĹ„ kolejnego czĹ‚onu daty/czasu
   UWAGA :Dwukrotne wybranie klawisza ok_key ustawia aktualnÄ… datÄ™/czas i wracamy do pÄ™tli loop()
*/
#include <Wire.h>
#include <RTClib.h>
#include <ShiftLCD.h>
ShiftLCD lcd(2, 4, 3);
RTC_DS1307 RTC; //powołujemy do życia obiekt klasy PCF8553 o nazwie p
// definicje klawiszy up, down, ok ( u mnie to odpowiednio 2,3 i 4 - piny cyfrowe Arduino)
#define up_key 5
#define down_key 6
#define ok_key 7
// --- funkcja prezentacji czasu --------------------------------------/
void pokaz_time()
{
  DateTime now = RTC.now();
  char buf[50];
   memset(buf,0,sizeof(buf));
   snprintf(buf, sizeof(buf), " %02d:%02d:%02d", now.hour(), now.minute(), now.second());
   lcd.setCursor(0,0); lcd.print(buf);
   memset(buf,0,sizeof(buf));
   snprintf(buf, sizeof(buf), " %02d/%02d/%02d ", now.day(), now.month(), now.year());
   lcd.setCursor(0,1); lcd.print(buf);
}
// --- funkcja odczytu stanu klawiszy (up_key, down_key, ok_key)-------/
int odczyt_klawiszy()
{
if(digitalRead(up_key)==0){delay(30);if(digitalRead(up_key)==0);return 1;} // funkcja zwraca 1
if(digitalRead(down_key)==0){delay(30);if(digitalRead(down_key)==0);return 0;} // funkcja zwraca 0
if(digitalRead(ok_key)==0){delay(30);if(digitalRead(ok_key)==0);return 2;} // funkcja zwraca 2
return -1; // jeśli nic nie wciśnięto funkcja zwraca -1
// dwukrotne sprawdzenie stanu + delay ogranicza nam efekt drgania stykĂłw do przyzwoitego minimum :-)
}
// --- funkcja ustawienia daty -----------------------------------------/
void ustaw_date()
{
  DateTime now = RTC.now(); // funkcja biblioteki PCF8583 , dla innego moduĹ‚u zastosuj jego funkcjÄ™ bibliotecznÄ…
  // rĂłwnieĹĽ skĹ‚adniki: p.year, p.month, p.day, p.hour, p.minute, p.second trzeba bÄ™dzie podmienić
  // na odpowiednie dla Twojej biblioteki (wszystkie ich wystÄ…pienia w kodzie!)
  int zm=-1;int akcja=-1; // zm jest po to aby przy dĹ‚uzszym wciĹ›niÄ™ciu klawisza nie generować "autozmiany"
  boolean ust=false; //jesli kolejno 2 razy wsiĹ›niesz OK to ust=true i wychodzimy z ustawieĹ„ daty
  int k_OK=0; // zmienna kontrolujaca wciĹ›niÄ™cie klaiwsza ok_key
  int w=1; // zmienna okreslajÄ…ca ktĂłry czĹ‚on daty/czasu jest aktywny
  
  int year = now.year();
  int month = now.month();
  int day = now.day();
  
  while(ust==false) // dopĂłki nie wciĹ›niÄ™to dwukrotnie klawisza ok_key to wykonuj to, co poniĹĽej
    {
    akcja=odczyt_klawiszy(); 
    if(akcja !=-1 && akcja!=zm) // jeĹĽeli coĹ› wcisniÄ™to i jest to coĹ› innego niĹĽ w poprzednim "rozdaniu"
    {
      switch (akcja)
        {  
        case 1: if(w==1)year++;
                if(w==2){month++;if(month>12)month=1;}
                if(w==3)day++;if(day>31)day=1;}
                pokaz_time();break;
        case 0: if(w==1){if(year>2000)year--;}
                if(w==2){month--;if(month<1)month=12;}
                if(w==3){day--;if(day<1)day=31;}
                pokaz_time();break;
        case 2: w++;if(w>3)w=1;break; // zmieniamy takĹĽe czĹ‚on daty do ustawiania: z roku na miesiÄ…c lub dzieĹ„
        }
      delay(50); // kosmetyka
      if(akcja==2 && k_OK==1) // jeĹ›li wciĹ›nieto wczeĹ›niej OK i teraz takĹĽe, to wychodzimy z pÄ™tli while
       {
       ust=true; // de facto 2 razy OK = koniec ustawieĹ„
       zm=-1;akcja=-1;        // na poĹĽegnanie
       }
      if(akcja==2) k_OK=1; // po pojedynczym OK
      else k_OK=0; // dla porzÄ…dku
    }zm=akcja;               // po to aby reagować tylko na zmiane stanu klawiatury
  
  RTC.adjust(DateTime()); // ustawiamy czas w module PCF8583 ( lub odp. funkcja z Twojej biblioteki)
}
// --- funkcja ustawienia czasu -------------------------------------------/
void ustaw_czas() // ta funkcja bez komentarzy, bo działanie jest identyczne jak ustaw_date
                   // zmienia siÄ™ tylko obsĹ‚uga na czĹ‚ony: hour, minute i second
{                    
  DateTime now = RTC.now();
  int zm=-1;int akcja=-1;
  boolean ust=false;
  int k_OK=0;
  int w=1;
  
  int hour = now.hour();
  int minute = now.minute();
  int second = now.second();
  
  while(ust==false)
    {
    akcja=odczyt_klawiszy(); 
    if(akcja !=-1 && akcja!=zm)
    {
      switch (akcja)
        {  
        case 1: if(w==1){hour++;if(hour>23)hour=0;}
                if(w==2){minute++;if(minute>59)minute=0;}
                if(w==3){second++;if(second>59)second=0;}
                pokaz_time();break;
        case 0: if(w==1){hour--;if(hour<0)hour=23;}
                if(w==2){minute--;if(minute<0)minute=59;}
                if(w==3){second--;if(second<0)second=59;}
                pokaz_time();break;
        case 2: w++;if(w>3)w=1;break;
        }
      delay(50);
      if(akcja==2 && k_OK==1)
       {
       ust=true;
       zm=-1;akcja=-1; 
       }
      if(akcja==2) k_OK=1;
      else k_OK=0;
    }zm=akcja; 
  }
  RTC.adjust(DateTime());
}
// --- startuje setup -------------------------------------------------/
void setup(void)
{
  Serial.begin(9600); // standard dla Seriala
  //konfiguracja pinĂłw cyfrowych jako wejĹ›cia, klawisze zwierajÄ… do MASY!
  pinMode(up_key,INPUT);digitalWrite(up_key,HIGH); //
  pinMode(down_key,INPUT);digitalWrite(down_key,HIGH);
  pinMode(ok_key,INPUT);digitalWrite(ok_key,HIGH);
}
// --- ... i startuje program glowny ----------------------------------/
void loop()
{
 // przykĹ‚adowo na Serialu programik pokazuje czas a potem czeka na zmiany
 Serial.println(" Aktualna data: ");
 pokaz_time();  delay(1000);
 ustaw_date();  Serial.println(" DATA Ustawiona !!!");delay(2000);pokaz_time();
 ustaw_czas();  Serial.println(" CZAS Ustawiony !!!");delay(2000);pokaz_time();
}
// === KONIEC ==========================================================/
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 309
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: wojtekizk » 4 mar 2014, 12:25

Witam
w funkcji brakowało 2 nawiasów otwierającego i zamykającego ( u mie były więc "przypadkiem" usunąłeś :-)
masz poprawione z moim komentarzem :-)

Kod: Zaznacz cały

void ustaw_date()
{
  DateTime now = RTC.now(); // funkcja biblioteki PCF8583 , dla innego modułu zastosuj jego funkcję biblioteczną
  // również składniki: p.year, p.month, p.day, p.hour, p.minute, p.second trzeba będzie podmienić
  // na odpowiednie dla Twojej biblioteki (wszystkie ich wystÄ…pienia w kodzie!)
  int zm=-1;int akcja=-1; // zm jest po to aby przy dłuzszym wciśnięciu klawisza nie generować "autozmiany"
  boolean ust=false; //jesli kolejno 2 razy wsiśniesz OK to ust=true i wychodzimy z ustawień daty
  int k_OK=0; // zmienna kontrolujaca wciśnięcie klaiwsza ok_key
  int w=1; // zmienna okreslająca który człon daty/czasu jest aktywny
  
  int year = now.year(); 
  int month = now.month();
  int day = now.day();
  
  while(ust==false) // dopóki nie wciśnięto dwukrotnie klawisza ok_key to wykonuj to, co poniżej 
    {
    akcja=odczyt_klawiszy(); 
    if(akcja !=-1 && akcja!=zm) // jeżeli coś wcisnięto i jest to coś innego niż w poprzednim "rozdaniu" 
    {
      switch (akcja) 
        {  
        case 1: if(w==1)year++;
                if(w==2){month++;if(month>12)month=1;}
                if(w==3){day++;if(day>31)day=1;}      // wojtekizk brakowało { przed day++
                pokaz_time();break;
        case 0: if(w==1){if(year>2000)year--;}
                if(w==2){month--;if(month<1)month=12;}
                if(w==3){day--;if(day<1)day=31;}
                pokaz_time();break;
        case 2: w++;if(w>3)w=1;break; // zmieniamy także człon daty do ustawiania: z roku na miesiąc lub dzień
        }
      delay(50); // kosmetyka 
      if(akcja==2 && k_OK==1) // jeśli wciśnieto wcześniej OK i teraz także, to wychodzimy z pętli while
       {
       ust=true; // de facto 2 razy OK = koniec ustawień
       zm=-1;akcja=-1;        // na poĹĽegnanie
       }
      if(akcja==2) k_OK=1; // po pojedynczym OK
      else k_OK=0; // dla porzÄ…dku 
    }zm=akcja;               // po to aby reagować tylko na zmiane stanu klawiatury
  
    RTC.adjust(DateTime()); // ustawiamy czas w module PCF8583 ( lub odp. funkcja z Twojej biblioteki)
  }   // wojtekizk brakowało }
}
aaaa ... i według mnie to RTC.adjust(DateTime()); powinno być chyba niżej ....za } :-)
Pozdrawiam
ps. z tym kolorowaniem składni to na dwoje babka wróżyła... owszem fajnie wygląda... ale nie ma opcji "Zaznacz cały"
Awatar użytkownika
kubica14
Młodszy majsterkowicz
Posty: 9
Rejestracja: 27 lut 2014, 11:35
Lokalizacja: Bielsko-Biała

Re: gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: kubica14 » 5 mar 2014, 15:17

No więc tak, dzięki wam program wreszcie się skompilował :D
Po drodze miałem jeszcze parę innych problemów, ale jakoś się z nimi uporałem i ostatecznie czas i data jest wyświetlana... ale. I tu bez kłopotów się nie obeszło, a mianowicie:
1. Dopóki zawartość void pokaz_time() nie znajdzie się w void loop() to nie będzie na bieżąco wyświetlany czas. W obecnej formie do aktualizacji czasu dochodzi w czasie kliknięcia na przycisk up lub down, później znów "zastój"
2. 2-krotne wciśnięcie "OK" powoduje zmianę ustawień... dodam, że ciekawą bo ustawia 6:28:18, 06/02/2099 Pt :D
3. Na serialu dostaję komendy: Aktualna data: (nic tu nie pokazuje), po przyciśnięciu OK 2 razy pokazuję DATA Ustawiona !!! a po kolejnych 3 CZAS Ustawiony !!!. Po drodze oczywiście zmienia ustawienia na te z pkt. 2.

Próbowałem to jakoś sam ogarnąć, ale znów sam sobie nie dam rady. Zawartość void pokaz_time() przeniosłem do void loop(), czas się wyświetlał co sekunde, ale nie było reakcji na przyciski, więc myślałem, że w void ustaw_czas() i void ustaw_date() zamienię pokaz_time();break; na void loop(); break;. Niestety bez rezultatu. Zastanawia mnie jeszcze czy komenda RTC.adjust(DateTime()); jest poprawna.

Program:
/* 
Zmiana ustawieĹ„ daty i czasu ...by wojtekizk ([email protected]) ...dla forum majsterkowo.pl
PrzykĹ‚adowy tutorial ustawiania daty i czasu za pomocÄ… zdefiniowanych 3 klawiszy:
up_key, down_key, ok_key ...ktĂłre sĹ‚uĹĽÄ… do ustawieĹ„ poszczegĂłlnych czĹ‚onĂłw daty i czasu 
W tym przykĹ‚adzie zastosowano moduĹ‚ RTC oparty na PCF8583, ale nic nie stoi na przeszkodzie
aby zaadoptować ten kod do dowolnego moduĹ‚u. Musisz tylko doĹ‚Ä…czyć odpowiednia bibliotekÄ™,
oraz podmienić funkcje odczytu i zapisu daty/czasu na Twoje funkcje biblioteczne 
i oczywiĹ›cie zmodyfikować nazwy zmiennych odpowiednich dla Twojej biblioteki.
W przykĹ‚adzie prezentacjÄ™ ustawieĹ„ zobaczysz na Serialu. Jesli chcesz zastosować 
np. wyĹ›wietlacz LCD, to musisz zmienić ciaĹ‚o funkcji pokaz_time().
Obsługa:
1) klawisz up_key   - zmiana parametru (czĹ‚onu daty - rok, m-c, dzieĹ„, godzina, min., sek) w gĂłrÄ™
2) klawisz down_key - zmiana parametru (czĹ‚onu daty - rok, m-c, dzieĹ„, godzina, min., sek) w dół
3) klawisz ok_key - przejĹ›cie do ustawieĹ„ kolejnego czĹ‚onu daty/czasu
   UWAGA :Dwukrotne wybranie klawisza ok_key ustawia aktualnÄ… datÄ™/czas i wracamy do pÄ™tli loop()
*/
#include <Wire.h>
#include <RTClib.h>
#include <ShiftLCD.h>
ShiftLCD lcd(2, 4, 3);
RTC_DS1307 RTC; //powołujemy do życia obiekt klasy PCF8553 o nazwie p
                                  // definicje klawiszy up, down, ok ( u mnie to odpowiednio
                                  //2,3 i 4 - piny cyfrowe Arduino)
#define up_key 5
#define down_key 6
#define ok_key 7
// --- funkcja prezentacji czasu --------------------------------------/
void pokaz_time()
{
  DateTime now = RTC.now();
  char buf[50];
   memset(buf,0,sizeof(buf));
   snprintf(buf, sizeof(buf), " %02d:%02d:%02d", now.hour(), now.minute(), now.second());
   lcd.setCursor(0,0); lcd.print(buf);
   memset(buf,0,sizeof(buf));
   snprintf(buf, sizeof(buf), " %02d/%02d/%02d ", now.day(), now.month(), now.year());
   lcd.setCursor(0,1); lcd.print(buf);
  
   int dayofweek = now.dayOfWeek();
   switch(dayofweek)
     {
     case 1: lcd.print("Pon"); break;
     case 2: lcd.print("Wt"); break;
     case 3: lcd.print("Sr"); break;
     case 4: lcd.print("Czw"); break;
     case 5: lcd.print("Pt"); break;
     case 6: lcd.print("Sob"); break;
     case 0: lcd.print("Nd"); break;
     }
}
// --- funkcja odczytu stanu klawiszy (up_key, down_key, ok_key)-------/
int odczyt_klawiszy()
{
if(digitalRead(up_key)==0){delay(30);if(digitalRead(up_key)==0);return 1;} // funkcja zwraca 1
if(digitalRead(down_key)==0){delay(30);if(digitalRead(down_key)==0);return 0;} // funkcja zwraca 0
if(digitalRead(ok_key)==0){delay(30);if(digitalRead(ok_key)==0);return 2;} // funkcja zwraca 2
return -1; // jeśli nic nie wcisnieto to funkcja zwraca -1
                                                                               // dwukrotne sprawdzenie stanu + delay ogranicza
                                                                               //nam efekt drgania stykow do przyzwoitego minimum :-)
}
// --- funkcja ustawienia daty -----------------------------------------/
void ustaw_date()
{
  DateTime now = RTC.now(); // funkcja biblioteki PCF8583 , dla innego moduĹ‚u zastosuj jego funkcjÄ™ bibliotecznÄ…
                            // rĂłwnieĹĽ skĹ‚adniki: p.year, p.month, p.day, p.hour, p.minute, p.second trzeba bÄ™dzie podmienić
                            // na odpowiednie dla Twojej biblioteki (wszystkie ich wystÄ…pienia w kodzie!)
  int zm=-1;int akcja=-1; // zm jest po to aby przy dĹ‚uzszym wciĹ›niÄ™ciu klawisza nie generować "autozmiany"
  boolean ust=false; // jesli kolejno 2 razy wsiĹ›niesz OK to ust=true i wychodzimy z ustawieĹ„ daty
  int k_OK=0; // zmienna kontrolujaca wciĹ›niÄ™cie klaiwsza ok_key
  int w=1; // zmienna okreslajÄ…ca ktĂłry czĹ‚on daty/czasu jest aktywny
  
  int year = now.year();
  int month = now.month();
  int day = now.day();
  
  while(ust==false) // dopĂłki nie wciĹ›niÄ™to dwukrotnie klawisza ok_key to wykonuj to, co poniĹĽej
    {
    akcja=odczyt_klawiszy(); 
    if(akcja !=-1 && akcja!=zm) // jeĹĽeli coĹ› wcisniÄ™to i jest to coĹ› innego niĹĽ w poprzednim "rozdaniu"
    {
      switch (akcja)
        {  
        case 1: if(w==1)year++;
                if(w==2){month++;if(month>12)month=1;}
                if(w==3){day++;if(day>31)day=1;}
                pokaz_time();break;
        case 0: if(w==1){if(year>2000)year--;}
                if(w==2){month--;if(month<1)month=12;}
                if(w==3){day--;if(day<1)day=31;}
                pokaz_time();break;
        case 2: w++;if(w>3)w=1;break; // zmieniamy takĹĽe czĹ‚on daty do ustawiania: z roku na miesiÄ…c lub dzieĹ„
        }
      delay(50); // kosmetyka
      if(akcja==2 && k_OK==1) // jeĹ›li wciĹ›nieto wczeĹ›niej OK i teraz takĹĽe, to wychodzimy z pÄ™tli while
       {
       ust=true; // de facto 2 razy OK = koniec ustawieĹ„
       zm=-1;akcja=-1;                // na poĹĽegnanie
       }
      if(akcja==2) k_OK=1; // po pojedynczym OK
      else k_OK=0; // dla porzÄ…dku
    }zm=akcja;                        // po to aby reagować tylko na zmiane stanu klawiatury
    }
    RTC.adjust(DateTime()); // ustawiamy czas w module PCF8583 ( lub odp. funkcja z Twojej biblioteki)
     
}
// --- funkcja ustawienia czasu -------------------------------------------/
void ustaw_czas() // ta funkcja bez komentarzy, bo działanie jest identyczne jak ustaw_date
                   // zmienia siÄ™ tylko obsĹ‚uga na czĹ‚ony: hour, minute i second
{                    
  DateTime now = RTC.now();
  int zm=-1;int akcja=-1;
  boolean ust=false;
  int k_OK=0;
  int w=1;
  
  int hour = now.hour();
  int minute = now.minute();
  int second = now.second();
  
  while(ust==false)
    {
    akcja=odczyt_klawiszy(); 
    if(akcja !=-1 && akcja!=zm)
    {
      switch (akcja)
        {  
        case 1: if(w==1){hour++;if(hour>23)hour=0;}
                if(w==2){minute++;if(minute>59)minute=0;}
                if(w==3){second++;if(second>59)second=0;}
                pokaz_time();break;
        case 0: if(w==1){hour--;if(hour<0)hour=23;}
                if(w==2){minute--;if(minute<0)minute=59;}
                if(w==3){second--;if(second<0)second=59;}
                pokaz_time();break;
        case 2: w++;if(w>3)w=1;break;
        }
      delay(50);
      if(akcja==2 && k_OK==1)
       {
       ust=true;
       zm=-1;akcja=-1; 
       }
      if(akcja==2) k_OK=1;
      else k_OK=0;
    }zm=akcja; 
  }
  RTC.adjust(DateTime());
}
// --- startuje setup -------------------------------------------------/
void setup(void)
{
  Serial.begin(9600); // standard dla Seriala
  RTC.begin();
  Wire.begin();
  lcd.begin(16,2);
  
  //RTC.adjust(DateTime(__DATE__, __TIME__)); //ustaw aktualna date i czas
                          //konfiguracja pinĂłw cyfrowych jako wejĹ›cia, klawisze zwierajÄ… do MASY!
  pinMode(up_key,INPUT);digitalWrite(up_key,HIGH); //
  pinMode(down_key,INPUT);digitalWrite(down_key,HIGH);
  pinMode(ok_key,INPUT);digitalWrite(ok_key,HIGH);
}
// --- ... i startuje program glowny ----------------------------------/
void loop()
{
  // przykladowo na Serialu programik pokazuje czas a potem czeka na zmiany
 Serial.println(" Aktualna data: ");
 pokaz_time();  delay(1000);
 ustaw_date();  Serial.println(" DATA Ustawiona !!!");delay(2000);pokaz_time();
 ustaw_czas();  Serial.println(" CZAS Ustawiony !!!");delay(2000);pokaz_time();
 
}
// === KONIEC ==========================================================/

noose
Młodszy majsterkowicz
Posty: 13
Rejestracja: 18 paź 2012, 14:15

Re: gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: noose » 5 mar 2014, 16:40

Chłopaki... Jeżeli chcecie dawać gotowce, to miałbym prośbę - trochę czystości kodu :-)
O co mi chodzi? up_key, down_key, year, day... ale ustaw_date, pokaz_time... albo jeden, albo drugi język :-)
Awatar użytkownika
wojtekizk
Starszy majsterkowicz
Posty: 309
Rejestracja: 19 lis 2013, 10:54
Lokalizacja: Bydgoszcz

Re: gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: wojtekizk » 5 mar 2014, 17:03

Witam... cóż co od czystości to się nie da niestety... wszystko możesz nazywać sobie jak chcesz, kwestia po pierwsze nawyku a po drugie kod nie jest czytelny dlatego, że po polsku czy angielsku ale dlatego, że opatrzony czytelnym komentarzem :-)
Jeśli jesteś purystą językowym to w każdym edytorze jest opcja "znajdź i zamień... :-)
Co do aktualizacji czasu co sekundę lub co jakiś inny periodyk to zawsze możesz pokaz czasu wrzucić do loopa. Ten tutorial pokazuje jak ustawić ( zmienić czas) a nie aktualny czas :-)
Co do pokazywania czasu na serialu - to w Twojej pozmienianej wersji przecież nie ma już linijki:
Serial.println(time); ... więc jak ma się wyświetlać? (w moim tutorialu jest, jak zmieniliśmy Seriala na LCD to nie będzie się wyświetalć :-)
Pozdrawiam
Awatar użytkownika
kubica14
Młodszy majsterkowicz
Posty: 9
Rejestracja: 27 lut 2014, 11:35
Lokalizacja: Bielsko-Biała

Re: gotowiec1 - RTC nastawy czasu za pomocą 3 klawiszy

Post autor: kubica14 » 5 mar 2014, 17:50

Sęk w tym, że jak to wrzucę do loopa to układ nie reaguje na przyciski. Myślałem o zrobieniu takiej zmiany czasy w czasie rzeczywistym, jak w normalnym zegarze.
ODPOWIEDZ

Strony partnerskie: