LinkedIn YouTube Facebook
Szukaj

Wstecz
SoM / SBC

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

Autor: Patryk Mądry