2 * Arduino Intervalometer
18 int encoderButton = 3;
19 int buttonA = 4; // Left pushbutton
20 int buttonB = 5; // Right pushbutton
24 int cameraShutter = 0; // Pulse low for shutter release
30 int lcdDataBus[] = { 4, 5, 6, 7 };
34 int triggerReset = 12;
36 /////////////////////////////
38 int currentMode = INTERVAL, selected = 0;
40 unsigned long lastToggleRunning = 0;
41 unsigned long lastModeUpdate = 0;
42 unsigned long lastSelectedUpdate = 0;
43 unsigned long lastShutter = 0;
46 int updateHeader = 1, updateEncoder = 1;
47 volatile long exposureTime = 0, lapseTime = 0;
48 int exposureRepresentation = 0, lapseRepresentation = 0;
52 * Higher level hardware functions
55 void pulsePin(int pin, int value)
57 digitalWrite(pin, !value);
59 digitalWrite(pin, value);
61 digitalWrite(pin, !value);
66 * lcd Control Functions
69 void lcdCommandWrite(int value)
76 for (i = lcdDataBus[0]; i <= lcdDataInt; i++)
78 digitalWrite(i,value1 & 01);
82 pulsePin(lcdEnable, HIGH);
85 for (i = lcdDataBus[0]; i <= lcdDataBus[3]; i++)
87 digitalWrite(i, value & 01);
93 for (i = lcdDataClock; i <= lcdDataInt; i++)
95 digitalWrite(i, value & 01);
99 pulsePin(lcdEnable, HIGH);
102 void lcdDataWrite(int value)
107 digitalWrite(lcdDataInt, HIGH);
108 digitalWrite(lcdDataClock, LOW);
112 for (i=lcdDataBus[0]; i <= lcdDataBus[3]; i++)
114 digitalWrite(i,value1 & 01);
118 pulsePin(lcdEnable, HIGH);
121 digitalWrite(lcdDataInt, HIGH);
122 digitalWrite(lcdDataClock, LOW);
124 for (i=lcdDataBus[0]; i <= lcdDataBus[3]; i++)
126 digitalWrite(i,value & 01);
130 pulsePin(lcdEnable, HIGH);
133 void lcdNumberWrite(int nr)
135 // We don't need negatives, but if you do:
138 lcdCommandWrite(557);
143 lcdCommandWrite(544);
147 int n2 = (nr - n1 * 100) / 10;
150 lcdCommandWrite(560 + n2);
152 nr = nr - n1 * 100 - n2 * 10;
153 lcdCommandWrite(560 + nr);
156 void lcdHome(int row)
158 lcdCommandWrite(0x02);
163 lcdCommandWrite(0xC0);
170 lcdCommandWrite(0x01);
175 * Hardware initialization functions
182 for (i = lcdEnable; i <= lcdDataInt; i++)
185 lcdCommandWrite(0x03); delay(64);
186 lcdCommandWrite(0x03); delay(50);
187 lcdCommandWrite(0x03); delay(50);
188 lcdCommandWrite(0x02); delay(50);
189 lcdCommandWrite(0x2C); delay(20);
190 lcdCommandWrite(0x06); delay(20);
191 lcdCommandWrite(0x0C); delay(20);
192 lcdCommandWrite(0x01); delay(100);
193 lcdCommandWrite(0x80); delay(30);
198 pinMode(encoderPinA, INPUT);
199 digitalWrite(encoderPinA, HIGH);
200 pinMode(encoderPinB, INPUT);
201 digitalWrite(encoderPinB, HIGH);
203 attachInterrupt(0, doEncoderA, CHANGE);
204 attachInterrupt(1, doEncoderB, CHANGE);
209 pinMode(cameraShutter, OUTPUT);
210 digitalWrite(cameraShutter, HIGH);
215 pinMode(triggerReset, OUTPUT);
216 digitalWrite(triggerReset, LOW);
219 void incrementValue()
223 if(lapseRepresentation == 0)
230 if(exposureRepresentation == 0)
235 if(exposureTime > lapseTime)
236 lapseTime = exposureTime;
240 void decrementValue()
244 if(lapseRepresentation == 0 || lapseTime == 60) // careful around transition; thanks, nate
254 if(exposureRepresentation == 0 || exposureTime == 60)
270 delayMicroseconds(3000);
271 if (digitalRead(encoderPinA) == HIGH)
273 if (digitalRead(encoderPinB) == LOW)
280 if (digitalRead(encoderPinB) == HIGH)
287 lapseRepresentation = 1;
289 lapseRepresentation = 0;
291 if(exposureTime >= 60)
292 exposureRepresentation = 1;
294 exposureRepresentation = 0;
306 delayMicroseconds(3000);
307 if (digitalRead(encoderPinB) == HIGH)
309 if (digitalRead(encoderPinA) == HIGH)
316 if (digitalRead(encoderPinA) == LOW)
323 lapseRepresentation = 1;
325 lapseRepresentation = 0;
327 if(exposureTime >= 60)
328 exposureRepresentation = 1;
330 exposureRepresentation = 0;
338 unsigned long diff = (millis() - lastModeUpdate);
340 if(diff < 300) // careful about the overflow...
342 lastModeUpdate = millis();
346 lastModeUpdate = millis();
352 if(currentMode == BULB)
357 if(currentMode == TRIGGER)
358 digitalWrite(triggerReset, HIGH);
360 digitalWrite(triggerReset, LOW);
366 void switchSelected()
368 if(currentMode == INTERVALBULB)
370 unsigned long diff = (millis() - lastSelectedUpdate);
372 if(diff < 300) // careful about the overflow...
374 lastSelectedUpdate = millis();
378 lastSelectedUpdate = millis();
380 selected = !selected;
388 unsigned long diff = (millis() - lastToggleRunning);
390 if(diff < 300) // careful about the overflow...
392 lastToggleRunning = millis();
396 lastToggleRunning = millis();
401 void drawTimecode(int secs, int rep)
405 lcdNumberWrite(secs);
410 lcdNumberWrite(secs/60);
415 int timecodeLength(int secs, int rep)
423 int n2 = (secs - n1 * 100) / 10;
431 char *modeHeader[4] = {"Interval", " Bulb", "Interval Bulb", "Trigger"};
440 for (count = 0; modeHeader[currentMode][count] != 0; count++)
441 lcdDataWrite(modeHeader[currentMode][count]);
442 for (; count < 16; count++)
453 if(currentMode != BULB)
454 drawTimecode(lapseTime, lapseRepresentation);
458 if(currentMode != BULB)
459 width += timecodeLength(lapseTime, lapseRepresentation);
460 if(currentMode != INTERVAL && currentMode != TRIGGER)
461 width += timecodeLength(exposureTime, exposureRepresentation);
465 lcdDataWrite(' '); width++;
466 lcdDataWrite(127); width++;
473 for(int i = 16; i > width; i--)
482 if(currentMode != INTERVAL && currentMode != TRIGGER)
483 drawTimecode(exposureTime, exposureRepresentation);
488 if(analogRead(buttonA) == 0)
493 if(currentMode == TRIGGER)
495 // do special trigger stuff
497 if(analogRead(triggerInput) < 100) // 100 might change with different resistors, make sure it works!
499 digitalWrite(triggerReset, HIGH);
500 delay(100); // this should probably be at least the time of the delay...
501 digitalWrite(triggerReset, LOW);
503 digitalWrite(triggerReset, HIGH);
509 unsigned long diff = millis() - lastShutter;
511 int adjustedLapseTime = lapseTime;
512 if(currentMode != INTERVAL)
513 adjustedLapseTime -= exposureTime;
515 if(diff > (adjustedLapseTime * 1000)) // careful about the overflow...
517 digitalWrite(cameraShutter, LOW);
519 if(currentMode == INTERVAL)
522 delay(exposureTime * 1000); //delay for length of exposure
524 digitalWrite(cameraShutter, HIGH);
525 lastShutter = millis();
527 if(currentMode == BULB)
533 if(analogRead(buttonB) == 0)
536 if(analogRead(encoderButton) == 0)