Skocz do zawartości

Funkcja odliczania bez delay()


lucek20

Pomocna odpowiedź

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);
      }

 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

(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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
Share on other sites

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...😝😜

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.