Skocz do zawartości

Kurs Arduino II - #9 - wielozadaniowość, opóźnienia z millis()


Komentator

Pomocna odpowiedź

@Mariusz0035 witamy na forum!

A mógłbyś wkleić swój program? Ewentualnie spróbuj wyświetlić w konsoli aktualną różnicę czasu (umieść tego printa przed blokiem warunkowym) i wewnątrz bloku warunkowego cokolwiek żeby mieć pewność że program działa.

  • Lubię! 1
Link do komentarza
Share on other sites

Witam wszystkich na forum .

Zainspirowany platformą Arduino zakupiłem wszystko co trzeba i przystąpiłem do waszych kursów.

Ukończyłem obydwie części i chciałbym za nie podziękować ponieważ bardzo logicznie prowadzą za rękę zwiększając stopniowo poziom trudności także jeszcze raz wielki dzięki. Napisałem też program i chciałbym go umieścić byście mogli go ocenić .

Pytanie czy tutaj czy w innym miejscu oraz w jaki sposób wkleić taki program?

Nigdy nie pisałem na żadnych forach więc jestem w tym temacie zielony.

  • Lubię! 1
Link do komentarza
Share on other sites

@autozaglada witam na forum i dziękuję za miłe słowa! Cieszę się, że kurs był dla Ciebie pomocny 🙂

Jeśli masz pytania związane bezpośrednio z kursem to pytaj i wklejaj kod bezpośrednio w komentarzach do danej części. Jeśli masz inne, ogólne pytania to załóż osobny temat w odpowiednim dziale na forum. Kody programów należy umieszczać za pomocą odpowiedniego narzędzia dostępnego w edytorze (przycisk "Wstaw kod"). Programy są wtedy prezentowane w czytelny sposób, a ich składania jest kolorowana. Więcej informacji znajdziesz w instrukcji edytora:

Link do komentarza
Share on other sites

fajny ten kurs ale nie doszukałem się rozwiązania co jak buffor się przepełni i wyzeruje licznik, wtedy zmienna która przechowuje ilość millis nigdy nie będzie większa, czy może jest a nie widze? będę wdzięczny gdzie tego szukać

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

6 minut temu, kamilzkamil napisał:

jak buffor się przepełni i wyzeruje licznik

Nie wyzeruje a przekręci (tzn. będzie miał wartość modulo 2^32)

7 minut temu, kamilzkamil napisał:

zmienna która przechowuje ilość millis nigdy nie będzie większa

Taka już uroda liczb bez znaku o określonej długości w bitach. Ważna jest różnica między czasem pokazywanym przez millis() a ostatnio zapamiętanym, a ta zawsze jest nieujemna (no, do pewnej granicy, ale nie mierzysz czasu w miesiącach tylko milisekundach) a nie bezwzględna wartość bieżącego i zapamiętanego czasu.

Przykładowo:

Niech zapamiętany czas będzie równy 0xfffffffe

Musimy odczekać 5 milisekund

Po 5 milisekundach wartość millis() wynosiłaby 0x100000003, ale z uwagi na ograniczenie wartości wynosi 3. Teoretycznie mniejsze niż zapamiętany czas, ale...

Różnica millis() - zapamiętany_czas wynosiłaby -0xfffffffb, ale znów z uwagi na to, że wartość nie może być ujemna w rzeczywistości jest to 0x1000000 - 0xfffffffb, czyli 5 - dokładnie tyle, ile trzeba.

Tu ważna jest kolejność działań: zawsze obliczamy to w sposób:

millis() - zapamietany_czas > roznica

nigdy np.:

millis() > zapamietany_czas + roznica

Jako ćwiczenie proponuję pokazanie, co się stanie jeśli dla podanych wcześniej liczb zastosujemy to drugie porównanie.

 

 

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

Próbuje stosować się do tego millis ale coś nie chce ze mną współpracować. Jak zrobić opóźnienie z millis w pętli for? Bo jedyne co udało mi się zrobić to opóźnienie tylko przy pierwszym wywołaniu fora :// Może ktoś podpowiedzieć co jest nie tak?

#include <Adafruit_NeoPixel.h>
 
#define LED_PIN 10
#define LED_COUNT 40
 
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
 
int r,g,b,j, color;
String dane, rS, gS,bS;
unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
unsigned long roznicaCzasu = 0;
 
void setup() {
    Serial.begin(9600);
    Serial.print("Device ready!");
 
    strip.begin();
    strip.show();
 
    j=0;
}
 
void loop() {
    readStr();
 
}
 
 
int setColor(int i,int r, int g, int b){
 
      Serial.print("Wywolano: ");
      Serial.println(i);
     
      strip.setPixelColor(i, r, b, g);
      //value rbg because my led strip have wrong coding
      strip.show();
}
 
void readStr() {
 
    while (Serial.available() > 0)
    {      
   
        dane = Serial.readString();
        Serial.println(dane);
 
        rS = dane.substring(0,3);
        gS = dane.substring(3,6);
        bS = dane.substring(6,9);
 
        r = rS.toInt();
        g = gS.toInt();
        b = bS.toInt();
 
        Serial.println("Color loading");
 
        aktualnyCzas = millis();
        roznicaCzasu = aktualnyCzas - zapamietanyCzas;
     
        Serial.println(roznicaCzasu);
     
        for(int i = 0; i <= LED_COUNT; i++){
         
          if(roznicaCzasu >= 500UL){              
            zapamietanyCzas = aktualnyCzas;                  
            Serial.print("I: ");
            Serial.println(i);
          }
         
          setColor(i,r,g,b);
        }            
    }      
}

 

Link do komentarza
Share on other sites

Dzień dobry 🙂 Bardzo podobają mi się Wasze kolejne wykłady. Tym razem jednak nasunęło mi się takie pytanie.. Czy nie prościej byłoby zwyczajnie ustawić Timer ? Mamy przecież do dyspozycji od 3 do 6 ciu na pokładzie w tym jeden lub cztery 16 to bitowe. Ustawić dzielnik i sprawa załatwiona ? Hmm czy może się mylę ? No nic. wracam do następnych wykładów z wypiekami na twarzy. 

Link do komentarza
Share on other sites

15 godzin temu, Adamjg napisał:

Czy nie prościej byłoby zwyczajnie ustawić Timer ?

Nie...ustawiasz jeden timer na okreslony interval i modyfikujesz jedna zmienna np...i teraz mozesz zrobic nawet tysiac roznych intervalow (na ile pamieci wystarczy) odwolujac sie tylko do tej jednej zmiennej...timerow w rzeczywistosci jest malo i trzeba dazyc do oszczednosci...a i 16bitowym timerem maxymalnie mozesz zrobic interwal kolo 4s...czyli stosunkowo malo...

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

13 godzin temu, Adamjg napisał:

Czy nie prościej byłoby zwyczajnie ustawić Timer ? Mamy przecież do dyspozycji od 3 do 6 ciu na pokładzie

A co jak będziesz chciał zrobić siódmy task?

W rzeczywistości używając millis() w opisany sposób tworzysz również timer - tyle że software'owy. Są nawet odpowiednie biblioteki które to wykorzystują.

Link do komentarza
Share on other sites

Panowie krotkie pytanie...to wkoncu po tych 50 dniach bedzie szkic dzialal prawidlowo czy nie?? Bo tak myslac to zmienna od starego czasu sie przeciez nie przekreci razem z millis(), a skoro tak to juz warunek nie ma szans byc spelniony...

unsigned long aktualnyCzas = 0;
unsigned long zapamietanyCzas = 0;
unsigned long roznicaCzasu = 0;
 
void loop(){
  
  aktualnyCzas = millis();
  roznicaCzasu = aktualnyCzas - zapamietanyCzas;
  
  
  if (roznicaCzasu >= 1000UL) {
    
    zapamietanyCzas = aktualnyCzas;
    
  }
}

 

Link do komentarza
Share on other sites

18 minut temu, farmaceuta napisał:

 zmienna od starego czasu sie przeciez nie przekreci razem z millis()

Ale wynik odejmowania będzie obcięty do 32 bitów.

Załóżmy że zapamiętałeś 0xfffffff0, a millis() zwróci 5. Jaki będzie wynik odejmowania?

 

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