Przejazd kolejowy z sygnalizacją i czujnikiem ruchu - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Silniki, Mechanika i Zasilanie (https://forum.arduinopolska.pl/dzial-silniki-mechanika-i-zasilanie) +--- Wątek: Przejazd kolejowy z sygnalizacją i czujnikiem ruchu (/watek-przejazd-kolejowy-z-sygnalizacj%C4%85-i-czujnikiem-ruchu) |
Przejazd kolejowy z sygnalizacją i czujnikiem ruchu - dom181 - 10-07-2022 Witam, dopiero zaczynam z Arduino, ale chciałem stworzyć projekt z wykorzystaniem sygnalizatorów świetlnych. Projekt będzie podzielony na kilka części. Pierwsza z nich to przejazd kolejowy. Kupiłem trochę elementów: arduino nano, 4 x sygnalizatory (wykorzystam tylko diody czerwone), 2 x serwomechanizmy, czujnik ruchu SR505. Całość ma działać podobnie do typowego przejazdu kolejowego. Chciałem to zrobić tak: jeśli czujnik ruchu wykryje pociąg (obiekt), to wtedy diody LED zaczynają migać na przemian i zamykają się szlabany. Szlabany będą zamknięte około 1 minutę i później się otwierają, diody nie świecą, ale czujnik gdy wykryje ruch, znowu zamknie rogatkę, czyli pętla. Jak się zabrać za kod, przewody podłączyłem, czy ktoś mógłby pomóc / dać wskazówkę? Dzięki za pomoc. Dołączam schemat jak ma to wyglądać. RE: Przejazd kolejowy z sygnalizacją i czujnikiem ruchu - kaczakat - 11-07-2022 Kurs Arduino tu np., przerobić wszystkie przykłady, nauczyć się programować, w szczególności bez delay. RE: Przejazd kolejowy z sygnalizacją i czujnikiem ruchu - dom181 - 11-07-2022 Dlaczego nie korzystać z delay? Co w takim razie wykorzystać? RE: Przejazd kolejowy z sygnalizacją i czujnikiem ruchu - kaczakat - 11-07-2022 W kursie jest to wyjaśnione. Jak wpiszesz delay(1000) to przez sekundę, czyli wieczność w świecie uC, uC nic nie robi, zamiast tego jak chcesz świeć ledem przez 1s to ją włączasz, zapisujesz sobie kiedy to zrobiłeś i pozwalając programowi robić inne rzeczy sprawdzasz, czy już minęła sekunda, by wyłączyć led. Do tego służy funkcja millis(). Tak samo jak byś to zrobił z delay, to robisz delay(1) i zliczasz sobie takie postoje w zmienna++, jak zmienna jest >1000 to zmieniasz stan led. Tylko delay(1) zajmuje więcej niż 1ms, a inne czynności w loop też coś trwają i w zależności ile ich jest błąd pomiaru 1s będzie się zmieniał, nawet jak ustalisz sobie, że zamiast 1000 zliczasz 995, to za chwilę coś dopiszesz do programu i już nie będzie to 995 tylko np. 990. A jak chcesz migać 1 ledem co 1s, a drugim led co 0.25s to już problem. Można zrobić delay(1) i co 250 takich przystanków zmieniać stan led1, a co 1000 drugiej. Z millis() to działa lepiej, jego licznik, taka zmienna++, działa w przerwaniach niezależnie od tego co się dzieje w loop, chociaż o tyle niedokładnie, że zerkasz na niego z loop, więc nie zawsze dokładnie 1s od poprzedniego zerknięcia. |