Skocz do zawartości

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ź
(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
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 🙂 

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. 

(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

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
(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
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? 

(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
  • 2 tygodnie później...

@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 🙂

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?

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