• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przejazd kolejowy z sygnalizacją i czujnikiem ruchu
#1
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]
 
Odpowiedź
#2
Kurs Arduino tu np., przerobić wszystkie przykłady, nauczyć się programować, w szczególności bez delay.
 
Odpowiedź
#3
Dlaczego nie korzystać z delay? Co w takim razie wykorzystać?
 
Odpowiedź
#4
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.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości