Skocz do zawartości

Zmienne millis, prośba o pomoc


Pomocna odpowiedź

Napisano
const int ledPin =  LED_BUILTIN;// the number of the LED pin 


int ledState = LOW;             // zmienna standiody którą zmieniamy w programie 


unsigned long previousMillis = 0;        // zmienna unsigned long to taka która może zapamiętać dużą liczbę, ta akurat (previousMillis) zapamiętuje kiedy ostatnio zmieniał się stan diody, w pierwszej pętli jej wartość to "0" 


const long interval = 1000;           //zmienna stała(wiem jak to brzmi), "tylko do odczytu", interwał między mignięciami 1s 

void setup() { 

 pinMode(ledPin, OUTPUT); // 
} 

void loop() { 

 unsigned long currentMillis = millis();//millis to czas w ms od uruchomienia programu(czyli to nasza zmienna currentMillis) 

 if (currentMillis - previousMillis >= interval) { jesli od aktualnego czasu(currentMillis) odjąć 
poprzedni czas zapisany w zmiennej previousMillis(w pierwszej pętli to 0) i różnica jest większa 
lub równa wpisanej "zmiennej stałej" interval 

   previousMillis = currentMillis;// to aktualny czas millis zapisujemy do zmiennej previousMillis 


   if (ledState == LOW) { 
     ledState = HIGH;//  warunkowo zmieniamy stan zmiennej ledState 
   } else { 
     ledState = LOW; 
   } 


   digitalWrite(ledPin, ledState);//i wł lub wył diodę zmienną ledState 
 } 
} 

Napiszcie mi czy dobrze rozumiem działanie tego programu

Jutro sprawdzę go praktycznie.

W pierwszej linijce kodu przypisujemy stałe wyjście, diodę wbudowaną, ale zdaje się, że jest ona zblokowana z wyjściem 13 i jeśli tam podepnę diodę to też będzie, no właśnie co robić? Migać z interwałem 1s??

Jak można użyć taki program?

Mam rozumieć, że on się wykonuje niejako obok innej pętli?

Jak to wygląda w praktyce?

Może jakiś mini programik pokazujący multitasking arduino 😉

Pozdrawiam.

SOYER, wydaje mi się że powinieneś poczytać trochę o samych podstawach programowania. We wcześniejszych wpisach i teraz doszukujesz się multitaskingu, powiązania między zmiennymi, a np. wyjściami diod.

W prostym C nic takiego nie ma - program jest wykonywany jedna linijka po drugiej, zupełnie jak czytanie tekstu.

Nie ma też w tym żadnej magii:

const int ledPin = LED_BUILTIN

Ten kod nie ustawia żadnego wyjścia, kompilator nie rozumie co to jest LED. Po prostu stała ledPin od tego momentu ma taką wartość jak stała LED_BUILTIN. Do czego dalej tej stałej używasz, to faktycznie sterowanie pinami, ale nie dzieje się to wcale równolegle, tylko jak program pracowicie, linijka-po linijce dobrnie do:

digitalWrite(ledPin, ledState);

to ustawi wartość pinu - którego nie wiem, bo ledPin ma tą wartość co LED_BUILTIN, a ile to jest równe nie wstawiłeś.

Proponowałbym poćwiczyć programowanie na czymś innym niż Arduino. Debugger to świetne narzędzie, pozwala na wykonywanie programu jedna linia po drugiej i "podglądanie" jak zmieniają się zmienne. To powinno rozjaśnić Ci o co chodzi.

I nie ma w tym ani odrobiny multitaskingu, na szczęście 🙂

Elvis przykład jest że strony arduino. Link do tego artykułu dał mi Treker. Sprawa dotyczyła niezależnego mijania dwoma diodami. Przeczytałem artykuł i pytam czy dobrze zrozumiałem. A co źle zrozumiałem. Uczę się z kursu arduino i przy okazji dopytuję o różne rzeczy...

Nie odbieraj mojego wpisu jako krytyki - po prostu wydaje mi się, że doszukujesz się komplikacji w bardzo prostym programie. Inna sprawa, że to chyba największa wada Arduino - brak debuggera. Ciężko więc prześledzić działanie programu i zrozumieć jak działa. Zostaje się domyślać, ale to prowadzi czasem do bardzo skomplikowanych teorii.

Program bez stałych wyglądałby tak:

int state = LOW; 
unsigned long previousMillis = 0;

void setup() {
 pinMode(13, OUTPUT);
} 

void loop() {
 unsigned long currentMillis = millis();

 if (currentMillis - previousMillis >= 1000) { 
   previousMillis = currentMillis;

  if (state == LOW)
    state = HIGH;
  else
    state = LOW;

 digitalWrite(13, state);
}

Czy teraz jest łatwiej? Zmieniłem nazwę stateLed na state, żeby się nie myliło.

Elvis te fragmenty kodu akurat rozumiem, zwykła zmienna. Chodziło mi o to czy dobrze skomentowałem program, a jeśli źle to w którym miejscu. Wiem, że to prosty program, ale treker pisał że zmienną millis można wykorzystywać do robienia, w ograniczonym zakresie, dwóch rzeczy jednocześnie... właśnie nie wiem jak...

Ja bym to inaczej określił - jeśli wywołujesz funkcję delay_ms (czy jakikolwiek jej odpowiednik), program nie robi nic poza czekaniem (nie licząc przerwań).

Natomiast program który napisałeś sprawdza czy upłynął odpowiedni czas od ostatniej zmiany stanu diody - jeśli nie, to możesz coś innego zrobić.

To nie jest multitasking, tylko zwykły jednowątkowy program, który jest wykonywany jedna linia po drugiej. Multitasking polega na uruchomieniu dwóch zadań jednocześnie - ale tutaj tego nie ma. Po prostu sprawdzasz coś if-em, jeśli nie jest spełnione, program przechodzi dalej.

Ok, Dzięki za szybkie odpowiedzi. Nie będę już używał słowa multitasking przy arduino... jak wykorzystac tą zmienną do np. Niezależnego migania diodami?

Za if-em możesz dopisać co tylko chcesz, chociażby kolejny if z następną zmienną previousMillis2, którą wykorzystasz do migania drugą diodą.

  • Lubię! 1

"Nie będę już używał słowa multitasking przy arduino"

Używaj ale tam, gdzie rzeczywiście tak jest to zrobione.

"jak wykorzystac tą zmienną.."

A jak korzystasz z jednego tylko zegarka na lodówce do ugotowania jajek (3 minuty od zagotowania wody), jednoczesnego upieczenia ciasta (50 minut od włożenia do piekarnika), zadzwonienia o 17 do kolegi i nękania co 5 minut dziecka by odrabiało lekcje? Zastanów się dobrze na czym to polega i dokładnie tak samo korzystaj z millis.

  • Lubię! 1

Kto jest debeściak? 😅

const int czerwona =  10;
const int zielona = 8;
int stanc = LOW;  
int stanz = LOW;           
unsigned long previousMillis1 = 0; 
unsigned long previousMillis2 = 0;     
const long interval1 = 1000; 
const long interval2 = 300;     
void setup() { 
pinMode(czerwona, OUTPUT); 
pinMode(zielona, OUTPUT);
} 

void loop() { 

 unsigned long currentMillis = millis();
 if (currentMillis - previousMillis1 >= interval1) {
   previousMillis1 = currentMillis;

 if (stanc == LOW) { 
     stanc = HIGH;
   } else { 
     stanc = LOW; 
   } 
  digitalWrite(czerwona, stanz);
 }
  if (currentMillis - previousMillis2 >= interval2) {
   previousMillis2 = currentMillis;

 if (stanz == LOW) { 
     stanz = HIGH;
   } else { 
     stanz = LOW; 
   } 
  digitalWrite(zielona, stanz);
  }
} 

DZIAŁA!!!!! 🤣😃🙂🤣😅😉😃

DZIĘKUJĘ CHŁOPAKI!!!!

Jak jest ze stosowaniem polecenia delay? Delay nie wstrzymuje odliczania millis?

ethanak, akurat takie kodowanie to nic dobrego, no chyba że się bierze udział w konkursie na najbardziej zwarty/nieczytelny program.

Ważne że program działa, dwie diody migają - i to chodziło 🙂

Eee czepiasz się 😉 To ja tu cały happy, a ty mi tu o oszczędzaniu linijek 😋 .

Elvis, popraw co uważasz za słuszne, znowu się czegoś nauczę. Miej wyrozumiałość, jeszcze miesiąc temu nie wiedziałem jak prawidłowo podpiąć diodę do baterii .

Kod jest czytelny - chyba że ktoś nie potrafi czytać.

Operator negacji jest bardziej czytelny niż jakiś durny if.

Operator podstawienia zwraca wartość, z której można skorzystać.

Nieznajomość C/C++ nie uprawnia do stwierdzenia, że kod jest nieczytelny. Podobnie jak nieznajomość alfabetu nie jest powodem do twierdzenia, że bajka o Wróbelku Elemelku jest za trudna.

(SOYER to nie było do Ciebie).

Ja nie twierdzę, że nie znam C, ale używanie przypisania w parametrach wywołania funkcji nie świadczy dobrze o kodzie. Po prostu łatwo jest coś takiego przeoczyć. Kod powinien nie tylko działać, ale i dawać się czytać / pielęgnować.

No chyba że chcemy brać udział w: http://www.ioccc.org/years.html

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