.
Hallo,
ich bin blutiger Anfänger und habe leider zu wenig Ahnung, daher die Frage
Im Rahmen eines Projektes zur Messung der Belichtungszeit alter Kameras, habe ich ein Messgerät it dem Arduino nachgebaut.
Den code habe ich dabei etwas ergänzt um zum seriellen Monitor auf ein LCD zu kommen.
Das unschöne dabei ist die Zeit korrekt darzustellen, also über eine Sekunde soll es nicht mit 1/xy angezeigt werden.
Die mirkosekunden bekomme ich ja gemessen und umgerechnet, aber die Anzeige analog zu der Einstellung an den Kameras würde dann aber so aussehen:
1sec
1/2 sec
1/4 sec
1/8 sec
1/10
1/25
1/50
1/60
usw.
Hat jemand eine Idee?
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
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
int Fired = 0; // 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.
int Risingflag = 0; // this is a flag that i set in my interrupt routine, Rising flag is set to = 1 when the voltage INCREASES in the interrupt
int Fallingflag = 0; // this is a flag that i set in the interrupt routine, Fallingflag is set to =1 when the voltage DECREASES in the interrupt
void setup() { //This part of the program is run exactly once on boot
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.setCursor(0,1);
lcd.print("(c) by xyz");
lcd.setCursor(0,0);
lcd.print("Shutterspeed 1.1");
Serial.begin(9600); //opens a serial connection.
attachInterrupt(digitalPinToInterrupt(2), 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 ==1){
Start = micros(); //set the variable Start to current microseconds
Risingflag=0; //reset the rising flag to 0, so that this function isnt called again until the shutter actually fires
}
if(Fallingflag == 1){
Stop = micros(); // set the variable Stop to current microseconds
Fallingflag = 0; //reset the falling flag to 0, so that this function isnt called again untill the shutter fires again.
Fired = 1; // set the fired flag to 1, triggering the calculation of a shutter speed, and its display over the serial monitor.
}
if(Fired == 1){ //if the flag Fired = 1, print this information to the serial monitor"
Serial.print("Start: ");
Serial.println(Start);
Serial.print("Stop: ");
Serial.println(Stop);
long Speed = (Stop - Start); // make a variable called speed, which is the total number of microseconds that the shutter is open for
Serial.print("Microseconds: ");
Serial.println(Speed); //display total microseconds in shutter interval
float SS = (float)Speed/1000000; // make a variable SS, which is how many seconds that the shutter open for
float SS2 = 1/SS; // 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();
lcd.begin(16, 2);
lcd.setCursor(0,1);
lcd.print("1/");
lcd.print(SS2);
lcd.print(" sec.");
lcd.setCursor(0,0);
lcd.print("Shutter Speed:");
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 = 0; //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(2) == LOW){
Risingflag = 1; // if the voltage on pin 2 is lowh, set the Risingflag to 1 : this will trigger the function called Rising from the main loop, which will set a start time
}
if(digitalRead(2) == HIGH){ // . if the voltage on pin 2 is high, 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 =1;
}
}
Shutter_Speed_v1_1_Ingo.ino (4.36 KB)