Arduino Polska Forum
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ć.

[Obrazek: ea3465c2dc3cb0fba856da6f332b469d863936f0.png]


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.