Skocz do zawartości

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


Pomocna odpowiedź

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ź
Link to post
Share on other sites

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

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. 

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

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
Link to post
Share on other sites

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

Edytowano przez Gieneq
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
Link to post
Share on other sites
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
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? 

Link to post
Share on other sites

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

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!

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.