servo throws switch with unknown delay

Hi all,

Trying to get a program to run once a hardware switch (set to pin 2) is set to high. A servo (handServo) with a small arm connected then turns the switch back off. Below is my code. For some reason there is a delay of anywhere between 3 and 15 seconds between the switch getting turned by me until the program executes. Any thoughts?

#include <Servo.h>
Servo doorServo;
Servo handServo;

int switch_pin = 2; //set switch on pin 2

int pos = 0;
int selectedMove = 0; //move selector
int Testmove = 0; //test mode: set to move number to test only one selected move
//(set to Zero to run normally i.e: roundrobbin on all moves)
boolean randomize = true; // if true, the box will do movers randomly, if set to false then the moves will be done sequencially from 1 to 10

void setup()
{
Serial.begin(9600);
pinMode(switch_pin, INPUT);
doorServo.attach(9); //set door servo on Pin 9 pwm
handServo.attach(10); //set hand servo on Pin 10 pwm
doorServo.write(60); //set door to hiding position
handServo.write(0); //set hand to hiding position

}

void loop()
{

//if the switch is on, then move door and hand to switch it off...
if(digitalRead(switch_pin) == HIGH)
{

if (Testmove == 0)
{

if(randomize == false)
{
if (selectedMove > 10)
{
selectedMove = 0; //when all moves are played, repeat the moves from beginning
}
}
else
{
selectedMove = random(5);
}
}
else
{
selectedMove = Testmove;
}
Serial.println(selectedMove);
if (selectedMove == 0) { switchoff(); }
else if (selectedMove == 1) { switchoff(); }
else if (selectedMove == 2) { switchoffbitaraddod(); }
else if (selectedMove == 3) { crazydoor(); }
else if (selectedMove == 4) { crazyslow(); }
if (Testmove == 0 && randomize == false) {
selectedMove++; //swith to next move if not in test mode
}

}
}

// Library of moves

// basic move
void switchoff()
{
//Moving door
for(pos = 60; pos > 0; pos -= 3)
{
doorServo.write(pos);
delay(15);
}

//Moving hand
for(pos = 0; pos < 115; pos += 4)
{
handServo.write(pos);
delay(15);
}

//hiding hand
for(pos = 115; pos>=0; pos-=4)
{
handServo.write(pos);
delay(15);
}

//hiding door
for(pos = 0; pos<=60; pos+=3)
{
doorServo.write(pos);
delay(15);
}
}

// move 2: open and wait, then move hand and wait, then switch of and hide
void switchoffbitaraddod()
{
//Moving door
for(pos = 60; pos > 0; pos -= 3)
{
doorServo.write(pos);
delay(15);
}
delay(800);
//Moving hand
for(pos = 0; pos < 90; pos += 4)
{
handServo.write(pos);
delay(15);
}
delay(1000);
for(pos = 90; pos < 115; pos += 4)
{
handServo.write(pos);
delay(15);
}

//hiding hand
for(pos = 115; pos>=0; pos-=5)
{
handServo.write(pos);
delay(15);
}

//hiding door
for(pos = 0; pos<=60; pos+=3)
{
doorServo.write(pos);
delay(15);
}

}

//move 3: open door then close it many times, wait, then quickly reoprn a nd switch off and hide.

void crazydoor()
{

//Moving door
for(pos = 60; pos > 0; pos -= 3)
{
doorServo.write(pos);
delay(15);
}

//hiding door
for(pos = 0; pos<=60; pos+=3)
{
doorServo.write(pos);
delay(15);
}
//Moving door
for(pos = 60; pos > 0; pos -= 3)
{
doorServo.write(pos);
delay(15);
}

//hiding door
for(pos = 0; pos<=60; pos+=3)
{
doorServo.write(pos);
delay(15);
}
delay(700);
//Moving door
for(pos = 60; pos > 0; pos -= 3)
{
doorServo.write(pos);
delay(15);
}
delay(700);
//hiding door
for(pos = 0; pos<=60; pos+=3)
{
doorServo.write(pos);
delay(15);
}

//----of switch of----//
//Moving door
for(pos = 60; pos > 0; pos -= 3)
{
doorServo.write(pos);
delay(15);
}

//Moving hand
for(pos = 0; pos < 115; pos += 4)
{
handServo.write(pos);
delay(15);
}

//hiding hand
for(pos = 115; pos>=0; pos-=4)
{
handServo.write(pos);
delay(15);
}

//hiding door
for(pos = 0; pos<=60; pos+=3)
{
doorServo.write(pos);
delay(15);
}

}

// move 4: open door, then move hand very slowly forward and back to hiding very slowly, then quickly close door
void crazyslow()
{

//Moving door
for(pos = 60; pos > 0; pos -= 3)
{
doorServo.write(pos);
delay(15);
}

//Moving hand
for(pos = 0; pos < 115; pos += 5)
{
handServo.write(pos);
delay(30);
}

//hiding hand
for(pos = 115; pos>=0; pos-=1)
{
handServo.write(pos);
delay(30);
}

//hiding door
for(pos = 0; pos<=20; pos+=1)
{
doorServo.write(pos);
delay(30);
}
delay(100);
for(pos = 20; pos<=80; pos+=4)
{
doorServo.write(pos);
delay(15);
}

}

Please modify your post and use the code button </> so your code looks like this and is easy to copy to a text editor. See How to use the Forum Your code is too long for me to study quickly without copying to a text editor.

...R

I'm guessing that you have a floating pin condition, because when the switch is not pressed, the voltage on the pin is undefined.

You really need to show us how the switch is wired, and explained why you are not using the internal pullup resistor and the associated much simpler wiring.

And, of course, post your code correctly.

Sorry, guys. Really new to this. The switch I'm using is a two position switch which has 3 connectors. The middle pole is connected to GND. One of the other two is connected to pin 2. I also think there is something going on with this switch, but am unfamiliar with the pull up resistor function on the Arduino. Here's a repost of the code:

#include <Servo.h> 
Servo doorServo;
Servo handServo;

int switch_pin = 2;               //set switch on pin 2

int pos = 0;
int selectedMove = 0;             //move selector
int Testmove = 0;                 //test mode: set to move number to test only one selected move 
                                 //(set to Zero to run normally i.e: roundrobbin on all moves)
boolean randomize = true;        // if true, the box will do movers randomly, if set to false then the moves will be done sequencially from 1 to 10 


void setup()
{
  Serial.begin(9600);
  doorServo.attach(9);           //set door servo on Pin 9 pwm
  handServo.attach(10);          //set hand servo on Pin 10 pwm
  doorServo.write(60);           //set door to hiding position 
  handServo.write(0);            //set hand to hiding position

}


void loop()
{

  //if the switch is on, then move door and hand to switch it off...
  if(digitalRead(switch_pin) == HIGH)
  {
    
  if (Testmove == 0)
  {
      
    if(randomize == false)
    {  
      if (selectedMove > 10) 
      {
      selectedMove = 0; //when all moves are played, repeat the moves from beginning 
      }
    } 
    else 
    {
    selectedMove = random(5);
    }
  }
  else 
  {
  selectedMove = Testmove;
  }
  Serial.println(selectedMove);
  if (selectedMove == 0) { switchoff(); }
  else if (selectedMove == 1) { switchoff(); }   
  else if (selectedMove == 2) { switchoffbitaraddod(); }
  else if (selectedMove == 3) { crazydoor(); }
  else if (selectedMove == 4) { crazyslow(); }
  if (Testmove == 0 && randomize == false) {
  selectedMove++;         //swith to next move if not in test mode
  }

}
}

// Library of moves

   // basic move 
   void switchoff() 
   {    
   //Moving door
    for(pos = 60; pos > 0; pos -= 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
   
    //Moving hand
    for(pos = 0; pos < 115; pos += 4)  
    {                                   
    handServo.write(pos);               
    delay(15);                       
    }  
    
    //hiding hand
    for(pos = 115; pos>=0; pos-=4)    
    {                                
    handServo.write(pos);               
    delay(15);                        
    } 
      
    //hiding door
    for(pos = 0; pos<=60; pos+=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    } 
   } 
     
   // move 2: open and wait, then move hand and wait, then switch of and hide  
    void switchoffbitaraddod()
   {
  //Moving door
    for(pos = 60; pos > 0; pos -= 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
    delay(800); 
    //Moving hand
    for(pos = 0; pos < 90; pos += 4)  
    {                                   
    handServo.write(pos);               
    delay(15);                       
    }
    delay(1000); 
    for(pos = 90; pos < 115; pos += 4)  
    {                                   
    handServo.write(pos);               
    delay(15);                       
    }    
    
    //hiding hand
    for(pos = 115; pos>=0; pos-=5)      
    {                                
    handServo.write(pos);               
    delay(15);                        
    } 
      
    //hiding door
    for(pos = 0; pos<=60; pos+=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                    
    } 
     
   }
  
   //move 3: open door then close it many times, wait, then quickly reoprn a nd switch off and hide.
  
   void crazydoor()
  {
    
   //Moving door
    for(pos = 60; pos > 0; pos -= 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
  
    //hiding door
    for(pos = 0; pos<=60; pos+=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                    
    } 
   //Moving door
    for(pos = 60; pos > 0; pos -= 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
  
    //hiding door
    for(pos = 0; pos<=60; pos+=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                    
    } 
    delay(700);
   //Moving door
    for(pos = 60; pos > 0; pos -= 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
    delay(700);
    //hiding door
    for(pos = 0; pos<=60; pos+=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                    
    } 

    
    //----of switch of----//
  //Moving door
    for(pos = 60; pos > 0; pos -= 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
   
    //Moving hand
    for(pos = 0; pos < 115; pos += 4)  
    {                                   
    handServo.write(pos);               
    delay(15);                       
    }  
    
    //hiding hand
    for(pos = 115; pos>=0; pos-=4)    
    {                                
    handServo.write(pos);               
    delay(15);                        
    } 
      
    //hiding door
    for(pos = 0; pos<=60; pos+=3)     
    {                                
    doorServo.write(pos);              
    delay(15);                    
    }    
    
  }   


 // move 4: open door, then move hand very slowly forward and back to hiding very slowly, then quickly close door
 void crazyslow()
 {
 
//Moving door
    for(pos = 60; pos > 0; pos -= 3)   
    {                                   
    doorServo.write(pos);              
    delay(15);                       
    }
   
    //Moving hand
    for(pos = 0; pos < 115; pos += 5)  
    {                                   
    handServo.write(pos);               
    delay(30);                       
    }  
    
    //hiding hand
    for(pos = 115; pos>=0; pos-=1)      
    {                                
    handServo.write(pos);               
    delay(30);                        
    } 
      
    //hiding door
    for(pos = 0; pos<=20; pos+=1)     
    {                                
    doorServo.write(pos);              
    delay(30);                      
    }
    delay(100);
    for(pos = 20; pos<=80; pos+=4)     
    {                                
    doorServo.write(pos);              
    delay(15);                      
    }     
    
 }

Just because your switch takes the pin low to ground when it's closed, that doesn't mean it will magically be high when it's open. A pullup resistor does that, and it so happens that Arduino pins have those builtin and you just need to turn them on.

Put this in setup:

pinMode(switch_pin, INPUT_PULLUP);