#include #include #include #include #include #include #include #include #include #define TRIGPIN 21 #define ECHOPIN 22 #define SERIES 100 // how many measurements #define SERIES1 5 // discard this count of the smallest and largest measurements #define SPEEDDIV 58 int compare_float (const void *a, const void *b); struct tm *loctime; time_t czas; char date[50]; void Delay(); int impuls; struct timespec tim, tim2,tim3; int pid; void int_impuls(void) { if (digitalRead (ECHOPIN) == 1) { clock_gettime(CLOCK_REALTIME, &tim); } else { clock_gettime(CLOCK_REALTIME, &tim2); impuls=0; } } int debug = 0; void catch_USR(int signal_num) { fflush(0); if(signal_num==SIGUSR1) debug=1; if(signal_num==SIGUSR2) debug=0; } int main (void) { float usec[SERIES]; float usectmp; int i,j,k; int max; int sum1, sum2; float low, middle, high; int tab_rob[10000]; pid=getpid(); printf("Start %d\n", pid);fflush(0); setpriority(0,0,-20); signal(SIGUSR1, catch_USR); signal(SIGUSR2, catch_USR); if (wiringPiSetup () == -1) exit (1) ; pinMode (ECHOPIN, INPUT) ; wiringPiISR (ECHOPIN, INT_EDGE_BOTH, &int_impuls); pinMode (TRIGPIN, OUTPUT) ; for(;;) { for(i=0;imax) max=tab_rob[i]; // Reject measurements less than 50% of the max for (i=0;i<10000;i++) if (tab_rob[i]0) printf("%d %d\n", i, tab_rob[i]); // Calculate the average 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]; } usectmp=(float)sum2/sum1; time (&czas); loctime = localtime (&czas); strftime (date, 50, "%Y-%m-%d %H:%M:%S", loctime); printf("%s %4.1f cm\n",date, usectmp/SPEEDDIV*10); } } int compare_float (const void *a, const void *b) { const float *da = (const float *) a; const float *db = (const float *) b; return (*da > *db) - (*da < *db); } void Delay(int microsec) { tim3.tv_sec = 0; tim3.tv_nsec = microsec * 1000; while(nanosleep(&tim3,&tim3)==-1) continue; }