Advertisement
Guest User

Untitled

a guest
Jun 24th, 2019
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.19 KB | None | 0 0
  1. #include <semaphore.h>
  2. #include <wiringPi.h>
  3. #include <sys/types.h>
  4. #include <sys/wait.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <signal.h>
  9. #include <pthread.h>
  10.  
  11. sem_t S1, S2, S3, S4, S5;
  12.  
  13. void *function1(){
  14.     while(1){
  15.         if(digitalRead(23)==1){
  16. //printf("Funktion 1 wird ausgeführt\n");
  17.  
  18. sem_post(&S1);  // -> 1     Thread 2 kann starten
  19. sem_wait(&S2);  // -> 0     Warte auf Thread 3
  20. sem_wait(&S4);  // -> 0     Warte auf Thread 4
  21.  
  22. }
  23. }
  24. }
  25.  
  26.  
  27. void *function2(double * dist){             // Thread 2 Funktion (Bewegungsmelder)
  28.     struct timeval start, ende;
  29.     long sec, usec;
  30.     double time;
  31.  
  32.     while(1){                   // Endlosschleife
  33.         sem_wait(&S1);              // <- 0  warte dass Thread 1 freigibt
  34.         //printf("Funktion 2 wird ausgeführt\n");
  35.  
  36.         // Code war gegeben, aus Unterlagen
  37.         digitalWrite(22,1);
  38.         delay(10);
  39.         digitalWrite(22,0);
  40.  
  41.  
  42.         if(gettimeofday(&start,(struct timezone*)0)){
  43.             printf("error\n");
  44.             exit(1);
  45.             }
  46.  
  47.         while(digitalRead(21) == 0){
  48.             if (gettimeofday(&start,(struct timezone*)0)){
  49.             printf("error\n");
  50.             exit(1);
  51.             }
  52.         }
  53.  
  54.         while(digitalRead(21) == 1){
  55.             if(gettimeofday(&ende,(struct timezone*)0)){
  56.             printf("error\n");
  57.             exit(1);
  58.             }
  59.         }
  60.  
  61.         sec=ende.tv_sec-start.tv_sec;
  62.         usec=ende.tv_usec-start.tv_usec;    // Mikrosekunden -> 1/1000000stel
  63.  
  64.         // printf("sec:%ld\n", sec);
  65.         printf("usec:%ld\n", usec);
  66.         time = usec;
  67.         time = (time / 1000000) + sec;
  68.         printf("Time:%f\n", time);
  69.         * dist = (time*34300)/2;        // Distanz in cm
  70.         printf("Dist:%f\n", *dist);
  71.  
  72.         sem_post(&S3);              // -> 1  Thread 3 freigeben
  73.         sem_post(&S5);              // -> 1  Thread 4 freigeben        
  74.     }
  75.  
  76. }
  77.  
  78.  
  79. void *function3(double * dist){             // Thread 3 Funktion (LEDs)
  80.     int i;
  81.     int gpionr[3] = {0,2,3};
  82.     while(1){
  83.         for(i=0; i < 3; i++){
  84.             digitalWrite(gpionr[i], 0);
  85.         }
  86.  
  87.         sem_wait(&S3);              // <- 0 Warte das Thread 2 freigibt
  88.  
  89.         //printf("Funktion 3 wird ausgeführt\n");
  90.  
  91.         if(*dist < 10){             // Unter 10cm -> Rote LED
  92.             digitalWrite(0, 1);
  93.                 printf("\nRote LED");
  94.                 printf("\n### BUZZER ###\n\n");
  95.             delay(50);
  96.         }else if(*dist > 10 && *dist < 20){ // Zwischen 10cm und 20Cm -> Gelbe LED
  97.             digitalWrite(3, 1);
  98.             printf("\nGelbe LED\n\n");
  99.             delay(50);
  100.         }else{                  // Bei mehr als 20cm -> Grüne LED
  101.             digitalWrite(2, 1);
  102.             printf("\nGrüne LED\n\n");
  103.             delay(50);
  104.         }
  105.         sem_post(&S2);              // -> 1 Gebe Thread 1 wieder frei (50%) 1/2
  106.     }
  107. }
  108.  
  109.  
  110. void *function4(double * dist){             // Thread 4 Funktion (Buzzer)
  111.     while(1){
  112.         sem_wait(&S5);              // -> 0     Warte das Thread 2 freigibt
  113.         //printf("Funktion 4 wird ausgeführt\n");
  114.    
  115.         if(*dist < 10){             // Wenn Distanz kleiner als 10cm, wird ein Ton ausgegeben
  116.             softToneWrite(25, 10);      // Ton ausgeben
  117.             delay(300);         // Warten
  118.             softToneWrite(25, 0);       // Ton auschalten
  119.         }
  120.     sem_post(&S4);                  // -> 1     gebe Thread 1 wieder frei (50%) 2/2
  121.     }
  122. }
  123. // Main
  124. int main(void){                     // Main Thread
  125.     int sem_value;
  126.     double _dist;
  127.     sem_init(&S1, 0, 0); //0   sem_init(&Name/Adr. , Teilen zwischen Threads , Initialisierung(0))
  128.     sem_init(&S2, 0, 0); //0
  129.     sem_init(&S3, 0, 0); //0
  130.     sem_init(&S4, 0, 0); //0
  131.     sem_init(&S5, 0, 0); //0
  132.  
  133.     wiringPiSetup();                // WiringPiSetup
  134.     int gpionr[5] = {0,2,3,22,25};          // Pin Belegung
  135.     int i;
  136.  
  137.     for(i=0; i < 5; i++){               // Pinmode für alle pins auf Output stellen
  138.         pinMode(gpionr[i], 1);
  139.     }
  140.     pullUpDnControl(21,PUD_OFF);            // Ultraschallsensor (Echo)
  141.     pullUpDnControl(22,PUD_OFF);            // Ultraschallsensor (Trig)
  142.     pullUpDnControl(23,PUD_OFF);            // Bewegungssensor
  143.     softToneCreate(25);             // Buzzer soll genutzt werden
  144.  
  145.     // Threads erstellen und initialisieren
  146.     pthread_t Thread1, Thread2, Thread3, Thread4;
  147.     pthread_create (&Thread1, NULL, (void*) function1, NULL);
  148.     pthread_create (&Thread2, NULL, (void*) function2, (void *) &_dist);
  149.     pthread_create (&Thread3, NULL, (void*) function3, (void *) &_dist);
  150.     pthread_create (&Thread4, NULL, (void*) function4, (void *) &_dist);
  151.  
  152.     sleep(15);                  // Schlafe 15 Sekunden, "Dauer wie lange das Programm läuft"
  153.  
  154.     // Threads beenden
  155.     pthread_cancel(Thread1);
  156.     pthread_cancel(Thread2);
  157.     pthread_cancel(Thread3);
  158.     pthread_cancel(Thread4);
  159.  
  160.     int gpioreset[6] = {0,2,3,21,22,23};
  161.     for(i=0; i < 6; i++){               // Deaktivieren der LEDs und Sensoren
  162.         digitalWrite(gpioreset[i], 0);
  163.     }
  164.     softToneWrite(25,0);                // Deaktivieren des Buzzers
  165.  
  166.     // Semaphoren schliessen
  167.     sem_destroy(&S1);
  168.     sem_destroy(&S2);
  169.     sem_destroy(&S3);
  170.     sem_destroy(&S4);
  171.     sem_destroy(&S5);
  172.  
  173.     return 1;
  174. }
  175.  
  176. // Funktionen
  177.  
  178. void *function1(){
  179.     while(1){
  180.         if(digitalRead(23)==1){
  181. //printf("Funktion 1 wird ausgeführt\n");
  182.  
  183. sem_post(&S1);  // -> 1     Thread 2 kann starten
  184. sem_wait(&S2);  // -> 0     Warte auf Thread 3
  185. sem_wait(&S4);  // -> 0     Warte auf Thread 4
  186.  
  187. }
  188. }
  189. }
  190.  
  191.  
  192. void *function2(double * dist){             // Thread 2 Funktion (Bewegungsmelder)
  193.     struct timeval start, ende;
  194.     long sec, usec;
  195.     double time;
  196.  
  197.     while(1){                   // Endlosschleife
  198.         sem_wait(&S1);              // <- 0  warte dass Thread 1 freigibt
  199.         //printf("Funktion 2 wird ausgeführt\n");
  200.  
  201.         // Code war gegeben, aus Unterlagen
  202.         digitalWrite(22,1);
  203.         delay(10);
  204.         digitalWrite(22,0);
  205.  
  206.  
  207.         if(gettimeofday(&start,(struct timezone*)0)){
  208.             printf("error\n");
  209.             exit(1);
  210.             }
  211.  
  212.         while(digitalRead(21) == 0){
  213.             if (gettimeofday(&start,(struct timezone*)0)){
  214.             printf("error\n");
  215.             exit(1);
  216.             }
  217.         }
  218.  
  219.         while(digitalRead(21) == 1){
  220.             if(gettimeofday(&ende,(struct timezone*)0)){
  221.             printf("error\n");
  222.             exit(1);
  223.             }
  224.         }
  225.  
  226.         sec=ende.tv_sec-start.tv_sec;
  227.         usec=ende.tv_usec-start.tv_usec;    // Mikrosekunden -> 1/1000000stel
  228.  
  229.         // printf("sec:%ld\n", sec);
  230.         printf("usec:%ld\n", usec);
  231.         time = usec;
  232.         time = (time / 1000000) + sec;
  233.         printf("Time:%f\n", time);
  234.         * dist = (time*34300)/2;        // Distanz in cm
  235.         printf("Dist:%f\n", *dist);
  236.  
  237.         sem_post(&S3);              // -> 1  Thread 3 freigeben
  238.         sem_post(&S5);              // -> 1  Thread 4 freigeben        
  239.     }
  240.  
  241. }
  242.  
  243.  
  244. void *function3(double * dist){             // Thread 3 Funktion (LEDs)
  245.     int i;
  246.     int gpionr[3] = {0,2,3};
  247.     while(1){
  248.         for(i=0; i < 3; i++){
  249.             digitalWrite(gpionr[i], 0);
  250.         }
  251.  
  252.         sem_wait(&S3);              // <- 0 Warte das Thread 2 freigibt
  253.  
  254.         //printf("Funktion 3 wird ausgeführt\n");
  255.  
  256.         if(*dist < 10){             // Unter 10cm -> Rote LED
  257.             digitalWrite(0, 1);
  258.                 printf("\nRote LED");
  259.                 printf("\n### BUZZER ###\n\n");
  260.             delay(50);
  261.         }else if(*dist > 10 && *dist < 20){ // Zwischen 10cm und 20Cm -> Gelbe LED
  262.             digitalWrite(3, 1);
  263.             printf("\nGelbe LED\n\n");
  264.             delay(50);
  265.         }else{                  // Bei mehr als 20cm -> Grüne LED
  266.             digitalWrite(2, 1);
  267.             printf("\nGrüne LED\n\n");
  268.             delay(50);
  269.         }
  270.         sem_post(&S2);              // -> 1 Gebe Thread 1 wieder frei (50%) 1/2
  271.     }
  272. }
  273.  
  274.  
  275. void *function4(double * dist){             // Thread 4 Funktion (Buzzer)
  276.     while(1){
  277.         sem_wait(&S5);              // -> 0     Warte das Thread 2 freigibt
  278.         //printf("Funktion 4 wird ausgeführt\n");
  279.    
  280.         if(*dist < 10){             // Wenn Distanz kleiner als 10cm, wird ein Ton ausgegeben
  281.             softToneWrite(25, 10);      // Ton ausgeben
  282.             delay(300);         // Warten
  283.             softToneWrite(25, 0);       // Ton auschalten
  284.         }
  285.     sem_post(&S4);                  // -> 1     gebe Thread 1 wieder frei (50%) 2/2
  286.     }
  287. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement