実現したいこと
ラズパイにて
タクトスイッチオン→LEDとブザーがON
もう一度タクトスイッチを押す→LEDとブザーがOF
システム終了をしない限りは、上記の繰り返しを行うシステムを実現させたいです
現状ではタクトスイッチを押した際にLEDとブザーは反応するのですが
再度タクトスイッチを押下してもLEDとブザーが反応したままになっています。
また、シグナルハンドラを呼び出した際にもLEDとブザーが反応したままなので、消したいです。
#include<stdio.h> #include<string.h> #include<wiringPi.h> #include<signal.h> #define GPIO_LED 21 #define GPIO_TCT 20 #define GPIO_BUZ 5 void motion_on(int flag2); void motion_off(void); void Signal (int sig_name); void SetSignal(int sig_name); void tct_callbak(void); volatile sig_atomic_t flag = 0; int main(void){ if(wiringPiSetupGpio()==-1){ return 1; } pinMode(GPIO_LED,OUTPUT); pinMode(GPIO_TCT,INPUT); pinMode(GPIO_BUZ,OUTPUT); pullUpDnControl(GPIO_TCT,PUD_DOWN); pullUpDnControl(GPIO_LED,PUD_DOWN); pullUpDnControl(GPIO_BUZ,PUD_DOWN); signal(SIGINT,Signal); wiringPiISR(GPIO_TCT,INT_EDGE_BOTH,tct_callbak); while(flag==0){ }; return 0; } void tct_callbak(void){ if(digitalRead(GPIO_TCT)==HIGH){ motion_on(1); }else if(digitalRead(GPIO_TCT)==LOW){ motion_off() ; } } void motion_on(int flag2){ digitalWrite(GPIO_BUZ,HIGH); for(int i=0; i<10;i++){ digitalWrite(GPIO_LED,HIGH); delay(500); digitalWrite(GPIO_LED,LOW); delay(500); } flag2=1; while(flag2==1){ digitalWrite(GPIO_LED,HIGH); digitalWrite(GPIO_BUZ,HIGH); } } void motion_off(void){ printf("OFFのよびだし"); digitalWrite(GPIO_BUZ,LOW); digitalWrite(GPIO_LED,LOW); motion_on(0); } void SetSignal(int sig_name){ f(signal(sig_name , Signal)==SIG_ERR){ printf("シグナル設定が出来ませんでした"); } } void Signal (int sig_name){ char str[3]; char str2[]="YES"; printf("システムを終了しますか。YES/NO\n"); scanf("%s",str); if(strcmp (str,str2)==0){ flag=1; }else{ flag=0; } }