Hello!
I have simple project that I've found in this video: DIY Arduino Camera Shutter Speed Tester. HOW TO, less than $10! - YouTube
It actually uses a laser module and a laser sensor to check the shutter speed. I've corrected the code a bit to make it work faster. Seems like it works more or less fine. But when I check my cameras seems like all my cameras' shutters are of speed. It is more or less ok up to 1/60s or 1/125 but then it shows something about 1/200 for the speed set on my camera to 1/500 and something around 1/400 to the speed set to 1/1000. I wonder if this sensor is precise enough for speeds like so that and all my cameras are very slow or the sensor is just not able to work on speeds like that.
long Start; // this is the time in microseconds that the shutter opens (the arduino runs a microsecond clock in the background always - it is reasonably accurate for this purpose)
long Stop; // this is the time in microseconds that the shutter closes
bool Fired = false; // this is a flag indicating when the shutter has been fired completely. when fired =1, the shutter has been fired, and the computer needs to display the information related to the exposure time.
bool Risingflag = false; // this is a flag that i set in my interrupt routine, Rising flag is set to = 1 when the voltage INCREASES in the interrupt
bool Fallingflag = false; // this is a flag that i set in the interrupt routine, Fallingflag is set to =1 when the voltage DECREASES in the interrupt
float SS1;
float SS2;
long Speed;
int pin = 2;
void setup() { //This part of the program is run exactly once on boot
Serial.begin(115200); //opens a serial connection.
attachInterrupt(digitalPinToInterrupt(pin), CLOCK, CHANGE); //run the function CLOCK, every time the voltage on pin 2 changes.
}
void loop() { // this part of the program is run, in order, over and over again, start to finish, unless INTERRUPTED by our interrupt
if(Risingflag){
Start = micros(); //set the variable Start to current microseconds
Risingflag=false; //reset the rising flag to 0, so that this function isnt called again until the shutter actually fires
}
if(Fallingflag){
Stop = micros(); // set the variable Stop to current microseconds
Fallingflag = false; //reset the falling flag to 0, so that this function isnt called again untill the shutter fires again.
Fired = true; // set the fired flag to 1, triggering the calculation of a shutter speed, and its display over the serial monitor.
}
if(Fired){ //if the flag Fired = 1, print this information to the serial monitor"
Speed = (Stop - Start);
SS1 = (float) Speed/1000000; // make a variable SS, which is how many seconds that the shutter open for
SS2 = 1/SS1;
Serial.print("Start: ");
Serial.println(Start);
Serial.print("Stop: ");
Serial.println(Stop);
Serial.print("Microseconds: ");
Serial.println(Speed); //display total microseconds in shutter interval
// make a variable SS2, which is the inverse of the SS, or 1/ the shutter speed
Serial.print("shutter speed: 1/");
Serial.println(SS2); //display the shutter speed
Serial.println();
Start = 0; // reset Start to 0
Stop = 0; //reset Stop to 0 . *** these are not necessarily needed, but makes errors more evident should they occur
Fired = false; //reset Fired flag to 0, so that the shutter speed will not be calclulated and displayed, until the next full interrupt cycle, where a start and stop time are generated.
}
}
void CLOCK(){ //this is the interrupt function, which is called everytime the voltage on pin 2 changes, no matter where in the main program loop that the computer is currently in
if(digitalRead(pin) == LOW){
Serial.println("HIGH");
Risingflag = true; // if the voltage on pin 2 is high, set the Risingflag to 1 : this will trigger the function called Rising from the main loop, which will set a start time
}
if(digitalRead(pin) == HIGH){ // . if the voltage on pin 2 is low, set the Fallingflag to 1 : this will trigger the function called Falling from the main loop, which will set the stop time, and also set the Fired flag to 1.
Fallingflag = true;
Serial.println("LOW");
}
}