Garażowy czujnik dojazdowy z wyświetlaczem

Garażowy czujnik dojazdowy z wyświetlaczem

Film znajduje się tutaj: https://youtu.be/SNg4OOBb188
Nie wszyscy mamy samochody wyposażone w czujniki odległości, a wjechanie do garażu zostawiając odpowiednią odległość z tyłu i z przodu samochodu wymaga umiejętności i wyczucia. Czujnik ultradźwiękowy HC-SR04 podłączony do płytki Arduino Uno lub Nano załatwia problem braku wprawy we wjeżdżaniu do garażu :) Dwie matryce led 8×8 wystarczą aby dane z czujnika po odpowiednim zaprogramowaniu płytki Arduino znalazły się przed oczami kierowcy. Ten czujnik pozwala na pomiar w odległości 2 – 200 cm. Mnie wystarczą dwie matryce, bo nie muszę mieć pomiaru powyżej jednego metra, ale z łatwością można zwiększyć ilość matryc.
Matryce podłączyłem do wyjść 12,11,10, zasilania 5V i GND
Czujnik jest podłączony również do zasilania 5v i GND. Piny Trig i Echo trafiły odpowiednio do złącz 7 i 6 na płytce Arduino.
Naturalnie, to co widzicie można zrobić znacznie estetyczniej. Robiłem to raczej dla zabawy elektroniką i nie skupiałem się na estetyce. Obudowa jest dość duża, ale przy zastosowaniu mniejszej płytki można całość upchnąć w znacznie niższym pudełku. Wewnątrz jest jeszcze niewielki regulator napięcia step-down, bo mam jedynie zasilacze 12v.

Kod jest bardzo prosty. Zadbałem również o zmniejszenie zużycia energii. Jaskrawość matryc zostaje maksymalnie zmniejszona po kilku sekundach oczekiwania, gdy pojazd się zatrzyma, a po dalszych kilkunastu sekundach matryce zostaną wyłączone. Czujnik, w trakcie ruchu pojazdu dokonuje pomiaru co ułamki sekundy. Później pomiar dokonywany jest co około 2 sekundy. Czujnik budzi się natychmiast gdy “wyczuje” ruch, ale te 2 sekundy pomiędzy pomiarami powoduje, że czasem można koło niego przejść i czujnik się nie “obudzi”.

Podczas oglądania filmu wyraźnie słychać odgłos pomiaru, ale “złapał” się tylko na nagranie wykonane komórką. Normalnie nie ma szans go usłyszeć. Proszę również zwrócić uwagę, że gdy zbliżałem rękę, ultradźwięki nie były już “złapane” przez komórkę. Mój samochód jest wyposażony w czujniki i na nagraniu je można usłyszeć. Oczywiście do płytki można również podłączyć buzzer, gdyby komuś nie wystarczał wyświetlacz :)

Czujnik, niestety trzeba umieścić tak, aby był na równi z przeszkodą, ko której się zbliżamy. Można też umieścić go dalej, ale istnieje prawdopodobieństwo, że wyniki pomiaru będą zafałszowane przez odbicia, no i takie przesunięcie trzeba też uwzględnić podczas programowania płytki.

#include “LedControl.h”

#define trigPin 7
#define echoPin 6

LedControl lc=LedControl(12,10,11,2); // Pins: DIN,CLK,CS, # of Display connected

int delayTime=200;
int zakr[30];
int mini, maxi;
byte loope=0, loopb=0;

// Put values in arrays
byte c[] ={B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000};
byte c0[] ={B00000000, B01111110, B11111111, B10000001, B10000001, B11111111, B01111110, B00000000};
byte c1[] ={B00000000, B00000000, B00000100, B10000010, B11111111, B11111111, B10000000, B00000000};
byte c2[] ={B00000000, B11000010, B11100011, B10110001, B10011001, B10001111, B10000110, B00000000};
byte c3[] ={B00000000, B01000010, B11000011, B10000001, B10001001, B11111111, B01110110, B00000000};
byte c4[] ={B00000000, B00111000, B00111100, B00100010, B00100001, B11111111, B11111111, B00000000};
byte c5[] ={B00000000, B01001111, B11001101, B10000101, B10000101, B11111101, B01111001, B00000000};
byte c6[] ={B00000000, B01111110, B11111111, B10001001, B10001001, B11111011, B01110010, B00000000};
byte c7[] ={B00000000, B00000011, B00000011, B11110001, B11111001, B00001111, B00000111, B00000000};
byte c8[] ={B00000000, B01110110, B11111111, B10001001, B10001001, B11111111, B01110110, B00000000};
byte c9[] ={B00000000, B01001110, B11011111, B10010001, B10010001, B11111111, B01111110, B00000000};

void setup()
{
lc.shutdown(0,false); // Wake up displays
lc.shutdown(1,false);
lc.setIntensity(0,5); // Set intensity levels
lc.setIntensity(1,5);
lc.clearDisplay(0); // Clear Displays
lc.clearDisplay(1);

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

void a(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c[i]);}}
void a1(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c1[i]);}}
void a2(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c2[i]);}}
void a3(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c3[i]);}}
void a4(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c4[i]);}}
void a5(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c5[i]);}}
void a6(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c6[i]);}}
void a7(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c7[i]);}}
void a8(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c8[i]);}}
void a9(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c9[i]);}}
void a0(){for (int i = 0; i < 8; i++){lc.setRow(0,i,c0[i]);}}

void b(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c[i]);}}
void b1(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c1[i]);}}
void b2(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c2[i]);}}
void b3(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c3[i]);}}
void b4(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c4[i]);}}
void b5(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c5[i]);}}
void b6(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c6[i]);}}
void b7(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c7[i]);}}
void b8(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c8[i]);}}
void b9(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c9[i]);}}
void b0(){for (int i = 0; i < 8; i++){lc.setRow(1,i,c0[i]);}}

void loop()
{
Serial.print(Odl());
Serial.println(” cm”);

switch(Odl())
{
case 1:a();b1();break;
case 2:a();b2();break;
case 3:a();b3();break;
case 4:a();b4();break;
case 5:a();b5();break;
case 6:a();b6();break;
case 7:a();b7();break;
case 8:a();b8();break;
case 9:a();b9();break;
case 10:a1();b0();break;
case 11:a1();b1();break;
case 12:a1();b2();break;
case 13:a1();b3();break;
case 14:a1();b4();break;
case 15:a1();b5();break;
case 16:a1();b6();break;
case 17:a1();b7();break;
case 18:a1();b8();break;
case 19:a1();b9();break;
case 20:a2();b0();break;
case 21:a2();b1();break;
case 22:a2();b2();break;
case 23:a2();b3();break;
case 24:a2();b4();break;
case 25:a2();b5();break;
case 26:a2();b6();break;
case 27:a2();b7();break;
case 28:a2();b8();break;
case 29:a2();b9();break;
case 30:a3();b0();break;
case 31:a3();b1();break;
case 32:a3();b2();break;
case 33:a3();b3();break;
case 34:a3();b4();break;
case 35:a3();b5();break;
case 36:a3();b6();break;
case 37:a3();b7();break;
case 38:a3();b8();break;
case 39:a3();b9();break;
case 40:a4();b0();break;
case 41:a4();b1();break;
case 42:a4();b2();break;
case 43:a4();b3();break;
case 44:a4();b4();break;
case 45:a4();b5();break;
case 46:a4();b6();break;
case 47:a4();b7();break;
case 48:a4();b8();break;
case 49:a4();b9();break;
case 50:a5();b0();break;
case 51:a5();b1();break;
case 52:a5();b2();break;
case 53:a5();b3();break;
case 54:a5();b4();break;
case 55:a5();b5();break;
case 56:a5();b6();break;
case 57:a5();b7();break;
case 58:a5();b8();break;
case 59:a5();b9();break;
case 60:a6();b0();break;
case 61:a6();b1();break;
case 62:a6();b2();break;
case 63:a6();b3();break;
case 64:a6();b4();break;
case 65:a6();b5();break;
case 66:a6();b6();break;
case 67:a6();b7();break;
case 68:a6();b8();break;
case 69:a6();b9();break;
case 70:a7();b0();break;
case 71:a7();b1();break;
case 72:a7();b2();break;
case 73:a7();b3();break;
case 74:a7();b4();break;
case 75:a7();b5();break;
case 76:a7();b6();break;
case 77:a7();b7();break;
case 78:a7();b8();break;
case 79:a7();b9();break;
case 80:a8();b0();break;
case 81:a8();b1();break;
case 82:a8();b2();break;
case 83:a8();b3();break;
case 84:a8();b4();break;
case 85:a8();b5();break;
case 86:a8();b6();break;
case 87:a8();b7();break;
case 88:a8();b8();break;
case 89:a8();b9();break;
case 90:a9();b0();break;
case 91:a9();b1();break;
case 92:a9();b2();break;
case 93:a9();b3();break;
case 94:a9();b4();break;
case 95:a9();b5();break;
case 96:a9();b6();break;
case 97:a9();b7();break;
case 98:a9();b8();break;
case 99:a9();b9();break;
}
delay(delayTime);
}

int Odl() {
long czas;
int dyst;

digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

czas = pulseIn(echoPin, HIGH);
dyst = czas / 58;
if (dyst > 99) {
dyst = 99;
}
zakr[loope]=dyst;
maxi=zakr[0];
mini=zakr[0];
for(int i=0;i<30;i++)
{
if(zakr[i]>maxi) maxi=zakr[i];
//Serial.println(maxi);
if(zakr[i]<mini) mini=zakr[i];
//Serial.println(mini);
}
if(maxi-mini<2){
lc.setIntensity(0,0);
lc.setIntensity(1,0);
delayTime=2000;
if(loopb>10){lc.shutdown(0,true);lc.shutdown(1,true);}
if(loopb<30)loopb++;
}
else{
lc.shutdown(0,false);
lc.shutdown(1,false);
lc.setIntensity(0,5);
lc.setIntensity(1,5);
delayTime=200;
loopb=0;
}
delay(100);
if(loope<=30){loope++;}else{loope=0;}
return dyst;

}

Ocena: 4.75/5 (głosów: 8)

Podobne posty

27 komentarzy do “Garażowy czujnik dojazdowy z wyświetlaczem

  • Hej, ładnie się to prezentuje :) Graty !
    Powiem Ci, że dużo tego w tym kodzie masz i to bardzo dużo.
    Definicje wyświetlania znaków można zredukować do jednej tablicy dwuwymiarowej.
    Za sprawą odpowiedniego przeliczania mógłbyś się pozbyć ilość tych case, a zarazem same wyświetlanie zrealizować
    na dwóch for :) Ale to taka moja sugestia, jeśli projekt miał tylko działać to ważne, że działa :D

    Pozdrawiam Piro

    Odpowiedz
  • Zastanawiałem się jak to ugryźć żeby skrócić kod przez rozbicie wyniku na dwie cyfry, ale postanowiłem zamknąć obudowę :) Niestety, jestem jeszcze początkującym. Dziś ją rozbiorę i ponownie przysiądę nad skróceniem kodu. Dziękuję za sugestię :)

    Odpowiedz
  • Zasadniczo nie zakładałem, że może być dużo osób wjeżdżających tyłem. Raz tak zrobiłem i żałowałem. Jak uruchomiłem silnik po dłuższym postoju, to był potężny smród :)

    Odpowiedz
  • czy można zaprogramować układ, a następnie przenieść go na płytkę i dodać jakieś elementy elektroniczne aby nie wykorzystywać samej płytki od arduino uno?

    Odpowiedz
  • Kolego… Pomysł fajny, ale same gotowe elementy… Nawet kabelki do goldpinow to gotowce. Nie masz ambicji na stworzenie projektu porządnie, taniej i przede wszystkim łatwiejszego do montażu dla czytelników, bez tej pajęczyny? Co za czasy…

    Odpowiedz
  • Słusznie, nie jest to estetyczne, ale nie o to chodziło.
    Co do kosztów. Koszty w dolarach – Czujnik 0.99, klon arduino 2.58, matryca 2×2,50, zasilacz 1.6 i jakieś kabelki, no i obudowa. Całość to koszt około 10 dolarów + kabelki i wykonanie obudowy, gdybyśmy kupowali na aliexpressie. Naturalnie na to wszystko trzeba mieć czas, żeby to złożyć i zaprogramować, a wspomniana wyżej bariera laserowa za 18.70 dol. (bez zasilacza) raczej jest produktem gotowym i trudno tu faktycznie o jakiś skomplikowany projekt elektroniczny czy programistyczny.

    Odpowiedz
    • Można. Tylko musisz zmienić tą część kodu, która odpowiada za wyświetlacz.
      I musisz uważać na czasy. Z tego, co wiem, obsługa wyświetlacza LCD może wprowadzać opóźnienia, które będą zakłócały pracę czujnika.

      Odpowiedz
  • Witaj, zakupiłem, złożyłem, zasiliłem i kicha :-(. Część pomiarowa czyli czujnik ultra działa bo na monitorze portu szeregowego pokazuje jak liczy odległość. Ale matryce zupełnie zgłupiały – albo poświecą całe przez chwilę i pomiga jedna albo wcale nie działają lub pojawia się pionowy pasek z ledów przesuwający się po matrycach a potem ciemno. Proszę o schemat połączeń układu – może coś mi nie wyszło. Pozdrawiam.

    Odpowiedz
  • Ja kiedyś jak jeździłem dostawczakiem bez środkowego lusterka po prostu zamontowałem na kiju w odpowiedniej odległości od ściany włącznik starej lampki jak się zapaliło to znaczy stop. Też działało i dużo łatwiejsze w budowie. :)

    Odpowiedz
  • Witam
    Jestem początkujący w programwaniu .Wywala mi błąd w pierwszym wierszu szkicu , prosze o sprawdzenie.
    Prosze też o schemat podłaczenia
    Pozdraiwiam

    Odpowiedz
    • Błąd jest prawdopodobnie spowodowany tym, że nie masz ściągniętej biblioteki, której nazwa jest w pierwszej linii.
      Schematu faktycznie nie ma. Ale… czujnik odległości podpinasz
      Echo -> pin 6
      Trig -> pin 7
      Wyświetlacz… masz w tej linijce podłączenie:
      LedControl lc=LedControl(12,10,11,2); // Pins: DIN,CLK,CS, # of Display connected

      Odpowiedz
  • Pomysł bardzo fajny :) Aż chętnie ten czujnik zastosuję do innych swoim rzeczy.
    Ale czy nie prościej by było zawiesić pod sufitem lusterko i ustawić pod takim kątem, że z auta widać będzie dokładnie jak podjeżdżasz? Może być np takie wyprofilowane lusterko z samochodu ciężarowego. Przy okazji się ktoś dowie, że ma żarówkę spaloną jak jeszcze nie zauważył tego ;)
    Pozdrawiam!

    Odpowiedz

Odpowiedz

anuluj

Masz uwagi?