![]() |
|
Millis() i sekwencja - jak to wykonać? - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica) +--- Wątek: Millis() i sekwencja - jak to wykonać? (/watek-millis-i-sekwencja-jak-to-wykona%C4%87) |
Millis() i sekwencja - jak to wykonać? - Prosiak_wej - 10-12-2024 Hej, Siedzę już trzecią godzinę, myślę, próbuję, zmieniam i im więcej próbuję, to mniej już rozumiem... Część większej całości, którą mam już w miarę ogarniętą, to sekwencja. Aby było prościej, to założenia są takie: 1. Włączam układ, na wyświetlaczu przez pierwsze cztery sekundy nic się nie wyświetla 2. Po czwartej sekundzie na pozycji (0,0) wyświetli się litera A 3. Po sekundzie na tej samej pozycji wyświetli się litera B 4. Po sekundzie na tej samej pozycji wyświetli się litera C 5. Po sekundzie na tej samej pozycji wyświetli się litera D 6. Po sekundzie na tej samej pozycji wyświetli się litera A 7 ...i tak w kółko, bez końca Powyższe mógłbym wykonać samym delay(), jednak chciałbym to zrobić za pomocą Millis, aby w tzw. międzyczasie układ nie był bezczynny. Jak z powyższe ogarnę, to z resztą powinienem dać sobie radę
RE: Millis() i sekwencja - jak to wykonać? - kaczakat - 10-12-2024 Zobacz sobie publikowaną tu wielokrotnie funkcję czas() w moich postach. Możesz też po prostu z przykładu blinkwithoutdelay sobie zamienić zmianę stanu led na zwiększanie zmiennej zmienna++, to będzie licznik sekund wg tego przykładu. Można w tej samej sekcji sprawdzać czy liczba zliczona jest podzielna przez 4 bez reszty, if(zmienna%4==0) to znaczy, że minęło 4 sekundy, wykonaj wymagane czynności. W przykładach z funkcją czas robię podobnie, tylko zliczam odcinki po np. 10ms, z tego zliczam sekundy, z sekund minuty, ustawiam zmienną/flagę gdy jest to nowe 10ms w danym loop, nowa sekunda -fsekund, fminut, fgodzin, to znaczy, że w tym konkretnym loop możesz wykonać czynności wykonywane co określoną liczbę sekund, minut, godzin. Czyli potem sprawdzam czy jest to nowa minuta i np. 4 - if (fminuty and minuty==4) , albo czy jest to nowa minuta i podzielna przez 4 bez reszty - czyli co 4 minuty if (fminuty and minuty%4==0). RE: Millis() i sekwencja - jak to wykonać? - Prosiak_wej - 11-12-2024 Próbowałem zrozumieć coś z tego wątku: https://forum.arduinopolska.pl/watek-funkcja-millis-k%C5%82opot-ze-zrozumieniem ale... jednak nie zrozumiałem. Czy mógłbyś przekazać mi wskazówki w bardziej przystępny sposób? Taki bardziej zrozumiały dla nie-programisty
RE: Millis() i sekwencja - jak to wykonać? - kaczakat - 11-12-2024 Nie wiem czy zdołam, otwórz przykład blinkwithoutdelay, modyfikuj, zmieniaj, wgrywaj, obserwuj, może zaskoczy. Idea jest taka, że zamiast zatrzymywać program na 1s delayem, pomijasz wykonywanie czynności dopóki nie minie ta sekunda, millis to funkcja która zwraca aktualną liczbę zmierzonych ms od uruchomienia programu, w ciągu jednej pętli loop takie sprawdzenie odbywa się setki tysięcy razy, wielokrotnie nawet nie minie ta jedna 1ms, prostym if sprawdzasz czy watość, która ostatnim razem została zapisana do zmiennej jest różna o co najmniej 1000ms, jeśli tak to zapisujesz aktualną wartość, wykonujesz czynności które mają być wykonane co 1s (1000ms) i znowu sprawdzasz, czy minęła ta sekunda. Ja w swojej funkcji czas() ustawiłem sobie ten okres na 10ms, potem zliczam ile tych 10ms okresów zliczyłem, potem zliczam ile sekund, itd. Możesz zrobić wiele takich bloków w programie, które dzięki temu sprawiają wrażenie, że wykonują się jednocześnie, bo jak to dobrze zaplanujesz to ludzkie zmysły nie wychwycą różnic rzędu pojedynczych ms. Kod: /*Kod: // constants won't change. Used here to set a pin number:RE: Millis() i sekwencja - jak to wykonać? - Prosiak_wej - 11-12-2024 Millisem bez problemu jestem w stanie ogarnąć wykonanie czegoś co sekundę, czegoś innego co dwie, a czegoś innego co dziesięć. Tylko jak wystartować pierwsze liczenie po czterech sekundach, drugie po pięciu, trzecie po sześciu, a czwarte po siedmiu sekundach...? Może poniższa tabelka lepiej zobrazuje to, co chciałbym uzyskać. RE: Millis() i sekwencja - jak to wykonać? - Prosiak_wej - 11-12-2024 Chyba zrobiłem wielki krok do przodu ![]() Ustawiając wartości początkowe odpowiednio 4000, 5000, 6000, 7000 warunki przyjmowały wartość ujemną, niedozwoloną dla Unsigned Long. Zdefiniowałem wszystkie zmienne jako Long i działa. Dorzuciłem sobie wyświetlanie dwóch wartości, aby mieć pewność, że dany warunek jest spełniony. Kod: #include <Arduino.h>Muszę teraz tylko coś wymyślić, żeby program działał dalej, gdy liczniki się przepełnią. Może w głównej pętli dam sprawdzenie, czy osiągnęły maksymalną wartość i jeśli tak - to niech je zeruje. RE: Millis() i sekwencja - jak to wykonać? - kaczakat - 11-12-2024 No i brawo. Ustaw sobie wszystkie zmienne do liczników na typ uint32_t, nic Ci się nie przepełni, wynik odejmowania możesz rzutować na uint32_t " if ((uint32_t) (mil - mil1)>=4000UL)" - tak z UL to oznacza, że ma traktować liczbę 4000 jako Unsigned Long. Jak operujesz na liczba UL to nie otrzymujesz liczb ujemnych, nic się nie przepełnia. To znaczy przepełnia się, ale to nie psuje arytmetyki i te warunki dalej działają. Jak masz wiele czynności wykonywanych w rozdzielczości 1s, to wystarczy licznik 1s 'sekundy' i flaga nowej sekundy 'fsekundy' - możesz to uprościć. Zobacz sobie te posty, gdzie wklejam przykłady z funkcją czas(); użyj dzielenia % modulo ==1, możesz ustawiać sobie takie warunki, że jak jest czwarta sekunda, trzecia sekunda, itp, albo co 3 sekundy, co 4 sekundy, itp. |