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

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

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ź😉

@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ś? 😉

#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

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

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

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

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

(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

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