Standardowe pliki nagłówkowe unixa, ale dodatkowo wiringPi.h:
#include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/resource.h> #include <time.h> #include <wait.h> #include <wiringPi.h>
Definiujemy, do których pinów podpięliśmy sygnały Trig i Echo czujnika:
#define TRIGPIN 21 #define ECHOPIN 22
Dwie stałe których użyjemy do walki z zakłóceniami:
#define SERIES 100 //tyle pomiarow #define SERIES1 5 // tyle najmniejszych i najwiekszych pomiarow odrzucic // jako zaklocenia
Przez tę wartość, według producenta czujnika trzeba podzielić czas trwania sygnału Echo, żeby wyliczyć odległość. Ale prędkość dźwięku w powietrzu zależy od temperatury, w temperaturze 35 ℃ rozchodzi się 11% szybciej, niż przy -25 ℃. Być może wartość tę trzeba będzie w szczególnych przypadkach skorygować:
#define SPEEDDIV 58
Pomijamy definicje zmiennych, są przecież w załączonym programie źródłowym, skupimy się na programie.
int main (void) {
PID procesu, który uruchomimy przyda się żeby łatwiej włączyć wyświertlanie komunikatów diagnostycznych:
pid=getpid(); printf("Start %d\n", pid);fflush(0);
Zwiększamy priorytet naszego procesu. Zwiększy to dokładność pomiaru czasu trwania sygnału Echo. Niewiele i niestety kosztem szybkości innych procesów. Jeśli jednak nasz program do pomiaru odległości jest częścią najważniejszego procesu działającego na naszym Raspberry...
setpriority(0,0,-20);
Teraz debugging. Chcemy, żeby po wysłaniu do procesu sygnału USR1 zaczął wyświetlać komunikaty diagnostyczne, po wysłaniu USR2 przestał.
A więc kill - USR1 8823 program gada, kill -USR2 8823 przestaje gadać. To 8823 to PID naszego procesu, dlatego wcześniej go odczytaliśmy i wyświetliliśmy.
signal(SIGUSR1, catch_USR); signal(SIGUSR2, catch_USR);
Po otrzymaniu sygnału USR1 lub USR2 wykonana zostanie funkcja catch_USR, która ustawi zmienną debug odpowiednio na 1 lub 0:
void catch_USR(int signal_num) { fflush(0); if(signal_num==SIGUSR1) debug=1; if(signal_num==SIGUSR2) debug=0; }