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.

Link to post
Share on other sites

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

 

 

Link to post
Share on other sites

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?

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

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

 

Link to post
Share on other sites

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

Link to post
Share on other sites

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

Fajnie, że udało się rozwiązać problem. To o czym pisał @Treker to dobry sposób na "debugowanie" programów, bo jest szybki i niezawodny. 🙂 

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