3 * Arduino Intervalometer
13 #define INTERVALBULB 2
16 void pulsePin(int pin
, int value
);
17 void lcdCommandWrite(int value
);
18 void lcdDataWrite(int value
);
19 void lcdNumberWrite(int nr
);
20 void lcdHome(int row
);
26 void incrementValue();
27 void decrementValue();
28 void updateEncoderValue();
30 void switchSelected();
32 void drawTimecode(int secs
, int rep
);
33 int timecodeLength(int secs
, int rep
);
35 int buttonA
= 0; // Left pushbutton
36 int buttonB
= 1; // Right pushbutton
38 int inputTrigger
= 2; // Input trigger interrupt
40 int encoderButton
= 3;
45 int lcdDataBus
[] = { 7, 8, 9, 10 };
46 int lcdDataClock
= 11;
49 int cameraTrigger
= 13; // Pulse low for shutter release
51 /////////////////////////////
53 int currentMode
= INTERVAL
, selected
= 0;
55 unsigned long lastToggleRunning
= 0;
56 unsigned long lastModeUpdate
= 0;
57 unsigned long lastSelectedUpdate
= 0;
58 unsigned long lastShutter
= 0;
61 int updateHeader
= 1, updateEncoder
= 1;
62 int exposureTime
= 0, lapseTime
= 0;
63 int exposureRepresentation
= 0, lapseRepresentation
= 0;
64 int encoderPinALast
= LOW
;
68 * Higher level hardware functions
71 void pulsePin(int pin
, int value
)
73 digitalWrite(pin
, !value
);
75 digitalWrite(pin
, value
);
77 digitalWrite(pin
, !value
);
82 * lcd Control Functions
85 void lcdCommandWrite(int value
)
92 for (i
= lcdDataBus
[0]; i
<= lcdDataInt
; i
++)
94 digitalWrite(i
,value1
& 01);
98 pulsePin(lcdEnable
, HIGH
);
101 for (i
= lcdDataBus
[0]; i
<= lcdDataBus
[3]; i
++)
103 digitalWrite(i
, value
& 01);
109 for (i
= lcdDataClock
; i
<= lcdDataInt
; i
++)
111 digitalWrite(i
, value
& 01);
115 pulsePin(lcdEnable
, HIGH
);
118 void lcdDataWrite(int value
)
123 digitalWrite(lcdDataInt
, HIGH
);
124 digitalWrite(lcdDataClock
, LOW
);
128 for (i
=lcdDataBus
[0]; i
<= lcdDataBus
[3]; i
++)
130 digitalWrite(i
,value1
& 01);
134 pulsePin(lcdEnable
, HIGH
);
137 digitalWrite(lcdDataInt
, HIGH
);
138 digitalWrite(lcdDataClock
, LOW
);
140 for (i
=lcdDataBus
[0]; i
<= lcdDataBus
[3]; i
++)
142 digitalWrite(i
,value
& 01);
146 pulsePin(lcdEnable
, HIGH
);
149 void lcdNumberWrite(int nr
)
151 // We don't need negatives, but if you do:
154 lcdCommandWrite(557);
159 lcdCommandWrite(544);
163 int n2
= (nr
- n1
* 100) / 10;
166 lcdCommandWrite(560 + n2
);
168 nr
= nr
- n1
* 100 - n2
* 10;
169 lcdCommandWrite(560 + nr
);
172 void lcdHome(int row
)
174 lcdCommandWrite(0x02);
179 lcdCommandWrite(0xC0);
186 lcdCommandWrite(0x01);
191 * Hardware initialization functions
198 for (i
= lcdEnable
; i
<= lcdDataInt
; i
++)
201 lcdCommandWrite(0x03); delay(64);
202 lcdCommandWrite(0x03); delay(50);
203 lcdCommandWrite(0x03); delay(50);
204 lcdCommandWrite(0x02); delay(50);
205 lcdCommandWrite(0x2C); delay(20);
206 lcdCommandWrite(0x06); delay(20);
207 lcdCommandWrite(0x0C); delay(20);
208 lcdCommandWrite(0x01); delay(100);
209 lcdCommandWrite(0x80); delay(30);
214 pinMode (encoderPinA
, INPUT
);
215 digitalWrite(encoderPinA
, HIGH
);
216 pinMode (encoderPinB
, INPUT
);
217 digitalWrite(encoderPinB
, HIGH
);
222 pinMode(buttonA
, INPUT
);
223 digitalWrite(buttonA
, HIGH
);
224 pinMode(buttonB
, INPUT
);
225 digitalWrite(buttonB
, HIGH
);
227 pinMode(encoderButton
, INPUT
);
228 digitalWrite(encoderButton
, HIGH
);
234 pinMode(cameraTrigger
, OUTPUT
);
235 digitalWrite(cameraTrigger
, HIGH
);
242 void incrementValue()
246 if(lapseRepresentation
== 0)
253 if(exposureRepresentation
== 0)
258 if(exposureTime
> lapseTime
)
259 lapseTime
= exposureTime
;
263 void decrementValue()
267 if(lapseRepresentation
== 0)
274 if(exposureRepresentation
== 0)
281 void updateEncoderValue()
283 n
= digitalRead(encoderPinA
);
284 if ((encoderPinALast
== LOW
) && (n
== HIGH
))
286 if (digitalRead(encoderPinB
) == LOW
)
297 lapseRepresentation
= 1;
299 lapseRepresentation
= 0;
301 if(exposureTime
>= 60)
302 exposureRepresentation
= 1;
304 exposureRepresentation
= 0;
313 unsigned long diff
= (millis() - lastModeUpdate
);
315 if(diff
< 300) // careful about the overflow...
317 lastModeUpdate
= millis();
321 lastModeUpdate
= millis();
327 if(currentMode
== BULB
)
335 void switchSelected()
337 if(currentMode
== INTERVALBULB
)
339 unsigned long diff
= (millis() - lastSelectedUpdate
);
341 if(diff
< 300) // careful about the overflow...
343 lastSelectedUpdate
= millis();
347 lastSelectedUpdate
= millis();
349 selected
= !selected
;
357 unsigned long diff
= (millis() - lastToggleRunning
);
358 if(diff
< 300) // careful about the overflow...
360 lastToggleRunning
= millis();
364 lastToggleRunning
= millis();
369 void drawTimecode(int secs
, int rep
)
373 lcdNumberWrite(secs
);
378 lcdNumberWrite(secs
/60);
383 int timecodeLength(int secs
, int rep
)
391 int n2
= (secs
- n1
* 100) / 10;
399 char *modeHeader
[4] = {"Interval", " Bulb", "Interval Bulb", "Trigger"};
408 for (count
= 0; modeHeader
[currentMode
][count
] != 0; count
++)
409 lcdDataWrite(modeHeader
[currentMode
][count
]);
410 for (; count
< 16; count
++)
421 if(currentMode
!= BULB
)
422 drawTimecode(lapseTime
, lapseRepresentation
);
426 if(currentMode
!= BULB
)
427 width
+= timecodeLength(lapseTime
, lapseRepresentation
);
428 if(currentMode
!= INTERVAL
&& currentMode
!= TRIGGER
)
429 width
+= timecodeLength(exposureTime
, exposureRepresentation
);
431 for(int i
= 16; i
> width
; i
--)
434 if(currentMode
!= INTERVAL
&& currentMode
!= TRIGGER
)
435 drawTimecode(exposureTime
, exposureRepresentation
);
440 if(digitalRead(buttonA
) == LOW
)
445 if(currentMode
== TRIGGER
)
447 // do special trigger stuff
451 unsigned long diff
= millis() - lastShutter
;
453 int adjustedLapseTime
= lapseTime
;
454 if(currentMode
!= INTERVAL
)
455 adjustedLapseTime
-= exposureTime
;
457 if(diff
> (adjustedLapseTime
* 1000)) // careful about the overflow...
459 digitalWrite(cameraTrigger
, LOW
);
461 if(currentMode
== INTERVAL
)
464 delay(exposureTime
* 1000); //delay for length of exposure
466 digitalWrite(cameraTrigger
, HIGH
);
467 lastShutter
= millis();
469 if(currentMode
== BULB
)
475 updateEncoderValue();
477 if(digitalRead(buttonB
) == LOW
)
480 if(digitalRead(encoderButton
) == LOW
)