• 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
Czujnik HC-SR04+Przekaźnik
#1
Witam,
Chciałem zrobić sobie buzzer z latarka jak wjeżdzam do garażu i dojeżdzam na 40 cm buzzer dzwoni a jak dojade na 10cm to przekaźnik się załączy i zaświeci mi jeszcze lampka.
Mam arduino uno z czujnikiem HC-SR04 oraz przekaźnik  jqc-3ff-s-z
Czy ktoś mogłby podpowiedzieć jak dopisać przekaźnik do programu z buzzerem dost na Youtube
https://www.youtube.com/watch?v=ZtOg2ahCmwU
Dzięki Smile
 
Odpowiedź
#2
Raczej nikt nie będzie oglądał kodu programu na ekranach w YT.
Umieść kod na forum.
W kodzie wystarczy dopisać ustawienie portu sterującego przekaźnikiem w roli wyjścia a w w miejscach gdzie jest sterowany buzzer dodać sterowanie przekaźnikiem.

PS
Dlaczego nowe pokolenie sadzi, że YT to wyrocznia i jedyne źródło wiedzy?
Po opętaniu przez YT mamy osoby, które twierdzą, że jak będzie się mówić dobrze do zamarzającej wody to zamarznie lepiej niż jak się będzie mówić źle https://forum.elportal.pl/viewtopic.php?...9c3#p96435
Silniki o sprawności 150% "Przecież na YT widziałem, działa"

Kiedy w końcu młodzieży zrozumiecie, że jesteście manipulowani przez reklamodawców?
 
Odpowiedź
#3
tu daje program

Kod:
#define trig 2
#define echo 3
int buzz = 9

void setup() {
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(buzz, OUTPUT);
digitalWrite (buzz, LOW);
pinMode(buz2, LOW);
}

void loop () {
int czas, dist;
digitalWrite(trig, HIGH);
delayMicroseconds(1000);
digitalWrite(trig, LOW);
czas = pulseIn(echo, HIGH);
dist = (czas/2) / 29.1;

if (dist <=10) {
  tone (buzz, 3000, 10);
  delay(2);
}
if (dist <=20 && dist >10) {
tone(buzz, 2000,100);    
delay(400);
}

}
 
Odpowiedź
#4
Program zabawka ale skoro chcesz z niego zrobić pełnosprawną aplikacje to:
- zdefiniuj pin PK
- w setup dodaj pinMode(PK, OUTPUT);
- w wybranym warunku "if" dodaj "digitalWrite (buzz, LOW);" lub "digitalWrite (buzz, HIGH);" zależnie od tego jakim poziomem jest sterowany przekaźnik/driver przekaźnika
- odczekaj wymagany czas i zmień stan przekaźnika na spoczynkowy
 
Odpowiedź
#5
Cześć, siedzę i siedzę i nie wiem co źle robię czy ktoś mógłby coś podpowiedzieć będę wdzięczny

Kod:
#define trig 2
#define echo 3
#define prz 11
int buzz = 9;


void setup() {
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
pinMode(buzz, OUTPUT);
pinMode(prz, INPUT):
digitalWrite (buzz, LOW);
pinMode(buz2, LOW);
}

void loop () {
int czas, dist;
digitalWrite(trig, HIGH);
delayMicroseconds(1000);
digitalWrite(trig, LOW);
czas = pulseIn(echo, HIGH);
dist = (czas/2) / 29.1;

if (dist <=10) {
  tone (buzz, 3000, 10);
  delay(2);
}
if (dist <=20 && dist >10) {
digitalWrite(prz, HIGH);    
delay(10);
}

}
 
Odpowiedź
#6
Długo będziesz siedział. Program piszesz metodą prób i błędów, CTRL+C,CTRL+V bez zrozumienia. Raptem pięć, góra dziesięć komend i nie chciał ci się nawet o nich poczytać. To zajęcie na max godzinę czasu aby te komendy poznać i wypróbować jak działają. LEŃ JESTEŚ i nie wykręcaj się urojoną chorobą dysumiejetnośćprogramowania. Poczytaj o komendzie pinMode i zastawów się jak powinna wyglądać dla wyjścia przekaźnikowego. Jak to już zrobisz, poczytaj o pozostałych komendach. To pewnie rozwiąże problem.


PS
Czy urządzenie ma tak działać, że jak załączy się przekaźnik, to już nigdy go nie wyłączy, do resetu lub wyłączenia zasilania?
 
Odpowiedź
#7
Użyj funkcji millis() lub micros() do zarządzania upływającym czasem.
Przykładowo jeśli odpalasz triger to zapisujesz sobie w zmiennej uint32_t jaki jest licznik micros zamiast robić delay. Program dalej tańczy sobie w kółeczko i w każdym sprawdza czy aktualny licznik micros jest większy od zapisanego o 1000. Jeśli tak to wyłączasz triger, tak samo możesz sobie zmierzyć pulse. W podobny sposób używając millis włączasz na określony czas ms światło, buzer. O tym czy odpalić triger, czyli pomiar odległości, też decydujesz Ty, programista, np. co 50ms, co 100ms - tak by było w miarę często, program miał czas na zrobienie wszystkiego w między czasie, ale pewnie 1000 razy na sekundę nie ma sensu. Przykład jest w kursie Arduino na Forbot, tutaj na forum pewnie jest z kilkadziesiąt przykładów.
 
Odpowiedź
#8
(07-10-2018, 20:13)kaczakat napisał(a): Użyj funkcji millis() lub micros() do zarządzania upływającym czasem.
Do millis() daleka droga. Co da millis() jak wyjście przekaźnika ustawia na input? W pewnych warunkach da się w ten sposób realizować funkcje wyjścia ale wętpię aby autor wątku świadomie użył input do sterowania wyjściem.
Niech najpierw zrobi to z delay. Jak upora się ze sterowaniem przekaźnika, to w "pulseIn" nie ma timeout. Czy to rozsądne? Samo użycie "pulseIn" do pomiaru czasu nie jest dobrym pomysłem ale nie dać timeout? Pomiar czau, a z HC-SR04 sa to bardzo długie czasy, powinien być zrealizowany przez wejście przechwytujące timera. Wtedy i millis() ma sens bo co ono da jak program będzie wisiał w nieskończoność na "pulseIn"?

Właśnie przez "pulseIn" i inne tego typu "hocki klocki" jak programowy uart, spi czy i2c, Arduino nie nadaje się do niczego poważnego. Para idzie w gwizdek, zamiast używać sprzętu jakieś programowe protezy blokujące działanie programu.
 
Odpowiedź
#9
Jak przejdzie ten kurs to może zacznie ogarniać do czego jest in i out. W Arduino jest sprzętowa obsługa UART, SPI i I2C, choć oczywiście są też wersje soft. Oczywiście wszystko da się zrobić lepiej (no nie mówię o Pana doskonałych kodach, ale to oczywiste ), ale już wykorzystanie tego co oferuje Arduino umożliwi rozwiązanie większości opisywanych na tym forum "problemów". A funkcja pulseIn ma timeout domyślny 1s, jeśli to nie wystarcza można sobie w argumencie podać swój - zaleta przeciążania funkcji w C++. Oczywiście trzeba to wiedzieć...
 
Odpowiedź
#10
(08-10-2018, 00:19)kaczakat napisał(a): Jak przejdzie ten kurs to może zacznie ogarniać do czego jest in i out.
Te kilka instrukcji to i bez kursu można ogarnąć. Ale jak się wpisuje "na pałę" różne wartości, to szanse na to, ze program zadział są jak wygrać w Lotto.

(08-10-2018, 00:19)kaczakat napisał(a): A funkcja pulseIn ma timeout domyślny 1s, jeśli to nie wystarcza można sobie w argumencie podać swój - zaleta przeciążania funkcji w C++. Oczywiście trzeba to wiedzieć...
Timeout 1s :-) W moich programach wdg najczęściej ustawiony jet na 400ms, czasem800.
Jak będzie działał program z timeout 1s gdy czujnik nie da echa? Czas wykonania pętli głównej 1s :-) Takie programy to mogą sobie w szkółce niedzielnej pisać, maja dużo czasu (wieczność).
W zastosowaniu z HC-SR04 pulseIn z timeout np 10ms można użyć. Dźwięk na dystansie 1m, w obie strony, będzie przemieszczał się ok 6,6ms. Ta zawieszenie programu na 10ms można sobie (czasem) pozwolić. PulseIn, na czas pomiaru zawiesza przerwania (o ile dobrze pamiętam, właściwie to innego wyjścia nie ma). Co może wydarzyć sie przez 10ms? Przypuścimy, że pseudodebugujemy kod. Przy prędkości 115200, w 10ms może być przesłane ponad 116 znaków!
Wystarczy użyc przechwytywania od timera i problemu nie ma.
Po co dla Arduino, zrobiono takie badziewie jak pulseIn na każdym pinie? Normalnie jak Bascom, jak jedna funkcja działa to inne już nie.

(08-10-2018, 00:19)kaczakat napisał(a): W Arduino jest sprzętowa obsługa UART, SPI i I2C, choć oczywiście są też wersje soft.
Soft uart :-) Na ARM można takie bajery sobie robić (tyle, że tam nie ma potrzeby, bo ARM mają po 3..6 a nawet 12 uart) ale na AVR nie za bardzo. Nie chodzi o to że jest wolny, można przyjąć, że soft uart to max 9600 i po problemie, chodzi o to, że AVR nie ma wielopoziomowego systemu przerwań. Efekt - czasem gubione sa znaki nawet przy 300 bodach. Jak juz ktoś zapiera się przy małych AVR, to można doposażyć go w SC16IS7xx. Ekonomia za tym nie przemawia ale SC16IS7xx to raj dla Arduinowców. Układy te mają 1 lub 2 uart z 64bitowym FIFO nadawczym i odbiorczym. Można sobie przerwania zawieszać na długi czas a nawet nie używać ich wcale (o ile nie używa się delay w tysiącach).

(08-10-2018, 00:19)kaczakat napisał(a): Oczywiście wszystko da się zrobić lepiej (no nie mówię o Pana doskonałych kodach, ale to oczywiste )
Każdy program można ulepszyć. Najlepszym dowodem na to jest Windows, tyle, że tam nie ma sensu czegokolwiek ulepszać, trzeba by toto (nie wiem jak nazwać Windows, system to nie jest) napisać od nowa.

(08-10-2018, 00:19)kaczakat napisał(a): ale już wykorzystanie tego co oferuje Arduino umożliwi rozwiązanie większości opisywanych na tym forum "problemów".
Jak to tylko miganie dioda czy funkcje prostego PLC to tak, jak coś bardziej zaawansowane to najczęściej rozwiązania są japońskie (działają jako-tako).
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości