Skocz do zawartości

Kurs Arduino - #9 - Czujnik odległości HC-SR04, funkcje


Komentator

Pomocna odpowiedź

html_mig_img
W tej części kursu Arduino wykorzystamy czujnik odległości HC-SR04, który cieszy się dużym zainteresowaniem wśród majsterkowiczów.Przyszła również pora, aby zacząć pisać własne funkcje. Na koniec zajmiemy się także bardzo prostym elementem akustycznym - buzzerem.

UWAGA, to tylko wstęp! Dalsza część artykułu dostępna jest na blogu.

Przeczytaj całość »

Poniżej znajdują się komentarze powiązane z tym wpisem.

  • Lubię! 1
Link do komentarza
Share on other sites

Odcinek miód-malina, jesteście Panowie Wielcy.Tyle informacji w dzisiejszym materiale, musiałbym szukać jeszcze długo, a tu rach-ciach i mam 😉

PS.

Koniecznie następne kursy dla Arduinowców- inna opcja nie istnieje 🙂

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Świetny kurs dla początkujących. Ja osobiście dodałbym pracę na przerwaniach i wbudowanych licznikach żeby niepotrzebnie nie blokować pracy uC np jeśli ktoś będzie chciał zamrugać 4 razy diodą po 1 sec. Mikro-kontroler stałby w funkcji Delay 7 sekund a to już długo. W najprostszych rozwiązaniach może i się to sprawdzi ale później to już inna bajka 🙂

Mimo wszystko gratuluję dobrej i skrupulatnej części + to że napisane tak że każdy zrozumie.

  • Lubię! 1
Link do komentarza
Share on other sites

Witam

Jako swój pierwszy projekt na arduino stworzyłem prosty "fotoradar" obliczający prędkość obiektu poruszanego się przed tym właśnie czujnikiem.

Brakuje kilku elementów, które chciałbym dodać w najbliższym czasie tj. "flash" przy oświetleniu niższym niż 50%, zapisywanie prędkości większej od 10km/h do tablicy i generowanie "mandatów", oraz kilka innych bajerów.

Poniżej wklejam kod, użyłem wyświetlacza 2x16 w projekcie, na którym wyświetlane są 2 odległości po czasie 1s, oraz prędkość liczona z różnicy pomiędzy tymi odległościami przez czas 1s bo po takim czasie następują pomiary.

#include <LiquidCrystal.h> //Dołączenie bilbioteki
#define trig 10
#define echo 11

LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza

void setup() {
 lcd.begin(16, 2); //Deklaracja typu
 lcd.setCursor(0, 0); //Ustawienie kursora
 pinMode(trig,OUTPUT);
 pinMode(echo, INPUT);

 lcd.print("Fotoradar v1");
 delay(1500);
 lcd.clear();
}

void pomiar(){
 digitalWrite(trig,LOW);
 delayMicroseconds(2);
 digitalWrite(trig,HIGH);
 delayMicroseconds(10);
}

void loop() {
 double czas, dist, czas1, dist1;


 delay(100);
 pomiar();
 czas = pulseIn(echo, HIGH);
 dist = czas / 58;

 lcd.print(dist);
 lcd.print("   ");

 delay(1000);

 pomiar();
 czas1 = pulseIn(echo, HIGH);
 dist1 = (czas1 / 58);

 lcd.print(dist1);

 lcd.setCursor(0,1);
 lcd.print("v: ");
 lcd.print((dist1-dist)/100 * 3,6);
 lcd.print(" km/h");

 delay(3000);
 lcd.clear();

}
Link do komentarza
Share on other sites

BartoszBor, bardzo ciekawy projekt! Mała sugestia, nie lepiej byłoby, aby funkcja pomiar() zwracała obliczoną odległość? W tej chwili jest to mało intuicyjne, że po jej wywołaniu musimy nasłuchiwać jeszcze osobno impulsu.

Link do komentarza
Share on other sites

Zamiast buzera dałem LED.

Zmodyfikowałem funkcję zakres(int a) aby sprawdzała jedynie jedną wartość, a mianowicie czy jest poniżej danej wartości. wywołuję ją z a=25. W oknie monitora portu szeregowego otrzymuję wartości zawsze grubo powyżej 25, a mimo to LED częściej się zapala niż gaśnie.

#define trigPin 13
#define echoPin 12

void setup() {
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
 pinMode(echoPin, INPUT); //a echo, jako wejście
 pinMode(8, OUTPUT);
 digitalWrite(8, LOW);
}

void loop() {
 Serial.println(zmierzOdleglosc());
 zakres(25);
 delay(500);
}

int zmierzOdleglosc() {
 long czas, dystans;

 digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW);

 czas = pulseIn(echoPin, HIGH);
 dystans = czas / 65;

 return dystans;
}

void zakres(int a) {
 int jakDaleko = zmierzOdleglosc();
 if (jakDaleko < a) {
     digitalWrite(8, HIGH); //Włączamy LED
 } else {
     digitalWrite(8, LOW); //Wyłączamy LED, gdy obiekt poza zakresem
 }
}
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.