Bogusław Kempny

Ultradźwiękowy pomiar odległości

Autor adres
Początek HC-SR04 LCD Kamera fork() sms strfry() GPIO impulsy Klawiatura Brama GPIO PWM SG90 ....











No to mamy 100 pomiarów. Każdy trochę inny. Który jest najbliższy prawdziwej wartości?
Na początek posortujemy zmierzone wartości:

qsort (usec, SERIA, sizeof (float), compare_float);
  usectmp=0;

Możemy wyświetlić zmierzone wartości. Bywają czasami dziwaczne.

if (debug)
  for (i=0;i<SERIA;i++)
   { printf(" %d: %3.0f \n", i ,usec[i]); fflush(0);}

W tabeli roboczej zliczamy ile było takich samych pomiarów, grupując razem różniące się o pojedyncze mikrosekundy, odrzucamy pewną liczbę najmniejszych i największych:


  for(i=0;i<10000; i++) tab_rob[i]=0;
   
  for (i=SERIA1;i<SERIA-SERIA1;i++)
   {
     j=usec[i]/10;
// Jesli nie wykryto echa, indeks wyjdzie poza tablice
     if(j<10000) tab_rob[j]++;
   }

Szukamy, jaka wartość najwięcej razy wystąpiła w pomiarach, odrzucamy pomiary których było mniej niż 50% tych najczęstszych. Z tego, co pozostało wyliczamy średnią:

// Znajdz maksimum
  max=0 ;
  for (i=0;<10000;i++)
   if (tab_rob[i]>max)
    max=tab_rob[i]; 


  for (i=0;i<10000;i++)
   if (tab_rob[i]<max*0.5)
    tab_rob[i]=0; 

  sum1=0; sum2=0;
  for (i=0;i<10000;i++)
    if (tab_rob[i] >0)
      {
       sum1=sum1+tab_rob[i];
       sum2=sum2+i*tab_rob[i];
      }   

No i mamy wynik pomiaru. Wystarczy go wyświetlić (tu dodatkowo jeszcze czas przeprowadzenia pomiaru wyświetlamy), ale oczywiście można go do innych celów wykorzystać, zapisać w bazie danych, użyć do zapalenia sygnalizatorów, włączenia alarmu zbliżenia się na niedozwoloną odległość...

  usectmp=(float)sum2/sum1;   
  time (&czas);
  loctime = localtime (&czas);
  strftime (data, 50, "%Y-%m-%d %H:%M:%S", loctime);
  printf("%s %4.1f cm\n",data, usectmp/SPEEDDIV*10);
 }

Opisany tu program został użyty w praktyce do mierzenia ilości oleju napędowego w zbiorniku zakładowej stacji paliw. W zbiorniku o pojemności 5000 litrów błąd pomiaru jest mniejszy niż 10 litrów.