Skocz do zawartości

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


Pomocna odpowiedź

(edytowany)

Poniżej mój program z linijką, w której diody będą się rozświetlają stopniowo tzn. pierwsza zacznie świecić coraz mocniej od 128 cm, przy 64 będzie świecić pełną mocą, i wtedy kolejna dioda zacznie się rozświetlać itd.

Skorzystałem z tablic (których jeszcze na kursie nie było) - tablice i pętle pozwoliły znacznie skrócić program 🙂.

Funkcja constrain() przy obliczaniu jasności diody użyta bo funkcja analogWrite() nie robi tego sama - zakłada, że wartość drugiego argumentu będzie z przedziału 0 - 255. To dziwne moim zdaniem, że przyjmuje argument value typu int podczas gdy mogłyby być to argument typu byte i wtedy wszystko byłoby jasne 😉.

#define trigger 12
#define echo 13

#define g1 3
#define g2 5
#define g3 6
#define y1 9
#define y2 10
#define r1 11

#define magicNumber 58 //to calculate distance from time

int diodes[] = {g1, g2, g3, y1, y2, r1};
int distances[] = {128, 64, 32, 16, 8, 4, 2};

void setup() {
  //setting pins for HC-SR04
  pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  //setting pins for diodes
  for (int i = 0; i < 6; i++) {
    pinMode(diodes[i], OUTPUT);
  }
}

void loop() {
  int distance = measureDistance();
  for (int i = 0; i < 6; i++) {
    setBrightness(i, distance);
  }
  delay(200);
}

int measureDistance() {
  long time, distance;
  digitalWrite(trigger, LOW);
  delayMicroseconds(2);
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW);

  time = pulseIn(echo, HIGH);
  distance = time / magicNumber;
  return distance;
}

void setBrightness(int index, int distance) {
  int mappedDistance = map(distance, distances[index], distances[index + 1], 0, 255);
  int brightness = constrain(mappedDistance, 0, 255);
  analogWrite(diodes[index], brightness);
}

I na dodatek filmik jak to działa

linijka.thumb.gif.2bd60dff1be3f0fbed97fde4ba0bd52b.gif

Edytowano przez Raccoon
dodany film
  • Lubię! 1
Link to post
Share on other sites

@Raccoon fajnie że kombinujesz, funkcja setBrightness wygląda bardzo ładnie 🙂 faktycznie tablice mogą tu znacznie uprościć zadanie.

Dnia 13.02.2021 o 17:28, Raccoon napisał:

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

Dziękujemy za zwrócenie uwagi, poprawimy niebawem 🙂 Choć nie jest to ogromny błąd, a nawet nieco prawdy - sama nazwa funkcji jest można powiedzieć zmienną, bo nazwa ta to wskaźnik na funkcję.

Link to post
Share on other sites

Ciekawostka !!!!

Po przystawieniu różnych rzeczy jak np: koc lub zeszyt od którego odbija się fala mamy różne odczyty ale najciekawsze  🤔🤔🤔🤔    jest to że przy odpowiednim koncie ustawienia np : książki czujnik pokazuje nam inne wartości (183 cm i więcej  ) a  przy ustawieniu książki w tym samym miejscu tylko pozycji pionowej    mamy np: 10  cm).

A odnośnie kursu to dla mnie rewelacja. Naprawdę świetnie zrobiony. 

Link to post
Share on other sites

@tomekk06 tak zgadza się, różne materiały mają różny współczynnik pochłaniania, pod różnymi katami są też inne odbicia więc te wyniki będą się różnić. Bez kalibracji taki czujnik działa orientacyjnie 🙂 

8 godzin temu, tomekk06 napisał:

A odnośnie kursu to dla mnie rewelacja. Naprawdę świetnie zrobiony. 

To bardzo dziękujemy! 🙂 

Link to post
Share on other sites

9.3 Chciałem powtórzyć własne zmienne program działa dobrze.

#define trigPin 12
#define echoPin 11

void setup(){
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(8, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(9, OUTPUT);
  
  
}
void loop(){
  zakres(5, 10);
  zakres2(11, 15);
  zakres3(16, 20);
  zakres4(21, 25);
  zakres5(26, 30);
  zakres6(31, 40);
  
  digitalWrite(8, LOW);
  digitalWrite(4, LOW);
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  digitalWrite(9, LOW);

  
}

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);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(9, HIGH);
      delay(10);
    }else{
      digitalWrite(8, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(9, LOW);
    }
  }
   void zakres2(int a, int b){
    int jakDaleko = zmierzOdleglosc();
    if((jakDaleko > a) && (jakDaleko < b)){
      digitalWrite(8, HIGH);
      digitalWrite(4, LOW);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(9, HIGH);
      delay(10);
    }else{
      digitalWrite(8, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(9, LOW);
    }
  }

void zakres3(int a, int b){
    int jakDaleko = zmierzOdleglosc();
    if((jakDaleko > a) && (jakDaleko < b)){
      digitalWrite(8, HIGH);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      digitalWrite(9, HIGH);
      delay(10);
    }else{
      digitalWrite(8, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(9, LOW);
    }
  }
  void zakres4(int a, int b){
    int jakDaleko = zmierzOdleglosc();
    if((jakDaleko > a) && (jakDaleko < b)){
      digitalWrite(8, HIGH);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, HIGH);
      digitalWrite(9, HIGH);
      delay(10);
    }else{
      digitalWrite(8, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(9, LOW);
    }
  }
  void zakres5(int a, int b){
    int jakDaleko = zmierzOdleglosc();
    if((jakDaleko > a) && (jakDaleko < b)){
      digitalWrite(8, HIGH);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(9, HIGH);
      delay(10);
    }else{
      digitalWrite(8, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(9, LOW);
    }
  }
 void zakres6(int a, int b){
    int jakDaleko = zmierzOdleglosc();
    if((jakDaleko > a) && (jakDaleko < b)){
      digitalWrite(8, HIGH);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(9, LOW);
      delay(10);
    }else{
      digitalWrite(8, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      digitalWrite(9, LOW);
    }
  }
  

 

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.