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 ==========================================================/
Pozdrawiam