Skocz do zawartości

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


Pomocna odpowiedź

(edytowany)

Cześć, 

chciałbym dokonać pomiaru czasu na pinie ECHO bez użycia instrukcji PulseIn. Napisałem, więc kilka linijek: 

 if (digitalRead(ECHO) == 1) {
    startCzas = millis();
  }
  else {
    stopCzas = millis();
  }

  zmierzonyCzas = stopCzas - startCzas;

zamiast jednej "PulsIn(ECHO,HIGH);", ale nie do końca mi się to sprawdza. 

Proszę o podpowiedź gdzie popełniłem błąd. 

 

Edytowano przez Gieneq
Link to post
Share on other sites

@ximot Witam na forum 🙂 pulseIn działa blokująco i patrząc na stornie Arduino służy do sprawdzenia zmiany stanu - czyli nie jest to digitalRead (bo to by nie miało sensu skoro jest już taka funkcja), tylko takie zdarzenie podobne do wyzwalania przerwania.

Poczytaj co jest w opisie funkcji na stronie Arduino.

  • Lubię! 1
Link to post
Share on other sites

@Gieneq dzięki za podpowiedź. A czy wiesz może jaki pin odpowiada za przerwania na płytce Robot Shield dla Arduino Uno i jak się do niego odnieść w programie? Mam przed sobą dokumentację od MCP23008 (ekspander portów na wspomnianej płytce), ale nie do końca wiem jak należy ją odczytać...

Link to post
Share on other sites

Witam, i serdecznie dziękuję za kurs!😀 Miałbym jednak pytanie. Nie umiem zrobić linijki led pod względem programowania.😕 Czy mógłby ktoś mi pomóc, dać jakieś wskazówki, czy podesłać szkielet programu?  Bardzo proszę o odpowiedź😉

Link to post
Share on other sites

@stawcio35 witam na forum 🙂 Cieszę się, że kurs jest pomocny!

6 godzin temu, stawcio35 napisał:

Nie umiem zrobić linijki led pod względem programowania.😕

Pokaż co tam już masz, na czym konkretnie utknąłeś? 😉

Link to post
Share on other sites
#define trigPin 12
#define echoPin 11

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

void loop() {  
  zakres(1, 20); 
  delay(100);
} 

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

void zakres(int a, int b) {
  int jakDaleko = zmierzOdleglosc();
  if ((jakDaleko > a) && (jakDaleko < b)) {
      digitalWrite(8, HIGH);
  } else {
      digitalWrite(8, LOW); 
  }
}

Tak naprawdę skorzystałem z Pana kodu podanego wyżej który między 10 cm a 25 odległości włącza buzzer. Zamiast niego podłączyłem jedną diodę z linijki, i jeszcze zmieniłem trochę zakres odległości, wszystko działało. To ten powyżej, który działał z jedną diodą. Ale kiedy kombinowałem aby zaprogramować tym sposobem kolejną diodę, ciągle wyskakuje mi błąd w programie.😕 Załączam zdjęcie, może coś źle połączyłem?

457319420_arduino2.thumb.jpg.3e0747070636fefe5859940d093479b4.jpg1016052041_arduino1.thumb.jpg.54c5c4c7573b7b2af9b706887110b36e.jpgarduino.thumb.jpg.d16a909d1a1b01336bad77b9aa6c0f35.jpg

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

Ale kiedy kombinowałem aby zaprogramować tym sposobem kolejną diodę, ciągle wyskakuje mi błąd w programie.😕

To zacznijmy od wyprostowania tego błędu - skopiuj jego dokładną treść i pokaż nam na forum 🙂

  • Lubię! 1
Link to post
Share on other sites
(edytowany)
#define sonar 12
#define odczyt 11 
#define brzeczyk 8
#define zasieg 100
#define czestotliwosc 20

void setup() {
  Serial.begin(9600);
  pinMode(sonar, OUTPUT);
  pinMode(odczyt,INPUT);
  pinMode(brzeczyk, OUTPUT);

  Serial.begin(9600);
}

void loop() {
  digitalWrite(sonar, LOW);
  delayMicroseconds(2);
  digitalWrite(sonar, HIGH);
  delayMicroseconds(10);
  digitalWrite(sonar, LOW);
  
  float czas = pulseIn(odczyt, HIGH);
  float dystans = czas/58;
  if (dystans>400){
    dystans = 400;
  }
    Serial.print(dystans);
    Serial.println(" cm");

  if (dystans<zasieg){
    digitalWrite(brzeczyk, HIGH);
    delay (100);
    digitalWrite(brzeczyk, LOW);
    delay (dystans*czestotliwosc);
  }
  delay(50);  
}

Gdyby ktoś był zainteresowany, przerobiłem w prosty sposób program z kursu na czujnik parkowania. W obecnej wersji działa na 1 metr ale można przestawić w zależności od upodobań 🙂 Aczkolwiek nie wiem czemu nie działa na zasilaniu baterią. W sensie, niezależnie od odległości odgłos jest jak przy odległości rzędu 1 cm. Ma ktoś jakiś pomysł?

Edytowano przez Slawekg2007
  • Lubię! 1
Link to post
Share on other sites

@Slawekg2007 fajnie że działasz coś we własnym zakresie, super!

10 godzin temu, Slawekg2007 napisał:

W sensie, niezależnie od odległości odgłos jest jak przy odległości rzędu 1 cm. Ma ktoś jakiś pomysł?

A mógłbyś wrzucić zdjęcie układu?

Link to post
Share on other sites

@Slawekg2007 Przepraszam, że odpisuję późno - w weekendy unikam komputera. Spróbuj podłączyć do pinu analogowego np 9 i zamiast digitalWrite użyć analogWrite i ustawiać PWM zależny od odległości nie twardego warunku IF.

  • Pomogłeś! 1
Link to post
Share on other sites
(edytowany)

@Gieneq Dzięki za pomoc, przełączenie na 9ty pin rozwiązało problem 🙂 Nie bardzo jednak rozumiem jak ustawić " PWM zależny od odległości nie twardego warunku IF", jako że używam Go wyłącznie aby włączał się w odległości 1 metra. Tak więc jak byś chciał to możesz rozwinąć myśl lub zaprezentować przykładowe rozwiązanie, aczkolwiek skoro już działa to nie musisz 🙂 Zrobiłem takie coś, ale nie wiem czy to o to chodziło. W każdym razie IFów nie ma a na dystansie krótszym niż 10 cm działa nieprzerwanie 🙂
 

#define sonar 12
#define odczyt 11 
#define brzeczyk 9
#define zasieg 100
#define czestotliwosc 5
#define plynny 10


float czas;
float dystans;
void setup() {
  pinMode(sonar, OUTPUT);
  pinMode(odczyt,INPUT);
  pinMode(brzeczyk, OUTPUT);
}
void zmierzDystans(){
  analogWrite(sonar, LOW);
  delayMicroseconds(2);
  analogWrite(sonar, HIGH);
  delayMicroseconds(10);
  analogWrite(sonar, LOW);
     czas = pulseIn(odczyt, HIGH);
     dystans = czas/58;
}

void loop() {

  zmierzDystans();
  
  while (dystans<zasieg && dystans > plynny ){
    zmierzDystans();
    analogWrite(brzeczyk, HIGH);
    delay (100);
    analogWrite(brzeczyk, LOW);
    delay (dystans*czestotliwosc);
  }
  while (dystans < plynny ){
    zmierzDystans();
    analogWrite(brzeczyk, HIGH);
  }
  delay(50);  
}

 

Edytowano przez Slawekg2007
  • Lubię! 1
Link to post
Share on other sites

@Slawekg2007 Możesz łatwo przekształcić dystans w jasność. Załóżmy że dystans mieści się w zakresie 0-100cm, a PWM jest od 0-255. Najpierw ogranicz dystans żeby nie było problemów czyli robisz ifa:

if(dystans > 100)
  dystans = 100;

I teraz przeskaluj jedną wartość w drugą mapą:

jasnosc = map(dystans,0,100,0,255);

Gotowe 🙂 

Link to post
Share on other sites
(edytowany)

Świetny kurs - jak wszystkie inne które na Forbocie przerabiałem - dużo wiedzy podanej w przystępny dla laika sposób. 

Jednakże wszyscy jesteśmy ludźmi i popełniamy błędy 😉 , w tekst lekcji wkradł się taki:
 

Cytat

Zwróć uwagę, że w pętli loop() {} wpisaliśmy nazwę naszej zmiennej (już bez przedrostka void).

tu powinno być nazwę naszej funkcji a nie zmiennej.

Edytowano przez Raccoon
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

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.