Skocz do zawartości

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


Komentator

Pomocna odpowiedź

Dzięki za przywitanie i szybką odpowiedź. Podesłałbym szybciej te zdjęcie, ale zacząłem montować coś zupełnie innego na płytce stykowej i dopiero teraz mam ją wolną, aczkolwiek wątpię, żeby w czymkolwiek pomogło... Czujnik podpinałem również bezpośrednio przez wtyki żeńskie, ale to też nic nie zmieniło, więc to nie wina styków. Szkoda, że nie mam aktualnie dostępu do oscyloskopu, multimetrem za wiele nie udało mi się wybadać. No ale to zapewne wina układu czujnika - może jakaś wada produkcyjna, albo coś gdzieś przypadkowo zwarłem. 😕

Link do komentarza
Share on other sites

artoroPL, nie wiem, czy dobrze widzę, ale czy przypadkiem nie masz wpiętych sygnałów z czujnika do pinów nr 10 i 11? W programach z kursu korzystamy z 11 i 12 🙂 Jeśli źle to odczytałem, to faktycznie reszta wygląda dobrze - pozostaje chyba kontakt ze sprzedawcą i wymiana czujnika.

Link do komentarza
Share on other sites

Mam pytanie, zbudowałem sprawny układ do zadania 9.3, aczkolwiek jedna rzecz mnie ciekawi, podczas pomiarów odległości do przeszkody, co jakiś czas diody gasną ( po prostu czujnik zwraca liczbę 0 ). Co sprawia, że czujnik wskazuje 0, mimo że przeszkoda jest nieruchoma. Jak rozwiązać ten problem?

Link do komentarza
Share on other sites

Dolin, wiele zależy od warunków i otoczenia, w którym dokonuje się pomiarów. Czasami delikatne poruszenie może wpływać na wyniki pomiarów lub coś zwyczajnie nie styka 😉 Pamiętaj, że czujniki ultradźwiękowe mają dość duży kąt widzenia, więc czasami może on zauważać coś innego od przeszkody np. podłogę/stół na którym stoi etc.

Link do komentarza
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

Witam,

Siedzę jakiś czas z nad prostym zegarem z wykorzystaniem lcd 1602, modułem rtc DS3231 i czujnikiem HC-SR04. Idea jest taka: zegar zamontowany w kuchni pod szafką kuchenną i jak podchodzę to zaświeca podświetlenie tak, że można odczytać czas, dzień tygodnia i datę. Wykorzystałem kod z pomiaru odległości i włączania buzera (zamiast buzera włącza podświetlenie lcd z pinu 8) i działa to ok. Jak koduje sam zegar to też jest ok. (czas i dzień tygodnia w pierwszym wierszu a data w drugim). Wyświetla wszystko zgodnie z oczekiwaniami. Natomiast jak próbuję połączyć to wszystko razem to niestety sypie się wyświetlanie danych, podświetlanie (reakcja na ruch) jest ok. Wyświetla tylko z przewijaniem. Nie wyświetla czasu i daty tak jak powinno.

Byłbym wdzięczny za sugestie jak to mogę poprawić.

Poniżej kod:

 

#define trigPin 12
#define echoPin 11
#include <LiquidCrystal.h>
LiquidCrystal lcd(1, 2, 4, 5, 6, 7);
#include <DS3231.h>
DS3231  rtc(SDA, SCL);


void setup() {
 rtc.begin(); 
 lcd.begin(16, 2); 
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
 pinMode(echoPin, INPUT); //a echo, jako wejście
 pinMode(8, OUTPUT); //Wyjście dla buzzera - podswietlenie lcd

}

void loop() {  

 zakres(15, 50); //Włącz alarm, jeśli w odległości od 10 do 25 cm od czujnika jest przeszkoda  
 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, LOW); //Włączamy buzzer
 } else {
     digitalWrite(8, HIGH); //Wyłączamy buzzer, gdy obiekt poza zakresem
 }

{

 lcd.setCursor(0,0);
 lcd.print("Czas: ");
 lcd.print(rtc.getTimeStr());

 lcd.setCursor(0,1);
 lcd.print("Data: ");
 lcd.print(rtc.getDateStr());


//  lcd.clear();  
}

}

Link do komentarza
Share on other sites

Witam. Chciałem zrobić układ, który mierzy odległość i wyświetla ją na lcd lecz gdy podłączam do 5V Arduino się wyłączało. Chciałem podłączyć baterię i ciągnąć z Vin ale ekran dalej nie świeci.

Link do komentarza
Share on other sites

lordolo, bez konkretnego schematu ciężko coś doradzić. Nie wiadomo, co gdzie i jak dokładnie podłączałeś. Jeśli Arduino się "wyłączyło", to prawdopodobnie robiłeś gdzieś zwarcie 😉 Możesz dokładniej opisać co próbowałeś zrobić?

Link do komentarza
Share on other sites

zadanie 9.1

#define czerwona 9
int czas = 10;
void setup() {
pinMode(czerwona, OUTPUT);// ustawienie pina jako wyjście
}
void pulsacja(){
 for(int a = 0; a <= 255; a++){// rozjaśniamy diodę
   analogWrite(czerwona, a);
   delay(czas);
 }
 for(int a = 255; a >= 0; a--){// przygaszamy diodę
   analogWrite(czerwona, a);
   delay(czas);
 }
}
void loop() {
 pulsacja();// uruchamiamy program

}

zadanie 9.2

#define czerwona 9
void setup() {
 pinMode(czerwona, OUTPUT);// ustawienie pinu jako wyjście
 zamigaj(300,1000,5);// nadanie argumentów dla zamigaj i odpalenie programu

}
void zamigaj(int czas, int Czas, int ile){
 for(int a = 0; a < ile; a++){
   digitalWrite(czerwona, HIGH);
   delay(czas);// swieci 300 milisek
   digitalWrite(czerwona, LOW);
   delay(Czas);// gaśnie 1 sec
 }
}

void loop() {

}

zadanie 9.3

String odpis = "";
String Odpis = "";
String dane = "";
int naszeA = 0;
int naszeB = 0;
int naszeC = 0;
int wpis = 0;
void setup() {
 Serial.begin(9600);// Połączenie z komputerem  
 Serial.print("Ktore zadanie chcesz zrobic:\n");
 Serial.println("pole prostokąta wpisz 1 i wcisnij enter");
 Serial.println("pole trujkąta wpisz 2 i wcisnij enter");
 Serial.println("pole koła wpisz 3 i wcisnij enter ");

}
int prostokat(int a, int b){//obliczamy pole prostokąta
 int wynik = 0;
 wynik = a * b;
 return wynik; 
}
float trujkat(int a, int b){//obliczamy pole trójkąta
 float wynik = 0;
 wynik = 0.5 * a * b;
 return wynik;
}
float kolo(int c){//obliczamy pole kola
 float wynik = 0;
 wynik = PI*c*c;
 return wynik;
}
int liczbaA(){// nadajemy do wzoru liczbę a 
   while(naszeA == 0){
     odpis = Serial.readStringUntil('\n');
     naszeA = odpis.toInt();  
   }
   Serial.flush(); 
   Serial.print(naszeA);
   Serial.print("*");
   return naszeA;
}
int liczbaB(){// nadajemy do wzoru liczbę b
   while(naszeB == 0){
    Odpis = Serial.readStringUntil('\n');
    naszeB = Odpis.toInt(); 
   }
   Serial.flush();
   Serial.println(naszeB);
   return naszeB;
}
int liczbaC(){// nadajemy do wzoru liczbę c
   while(naszeC == 0){
    dane = Serial.readStringUntil('\n');
    naszeC = dane.toInt();
   }
   Serial.flush();
   Serial.print(naszeC);
   Serial.println("^2");
   return naszeC;
}
void wynikProstokata(){
  Serial.print("Podaj dane by obliczyc pole prostokata\n");
  Serial.println("Wzór:");
  Serial.println("P = a*b");
  Serial.println("wpisz zmienna a nastepnie wcisnij enter potem wpisz b i wcisnij enter");
  Serial.print("P=");
  liczbaA();
  liczbaB();
  int wynik = prostokat(naszeA,naszeB);
  Serial.println("wynik");
  Serial.println(wynik);
  Serial.println("jesli chcesz obliczać wpisz numer zadania");
  naszeA = 0;
  naszeB = 0;
}
void wynikTrujkata(){
   Serial.print("Podaj dane by obliczyc pole trujkata\n");
   Serial.println("Wzór");
   Serial.println("P = 1/2*a*h");
   Serial.println("wpisz zmienna a nastepnie wcisnij enter potem wpisz h i wcisnij enter");
   Serial.print("P=1/2*");
   liczbaA();
   liczbaB();
   float wynik = trujkat(naszeA,naszeB);
   Serial.println("wynik");
   Serial.println(wynik);
   Serial.println("jesli chcesz obliczać wpisz numer zadania");
   naszeA = 0;
   naszeB = 0;
}
void wynikKola(){
   Serial.print("Podaj dane by obliczyc pole kola\n");
   Serial.print("Wzór\n P=");
   Serial.print(PI);
   Serial.println("*r^2");
   Serial.println("wpisz zmienna r i wcisnij enter");
   Serial.print("P=");
   Serial.print(PI);
   Serial.print("*");
   liczbaC();
   float wynik = kolo(naszeC);
   Serial.println("wynik");
   Serial.println(wynik);
   Serial.println("jesli chcesz obliczać wpisz numer zadania");
   naszeC = 0;
}
void loop() {
 if(Serial.available() > 0){//sprawdzamy czy coś jest buforze
   wpis = Serial.read();
   switch(wpis){// nadajemy możliwość wybrania zadania
     case '1':
      wynikProstokata();  
      break; 
    case '2':
      wynikTrujkata();
      break;
    case '3':
      wynikKola();
      break;
 }
}
}

zadanie 9.4

#define triger 9
#define echo 10
#define glosnik 8
#define czerwona 2
#define Czerwona 3
#define zolta 4
#define Zolta 5
#define zielona 6
#define Zielona 7
void setup() {
 Serial.begin(9600);
 pinMode(triger, OUTPUT);// ustawienie nadajnika jako wyjscie
 pinMode(echo, INPUT);// ustawienie odbiornika jako wejscie
 pinMode(glosnik, OUTPUT);// nasz piszczek jako wyjscie
 pinMode(czerwona, OUTPUT);// ustawienie linijki jako wyjscia
 pinMode(Czerwona, OUTPUT);
 pinMode(zolta, OUTPUT);
 pinMode(Zolta, OUTPUT);
 pinMode(zielona, OUTPUT);
 pinMode(Zielona, OUTPUT);
}
int dalekościomierz(){// wyliczenie dystansu
 long czas, dystans;
 digitalWrite(triger, LOW);
 delayMicroseconds(2);
 digitalWrite(triger, HIGH);
 delayMicroseconds(10);
 digitalWrite(triger , LOW);
 czas = pulseIn(echo, HIGH);
 dystans = czas /58;// zamiana na cm 
 return dystans;
}

void zakres(int a, int b){// zakres działania piszczka
 int jakDaleko = dalekościomierz();
 if ((jakDaleko > a)&&(jakDaleko < b)){
   digitalWrite(glosnik, HIGH);
 }
   else{
     digitalWrite(glosnik, LOW);
   }
 }
void odlegloscLED(){// nasza linijka sterowana odległością
 digitalWrite(czerwona, LOW);
 digitalWrite(Czerwona, LOW);
 digitalWrite(zolta, LOW);
 digitalWrite(Zolta, LOW);
 digitalWrite(zielona, LOW);
 digitalWrite(Zielona, LOW);
 int odleglosc = dalekościomierz();
 odleglosc = map(odleglosc, 2,50,1,6);// dziele odległość na części  
 switch(odleglosc){
   case 1:
   digitalWrite(czerwona, HIGH);
   break;
   case 2:
   digitalWrite(Czerwona, HIGH);
   break;
   case 3:
   digitalWrite(zolta, HIGH);
   break;
   case 4:
   digitalWrite(Zolta, HIGH);
   break;
   case 5:
   digitalWrite(zielona, HIGH);
   break;
   case 6:
   digitalWrite(Zielona, HIGH);
   break;  
 }
}
void loop(){
 zakres(2, 50);
 odlegloscLED();
 delay(100);

}

[ Dodano: 15-02-2018, 19:10 ]

zadanie dodatkowe przez kolegę z pracy 😉

Wyświetl odległość na wyświetlaczu

To zrobiłem i chciałem się pochwalić wam

Program :

#include <LiquidCrystal.h>// uruchomienie biblioteki 
LiquidCrystal wyswietlacz(2,3,4,5,6,7);//wskazanie pinów wyświetlaczowi
#define triger 12// nadajnik
#define echo 13// odbiornik
void setup() {
 Serial.begin(9600);// polaczenie z komputerem by sprawdzić czy działa prawidłowo
 pinMode(triger, OUTPUT);
 pinMode(echo, INPUT);
 wyswietlacz.begin(16,2);
 wyswietlacz.clear();
 wyswietlacz.setCursor(0,0);
 wyswietlacz.print("Dalekosciomierz");
 wyswietlacz.setCursor(5,1);
 wyswietlacz.print("000 cm");

}
int dalekosciomierz(){// obliczanie odległości
 long czas, dystans;
 digitalWrite(triger, LOW);
 delayMicroseconds(2);
 digitalWrite(triger, HIGH);
 delayMicroseconds(10);
 digitalWrite(triger , LOW);
 czas = pulseIn(echo, HIGH);// próbkowanie odległości 
 dystans = czas /58;// zamienianie na cm
 dystans = dystans + 7.8;// to dodatkowo by mozna bylo liczyć od początku płytki
 if(dystans > 400){// zabezpieczenie by nie pokazywał głupot
   dystans = 400;
 }
 Serial.println(dystans);
 delay(100);
 return dystans;
}
void wyswietlaczLED(){// wyświetlanie odległości
int odleglosc = dalekosciomierz();
if(odleglosc <= 9){// liczymy 1 cyfrę
  wyswietlacz.setCursor(7,1);
  wyswietlacz.print(odleglosc);
}
if((odleglosc > 9)&&(odleglosc <= 99)){// liczymy 2 cyfrę od lewej
   wyswietlacz.setCursor(6,1);
   wyswietlacz.print(odleglosc);
}
   else{
     wyswietlacz.setCursor(6,1);
     wyswietlacz.print("0");

 }
if((odleglosc > 99)&&(odleglosc <= 999)){// liczymy 3 cyfrę od lewej
   wyswietlacz.setCursor(5,1);
   wyswietlacz.print(odleglosc);
}
   else{
     wyswietlacz.setCursor(5,1);
     wyswietlacz.print("0");
   }

}
void loop(){
 wyswietlaczLED();// wyświetlamy wynik
 delay(100);

}

Schemat połączenia :

A tak działa:

Link do komentarza
Share on other sites

krzysiekde3, witaj na forum 🙂 Wywołując funkcję "mówimy Arduino", aby wykonało pewien ciąg instrukcji, który znajduje się wewnątrz funkcji. W tym wypadku dokonujemy pomiaru odległości i przeliczamy go na centymetry. Funkcja kończy się zwróceniem wyniku, czyli przekazaniem obliczonej wartości z powrotem do programu (wynik jest podstawiony w miejscu, w którym wywołaliśmy funkcję). Jeśli funkcja nie zwracałaby żadnej wartości to program nie wiedziałby jaki dystans został zmierzony. Czego dokładnie tutaj nie rozumiesz?

Link do komentarza
Share on other sites

Cześć 🙂

9.3. Działa jak powinno



#define trig 11
#define echo 12


#define dioda1 1
#define dioda2 2
#define dioda3 3
#define dioda4 4
#define dioda5 5
#define dioda6 6



void setup() {
 Serial.begin(9600);
 pinMode(echo, INPUT);
 pinMode(trig, OUTPUT);
 pinMode(dioda1, OUTPUT);
 pinMode(dioda2, OUTPUT);
 pinMode(dioda3, OUTPUT);
 pinMode(dioda4, OUTPUT);
 pinMode(dioda5, OUTPUT);
 pinMode(dioda6, OUTPUT);
}

void loop() {
   int zakres= map(jakdaleko(),3,80,6,1);        // zmapowane tak zeby pokazywalo dystans od 3 do 80 cm na 6 diodach. 6 najblizej, 1 najdalej.
  // Serial.println(zakres); 
         zgaswszystkie();                        //w przypadku gdy diod zapalonych bylo 5 a wskaznik ma wskazac np.3, efekt nie bylby widoczny
         zaswiec(zakres);                        //zaswiecenie odpowiedniej liczby diod (zalezna od zmiennej zakres)
         delay(50);

}




int jakdaleko () {                              //funkcja oddajaca odleglosc
     long czas, odleglosc;
     digitalWrite(trig, LOW);
     delayMicroseconds(2);
     digitalWrite(trig, HIGH);
     delayMicroseconds(10);
     digitalWrite(trig, LOW);

     czas= pulseIn(echo, HIGH);
     odleglosc= czas/58;
     //    Serial.println(odleglosc);           //do sprawdzenia zakresu
     return(odleglosc);                        //oddanie wartosci
}





void zgaswszystkie() {                            //funkcja gaszaca wszystkie diody
 digitalWrite(dioda1, LOW);
 digitalWrite(dioda2, LOW);
 digitalWrite(dioda3, LOW);
 digitalWrite(dioda4, LOW);
 digitalWrite(dioda5, LOW);
 digitalWrite(dioda6, LOW);
}




void zaswiec(int zaswiecile) {                        //funkcja zapalajaca odpowiednia liczbe diod, jako argument liczba diod
 for (int i=0; i<=zaswiecile; i++) {
  // Serial.print("zapalam"); Serial.println(i);
   digitalWrite(i,HIGH);
 }
}

Mam pytanie odnośnie funkcji która zapala odpowiednią liczbę diod

void zaswiec(int zaswiecile) {                        //funkcja zapalajaca odpowiednia liczbe diod, jako argument liczba diod
 for (int i=0; i<=zaswiecile; i++) {
  // Serial.print("zapalam"); Serial.println(i);
   digitalWrite(i,HIGH);
 }
}

W tym przypadku mogłem tak zrobić. Diody są po kolei. Co w przypadku gdyby z niewiadomych przyczyn nie mógł mieć ich wpiętych po kolei?

Myślałem o zmianie "indeksu". Wtedy odpowiednio zadeklarowane na początku diody mogę podpiąć prawie dowolnie.

Na przykład tak.

digitalWrite(diodai,HIGH);

Chcę, żeby zmieniało się samo "i". Czy jest to wykonalne? 🙂

Link do komentarza
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.