Skocz do zawartości

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


Pomocna odpowiedź

@sliskii czujnik ultradźwiękowy nie jest idealnym urządzeniem pomiarowym i mogą się pojawić takie niespodzianki. Możesz spróbować polutować kable - połączenia na płytce stykowej są szybkie ale niestabilne, zwłaszcza w układzie dość wrażliwym na zakłócenia.

W kodzie polecam buforować wartości i wyliczać z nich medianę (wartość środkowa w posortowanej tablicy), wartości skrajne w tym pojedyncze zakłócenia zostaną odrzucone. Wadą tego rozwiązania jest opóźnienie rozpoznania większych zmian.

  • 2 tygodnie później...

Tutaj mój potworek, na chińskim samochodziku, który sprawiał same problemy. Zasilacz oraz dystanse (koło zębate nie było wystarczająco dociśnięte do silnika) z następnego kursu przydały się żeby wreszcie to jeździło.

GOPR0225.thumb.JPG.a8eb32a09d071c51041f79b0a881162c.JPGGOPR0226.thumb.JPG.418c1c62228d8a7808d21cce0a44e898.JPG

Program zmieniłem, żeby mi z gniazdkiem nie uciekł. Gdybym się jeszcze pobawił trochę to pewnie jeździłby tak jak chcę.

 

Fajny kurs zrobiliście :).

 

 

Mam pytanie, może głupie, może mądre - jak podłączyć led do rezystorów?Czy jak połączę je w linii prostej (tak jak płynie prąd, tylko mam nadzieję będzie płynął nad płytką przez rezystor) na płytce prototypowej, to je spali?

5 godzin temu, Gieneq napisał:

@m461k każde pytanie jak potrzebne jest dobre. Dlatego powstał artykuł o działaniu płytki stykowej, jest tam przykład o tym jak podłączyć LED i rezystor, a dokładnie animacja.

Ale nie ma tam jak kilka, i nie ma czy prąd będzie jednocześnie płynął górą i dołem(tak logika podpowiada), żeby nie spalić led, żeby zaobrazować moje wątpliwości zrobiłem obrazek - jak na nim będzie płynął prąd?

prąd.png

@m461k na Twoim rysunku jest niepoprawne połączenie, ponieważ wyprowadzenia rezystora są wpięte do tej samej listwy blaszek, więc są ze sobą zwarte. W takiej sytuacji mogłoby wcale nie być rezystora i efekt byłby taki sam tzn. spalisz diodę 😉 Pominąłem fakt tego, że dioda jest niepodłączona, bo jak rozumiem to tylko błąd na rysunku. W linkowanym artykule jest animacja, która pokazuje jak płynie prąd w poprawnej wersji tego układu.

  • 1 miesiąc później...

Witam. Mam problem z którym nie mogę sobie poradzić. Program działa tylko za pierwszym razem. Później przy wprowadzeniu pierwszej strony cały czas wyświetla wynik poprzedniego wyliczenia 🤔

String rozmiarStrony1 = "";//Deklaracja  tekstowych zmiennych
String rozmiarStrony2 = "";

void setup() {
  Serial.begin(9600); //Nawiązanie komunikacji przez UART
}

void loop() {

  if (Serial.available() > 0) {// Gdy dane zostały odczytane
    while (rozmiarStrony1 == "") {// Poczekaj na wprowadzenie danych
      rozmiarStrony1 = Serial.readStringUntil('\n');//Zapisywanie wprowadzonych danych do zmiennej
    }
    while (rozmiarStrony2 == "") {//Poczekaj na wprowadzenie danych
      rozmiarStrony2 = Serial.readStringUntil('\n');//Zapisywanie wprowadzonych danych do zmiennej
    }
    int wynik = prostokatPole(rozmiarStrony1.toInt(), rozmiarStrony2.toInt());//Rrutowanie danych tekstowych na liczbowe
    Serial.println(wynik);//Drukuj tekst
  }
}
int prostokatPole(int a, int b) {
  int wynik = 0;
  wynik = a * b;

  return wynik;
}

 

Świetny kurs. I mam pytanie. Jak przeliczyć odległość np. na % 

Przypuśćmy, że 25 cm to 100% a 4 cm to 0%

Chciałbym pomiar odległości wyświetlać na LCD w procentach.

Pozdrawiam

@thodynski witam na forum 🙂

Możesz np. zmodyfikować kod programu żeby zaoszczędzić dodatkowych operacji. Najprościej jest jednak użyć funkcji map, która przeskaluje wartość.

(edytowany)

@Treker Nie próbowałem, bo nawet nie mam pomysłu jak można było by wykorzystać diodę do sprawdzenia działania programu obliczenia pola. Myślałem że w samym kodzie będzie widać jakiś błąd.

Dobra, udało się rozwiązać problem. trzeba było trochę zmodyfikować kod i teraz działa poprawnie

String rozmiarStrony1 = "";//Deklaracja  tekstowych zmiennych
String rozmiarStrony2 = "";

void setup() {
  Serial.begin(9600); //Nawiązanie komunikacji przez UART
}

void loop() {

  if (Serial.available() > 0) {// Gdy dane zostały odczytane
    while (Serial.available() <= 0) {} // Poczekaj na wprowadzenie danych
    rozmiarStrony1 = Serial.readStringUntil('\n');//Zapisywanie wprowadzonych danych do zmiennej
    while (Serial.available() <= 0) {} //Poczekaj na wprowadzenie danych
    rozmiarStrony2 = Serial.readStringUntil('\n');//Zapisywanie wprowadzonych danych do zmiennej
    int wynik = prostokatPole(rozmiarStrony1.toInt(), rozmiarStrony2.toInt());//Rrutowanie danych tekstowych na liczbowe
    Serial.println(wynik);//Drukuj tekst
  }
}
int prostokatPole(int a, int b) {//Wykonaj obliczenie
  int wynik = 0;
  wynik = a * b;

  return wynik;//Podaj wynik
}

  

Edytowano przez Vova
  • Lubię! 1
Dnia 15.06.2020 o 00:28, Vova napisał:

Witam. Mam problem z którym nie mogę sobie poradzić. Program działa tylko za pierwszym razem. Później przy wprowadzeniu pierwszej strony cały czas wyświetla wynik poprzedniego wyliczenia 🤔


String rozmiarStrony1 = "";//Deklaracja  tekstowych zmiennych
String rozmiarStrony2 = "";

void setup() {
  Serial.begin(9600); //Nawiązanie komunikacji przez UART
}

void loop() {

  if (Serial.available() > 0) {// Gdy dane zostały odczytane
    while (rozmiarStrony1 == "") {// Poczekaj na wprowadzenie danych
      rozmiarStrony1 = Serial.readStringUntil('\n');//Zapisywanie wprowadzonych danych do zmiennej
    }
    while (rozmiarStrony2 == "") {//Poczekaj na wprowadzenie danych
      rozmiarStrony2 = Serial.readStringUntil('\n');//Zapisywanie wprowadzonych danych do zmiennej
    }
    int wynik = prostokatPole(rozmiarStrony1.toInt(), rozmiarStrony2.toInt());//Rrutowanie danych tekstowych na liczbowe
    Serial.println(wynik);//Drukuj tekst
  }
}
int prostokatPole(int a, int b) {
  int wynik = 0;
  wynik = a * b;

  return wynik;
}

 

A jeżeli chciałbyś wiedzieć co było nie tak w tym kodzie to to, że za pierwszym razem zmienne rozmiarStrony1 oraz rozmiarStrony2 miały ustawiona wartość i przy kolejnym wprowadzaniu danych te zmienne nie były puste więc nie przypisywało im nowych wartości tylko pozostawiało stare :) w tym kodzie wystarczyło by dodać na końcu pętli czyszczenie tych zmiennych :)

  • Lubię! 2

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