Układ pomiaru hałasu

Typ_projektu
microPython
Zdjecie główne
Krótki opis projektu

Projekt obejmuje stworzenie prostego układu, mierzącego i reagującego na poziom głośności w otoczeniu. Wykorzystuje pasek LED do wizualizacji poziomu dźwięku oraz buzzer do emisji dźwięków ostrzegawczych przy przekroczeniu określonego poziomu głośności.

Niezbędne elementy

1. Płytka ESP8266

2. Pasek LED WS2812b

3. Buzzer

4. Czujnik dźwięku

5. Płytka stykowa

6. Przewody męsko-męskie i męsko-żeńskie

Sprzęt

Komputer ze środowiskiem Thonny

Opis projektu

Założeniem projektu było stworzenie prostego układu mierzącego poziom głośności w pomieszczeniu. Po przekroczeniu ustalonej wartości użytkownik jest ostrzegany dźwiękiem buzzera oraz wizualnie na pasku LED.

Pomiar za pomocą danego czujnika nie należy do najdokładniejszych. Jednak jest w stanie wychwycić znaczące i nagłe zmiany głośności, takie jak np. klaśnięcie.

Użyte biblioteki:

  • neopixel:  umożliwia obsługę paska LED
  • machine: umożliwia obsługę ogólnych funkcji mikrokontrolera ESP8266, takich jak zarządzanie pinami, obsługa przetworników analogowo-cyfrowych (ADC) czy konfiguracja modułów PWM
  • time: do obsługi czasu, umożliwia odmierzanie czasu oraz tworzenie opóźnień w programie

Kod rozpoczyna się inicjalizacją czujnika dźwięku, paska LED WS2812b oraz buzzera, ustawiając również wartości graniczne dla pomiarów.

Następnie funkcja calculate_db() dokonuje pomiaru poziomu dźwięku, obliczając wartość w decybelach na podstawie odczytów z czujnika dźwięku. Odczytane wartości w decybelach są wyświetlane w programie Thonny.

Za pomocą funkcji set_pixel_color() i calculate_color()  kolory diod na pasku LED są zmienione w zależności od poziomu dźwięku.

W głównej pętli programu na podstawie pobieranego aktualnego poziomu dźwięku ustawione są kolory diod na pasku. Gdy poziom głośności jest niski diody świecą się na niebiesko. Wraz ze wzrostem głośności, górne diody przybierają coraz bardziej intensywny kolor czerwieni. Dodatkowo, w przypadku przekroczenia poziomu 75dB, buzzer emituje dźwięk przez 2 sekundy.

Zdjęcia
kod programu

from machine import ADC, Pin, PWM
import neopixel
import time

# Inicjalizacja czujnika glosnosci
adc = ADC(0)
sample_window = 50
peak_to_peak_min = 20
peak_to_peak_max = 900
db_min = 49
db_max = 90

# Inicjalizacja diod NeoPixel
NUM_PIXELS = 8
pixel_pin = Pin(4, Pin.OUT)
np = neopixel.NeoPixel(pixel_pin, NUM_PIXELS)

BOTTOM_COLOR = (0, 0, 255)

# Inicjalizacja buzzer
buzzer_pin = Pin(15, Pin.OUT)
buzzer = PWM(buzzer_pin)
buzzer.freq(1000)

# Funkcja do odczytu poziomu głośności
def calculate_db():
   signal_max = 0
   signal_min = 1024

   start_time = time.ticks_ms()
   while time.ticks_diff(time.ticks_ms(), start_time) < sample_window:
       sample = adc.read()

       if sample < 1024:
           if sample > signal_max:
               signal_max = sample
           elif sample < signal_min:
               signal_min = sample

   peak_to_peak = signal_max - signal_min
   db = int((peak_to_peak - peak_to_peak_min) * (db_max - db_min) / (peak_to_peak_max - peak_to_peak_min) + db_min)
   return db

# Funkcja do ustawiania koloru diody
def set_pixel_color(pixel, color):
   np[pixel] = color
   np.write()

# Funkcja do obliczania koloru na podstawie jasności
def calculate_color(brightness):
   blue = max(0, 255 - brightness * 2)
   red = min(255, brightness * 2)
   green = 0
   return (red, green, blue)

# Główna pętla
while True:
   db_value = calculate_db()
   print(f"Pomiar w decybelach: {db_value} dB")

   # Skalowanie jasności dla diod NeoPixel
   brightness = int((db_value - db_min) * 255 / (db_max - db_min))
   brightness = min(max(brightness, 0), 255)
   
   # Ustawienie koloru dolnej diody
   np[0] = BOTTOM_COLOR
   np.write()

   # Ustawienie koloru górnej diody w zależności od jasności
   np[NUM_PIXELS - 1] = calculate_color(brightness)
   np.write()

   # Ustawienie kolorów diod pomiędzy dolną a górną
   for i in range(1, NUM_PIXELS - 1):
       color = calculate_color(int((i / (NUM_PIXELS - 1)) * brightness))
       set_pixel_color(i, color)
   
   # Obsługa buzzer
   if db_value > 75:
       # Emitowanie dźwięku, gdy poziom głośności przekroczy 75 dB
       buzzer.duty(512)
       time.sleep(2)
       buzzer.duty(0)

   time.sleep(0.1)

Schemat
Tagi
ESP8266 czujnik hałasu led buzzer