Skocz do zawartości

Wykonywanie akcji po odliczeniu czasu (millis)


uczesie

Pomocna odpowiedź

Witam, próbuję ustawić aby program wykonał akcję po odliczeniu czasu i niestety nie działa mi to.. Oczywiście na początku mam:

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
unsigned long roznicaCzasu = 0;

i w loop 

void loop() {

  //Liczenie czasu
  aktualnyCzas = millis();
  roznicaCzasu = aktualnyCzas - zapamietanyCzas;


 //Zapis temperatury dnia
  {
    float dp = sensors.getTempCByIndex(0);

    if (dp > 30 && blokada == 0) {
      if (aktualnyCzas - roznicaCzasu >= 15000UL) {
        lcd.setCursor (4, 0);
        lcd.print(sensors.getTempCByIndex(0) + 0.24);
        blokada = 1;

Niestety po obliczeniu 15 sekund gdy zostanie spełniony warunek nic nie zapisuje isę na wyświetlaczu.. 

Link do komentarza
Share on other sites

@uczesie witam na forum 🙂

Dla większego porządku pytanie wydzieliłem z kursu, ponieważ nie dotyczy ono bezpośrednio omawianych tam ćwiczeń. Tutaj będzie łatwiej utrzymać porządek w dyskusji i nie będziemy mylić osób szukających informacji o programach z kursu. Źródło pytania: https://forbot.pl/forum/topic/10449-kurs-arduino-ii-9-wielozadaniowosc-opoznienia-z-millis/

10 godzin temu, uczesie napisał:

Witam, próbuję ustawić aby program wykonał akcję po odliczeniu czasu i niestety nie działa mi to..

Możesz napisać trochę więcej szczegółów? Co dokładnie nie działa? Jakiego efektu się spodziewałeś, a jaki uzyskałeś? Ciężko coś doradzić, gdy nie wkleiłeś nawet całego programu.

Link do komentarza
Share on other sites

Witam 🙂  Chciałbym aby to co zostanie wykonane po spełnieniu warunku zostało wykonane z opóźnieniem czyli gdy temperatura osiągnie 30*C to zostanie zapisana na wyświetlaczu w innym miejscu ale po 5 minutach. Dodatkowo dodałem "blokada" aby ten zapis był tylko jednorazowy. Wszystko działa poprawnie jeśli nie ma żadnego opóźnienia bo zapisuje i nie nadpisuje dzięki tej blokadzie 🙂 Tylko jak to robić aby opóźnić to co zostanie zrobione gdy warunek zostanie spełnoiny. 🤔

Link do komentarza
Share on other sites

11 godzin temu, uczesie napisał:

if (aktualnyCzas - roznicaCzasu >= 15000UL) {

A nie powinno być przypadkiem:
 

if (roznicaCzasu >= 15000UL) {

Poza tym gdzie ustawiasz zmienną zapamietanyCzas?

Dodatkowo rozumiem, że zmienna "blokada" jest globalna?

Podawaj całe kody a nie kawałki, bo w przeciwnym razie dostaniesz kawałki odpowiedzi.

Edytowano przez ethanak
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

13 godzin temu, uczesie napisał:

aktualnyCzas = millis();   roznicaCzasu = aktualnyCzas - zapamietanyCzas;

Ten fragment kodu wykonuje się z każdym obiegiem pętli, tak? Zastanów się jaki jest tego efekt... 

Pytanie pomocnicze, ile wynosi zapamietanyCzas w każdym obiegu pętli i po co w takim razie to: "roznicaCzasu = aktualnyCzas - zapamietanyCzas;" 

Edytowano przez SOYER
Link do komentarza
Share on other sites

(edytowany)

@SOYER tak mi coś świtało skąd ma się wziąć ten zapamiętany czas.. A wziąłem to z "Kurs Arduino II – #9 – wielozadaniowość, opóźnienia z millis()". To jak to ugryźć aby działało poprawnie?  Bo mi po 2 dniach kombinowania skończył się pomysły i dlatego zdecydowałem zapytać na forum 😉 

 

 

Edytowano przez uczesie
Link do komentarza
Share on other sites

najprościej: zapamieranyCzas uaktualniasz gdy odczytana temperatura jest niższa niż 30, a różnicę obliczasz dopiero gdy jest potrzebna. wtedy masz pewność, że musi przez te 15 sekund być temperatura powyżej 30 stopni aby to zadziałało.

Inna sprawa, że to trochę bez sensu; na wyśwetlaczu pojawi Ci się temperatura odczytana  nie wiadomo kiedy (np. 31 stopni) i już się nie zmieni, nawet gdyby temperatura była w okolicy smażenua jajek. Na pewno to chciałeś zrobić?

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

(edytowany)

@SOYER dzięki, biorę się za czytanie 🙂 

@ethanak  tak właśnie chcę aby to działało, to będzie temperatura do której będę się odnosił w innym miejscu.

edit: Poprawiłem czyli dodałem do czasu if czyli zapis zapamiętanego czasu ale nadal nie działa..

 

 //Liczenie czasu
  aktualnyCzas = millis();
  roznicaCzasu = aktualnyCzas - zapamietanyCzas;

  if (dzies < 30) {
    zapamietanyCzas = aktualnyCzas;
  }

 

edit2: Ok, znalazłem błąd. Poprawiłem to miejsce na if (sensors.getTempCByIndex(0) < 30) i teraz wszystko śmiga poprawnie 😄 Muszę dodać na górze globalnie czujniki jako nazwy bo miałem tylko w zapisie temperatury coś takiego "float dzies = sensors.getTempCByIndex(0);" więc działało to tylko w obrębie tej klamerki {} jesli dobrze rozumiem? 

Edytowano przez uczesie
  • Lubię! 1
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.