buton durumunu bekletme

merhaba arkadaşlar programda switch devreye girince habire dongunun içine girip defalarca kapı açık yada kapı kapalı yazıyor . acaba bunu sadece switch buttonun her basımı için sadece bir kez tepki verebilmesi için ne yapabilirirm ? Ekran goruntusu bu http://prntscr.com/c05klb switch e bastıgımda sadece bir kere yazsın istiyorum if dongüsünü bekletecek bir kod varmı ? const int switch1Pin = 7; // switch input 1 const int switch2Pin = 9; // switch input 2 const int ledPin = 13; int count1 = 1; int count2 = 1; int row =0 ; int Switch1State = 0; int Switch2State= 0; void setup() { // set the switch as an input: Serial.begin(115200); Serial.println(“CLEARDATA”); Serial.println(“LABEL,Time,Cyc of heater,Cyc of door,Stuation”); pinMode(ledPin, OUTPUT); pinMode(switch1Pin, INPUT); pinMode(switch2Pin, INPUT); Switch1State = digitalRead( switch1Pin) ; Switch2State = digitalRead( switch2Pin); } void loop() { // Door is closed and heater is working well if(digitalRead(switch1Pin)==HIGH && digitalRead(switch2Pin) == HIGH){ //kapi kapali + heater calisiyor Serial.print(“DATA,TIME,”); Serial.print(count1); Serial.print(“,”); Serial.print(count2); Serial.print(“,”); Serial.println(“Door is closed and heater is working well”); } if(digitalRead(switch1Pin)==LOW && digitalRead(switch2Pin) == HIGH){ //kapi kapali + heater calismiyor Serial.print(“DATA,TIME,”); Serial.print(count1); Serial.print(“,”); Serial.print(count2); Serial.print(“,”); Serial.println(“EROR! Door is closed and heater is not working well”); } if(digitalRead(switch1Pin)==LOW && digitalRead(switch2Pin) == LOW){ //kapi acik + heater calismiyor Serial.print(“DATA,TIME,”); Serial.print(count1); Serial.print(“,”); Serial.print(count2); Serial.print(“,”); Serial.println(“Door is open and heater is not working well”); } }

programı yaptım flag ekleyerek ; const int switch1Pin = 7; // switch input 1 const int switch2Pin = 9; // switch input 2 const int ledPin = 13; int count1 = 1; int count2 = 1; int row = 0 ; int Switch1State = 0; int Switch2State = 0; void setup() { // set the switch as an input: Serial.begin(115200); Serial.println(“CLEARDATA”); Serial.println(“LABEL,Time,Cyc of heater,Cyc of door,Stuation”); pinMode(ledPin, OUTPUT); pinMode(switch1Pin, INPUT); pinMode(switch2Pin, INPUT); Switch1State = digitalRead( switch1Pin) ; Switch2State = digitalRead( switch2Pin); } bool flag = false; void loop() { // Door is closed and heater is working well if( digitalRead(switch2Pin) == HIGH && (flag == false)) { if(digitalRead(switch1Pin) == HIGH) { flag = true; Serial.print(“DATA,TIME,”); Serial.print(count1); Serial.print(“,”); Serial.print(count2); Serial.print(“,”); Serial.println(“Door is closed and heater is working well”); } else { flag = true; Serial.print(“DATA,TIME,”); Serial.print(count1); Serial.print(“,”); Serial.print(count2); Serial.print(“,”); Serial.println(“EROR! Door is closed and heater is not working well”); } delay(10); } else if( digitalRead(switch2Pin) == LOW && (flag == true)) { flag = false; Serial.print(“DATA,TIME,”); Serial.print(count1); Serial.print(“,”); Serial.print(count2); Serial.print(“,”); Serial.println(“Door is open and heater is not working well”); } }

Programını incelemedim ama ortak problemi çok yerde gördüğüm için anlatmaya çalışacağım. mikroişlemci saniyede binlerce, milyonlarca işlem yapar. Sen 1 butonu kontrol etmek istediğinde, if(Buton1 ==1 ) { } yazdığında butona 1 geldimi, gelmedimi diye kontrol etmiş olursun. Mikroişlemci bu satırı saniyede binlerce, milyonlarca kez kontrol eder. Bir insanın butona basıp bırakma süresini ortalama 1 saniye varsayarsak aslında sen 1 milyon kere karar vermiş olursun. Burada yapman gereken yükselen kenarı yakalamak. Bunun yolu ise şu şekilde if(Buton1 ==1) { if(Buton1kontrol) { Buton1kontrol=0; //yapılacak işlemler } } else Buton1kontrol=1; Böylece butona bastığın anda buton1 kontrol değişkeni 0 değerini alır butonu bırakana kadar bu değişken 0 kalacağı için içerideki işlem yalnızca 1 defa yapılmış olur. Elini butondan çektiğinde Buton1kontrol değişkeni 1 değerini alarak bir sonraki basma için hazır hale gelir.