Skocz do zawartości

Zmienne millis, prośba o pomoc


SOYER

Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

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 🙂

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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.

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

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

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

"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
Link do komentarza
Share on other sites

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?

Link do komentarza
Share on other sites

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 🙂

Link do komentarza
Share on other sites

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 .

Link do komentarza
Share on other sites

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

Link do komentarza
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.