Skocz do zawartości

Funkcja odliczania bez delay()


Pomocna odpowiedź

Napisano

Mam problem z napisaniem funkcji która odlicza czas w dół. Nie potrafię tego logicznie rozegrać. Utworzyłem takie paskudztwo(dosłownie) - działa, ale nie tak jak powinno, ponieważ nie następuje zmniejszenie  zmiennej odliczanieGodzinaNawadnianiaKropelkowego o 1 , przez co odliczanie  zatrzymuje się na 03:00:00. I to nie jest tak, że nie umiem pisać funkcji, bo jestem wstanie napisać dużo bardziej skomplikowane dzieło np. funkcje która rysuje wykres temperatury i wilgotności na LCD, A w tym wypadku odejmuje mi rozum. Proszę o pomoc. Delay odpada 😄
 

int odliczanieGodzinaNawadnianiaKropelkowego = 3;

int odliczanieMinutaNawadnianiaKropelkowego = 1;

int odliczanieSekundaNawadnianiaKropelkowego = 0;

//w jakimś miejscu rozpoczynam odliczanie odliczanieCzasuNawadnianieKropelkowe.begin(1000);

if (odliczanieCzasuNawadnianieKropelkowe.available()) {                                                 
        odliczanieCzasuNawadnianieKropelkowe.restart();
        if (odliczanieSekundaNawadnianiaKropelkowego > 0) {
          odliczanieSekundaNawadnianiaKropelkowego = odliczanieSekundaNawadnianiaKropelkowego - 1;
        }
        if (odliczanieSekundaNawadnianiaKropelkowego <= 0) {                                                   
          if (odliczanieMinutaNawadnianiaKropelkowego > 0) {
            odliczanieSekundaNawadnianiaKropelkowego = 59;
            odliczanieMinutaNawadnianiaKropelkowego = odliczanieMinutaNawadnianiaKropelkowego - 1;
          }
          if (odliczanieGodzinaNawadnianiaKropelkowego > 0 && odliczanieGodzinaNawadnianiaKropelkowego <= 0) {
            odliczanieMinutaNawadnianiaKropelkowego = odliczanieMinutaNawadnianiaKropelkowego - 1;
            odliczanieGodzinaNawadnianiaKropelkowego = odliczanieGodzinaNawadnianiaKropelkowego - 1;
          }
        }
        odliczanieCzasuNawadnianieKropelkowe.restart();
        zapisCzasDoKoncaNawadnianiaKropelkowego();
      }

if (odliczanieGodzinaNawadnianiaKropelkowego == 0 && odliczanieMinutaNawadnianiaKropelkowego == 0 && odliczanieSekundaNawadnianiaKropelkowego == 0) {
        odliczanieCzasuNawadnianieKropelkowe.time(STOP);
      }

 

(edytowany)

Chodzi Ci o stworzenie jakby wlacznika on/off w systemie czasu rzeczywistego na millis() czy jak??

A musisz ten czas odliczac? Czy tylko wystarczy ustawic na millis() jakis interwal np. co godzine/dwie itp...

Edytowano przez farmaceuta
(edytowany)

Poprostu chcę aby po upłynięciu czasu który ustawię coś się zadziałało. Z millis miałem problemy ( nie pamiętam już jakie), więc użyłem biblioteki timers. 

Czas musi być odliczany, nie mogę ustawić interwału 3 godziny i czekać aż upłynie te 3 godziny. Muszę mieć widok na czas. Odliczanie jest ważna rzeczą w projekcie który buduję, jak nie najważniejszą, a podgląd czasu jest bardzo istotny. Na dole jest link do filmu który ukazuje dlaczego tak jest.  Sorry że odwrócony, ale jakoś tak wyszło.

 

Film

Edytowano przez lucek20
void setup() {
Serial.begin(9600);
}

void loop() {
  static int sekunda = 30;
  static int minuta = 1;
  static int godzina = 4;
  static long last = 0;
  
if (millis() - last > 1000UL) {
  last = millis();
  sekunda--;
  if(sekunda == 0) {
    sekunda = 59;
    minuta--;
    if (minuta == 0 ) {
      minuta = 59;
      godzina--;
      if(godzina == 0) {
        godzina = 23;
      }
    }
    sekunda = 59;
  }
  Serial.print(godzina); Serial.print(":");
  Serial.print(minuta); Serial.print(":");
  Serial.print(sekunda); Serial.println();
}
}

nie wiem czy o takie cos ci chodzilo...sprawdz..jak bedzie pasowac to poprawie bo jest maly blad i godzina trwa 59 minut a nie 60..do zmiennych zapisujesz sobie czas i odlicza w tyl, ale nie do zera tylko do tylu jak zwykly zegar

  • Pomogłeś! 1

Strasznie komplikujecie...

uint32_t start; // tu można sobie wpisywać aktualną wartość millis()
uint32_t czas = 3 * 3600; // trzy godziny na przykład
void loop()
{
    uint32_t totalsec = (millis() - start) / 1000;
    uint32_t pozostalo = (czas > totalsec) ? czas - totalsec : 0;
    int sekundy = pozostalo % 60;
    int minuty = (pozostalo / 60) % 60;
    int godziny = pozostalo / 3600;

    // no i można sobie to ładnie wypisać
    // co pozwolę sobie pozostawić do rozwiązania wątkotwórcy
    
}

 

  • Lubię! 1
  • Pomogłeś! 1
2 godziny temu, lucek20 napisał:

@farmaceuta twój kod miał 2 małe błędy poprawiłem i jest git,  @ethanak

Jeden to to ze godzina trwa 59 minut...czyli nie ma czasu 4:0;59 tylko 3:59;59...to juz wiem, a ten drugi?? Ciekawy jestem😉

 

2 godziny temu, lucek20 napisał:

@farmaceuta 

 

ale zdecydowałem się skorzystać z rozwiązania @ethanak 

Obrazilem sie na smierc...😝😜

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...