Skocz do zawartości

Wykonywanie akcji po odliczeniu czasu (millis)


Pomocna odpowiedź

Napisano

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

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

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

(edytowany)
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
(edytowany)

@ethanak  Próbowałem zmienić tak jak podałeś ale od razu zapisuje temperaturę bez oczekiwania. 

 

 

Edytowano przez uczesie
(edytowany)

@uczesie napisz kolego jaką wartość ma zmienna roznicaCzasu i aktualnyCzas i napisz ile one wynoszą z każdym obiegiem pętli... 

Edytowano przez SOYER
(edytowany)
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
(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

Hę, wróć do kursu, albo poczytaj jak mnie koledzy wbijali millis do głowy:

 

Pokombinuj,  przyda Ci się to później, a w kursie jest naprawdę fajnie wytłumaczone...

  • Lubię! 1

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

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