Skocz do zawartości

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


Pomocna odpowiedź

Napisano
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

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 🙂

Zakurek, dzięki 🙂

Odcinek miód-malina, jesteście Panowie Wielcy.

Dzięki liczbę mnogą potraktuję jako komplement, bo pisałem tekst sam 🙂

Ś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

Treker, używając liczby mnogiej miałem na uwadze, też twoich współpracowników, którzy piszą teksty w innych kursach 🙂 Jako autorowi tego wpisu- gratuluję Ci wiedzy i pracowitości, której mi brak 😉

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();

}

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.

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
 }
}

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...