Skocz do zawartości

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


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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
Share on other sites
48 minut temu, ethanak napisał:

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

 

21...hmmm🤔 nie moge zalapac..myslalem ze bedzie 0 skoro uzywam liczb tylko dodatnich...

Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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