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);
}