# Συζήτηση Κυκλωμάτων > Ψηφιακά Κυκλώματα > Μικροελεγκτές >  >  Rc pwm button hold

## finos

καλήμερα σας ! 

από το frsky taranis που έχω για το uav όταν αλλαξω τη θέση σε ένα switch που έχει το χειριστήριο  στον δεκτή αλλάζει η καταλληλη τιμή  pwm 
με το arduino διαβάζω την τιμή αυτή 



```
Rc1Value = pulseIn(Rc1, HIGH);
if (Rc1Value >= 1480 && Rc1Value <= 1490) {
        //do stuff
    }
```


ο διακόπτης έχει 3 θέσεις 



```
if (Rc1Value >= 970 && Rc1Value <= 980) {//upper       
        timeIn = millis();
        held = timeIn-timeOut;
        if (held >= 500 && held <= 600) {
            Serial.write(Mode, sizeof(Mode));
        }
        if (held >= 601 && held <=800)
        {
            Serial.write(SimWiFi, sizeof(SimWiFi));
        }
        timeOut = millis();
    }


    if (Rc1Value >= 1480 && Rc1Value <= 1490) {//mid
        return;
    }


 if (Rc1Value >= 1990 && Rc1Value <= 2000) {//lower
       //Serial.println("Simwifi");
     Serial.write(SimPower, sizeof(SimPower));


  }
```


προσπαθώ όπως βλέπετε όταν το κρατάω στο upper να κάνει το 1 action και όταν το ανοιγοκλείνω να κάνει το 2ο το "normal" του swich θα ειναι το mid  . άμα κάνω αυτό  θέλει pushbutton στα ψηφιακά,κάτι που έμενα δεν με βολεύει
timer-taranis-arm-switch-start-stop-pause.jpg

κάθε βοήθεια θα ήταν ευπρόσδεκτη !

----------


## info@kalarakis.com

Να πω τώρα ότι κατάλαβα κάτι
Θα πω ψέματα
Για ξαναγραψετα αλλά πιο αναλυτικά. Σαν να μηλας στη γιαγιά σου

----------

finos (02-04-19)

----------


## finos

ναι συγνωμη ,έχω καιρό να εκφράσω γραπτά τεχνικό πρόβλημα και ... :Unsure:  :Biggrin:  :Blink: ...
στο θεμα μας !

ο pixhawk θα στελνει ενα pwm σήμα στο arduino για να κάνει 3 εργασίες . ο διακόπτης που αλλαζει αυτό σήμα εχει 3 θεσειςtimer-taranis-arm-switch-start-stop-pause.jpg με τα κομμάτια κωδικά που σας έχω γράψει στο #1 
εχω καταφέρει α) να διαβάζω το pwm σήμα .
                      β) να εχω το mid->upper->mid σαν μια momentary θέση του διακόπτη ,και αντίστοιχα για το mid->lower->mid  (να το χρησιμοποιώ σαν button)

 το mid θα ειναι σαν nutural θέση όποτε όταν το κρατάω στην upper θέση για <=1 δευτερόλεπτο θα κάνει την 1η εργασία ,   >=1s την 2η (hold δηλαδή το κουμπί ) 

αυτο το κομματι του hold δεν μπορώ να πετύχω . :Blushing: 

καλύτερα τωρα ?   :Blush:

----------


## nestoras

Με το που φυγει ο διακοπτης απο τη θεση mid προς τα επανω θα πρεπει να ξεκινα ενας timer. Ο timer θα μετρα μεχρι να επιστρεψει ξανα ο διακοπτης στη θεση mid.

Μετα θα βαλεις τις απαραιτητες συνθηκες αναλογα με την τιμη του timer.

----------


## finos

```
if(Rc1Value >= 970 && Rc1Value <= 980) {		timeIn = millis();
		if(millis() - timeIn > 100)
		{
      Serial.println("simMode");
		}
	}
```


έκανα μια μικρη προσπαθεια που στεφθηκε απο απολυτή αποτυχια  :Cursing: 

καταλαβα κατι λαθος ? 

ειχα σκεφτει και αυτο : 



```
 i++;

if(i>=10){
 Serial.println("simMode");
}
if(i<=10){
 Serial.println("simWiFi");
}
```


που ξεκινουσε καλά αλλα με το που εμπενε για πρωτη φωρα στο simWiFi κολουσε κει 

εχω μια ακομη ιδεα αλλα θα μπορεσω να την δωκιμασω αυριο

----------


## finos

:Dancing:  :Dancing:  κάτι κατάφερα  :Wink: 




```

void loop() {
    Rc1Value = pulseIn(Rc1, HIGH);


    if(Rc1Value >= 970 && Rc1Value <= 980) {
         //top
        i++;
        //when the switch goes to this posision 
        //the i counter starts 
   
     return;
    }


    if (Rc1Value >= 1480 && Rc1Value <= 1490) {
    //mid
        //when the switch is back at center detarmine
        //the time that it spent on lower pos
        
        if (i >=11) {
            Serial.println("simWiFi");
        }
        if (i <= 10&&i>0) {
            Serial.println("simMode");//then send the command 
        }
        if (sPower == true) {
            Serial.println("SimPower");//read the flag , if true perform the actio n only once 
            
        }
    sPower = false;
    i = 0;//finaly reset the timer and flag
     return;     
    }


    if(Rc1Value >= 1990 && Rc1Value <= 2000) {
       
    
     //lower
     // single action
        sPower = true;//set a flag ,when on mid  the right action will take place 
        Serial.println("sPower");
     return;
    }
    delay(800);
 
}
```


πως σας φαίνεται?

----------

