Skocz do zawartości

Czujnik parkowania oparty o moduł ultradźwiękowy


Pomocna odpowiedź

Napisano

Witam,

dopiero zaczynam przygodę z arduino i postanowiłem że tak powiem skopiować najpierw ten projekt i sprawdzić czy działa, udało mi się wszystko się uruchomiło tylko teraz chciałbym to ulepszyć. jest mi ktoś w stanie wytłumaczyć jak dodać kolejne diody aby zapalały się po zmianie odległośći? chciałbym jeszcze wstawić tryb czuwania żeby cały czas nie musieć wyłączać zasilania. link do tematu http://technovade.pl/poradniki/zeszytprojektowyarduino/zpa-016.html

 

 

 

Możesz przeskalować odległość na zakres, odpowiadający liczbie diod i w pętli for zapalać ilość diod, proporcjonalną do odległości:

for(int i=0; i<odlegloscPrzeskalowana; i++){
          digitalWrite(numerDiody,HIGH);
          numerDiody++;
        }

 Jak dokładnie miałby działać ten tryb czuwania?

 

  • Lubię! 1

Ja bym tam dodal do tego kodu tablice w ktorej byly by wpisane nr pinow (wtedy nr nie musza byc systematyczne...czyli 1/2/3...a moga byc 1/5/7/13 itp...i uzywac jako indeksu zmiennej "i" z for...i dwie takie petle w "gore" i w "dol" i chodzi porzadnie...niech kolega @grabarz666 wrzuci tu swoj kod...

#include "LiquidCrystal.h"
#define pin_nadajnik 6  //Definicja pinu, do którego podłączamy nadajnik (pin TRIG)
#define pin_odbiornik 7 //Definicja pinu, do którego podłączamy odbiornik (pin ECHO)
#define pin_buzzer 1
#define dioda_ostrzegawcza 8
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Definicja pinów do których podłączamy wyprowadzenia ekranu

int odleglosc;          //Zmienna przechowująca odległość
long czas_impulsu = 0;  //Zmienna przechowująca czas trwania impulsu na pinie ECHO
 
void setup()
{
 lcd.begin(16,2); //Inicjalizacja pracy LCD
 pinMode(pin_nadajnik, OUTPUT);
 pinMode(pin_odbiornik, INPUT);
 pinMode(dioda_ostrzegawcza, OUTPUT);
 pinMode(dioda_ostrzegawcza, OUTPUT);
}
 
void loop()
{
 digitalWrite(pin_nadajnik, HIGH); //Wystawienie stanu wysokiego na pin nadajnika
 delayMicroseconds(10); //Czas trwania 10us
 digitalWrite(pin_nadajnik, LOW); //Wystawienie stanu niskiego na pin nadajnika
 
 czas_impulsu = pulseIn(pin_odbiornik, HIGH); //Czas trwania impulsu na pinie Echo
 odleglosc = czas_impulsu/58; //Wyznaczenie odległości w cm
}

//Zabezpieczenie przed przekroczeniem zakresu pomiarowego
  if ( odleglosc < 5 || odleglosc> 200 )
  {
   lcd.setCursor(0,0);
   lcd.print("Pomiar niedostepny");
  }
  
  else
  {
   lcd.setCursor(0,0);
   lcd.print("Odleglosc: ");
   lcd.setCursor(11,1);
   lcd.print(odleglosc);
   lcd.print("cm");
  }
   delay(1000);
   lcd.clear();

  //Sygnał dzwiękowy
  if (odleglosc<=20 && odleglosc>=10)
  {
   tone(pin_buzzer, 2000, 200);  
  }

  //Dioda ostrzegawcza
  
  if(odleglosc>50)
  {
   digitalWrite(dioda_ostrzegawcza, LOW);
  }
  if (odleglosc<50)
  {
    digitalWrite(dioda_ostrzegawcza, HIGH);
  {
   tone(pin_buzzer, 3000, 200);
    digitalWrite(dioda_ostrzegawcza, HIGH);
  }

mam to w ten sposób zrobione i działa, buzer jest fizycznie niepodłaczony bo go nie mam ale poza tym wszystko działa, zmodyfikować odległość żeby zapalała się dioda umiem ogarnąć, natomiast jak chce dodać kolejną to już mi to nie działa, bo docelowo chce dać 3 diody, czerowna zielona i żółta i w zależności od odległości będą się zapalały po kolei, tylko nie wiem jak to fizycznie ugryźć 

(edytowany)
#include "LiquidCrystal.h"
#define pin_nadajnik 6  //Definicja pinu, do którego podłączamy nadajnik (pin TRIG)
#define pin_odbiornik 7 //Definicja pinu, do którego podłączamy odbiornik (pin ECHO)
#define pin_buzzer 1
#define dioda_ostrzegawcza 8
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Definicja pinów do których podłączamy wyprowadzenia ekranu

int odleglosc;          //Zmienna przechowująca odległość
long czas_impulsu = 0;  //Zmienna przechowująca czas trwania impulsu na pinie ECHO
 
void setup()
{
 lcd.begin(16,2); //Inicjalizacja pracy LCD
 pinMode(pin_nadajnik, OUTPUT);
 pinMode(pin_odbiornik, INPUT);
 pinMode(dioda_ostrzegawcza, OUTPUT);
 pinMode(9, OUTPUT);
}
 
void loop()
{
 digitalWrite(pin_nadajnik, HIGH); //Wystawienie stanu wysokiego na pin nadajnika
 delayMicroseconds(10); //Czas trwania 10us
 digitalWrite(pin_nadajnik, LOW); //Wystawienie stanu niskiego na pin nadajnika
 
 czas_impulsu = pulseIn(pin_odbiornik, HIGH); //Czas trwania impulsu na pinie Echo
 odleglosc = czas_impulsu/58; //Wyznaczenie odległości w cm


//Zabezpieczenie przed przekroczeniem zakresu pomiarowego
  if ( odleglosc < 5 || odleglosc> 200 )
  {
   lcd.setCursor(0,0);
   lcd.print("Pomiar niedostepny");
  }
  
  else
  {
   lcd.setCursor(0,0);
   lcd.print("Odleglosc: ");
   lcd.setCursor(11,1);
   lcd.print(odleglosc);
   lcd.print("cm");
  }
   delay(1000);
   lcd.clear();

  //Sygnał dzwiękowy
  if (odleglosc<=20 && odleglosc>=10)
  {
   tone(pin_buzzer, 2000, 200);  
  }

 static byte tab[3] = {8,9,4}; //ledy piny

byte skala = map(odleglosc, 0, 190, 0, 3);

for (byte i = 0; i < skala; i++) {
  digitalWrite(tab[i], HIGH);
  }
for (byte i = 3; i > skala; i--) {
  digitalWrite(tab[i-1], LOW);
   }
 }

Powinno dzialac...ewentualnie nawiasy klamrowe pogubilem...w tej tablicy podajesz nr pinow od ledow...

Edytowano przez farmaceuta
  • Lubię! 1
(edytowany)

dzięki, skopiowałem wgrałem i wyskoczyły błędy:


 

Arduino:1.8.15 (Windows 10), Płytka:"Arduino Uno"

sketch_nov19a:31:3: error: expected unqualified-id before 'if'
   if ( odleglosc < 5 || odleglosc> 200 )
   ^~
sketch_nov19a:37:3: error: expected unqualified-id before 'else'
   else
   ^~~~
sketch_nov19a:45:9: error: expected constructor, destructor, or type conversion before '(' token
    delay(1000);
         ^
sketch_nov19a:46:4: error: 'lcd' does not name a type
    lcd.clear();
    ^~~
sketch_nov19a:49:3: error: expected unqualified-id before 'if'
   if (odleglosc<=20 && odleglosc>=10)
   ^~
sketch_nov19a:58:1: error: expected unqualified-id before 'for'
 for (byte i = 0; i < skala; i++) {
 ^~~
sketch_nov19a:58:18: error: 'i' does not name a type
 for (byte i = 0; i < skala; i++) {
                  ^
sketch_nov19a:58:29: error: 'i' does not name a type
 for (byte i = 0; i < skala; i++) {
                             ^
sketch_nov19a:61:1: error: expected unqualified-id before 'for'
 for (byte i = 3; i > skala; i--) {
 ^~~
sketch_nov19a:61:18: error: 'i' does not name a type
 for (byte i = 3; i > skala; i--) {
                  ^
sketch_nov19a:61:29: error: 'i' does not name a type
 for (byte i = 3; i > skala; i--) {
                             ^
exit status 1
expected unqualified-id before 'if'


Ten raport powinien zawierać więcej informacji jeśli w 
File -> Preferencje zostanie włączona opcja "Pokaż
szczegółowe informacje podczas kompilacji"

 

jeżeli mam diody podłączone na pinach 8 i 9 to powinienem wpisać numery pinów? i w których nawiasach?

Edytowano przez Gieneq
(edytowany)
30 minut temu, grabarz666 napisał:

jeżeli mam diody podłączone na pinach 8 i 9 to powinienem wpisać numery pinów? i w których nawiasach?

Tak musisz zainicjowac piny w setup i wpisac tam gdzie masz tab...2/3/4 to moje piny...ty wpisz swoje...bledy masz bo brakuje nawiasow pewnie...dorzuc na dole klamrowy zamykajacy..

 

edit poprawilem ten kod...sprawdz czy dziala

Edytowano przez farmaceuta
  • Lubię! 1

działa wszystko zapalają się 3 diody, a jak bym chciał żeby każda dioda zapalała się od danej odległości?

np 1 od nieskończoności do np 50 cm, druga od 50 cm do 20 i trzecia od 20 do 0? 

static byte tab[3] = {8,9,4}; //ledy piny

byte skala = map(odleglosc, 0, 190, 0, 3);

for (byte i = 0; i < skala; i++) {
  digitalWrite(tab[i], HIGH);
  }
for (byte i = 3; i > skala; i--) {
  digitalWrite(tab[i-1], LOW);
   }
 }

to w miejsce 3 musiał bym wpisac 1 i led 8 na początek i reszte skopiowac zmieniając dane odleglosci?

(edytowany)
16 minut temu, grabarz666 napisał:

to w miejsce 3 musiał bym wpisac 1 i led 8 na początek i reszte skopiowac zmieniając dane odleglosci?

To juz lepiej na warunkach if bo funkcja map() dzieli wartosci na rowne czesci...mozna zrobic np tak.

if (odleglosc > 50) {     //led 51-...cm
  digitalWrite(8, HIGH);
} else {
    digitalWrite(8, LOW);
}
if (odleglosc < 50 && odleglosc > 20) { //led 49-21 cm
  digitalWrite(9, HIGH);
} else {
    digitalWrite(9, LOW);
}
if (odleglosc < 20 && odleglosc > 0) { // 19-1 cm
  digitalWrite(10, HIGH);
} else {
    digitalWrite(10, LOW);
}

tamten kod wywal wczesniejszy a wstaw to...wywal to co ja dopisalem a twoj zostaw,,

Edytowano przez farmaceuta

podpowiedział byś jak? zmieniłem diode na pin 10 bo mialem wolny akurat i nie działa. czarna magia to jest dla mnie, ogólnie chciałem to zrobić w ten sposób, żeby te diody zapalały się po kolei i chciałem jeszcze zrobić jakieś czuwanie i zasilanie bateryjne, ale widze że z takimi podstawami sobie nie radzę i chyba odpuszczę temat

8 minut temu, grabarz666 napisał:

podpowiedział byś jak? zmieniłem diode na pin 10 bo mialem wolny akurat i nie działa. czarna magia to jest dla mnie, ogólnie chciałem to zrobić w ten sposób, żeby te diody zapalały się po kolei i chciałem jeszcze zrobić jakieś czuwanie i zasilanie bateryjne, ale widze że z takimi podstawami sobie nie radzę i chyba odpuszczę temat

Spokojnie...bez stresu, nie ma jednego czlowieka na swiecie ktory sie urodzil i moglby powiedziec "Ja wiem"...😉 kazdy sie musi nauczyc...masz powyzej juz kod z tymi zakresami...sprawdz czy dziala jak chcesz i mozna dzialac dalej...

  • Lubię! 1
3 minuty temu, grabarz666 napisał:

dzięki za wyrozumiałość 🙂 zmieniłem i działa ale nadal ta jedna dioda nie prądzi, zmieniałem na pin 10 pin 13 i w wartościach też to zmieniałem i nie działa

Tam masz takie cos jak 

pinMode(10,OUTPUT)

to jest funkcja ustalajaca tryb dzialania pinu...w setup() wpisz sobie to co powyzej i bedzie dzialac...

jeśli mam tak: pinMode(9, OUTPUT); to wszystko jest ok tylko ta jedna dioda nie działa, jeśli zmienie tak jak pisałeś na 10 to jedna dioda ledwo świeci a ta ostatnia i tak nie działa

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