Arduino Polska Forum

Pełna wersja: RTC sekundnik
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam,

Mam pytanie odnośnie odliczania czasu przy pomocy modułu RTC. Nie chcę używać funkcji delay(); oraz millis();, za dużo elementów do odliczania. 

Chciałbym zrobić, aby arduino wraz z modułem RTC odliczało czas i np. jeśli minie 400s ma włączyć led 1, drugie urządzenie ma być uruchomione na czas 80s. 

Obecnie korzystam z bibliotek TimeLib.h i DS1307RTC.h
jak nie chcesz się bawić z przerwaniami to zdaje się ds1307 ma pin opisany jako out i generuje sygnał co dokładnie sekundę. Możesz go sprawdzać na jakimś pinie arduino i powiększać w pętli jakąś zmienną za każdym razem jak się zmieni stan pinu. albo nawet dowolną ilość zmiennych dla każdego z twoich zadań. jak wynik w ifie sprawdzisz że ok to zerujesz daną zmienną i wykonujesz jakieś tam swoje zadanie, a ona liczy się od zera.



Cytat:SQW/OUT (Square Wave/ Output Driver) -
When enabled, the SQWE bit set to 1, the SQW/OUT pin
outputs one of four square wave frequencies (1 Hz, 4 kHz, 8 kHz, 32 kHz).  The SQW/OUT pin is open
drain which requires an external pullup resistor.  SQW/OUT will operate with either Vcc or Vbat applied.

a tu wycinek z dokumentacji układu.
A nie ma lepszego rozwiązania? Ponieważ mam 12 zmiennych czasowych, do których przy tej metodzie będę musiał zaimplementować dodatkowych 12 zmiennych pomocniczych. Dodatkowo chciałbym się zapytać czy jest możliwość zapisu w pamięci eeprom wartości powyżej 255, czytałem trochę o przesunięciu bitowym ale nie wiem jak się za to zabrać.

Edit:
Narazie bazuje na stworzeniu dodatkowych zmiennych i robie działanie (now() - zmiennaReferencyja > zmienna).
A mógł byś opisać co dokładnie chcesz by się działo ? Co ma robić program ? Wtedy można było by pęknąć jakieś przykłady. I czy pracować ma to w domu czy na zewnątrz. W końcu zima a różnica temperatur nie sprzyja RTC i wtedy bym polecił DS3231 bo posiada kompensacje temperaturową.
Przepraszam za opóźnienie ale byłem dość zajęty. Chciałbym zrobić program, który włączałby urządzenie co 2min na czas 15s.
Tyle że przy użyciu rtc jest jakby nie patrząc więcej do liczenia bo czas rtc musisz przeliczać na minuty sekundy itd .
możesz to zrobić w prosty sposób na millis np.

tu odpalany z przycisku
Kod:
int czas_pracy_1 = 15;
byte urzadzenie_1 = 0;

void setup() {

pinMode(5,INPUT_PULLUP);
pinMode(13,OUTPUT);

}

void loop() {

long cm = millis()/1000;

if ( digitalRead(5) == LOW )urzadzenie_1 = cm + czas_pracy_1 ;
if ( urzadzenie_1 > cm )digitalWrite(13,HIGH);else digitalWrite(13,LOW);
    
}

a jak chcesz cyklicznie to tak

Kod:
int czas_pracy_1 = 3;
int czas_postoju_1 = 10;
long cm;
long Pm;
int cykl = 0;

void setup() {

pinMode(5,INPUT_PULLUP);
pinMode(13,OUTPUT);

}

void loop() {

cm = millis()/1000;

if ( Pm < cm ){cykl++ ;Pm = cm;}
if ( cykl < czas_pracy_1 )digitalWrite(13,HIGH);else digitalWrite(13,LOW);
if ( cykl == czas_postoju_1 )cykl = 0;  
}

ponieważ "cm" jest stała dla całego programu możesz sobie te 3 linijki powtórzyć dla każdego urządzenia z tym że dla każdego musisz zrobić osobny cykl i Pm