Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'Timer'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino, ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - roboty
    • Projekty - DIY
    • Projekty - DIY (początkujący)
    • Projekty - w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie
    • Kosz

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Znaleziono 2 wyniki

  1. Moja pierwsza w życiu biblioteka Arduino! Na samym początku naszej przygody z Arduino spotkaliśmy się z najsłynniejszym "migaczem": void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } Bardzo szybko możemy się przekonać o tym, że funkcja delay() blokuje wykonywanie innych zadań w międzyczasie. W wielu wypadkach może to stwarzać problemy. To tak jakbyśmy o godzinie 23:00 zaprogramowali siebie: WŁĄCZ SEN odczekaj(7 godzin) WYŁĄCZ SEN PÓJDŹ DO PRACY odczekaj(8 godzin) WYJDŹ Z PRACY i przekonali się, że odczekaj(8 godzin) całkowicie "zamraża" nas i uniemożliwia jakąkolwiek pracę. Doskonale opisuje to artykuł Kurs Arduino II – #9 – wielozadaniowość, opóźnienia z millis(). Znajdziemy tam też bardzo dobre rozwiązanie tego problemu: unsigned long lastTimeLCD = 0; void setup() { .... } void loop() { CAŁY CZAS PRACUJ if (lastTimeLCD == 0 || millis() - lastTimeLCD >= 1000) { lastTimeLCD = millis(); UAKTUALNIJ ZAWARTOŚĆ WYŚWIETLACZA } } Co jeśli chcemy wykonac funkcję określoną ilość razy? Możemy oczywiście dopisywać dalsze warunki i zliczać już wykonaną ilość iteracji. unsigned long lastTimePicture = 0; int iterationsDone = 0; void setup() { .... } void loop() { CAŁY CZAS PRACUJ if (iterationsDone < 3 && (lastTimePicture == 0 || millis() - lastTimePicture >= 1000)) { iterationsDone++; lastTimePicture = millis(); WYKONAJ ZDJECIE LUSTRZANKA PODLACZONA DO ARDUINO } } Taka potrzeba istnieje np przy interwałometrze WiFi podłączonym do lustrzanki cyfrowej (np mikrokontroler ESP8266 hostuje stronę WWW sterującą aparatem albo ESP32, które sterujemy poprzez Bluetooth za pomocą dedykowanej aplikacji na Androida). Może on dostać np zadanie: poczekaj 10s przed rozpoczęciem, wykonaj serię 15. zdjęć o czasie naświetlania 2s i interwale 5s. Oczywiście nadal problem rozwiążemy naszą słynną instrukcją warunkową if(....millis()... jakieś kolejne liczniki i warunki). Przy wielu różnych zadaniach wywoływanych asynchronicznie nasz kod stanie się mniej czytelny. O wiele łatwiej o pomyłkę. Nie możemy w końcu pomylić wielu różnych zmiennych odpowiedzialnych za przechowywanie czasu ostatniego wykonania zadania, interwały, ilość wykonanych iteracji, ilość oczekiwanych iteracji... Ten niekończący się wstęp powinien uzmysłowić Wam powód, dla którego napisałem Arduino Timer Library RZtimer. Przykład wykorzystania jej dwóch podstawowych metod: - wykonaj funkcję blinkLED() co każde 2000 ms: timer.addEverytime(2000, blinkLED); - wykonaj funkcję itWorks() dwa razy z interwałem 2000 ms, poczekaj 300 ms przed startem: timer.addTask(2000, 2, 300, itWorks); Kod w całości: #include "RZtimer.h" RZTimer timer; void blinkLED(); void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); timer.addEverytime(2000, blinkLED); auto itWorks = []()->void {Serial.print("It Works! "); Serial.print(millis()); Serial.println(" ms");}; timer.addTask(300, 2, 2000, itWorks); } void loop() { timer.run(); } void blinkLED() { Serial.print("ON "); Serial.print(millis()); Serial.println(" ms"); digitalWrite(LED_BUILTIN, HIGH); auto blinkLEDoff = []()->void {digitalWrite(LED_BUILTIN, LOW); Serial.print("OFF "); Serial.print(millis()); Serial.println(" ms");}; timer.addTask(1000, 1, 0, blinkLEDoff); } RZTimer timer; tworzy obiekt timer klasy RZTimer. Przykładowe funkcje wykonywane cyklicznie to blinkLED() oraz itWorks(). Pierwszą zdefiniowałem "klasycznie", drugą w celach edukacyjnych jako wyrażenie lambda (w takich zastosowaniach mogą się one okazać całkiem wygodne w użyciu). Nie zapomnijmy o wstawieniu timer.run(); gdzieś w pętli loop! Dodatkowym (i chyba unikatowym atutem jest możliwość usypiania mikrokontrolera przy równoczesnym asynchronicznym wykonywaniu zadań! Poniższy przykład będzie działać jedynie z mikrokontrolerami wspieranymi przez bibliotekę narcoleptic. #include "RZtimer.h" #include <Narcoleptic.h> //https://github.com/rcook/narcoleptic void delaySleep(unsigned long sleepTime) { delay(30); extern volatile unsigned long timer0_millis; noInterrupts(); timer0_millis += (unsigned long)(sleepTime - 30); interrupts(); Narcoleptic.delay(sleepTime - 30); } RZTimerWithSleep timer(delaySleep); void blinkLED(); void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); timer.addEverytime(2000, blinkLED); auto itWorks = []()->void {Serial.print("It Works! "); Serial.print(millis()); Serial.println(" ms");}; timer.addTask(300, 2, 2000, itWorks); } void loop() { timer.run(); } void blinkLED() { Serial.print("ON "); Serial.print(millis()); Serial.println(" ms"); digitalWrite(LED_BUILTIN, HIGH); auto blinkLEDoff = []()->void {digitalWrite(LED_BUILTIN, LOW); Serial.print("OFF "); Serial.print(millis()); Serial.println(" ms");}; timer.addTask(1000, 1, 0, blinkLEDoff); } Po drobnych modyfikacjach biblioteka powinna działać też w programach C++ uruchomionych na Raspberry Pi. Np zamiast "Arduinowego" millis() powinniśmy skorzystać z funkcji clock(), a same wartości zmiennych przechowywać w typie danych clock_t. Przykład zastosowania: kontroler akwarium. Co sekundę odświeża zawartość LCD. Włącza i wyłącza pompę "utleniającą wodę" o zadanej porze. Co dwa tygodnie sprawdza synchronizację czasu łącząc się z serwerem NTP.
  2. Witam, posiadam płytkę STM32F407G-DISC1. Celem mojego projektu jest stworzenie programu, który będzie inkrementował pewną zmienną z losowym czasem. Wartość średnia tego czasu będzie zadawana z potencjometru, odchylenie standardowe będzie proporcjonalne do wartości średniej. Jestem początkującym w programowaniu mikrokontrolerów i próbowałem to rozwiązać za pomocą aktualizacji prescalera dla timera lecz to chyba nie jest właściwie rozwiązanie. Czy ktoś z forumowiczów posiada wiedzę jak coś takiego zrobić?
×
×
  • Utwórz nowe...