BASCOM AVR ATmega8 16MHz – HC-SR04 z korekcją temperatury TM_P

Pytanie

napisz kod w bascom avr dla procesora atmega 8 na zewnetrznym kwarcu 16mhz do obslugi czujnika odlegloosci HC-SR04 i korekcja wskazan dla roznych temperatur powietrza . temperatura aktualna powietrza bedzie w zmiennej "TM_P"

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

  • Poniżej znajduje się kompletny program w BASCOM-AVR dla ATmega8 pracującego na zewnętrznym kwarcu 16 MHz.
  • Kod mierzy odległość za pomocą HC-SR04, a wynik jest automatycznie korygowany o bieżącą temperaturę przechowywaną w zmiennej TM_P (°C).
  • Pomiar wykonywany jest przy użyciu 16-bitowego Timer1 z preskalerem 8 (rozdzielczość 0,5 µs).

'==============================================================
'  HC-SR04  +  korekcja temperaturowa
'  MCU : ATmega8   |  F_CPU : 16 MHz (kwarc zewnętrzny)
'==============================================================

$regfile  = "m8def.dat"
$crystal  = 16000000
$baud     = 9600                            ' UART – podgląd wyników (opcjonalnie)

'------------- Konfiguracja pinów --------------------------------
Config Portd.0 = Output                     ' TRIG  -> PD0
Config Portd.1 = Input                      ' ECHO  -> PD1
Trig  Alias Portd.0
Echo  Alias Pind.1                          ' odczyt stanu pinu

'------------- Konfiguracja Timer1 --------------------------------
' Tryb normal, preskaler = 8  =>   1 tik = 0,5 µs
Config Timer1 = Timer, Prescale = 8

'------------- Zmienne robocze -----------------------------------
Dim Echo_ticks   As Word                    ' tiks Timer1 (0,5 µs)
Dim Echo_timeus  As Single                  ' czas echa [µs]
Dim Distance_cm  As Single                  ' wynik końcowy [cm]
Dim V_sound      As Single                  ' prędkość dźwięku [m/s]
Dim TM_P         As Single                  ' aktualna temperatura [°C]
Dim Timeout_cnt  As Word

Const Tick_us    = 0.5                      ' 1 tik = 0,5 µs
Const Echo_timeout_us = 30000               ' 30 ms  (ok. 5 m w jedną stronę)

'------------- Inicjalizacja -------------------------------------
Print "HC-SR04 + kompensacja T"; CrLf
Print "Start pomiaru…" ; CrLf
TM_P = 20                                    ' wartość domyślna, nadpisywana z czujnika

'==============================================================
'  G  Ł  Ó  W  N  A     P  Ę  T  L  A
'==============================================================
Do
    Gosub Measure_HCSR04

    If Distance_cm > 0 Then
        Print "Temp=" ; Fusing(TM_P , "#.#") ; "C  |  Odleglosc=" ; _
              Fusing(Distance_cm , "##0.0") ; "cm"
    Else
        Print "Brak echa / poza zakresem"
    End If

    Waitms 100                               ' >=60 ms wg dokumentacji
Loop
End

'==============================================================
'                P R O C E D U R A    P O M I A R U
'==============================================================
Measure_HCSR04:
    '---- impuls TRIG ≥10 µs -------------------------------------------------
    Reset Trig
    Waitus 2
    Set Trig
    Waitus 12                                ' impuls 12 µs
    Reset Trig

    '---- oczekiwanie na zbocze narastające ECHO -----------------------------
    Timeout_cnt = 0
    While Echo = 0
          Incr Timeout_cnt
          If Timeout_cnt > 60000 Then        ' ~30 ms
                 Distance_cm = -1
                 Return
          End If
    Wend

    '---- pomiar czasu trwania poziomu wysokiego ------------------------------
    Tcnt1 = 0                                ' zeruj licznik
    Set Tifr.Tov1                            ' zeruj flagę przepełnienia
    Start Timer1                             ' preskaler 8 już ustawiony

    While Echo = 1
          If Tifr.Tov1 = 1 Then              ' timeout – brak echa w zakresie HC-SR04
                 Stop Timer1
                 Distance_cm = -1
                 Set Tifr.Tov1
                 Return
          End If
    Wend
    Stop Timer1
    Echo_ticks = Tcnt1

    '---- przeliczenia --------------------------------------------------------
    Echo_timeus = Echo_ticks * Tick_us           ' µs
    V_sound     = 331.3 + 0.606 * TM_P           ' m/s  (aktualna prędkość dźwięku)
    Distance_cm = Echo_timeus * 1e-6 * V_sound * 100 / 2  ' cm

    '---- weryfikacja specyfikacji czujnika -----------------------------------
    If Distance_cm < 2 Or Distance_cm > 400 Then Distance_cm = -1

Return

Bezpośrednia odpowiedź na pytanie – Szczegółowa analiza problemu

  1. Zasada HC-SR04
    • Impuls TRIG ≥ 10 µs inicjuje 8 fal 40 kHz.
    • Pin ECHO przechodzi na stan wysoki na czas powrotu sygnału (tam + z powrotem).

  2. Pomiar czasu
    • Timer1 (16 bit) z podziałem /8 → 2 MHz → 0,5 µs/ tik.
    • Zakres bez przepełnienia ≈ 32,8 ms (≈ 5,6 m), wystarczające dla HC-SR04 (max 4 m).

  3. Korekcja temperaturowa
    • Prędkość dźwięku: v [m/s] ≈ 331,3 + 0,606·T[°C].
    • Odległość: d [cm] = t[µs]·v·10⁻⁶·100 / 2.

  4. Obsługa błędów / timeoutów
    • Dwa progi: brak zbocza początkowego oraz przepełnienie Timer1.
    • Wartość –1 cm sygnalizuje błąd (można zmodyfikować pod własny interfejs).

  5. Integracja czujnika temperatury
    TM_P musi być cyklicznie aktualizowana np. z DS18B20, NTC + ADC lub BME280.
    • Rozdzielczość temperatury ±0,5 °C daje błąd odległości ok. ±0,1 %.

  6. Kalibracja
    • Dodatkowo uwzględnij wilgotność i ciśnienie (wpływają < 0,5 % w typowych warunkach).
    • W aplikacjach precyzyjnych wykonaj kalibrację w docelowej obudowie.


Aktualne informacje i trendy

  • Ultrasonic HC-SR04 jest tanim, lecz wrażliwym na warunki środowiskowe sensorem.
  • Coraz częściej zastępuje się go miniaturowymi radarami 60 GHz (FMCW) lub ToF-LIDAR-em VL53L1X, które mają niezależność od temperatury.
  • W 2023–2024 popularne biblioteki BASCOM dodają gotową funkcję PulseIn, jednak pomiar sprzętowym timerem (jak w kodzie) jest szybszy i eliminuje zakłócenia przerwań.

Wspierające wyjaśnienia i detale

  • 0,5 µs/tik odpowiada drodze dźwięku ≈ 0,0086 cm; rozdzielczość układu jest więc teoretycznie lepsza niż 0,1 mm, jednak dokładność HC-SR04 ogranicza się praktycznie do 2–3 mm.
  • Funkcja Waitus w BASCOM wykorzystuje dokładne pętle ASM, co gwarantuje stabilny impuls TRIG.
  • Jeśli chcesz użyć wejścia ICP1 (PD6), możliwe jest podwojenie precyzji i wyeliminowanie pętli oczekujących.

Aspekty etyczne i prawne

  • Czujniki ultradźwiękowe zwykle nie podlegają ograniczeniom prawnym, ale stosowanie ich w systemach bezpieczeństwa (np. radar cofania) wymaga zgodności z ISO 26262.
  • W aplikacjach pomiaru obecności osób zachowaj przejrzystość informacyjną – mimo że fale 40 kHz są niesłyszalne, mogą podlegać regulacjom BHP (długotrwała ekspozycja).

Praktyczne wskazówki

  1. Zasil czujnik i mikrokontroler z jednego stabilnego 5 V; przy 3,3 V konieczna jest konwersja poziomów logicznych.
  2. ECHO zwraca pełne 5 V – jeśli MCU pracuje przy 3,3 V, użyj dzielnika 10 kΩ/15 kΩ.
  3. Minimalny odstęp pomiarów HC-SR04: 60 ms; w kodzie użyto 100 ms.
  4. Przy montażu w obudowie stosuj tłumiki akustyczne, by zredukować echa boczne.

Ewentualne zastrzeżenia lub uwagi dodatkowe

  • HC-SR04 ma martwą strefę ~2 cm; pomiar bliżej daje losowe wartości.
  • Mgła, deszcz, wentylatory znacząco degradu­ją sygnał; w takich warunkach rozważ czujnik radarowy.
  • Przy temperaturze poniżej –10 °C sygnał bywa zbyt słaby – do aplikacji zewnętrznych stosuj hermetyczną wersję JSN-SR04T.

Sugestie dalszych badań

  • Porównanie kompensacji temperatury z korekcją wilgotności i ciśnienia – wzór rozszerzony Cramer-Kirchhoff.
  • Test wejścia ICP1 do sprzętowego pomiaru szerokości impulsu (bez aktywnego polling’u).
  • Migracja na nowoczesne czujniki ToF (VL53L4CD) – brak wpływu temperatury i większa odporność na zakłócenia.

Krótkie podsumowanie

Zaprezentowany program w BASCOM-AVR łączy tradycyjny czujnik HC-SR04 z korekcją temperaturową bazującą na zmiennej TM_P. Wykorzystanie Timer1 (0,5 µs/tik) gwarantuje precyzyjny pomiar, a pełna obsługa timeoutów i weryfikacja zakresu czynią kod odpornym w praktycznych aplikacjach. Rozwiązanie jest kompatybilne z każdą płytką ATmega8 @ 16 MHz i stanowi solidny punkt wyjścia do dalszej rozbudowy (LCD, Modbus, LoRa WAN).

Oceń odpowiedź:
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.