[PROJEKT] Ultradźwiękowy czujnik odległości HC-SR04 i Arduino
Kod projektu
Teraz przejdźmy do omówienia programu (cały kod znajduje się w sekcji do pobrania na końcu artykułu).
Pierwszym krokiem jest deklaracja pinów, do których podłączone są ultradźwiękowy czujnik odległości oraz buzzer.
#define TRIG 2 #define ECHO 3 #define BUZZER 9
Następnie jest dołączona biblioteka ułatwiająca sterowanie diodami WS2812. Trzeba jeszcze zadeklarować zmienne potrzebne do inicjalizacji biblioteki, takie jak liczba diod w łańcuchu oraz pin, którym będzie odbywać się sterowanie.
#include <Adafruit_NeoPixel.h> const uint8_t LICZBA_DIOD_RGB = 8; const uint8_t PIN_GPIO = 6; Adafruit_NeoPixel strip = Adafruit_NeoPixel(LICZBA_DIOD_RGB, PIN_GPIO, NEO_GRB + NEO_KHZ800);
Pozostała jeszcze deklaracja pozostałych zmiennych wykorzystywanych w programie:
long czas_impulsu= 0; int odleglosc = 0; int ile_diod =0;
Następnie w programie znajduje się funkcja pomiar_odleglosci(). To właśnie w niej jest wyzwalany pomiar, następnie jest mierzony czas trwania impulsu wygenerowany przez czujnik, na podstawie którego jest obliczany dystans do przeszkody. Wynik jest zapisywany do zmiennej odleglosc:
void pomiar_odleglosci() { digitalWrite(TRIG,LOW); delayMicroseconds(2); digitalWrite(TRIG,HIGH); delayMicroseconds(10); czas_impulsu = pulseIn(ECHO,HIGH); odleglosc = czas_impulsu/58; }
Obsługa diod WS2812
W funkcji o nazwie zaswiec_diody() jest sprawdzana zmienna dystans. W zależności od jej wartości zapala się odpowiednia liczba diod. Dla lepszej prezentacji działania programu, maksymalna liczba diod zaświeci się w przypadku gdy zmienna dystans będzie większa niż 40 cm. Gdy dystans będzie mniejszy niż 40 cm, kolejne diody będą gasnąć (z krokiem 5 cm = 1 dioda). Diody 1…3 świecą się na czerwono, diody 4…6 na żółto, natomiast diody 7 oraz 8 na czerwono:
void zaswiec_diody(int dystans) { if (dystans <=40) { ile_diod=dystans/5; for(int i = 0 ; i<=ile_diod;i++) { if (i<=2) { strip.setPixelColor(i, 50, 0, 0); } else if ((i>2) && (i<=5)) { strip.setPixelColor(i, 50, 50, 0); } else if (i>5) { strip.setPixelColor(i, 0, 50, 0); } strip.show(); } for(int i = 8 ; i>ile_diod; i--) { strip.setPixelColor(i,0 , 0, 0); strip.show(); } }
W funkcji setup() ustawiono szybkość portu szeregowego oraz role poszczególnych pinów:
void setup() { Serial.begin(9600); pinMode(TRIG,OUTPUT); pinMode(ECHO,INPUT); pinMode(BUZZER,OUTPUT); strip.begin(); strip.show(); }
Pętla główna
W pętli głównej programu jest dokonywany pomiar w funkcji pomiar_odleglosci(). Wartość zmierzonej odległości jest wyświetlana w monitorze portu szeregowego. Następnie wywoływana jest funkcja zaswiec_diody(odleglosc) odpowiedzialna za przedstawianie zmierzonej odległości poprzez zaświecenie odpowiedniej liczby diod WS2812. Jeżeli dystans jest mniejszy niż 10 cm, to włączany jest buzzer. W przeciwnym przypadku pozostaje on wyłączony.
void loop() { pomiar_odleglosci(); Serial.print("Odleglosc: " ); Serial.println(odleglosc); zaswiec_diody(odleglosc); if (odleglosc <10) { digitalWrite(BUZZER,HIGH); } else { digitalWrite(BUZZER,LOW); } }
Efekt działania projektu
Podczas działania programu w monitorze portu szeregowego wyświetlana jest zmierzona przez czujnik odległość:
Rysunek 4. Wartość zmierzonej odległości wyświetlana w monitorze portu szeregowego
Działanie programu przedstawiono na poniższym wideo: