• 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
RTC sekundnik
#1
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
 
Odpowiedź
#2
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.
 
Odpowiedź
#3
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).
 
Odpowiedź
#4
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ą.
 
Odpowiedź
#5
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.
 
Odpowiedź
#6
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
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości