Stepper Moves, IR Flashes, Repeat... How?

Hi Tom,

You need to set the pinMode to INPUT_PULLUP because otherwise you will get problems when using things like a stepper motor or a servo.

See if this works, all I'm doing here is first setting the counter to the max so nothing happens in the loop and then when the user presses the button it resets the counter to 0 so that the loop begins the processing.
Gets rid of enclosing everything in an if statement:

#include <AFMotor.h>
int IRledPin =  12;    // LED connected to digital pin 12
AF_Stepper motor(200, 1);
int NumberOfPictures = 5;  // How many pictures should we take?
int CountVariable = 5;  // I'll use this to keep a tab on how many pictures we've taken so far. I've set this to 5 already so nothings going to happen until its reset to 0
int ButtonPin = 2; // needn't be a const
// int ButtonState = 0; // don't need this line

void setup()   {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Start!");  
  pinMode(IRledPin, OUTPUT);
  pinMode(ButtonPin, INPUT_PULLUP); // you hadn't set the pin mode in your example, you need to wire the button between pin 2 and Gnd
  motor.setSpeed(5);
}

// you also need to use digitalRead(ButtonPin) to get the value of the pin.

void loop() {
  if (digitalRead(ButtonPin) == LOW) CountVariable = 0; // the magic line, if the button is pressed then the count is set to 0 so it all begins. 
  if (CountVariable == NumberOfPictures) return; // Stop now as CountVariable indicates that we have taken the correct NumberOfPictures

 RotateTT();
 delay(1000); // 1000 milliseconds = 1 second
 SendNikonCode();
 delay(1000); // 1000 milliseconds = 1 second
 CountVariable ++; // increment the count variable so it is actually counting :)
}  // at this point it will go to the top of the loop at the void loop() line and start again.

// everything below this is nicely hidden away :)

// This procedure sends a 38KHz pulse to the IRledPin 
// for a certain # of microseconds. We'll use this whenever we need to send codes
void pulseIR(long microsecs) {
  // we'll count down from the number of microseconds we are told to wait
 
  cli();  // this turns off any background interrupts

  while (microsecs > 0) {
    // 38 kHz is about 13 microseconds high and 13 microseconds low
   digitalWrite(IRledPin, HIGH);  // this takes about 3 microseconds to happen
   delayMicroseconds(10);         // hang out for 10 microseconds, you can also change this to 9 if its not working
   digitalWrite(IRledPin, LOW);   // this also takes about 3 microseconds
   delayMicroseconds(10);         // hang out for 10 microseconds, you can also change this to 9 if its not working
 
   // so 26 microseconds altogether
   microsecs -= 26;
  }
 
  sei();  // this turns them back on
}
 
void SendNikonCode() {
  Serial.println("Fire Camera!");
  pulseIR(2080);
  delay(27);
  pulseIR(440);
  delayMicroseconds(1500);
  pulseIR(460);
  delayMicroseconds(3440);
  pulseIR(480);
 
  delay(65); // wait 65 milliseconds before sending it again
 
  pulseIR(2000);
  delay(27);
  pulseIR(440);
  delayMicroseconds(1500);
  pulseIR(460);
  delayMicroseconds(3440);
  pulseIR(480);
  
  delay(55);
}


void RotateTT() {
  Serial.println("6 Double coil steps");
  motor.step(6, FORWARD, DOUBLE);
}