Skocz do zawartości

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


Pomocna odpowiedź

(edytowany)
21 minut temu, ARDIP napisał:

Czy taka sytuacja wynika z błędów w programie, czy czego innego ?

Co się stanie, jeżeli howFar jest równy idealnie 50 (dla przytoczonego przez Ciebie przykładu)? [przeanalizuj kod]

Edytowano przez H1M4W4R1
  • Lubię! 1
#define trigPin 12
#define echoPin 11
#define Red2 3
#define Red1 4
#define Yellow2 5
#define Yellow1 6
#define Green2 7
#define Green1 8

void setup() {
  Serial.begin(9600); //UART speed transmission set
  pinMode(trigPin, OUTPUT); //Pin that trig is setting as output
  pinMode(echoPin, INPUT); //Pin that echo is setting as input
  pinMode(2, OUTPUT); //Pin that buzzer is setting as output
  pinMode(Red1, OUTPUT); //Diodes pins show the distance by displaying colours
  pinMode(Red2, OUTPUT);
  pinMode(Yellow1, OUTPUT);
  pinMode(Yellow2, OUTPUT);
  pinMode(Green1, OUTPUT);
  pinMode(Green2, OUTPUT);
}

void loop() {
  range(0, 60); //Turn on alarm if in distance 0-60 cm from sensor is any object
  delay(10); //Time delay
}

int distanceMeasure() {
  long time, distance; //Define variables for distance and time 

  digitalWrite(trigPin, LOW); //Turn off trigPin
  delayMicroseconds(2); //Time delay
  digitalWrite(trigPin, HIGH); //Turn on trigPin 
  delayMicroseconds(10); //Time delay
  digitalWrite(trigPin, LOW); //Turn off trigPin

  time = pulseIn(echoPin, HIGH); //Time count
  distance = time/58; //Distance count
  
  return distance;
}

void range(int a, int b) {
  int howFar = distanceMeasure(); //Assignment to howFar variable
  if((howFar > 50) && (howFar < b)) { //Distance between 50-60 cm
    Led1(); //Function call
    Buzz1(); //Function call
  } else if((howFar > 40) && (howFar <= 50)) { //Distance between 40-50 cm
    Led2(); //Function call
    Buzz2(); //Function call
  } else if((howFar > 30) && (howFar <= 40)) { //Distance between 30-40 cm
    Led3(); //Function call
    Buzz3(); //Function call
  } else if((howFar > 20) && (howFar <= 30)) { //Distance between 20-30 cm
    Led4(); //Function call
    Buzz4(); //Function call
  } else if((howFar > 10) && (howFar <= 20)) { //Distance between 10-20 cm
    Led5(); //Function call
    Buzz5(); //Function call
  } else if((howFar > a) && (howFar <= 10)) { //Distance between 0-10 cm
    Led6(); //Function call
    Buzz6(); //Function call
  } else { //Distance more than 60 cm
    Led7(); //Function call
    Buzz7(); //Function call
  }
}

void Led1() { //Distance between 50-60 cm
  digitalWrite(Green1, HIGH); //Turn on only diode Green1 
  digitalWrite(Green2, LOW);
  digitalWrite(Yellow1, LOW);
  digitalWrite(Yellow2, LOW);
  digitalWrite(Red1, LOW);
  digitalWrite(Red2, LOW);
}
void Led2() { //Distance between 40-50 cm
  digitalWrite(Green1, HIGH); //Turn on diodes Green1 & Green2 
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow1, LOW);
  digitalWrite(Yellow2, LOW);
  digitalWrite(Red1, LOW);
  digitalWrite(Red2, LOW);
}
void Led3() { //Distance between 30-40 cm
  digitalWrite(Green1, HIGH); //Turn on diodes Green1, Green2 & Yellow1 
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Yellow2, LOW);
  digitalWrite(Red1, LOW);
  digitalWrite(Red2, LOW);
}
void Led4() { //Distance between 20-30 cm
  digitalWrite(Green1, HIGH); //Turn on diodes Green1, Green2, Yellow1 & Yellow2 
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red1, LOW);
  digitalWrite(Red2, LOW);
}
void Led5() { //Distance between 10-20 cm
  digitalWrite(Green1, HIGH); //Turn on diodes Green1, Green2, Yellow1, Yellow2 & Red1 
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red1, HIGH);
  digitalWrite(Red2, LOW);
}
void Led6() { //Distance between 0-10 cm
  digitalWrite(Green1, HIGH); //Turn on diodes Green1, Green2, Yellow1, Yellow2, Red1 & Red2 
  digitalWrite(Green2, HIGH);
  digitalWrite(Yellow1, HIGH);
  digitalWrite(Yellow2, HIGH);
  digitalWrite(Red1, HIGH);
  digitalWrite(Red2, HIGH);
}
void Led7() { //Distance more than 60 cm
  digitalWrite(Red1, LOW); //Turn off all diodes
  digitalWrite(Red2, LOW);
  digitalWrite(Yellow1, LOW);
  digitalWrite(Yellow2, LOW);
  digitalWrite(Green1, LOW);
  digitalWrite(Green2, LOW);
}

void Buzz1() { //Distance between 50-60 cm
  digitalWrite(2, HIGH); //Buzzer on
  delay(300); //Interval time between impulses
  digitalWrite(2, LOW); //Buzzer off
  delay(300); //Interval time between impulses
}
void Buzz2() { //Distance between 40-50 cm
  digitalWrite(2, HIGH); //Buzzer on
  delay(150); //Interval time between impulses
  digitalWrite(2, LOW); //Buzzer off
  delay(150); //Interval time between impulses
}
void Buzz3() { //Distance between 30-40 cm
  digitalWrite(2, HIGH); //Buzzer on
  delay(100); //Interval time between impulses
  digitalWrite(2, LOW); //Buzzer off
  delay(100); //Interval time between impulses
}
void Buzz4() { //Distance between 20-30 cm
  digitalWrite(2, HIGH); //Buzzer on
  delay(50); //Interval time between impulses
  digitalWrite(2, LOW); //Buzzer off
  delay(50); //Interval time between impulses
}
void Buzz5() { //Distance between 10-20 cm
  digitalWrite(2, HIGH); //Buzzer on
  delay(35); //Interval time between impulses
  digitalWrite(2, LOW); //Buzzer off
  delay(35); //Interval time between impulses
}
void Buzz6() { //Distance between 0-10 cm
  digitalWrite(2, HIGH); //Buzzer on
}
void Buzz7() { //Distance more than 60 cm
  digitalWrite(2, LOW); //Buzzer off
}

Zadanie 9.3 - drobne poprawki 🙂

  • Lubię! 2
  • 6 miesiące później...

Praca domowa 9.1

Napisz funkcję, która sprawia, że dioda będzie  pulsować (stopniowe przygaszanie i rozjaśnianie). Skorzystaj oczywiście z wiadomości zdobytych podczas lekcji o sygnale PWM.

int jasnoscdiody = 0; //jasnosc diody od 0-255 
int zmiana = 5; // zmiana jasnosci o 5

void setup() {
  pinMode(11, OUTPUT); //Konfiguracja pinu 13 jako wyjście PWM
  Serial.begin(9600);
}

void loop() {
  zamigajLED(); // uruchomienie void zamigajLED 
}

void zamigajLED() { //funkcja zamigaj led
	for (jasnoscdiody; jasnoscdiody <= 255; jasnoscdiody += zmiana) { // jezeli jasnosc diody jest ponizej 255 czyli 100% to jasnosc diody +5
	analogWrite(11, jasnoscdiody); //Spokojne rozświetlanie diody
	Serial.println(jasnoscdiody); // podglad w porcie szeregowym wysokosci wypelnienia 0-255
delay(50);
}
	for (jasnoscdiody >= 255; jasnoscdiody >= 0; jasnoscdiody -= zmiana) { // jezeli jasnosc diody =255 lub wiecej
	analogWrite(11, jasnoscdiody); //Spokojne sciemnianie diody
	Serial.println(jasnoscdiody); // podglad w porcie szeregowym wysokosci wypelnienia 0-255
delay(50);
}}
  

 

  • Lubię! 1

@PanMajster Czy ty przekopiowujesz niektóre funkcje? Pytam bo w tym i w innych kodach widzę funkcje z dołączonymi komentarzami nie na temat np. ta linijka:

pinMode(11, OUTPUT); //Konfiguracja pinu 13 jako wyjście PWM

 

Dnia 23.01.2025 o 18:14, BeeKeyPro napisał:

@PanMajster Czy ty przekopiowujesz niektóre funkcje? Pytam bo w tym i w innych kodach widzę funkcje z dołączonymi komentarzami nie na temat np. ta linijka:

pinMode(11, OUTPUT); //Konfiguracja pinu 13 jako wyjście PWM

 

Hej . Tak przyspieszam sobie prace korzystając z poprzednich prac domowych.  Czasem mam takie kwiatki jak w twoim cytacie 😛

(edytowany)

@PanMajster Nie polecam Ci czegoś takiego (przynajmniej na początku). Przepisując możesz sobie wbić do głowy nazwę funkcji - nie musisz jej potem szukać w poprzednich kodach, lub na internecie. 😉 

Edytowano przez BeeKeyPro

Zadanie 9.2

void setup() {
 
zamigajLED(150, 50, 15, 11);
}
void loop() {
}
void zamigajLED(int czasON, int czasOFF, int ile, int NumerPin){
  pinMode(NumerPin, OUTPUT); //Konfiguracja pinu x jako wyjście
  for (int i=0; i < ile; i++) {
    digitalWrite(NumerPin, LOW); //Włączenie diody pinem x
    delay(czasON); //Odczekanie czasu włączenia
    digitalWrite(NumerPin, HIGH); //Wyłączenie diody pinem x
    delay(czasOFF); //Odczekanie czasu wyłączenia
  }
}

 

Hej. Tym razem zadanie nr 9.3

Jak by ktoś rzucił okiem czy jest w miare OK

 

#define trigPin 12 // zdefiniowanie Pinu 12 jako trigger
#define echoPin 11 // zdefiniowanie Pinu 11 jako echo
int odczytanaWartosc = 0;

void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
  pinMode(echoPin, INPUT); //echo, jako wejście

  pinMode(5, OUTPUT);//Konfiguracja wyjść pod diody LED
  pinMode(6, OUTPUT);//Konfiguracja wyjść pod diody LED
  pinMode(7, OUTPUT);//Konfiguracja wyjść pod diody LED
  pinMode(8, OUTPUT);//Konfiguracja wyjść pod diody LED
  pinMode(9, OUTPUT);//Konfiguracja wyjść pod diody LED
  pinMode(10, OUTPUT);//Konfiguracja wyjść pod diody LED


}
void loop() {  
 
  Serial.print(zmierzOdleglosc()); //podglad wartości zmierzodleglosc
  Serial.println(" odleglosc");
  delay(200);

  odczytanaWartosc = zmierzOdleglosc(); 
  odczytanaWartosc = map(odczytanaWartosc, 5, 500, 1, 6); //Przeskalowanie wartości do 500cm ( czujnik łapie do ok 500 a potem skacze na 1200 (max). Nie zczytuje wartości pomiedzy 500 a 1200 stad takie skalowanie


  switch (odczytanaWartosc) { // funkcja linijki odleglości diody LED (im dalej tym wiecej diod świeci)
    case 1:
      digitalWrite(5, HIGH); 
      digitalWrite(6, LOW); 
      digitalWrite(7, LOW); 
      digitalWrite(8, LOW); 
      digitalWrite(9, LOW); 
      digitalWrite(10, LOW); 
    break;
    case 2:
      digitalWrite(5, HIGH); 
      digitalWrite(6, HIGH); 
      digitalWrite(7, LOW); 
      digitalWrite(8, LOW); 
      digitalWrite(9, LOW); 
      digitalWrite(10, LOW);  
    break;
    case 3:
      digitalWrite(5, HIGH); 
      digitalWrite(6, HIGH); 
      digitalWrite(7, HIGH); 
      digitalWrite(8, LOW); 
      digitalWrite(9, LOW); 
      digitalWrite(10, LOW);  
    break;
    case 4:
      digitalWrite(5, HIGH); 
      digitalWrite(6, HIGH); 
      digitalWrite(7, HIGH); 
      digitalWrite(8, HIGH); 
      digitalWrite(9, LOW); 
      digitalWrite(10, LOW);     
    break;
    case 5:
      digitalWrite(5, HIGH); 
      digitalWrite(6, HIGH); 
      digitalWrite(7, HIGH); 
      digitalWrite(8, HIGH); 
      digitalWrite(9, HIGH); 
      digitalWrite(10, LOW);    
    break;
    case 6:
      digitalWrite(5, HIGH); 
      digitalWrite(6, HIGH); 
      digitalWrite(7, HIGH); 
      digitalWrite(8, HIGH); 
      digitalWrite(9, HIGH); 
      digitalWrite(10, HIGH);   
    break;
    default: //Kod wykonywany jeśli żaden warunek nie był spełniony (czasem nie działał case6)
      digitalWrite(5, HIGH); 
      digitalWrite(6, HIGH); 
      digitalWrite(7, HIGH); 
      digitalWrite(8, HIGH); 
      digitalWrite(9, HIGH); 
      digitalWrite(10, HIGH);  
  break;
  }

  delay(50); //Opóźnienie
}


int zmierzOdleglosc() { //odczyt z czujnika odległości
  long czas, dystans;
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(15);
  digitalWrite(trigPin, LOW);
  czas = pulseIn(echoPin, HIGH);
  dystans = czas / 58;
  return dystans;
}

 

@PanMajster Jak 'ktoś ma rzucić okiem czy jest w miarę ok' ? , jak zrobiłeś zadanie i działa to dobrze, jak masz wątpliwości no napisz z czym. No powodzenia !

  • Lubię! 1

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