Skocz do zawartości
Komentator

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

Pomocna odpowiedź

(edytowany)

Próbuję zrobić przykład z buzzerem (z zestawu), ale albo robię coś źle, albo mój buzzer nie działa.

Do funkcji dodałem dla pewności Serial.print, który wskazuje poprawnie i wyświetla odległość wraz z napisem HIGH gdy odległość jest w przedziale.

Upewniłem się wiele razy czy buzzer na pewno jest podłączony poprawnie, GND (krótsza nóżka) pod GND na płytce, a (+) pod 2 pin digital (nawet podmieniałem kabelki by upewnić się,że nie są uszkodzone). Choć już przy wyjmowaniu jego coś mnie zdziwiło... Nie miał naklejki...

#define trigPin 12
#define echoPin 11

void setup() {
    Serial.begin(9600);
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
}

void loop() {
    zakres(10, 25);
    delay(100);
}

int zmierzOdleglosc()
{
    long czas; 
  
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    czas = pulseIn(echoPin, HIGH);
    return czas / 58;
}

void zakres(int a, int b)
{
    int odleglosc = zmierzOdleglosc();
    Serial.print(odleglosc);
    if ((odleglosc > a) && (odleglosc < b)) {
        Serial.println(" HIGH");
        digitalWrite(2, HIGH);
    } else {
        Serial.println(" LOW");
        digitalWrite(2, LOW);
    }
}

Edit: chyba znam już powód nie działania buzzer-a. Odpowiedz znalazłem w kursie "Arduino - Poziom 2". Mój buzzer do pierwszego zestawu najprawdopodobniej otrzymałem bez generatora. Działa z przykładami z lekcji 3 kursu "Arduino - Poziom 2".

Edytowano przez radziopoke
Znalazłem sam odpowiedź

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

A tu moje rozwiązanie do zadania 9.3 (działa 🙂 ) :

#define trigPin 12
#define echoPin 11
#define minPinDiod 2
#define maxPinDiod 7
#define maxOdleglosc 210

void setup() {
    Serial.begin(9600);
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);

    //ustawienie pinów dla diot
    for (int i = minPinDiod; i <= maxPinDiod; i++) {
        pinMode(i, OUTPUT);
    }
}

void loop() {
    int odleglosc, maxPin;
    odleglosc = zmierzOdleglosc();

    Serial.print(odleglosc);
    // Maksymalny pin diody, który ma się zaświecić, gdy maxPin == 1 to wszystkie diody będą zgaszone :)
    maxPin = map(odleglosc, 1, maxOdleglosc, maxPinDiod, minPinDiod - 1);
    Serial.print(" ");
    Serial.println(maxPin);
    zapalDiody(maxPin);
    
    delay(100);
}

int zmierzOdleglosc()
{
    long czas, odleglosc; 
  
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    czas = pulseIn(echoPin, HIGH);
    odleglosc = czas / 58;
    
    //zabezpieczenie przed wyjściem z zakresu;
    if (odleglosc > maxOdleglosc) {
        odleglosc = maxOdleglosc;
    } else if (odleglosc < 1) {
        odleglosc = 1;
    }
    
    return odleglosc;
}

void zapalDiody(int maxPin)
{
    for (int i = minPinDiod; i <= maxPinDiod; i++) {
        if (i <= maxPin) {
            digitalWrite(i, HIGH);
        } else {
            digitalWrite(i, LOW); //Pozostałe diody należy zgasić
        }
    }
}

 

Edytowano przez radziopoke

Udostępnij ten post


Link to post
Share on other sites
21 godzin temu, radziopoke napisał:

Edit: chyba znam już powód nie działania buzzer-a. Odpowiedz znalazłem w kursie "Arduino - Poziom 2". Mój buzzer do pierwszego zestawu najprawdopodobniej otrzymałem bez generatora. Działa z przykładami z lekcji 3 kursu "Arduino - Poziom 2".

Cieszę się, że problem się rozwiązał. Buzzery obojętnie jakie przy podłączeniu do zasilania powinny wydać z siebie jakiś dźwięk - te bez generatora chociażby powinny piknąć. 

19 godzin temu, radziopoke napisał:

A tu moje rozwiązanie do zadania 9.3 (działa 🙂 ) :

Super! Tak trzymaj 🙂 

Udostępnij ten post


Link to post
Share on other sites

Witam, mam taki problem, że gdy mam już cały,  układ zbudowany i program napisany z ultradźwiękowym czujnikiem odległości bez buzzera, to ciągle mi pokazuje 1208 cm, nawet jak przesuwam czujnikiem mam podobnie w przykładzie z buzzerem. 

Udostępnij ten post


Link to post
Share on other sites

@Szatanak Przydał by się kod, który napisałeś i może jakieś zdjęcia połączeń. Bez tego ciężko ustalić co może być nie tak.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
Dnia 6.03.2020 o 07:58, radziopoke napisał:

@Szatanak Przydał by się kod, który napisałeś i może jakieś zdjęcia połączeń. Bez tego ciężko ustalić co może być nie tak.

 Zawsze jak coś mi nie wychodzi to kopiuję. A tutaj masz zdjęcia:

image.thumb.jpg.3e197a56a73af2fea847b90e68ee7cd1.jpgimage.thumb.jpg.e3c395b392291bf49bb6709372349dcb.jpg

Edytowano przez Gieneq
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Szatanak Jeżeli kopiujesz kod z kursu to zamień kabelki sygnałowe trig i echo, masz je zamienione 🙂 

Edytowano przez Gieneq

Udostępnij ten post


Link to post
Share on other sites
8 godzin temu, Gieneq napisał:

@Szatanak Jeżeli kopiujesz kod z kursu to zamień kabelki sygnałowe trig i echo, masz je zamienione 🙂 

no właśnie jak je zamieniam to mi pokazuje 0 cm

Udostępnij ten post


Link to post
Share on other sites

Na tym drugim zdjęciu wygląda jakby atmega powoli próbowała uciekać z płytki Adruino 🙂 

Podaj jeszcze kod programu, którego używasz. Nawet drobny błąd może powodować źle działający program.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
Dnia 9.03.2020 o 20:01, radziopoke napisał:

Na tym drugim zdjęciu wygląda jakby atmega powoli próbowała uciekać z płytki Adruino 🙂 

Podaj jeszcze kod programu, którego używasz. Nawet drobny błąd może powodować źle działający program.

image.thumb.jpg.223eeb0f8ed2532ab362e97dea2f6681.jpg

#define trigPin 12

#define echoPin 11



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

}



void loop() {  

  Serial.print(zmierzOdleglosc());

  Serial.println(" cm");

  

  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 / 58;



  return dystans;

}

 

Edytowano przez Gieneq
Zachęcam do używania bloku kodu

Udostępnij ten post


Link to post
Share on other sites
Dnia 12.03.2020 o 16:27, Szatanak napisał:

image.thumb.jpg.223eeb0f8ed2532ab362e97dea2f6681.jpg


#define trigPin 12

#define echoPin 11



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

}



void loop() {  

  Serial.print(zmierzOdleglosc());

  Serial.println(" cm");

  

  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 / 58;



  return dystans;

}

 

Czyli mam zareklamować czujnik odległościowy? 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Kod wygląda na ok.

Ja bym jeszcze spróbował podłączyć czujnik w innym miejscu płytki stykowej, innymi przewodami, i pod inne piny (np. echo pod pin 6, trigger pod pin 7). Oczywiście wtedy też musisz poprawić to w programie. 

Jeżeli to nie pomoże, to jest duże prawdopodobieństwo, że czujnik jest uszkodzony.

Edytowano przez radziopoke
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Dzięki za kurs. Bardzo owocnie spędzony czas! Teoria + praktyka = super zabawa 🙂

Edytowano przez Treker
Literówka.
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

@Radoslaw3 witam na forum i bardzo dziękuję za pozytywną opinię. Cieszę się, że kurs był ciekawy i zachęcam do dalszej nauki z naszych poradników 🙂

Udostępnij ten post


Link to post
Share on other sites

Miał ktoś może problem z tym, że co kilka-kilkanaście (pomiar co 500 ms) pomiarów pojawia się dziwna wartość, u mnie dla przykładu czujnik mierzy wartości około 180 i nagle pojawia się wartość 100, a czujnik jest w miejscu cały czas, a sygnał odbija się od takiej ciemnej, grubej kurtyny. Da się to jakoś zniwelować w kodzie?

Udostępnij ten post


Link to post
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!

Gość
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...