SOYER Napisano Listopad 13, 2017 Udostępnij Napisano Listopad 13, 2017 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. Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Listopad 13, 2017 Udostępnij Listopad 13, 2017 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 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Listopad 14, 2017 Autor tematu Udostępnij Listopad 14, 2017 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... Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Listopad 14, 2017 Udostępnij Listopad 14, 2017 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. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
SOYER Listopad 14, 2017 Autor tematu Udostępnij Listopad 14, 2017 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... Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Listopad 14, 2017 Udostępnij Listopad 14, 2017 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. Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Listopad 14, 2017 Autor tematu Udostępnij Listopad 14, 2017 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? Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Listopad 14, 2017 Udostępnij Listopad 14, 2017 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ą. 1 Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Listopad 14, 2017 Udostępnij Listopad 14, 2017 "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. 1 Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Listopad 14, 2017 Autor tematu Udostępnij Listopad 14, 2017 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? Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Listopad 14, 2017 Udostępnij Listopad 14, 2017 Hm... Z tym debeściakiem to ja bym uważał 😉 digitalWrite(zielona, stanz = !stanz); Ile linijek programu zaoszczędzone? Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Listopad 14, 2017 Udostępnij Listopad 14, 2017 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 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
SOYER Listopad 14, 2017 Autor tematu Udostępnij Listopad 14, 2017 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 . Cytuj Link do komentarza Share on other sites More sharing options...
ethanak Listopad 14, 2017 Udostępnij Listopad 14, 2017 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). Cytuj Link do komentarza Share on other sites More sharing options...
Elvis Listopad 14, 2017 Udostępnij Listopad 14, 2017 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 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!