Inicjalizacja wiringPI:
if (wiringPiSetup () == -1) exit (1) ;
Programujemy ECHOPIN jako wejściowy, TRIGPIN jako wyjściowy.
ECHOPIN będzie jednak robił coś więcej niż zwykle. Po zmianie stanu sygnału na nim zostanie wygenerowane przerwanie, wykonany zostanie kod w funkcji int_impuls.
pinMode (ECHOPIN, INPUT) ; wiringPiISR (ECHOPIN, INT_EDGE_BOTH, &int_impuls); pinMode (TRIGPIN, OUTPUT) ;
Wystarczy w funkcji int_impuls zapamiętać czas, kiedy sygnał stał się jedynką i czas, kiedy spadł do zera, aby w prosty sposób wyliczyć czas trwania impulsu Echo.
void int_impuls(void) { if (digitalRead (ECHOPIN) == 1) { clock_gettime(CLOCK_REALTIME, &tim); } else { clock_gettime(CLOCK_REALTIME, &tim2); impuls=0; } }Zanim zaczniemy pomiar, jeszcze jedna uwaga. Jeśli proces dostanie przerwanie, sleep (i parę innych funkcji) nie wznowi działania po jego obsłużeniu.
Sleep 10 sekund może trwać sekundę, dlatego w naszym programie użyjemy własnej funkcji:
void Delay(int microsec) { tim3.tv_sec = 0; tim3.tv_nsec = microsec * 1000; while(nanosleep(&tim3,&tim3)==-1) continue; }