[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:

Technologie End of Life i bezpieczeństwo sieci – wyzwania Europy związane z tzw. długiem technologicznym
Najczęstsze błędy firm przy wyborze dostawcy energii i jak ich uniknąć
Fotorezystor, czyli czujnik światła dwojakiego działania. Przykład innowacji w automatyce i elektronice możliwej dzięki technologii fotooporników 



