//Sample using LiquidCrystal library #include /******************************************************* * * TimeLapse shait * v.01 13.04.2013 * v.02 27.04.2013 First working prototype ********************************************************/ const int ledPin = 13; // the number of the LED pin const int focusPin = 11; const int shutterPin = 12; const int backlitPin = 10; int intervals[] = { 1, 2, 5, 10, 15, 30, 60,300,600,1800,3600}; char* intervalNames[]={ "1s ", "2s ", "5s ", "10s ", "15s ", "30s ", "1min ", "5min ", "10min ", "30min ", "1hour "}; int maxintervals = 10; int ledState = LOW; // select the pins used on the LCD panel LiquidCrystal lcd(8, 9, 4, 5, 6, 7); unsigned long previousMillis = 0; // last time update long interval = 2000; // interval at which to do something (milliseconds) // define some values used by the panel and buttons int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 int currentmenu = 0; int currentinterval = 0; int currentnumpics = 1000; int picstaken = 0; #define mnuStart 10 #define mnuInterval 20 #define mnuIntervalSet 21 #define mnuNumpics 30 #define mnuRun 40 #define mnuRunShow 41 // read the buttons int read_LCD_buttons() { adc_key_in = analogRead(0); // read the value from the sensor // my buttons when read are centered at these valies: 0, 144, 329, 504, 741 // we add approx 50 to those values and check to see if we are close if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result if (adc_key_in < 50) return btnRIGHT; if (adc_key_in < 195) return btnUP; if (adc_key_in < 380) return btnDOWN; if (adc_key_in < 555) return btnLEFT; if (adc_key_in < 790) return btnSELECT; return btnNONE; // when all others fail, return this... } void setup() { pinMode(backlitPin, OUTPUT); lcd.begin(16, 2); // start the library currentmenu = mnuStart; analogWrite(backlitPin, 50); //lcd.setCursor(0,0); //lcd.print("TimeLapse v0.1"); // print a simple message } void loop() { //lcd.setCursor(9,1); // move cursor to second line "1" and 9 spaces over //lcd.print(millis()/1000); // display seconds elapsed since power-up // move to the begining of the second line if(currentmenu == mnuStart) { lcd.setCursor(0,0); lcd.print("TimeLapse "); lcd.setCursor(0,1); lcd.print("v0.2"); lcd_key = read_LCD_buttons(); // read the buttons switch (lcd_key) // depending on which button was pushed, we perform an action { case btnRIGHT: { //lcd.print("RIGHT "); break; } case btnLEFT: { //lcd.print("LEFT "); break; } case btnUP: { currentmenu = mnuRun; lcd.clear(); break; } case btnDOWN: { delay(50); currentmenu = mnuInterval; lcd.clear(); break; } case btnSELECT: { //lcd.print("SELECT"); break; } case btnNONE: { //lcd.print("NONE "); break; } } } else if(currentmenu == mnuInterval) { lcd.setCursor(0,0); lcd.print("Interval:"); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(11,0); lcd.print(intervalNames[currentinterval]); lcd_key = read_LCD_buttons(); // read the buttons switch (lcd_key) // depending on which button was pushed, we perform an action { case btnRIGHT: { lcd.clear(); delay(50); currentmenu = mnuIntervalSet; break; } case btnLEFT: { //lcd.print("LEFT "); break; } case btnUP: { lcd.clear(); currentmenu = mnuStart; break; } case btnDOWN: { lcd.clear(); delay(50); currentmenu = mnuNumpics; break; } case btnSELECT: { //lcd.print("SELECT"); break; } case btnNONE: { //lcd.print("NONE "); break; } } } else if(currentmenu == mnuIntervalSet) { lcd.setCursor(0,0); lcd.print("Interval:"); lcd.setCursor(0,1); lcd.print(" [Set] "); lcd.setCursor(11,0); lcd.print(intervalNames[currentinterval]); lcd_key = read_LCD_buttons(); // read the buttons switch (lcd_key) // depending on which button was pushed, we perform an action { case btnRIGHT: { break; } case btnLEFT: { currentmenu = mnuInterval; break; } case btnUP: { delay(40); currentinterval++; if(currentinterval > maxintervals) currentinterval = maxintervals; break; } case btnDOWN: { delay(40); currentinterval--; if(currentinterval < 0) currentinterval = 0; break; } case btnSELECT: { lcd.clear(); currentmenu = mnuInterval; break; } case btnNONE: { //lcd.print("NONE "); break; } } } else if(currentmenu == mnuNumpics) { lcd.setCursor(0,0); lcd.print("Num pics:"); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(11,0); lcd.print(currentnumpics); lcd_key = read_LCD_buttons(); // read the buttons switch (lcd_key) // depending on which button was pushed, we perform an action { case btnRIGHT: { //currentmenu = mnuIntervalSet; break; } case btnLEFT: { //lcd.print("LEFT "); break; } case btnUP: { lcd.clear(); currentmenu = mnuInterval; break; } case btnDOWN: { lcd.clear(); delay(50); currentmenu = mnuRun; break; } case btnSELECT: { //lcd.print("SELECT"); break; } case btnNONE: { //lcd.print("NONE "); break; } } } else if(currentmenu == mnuRun) { lcd.setCursor(0,0); lcd.print("Run: "); lcd.setCursor(0,1); lcd.print(" "); lcd.setCursor(11,0); lcd.print(intervalNames[currentinterval]); lcd_key = read_LCD_buttons(); // read the buttons switch (lcd_key) // depending on which button was pushed, we perform an action { case btnRIGHT: { lcd.clear(); currentmenu = mnuRunShow; break; } case btnLEFT: { //lcd.print("LEFT "); break; } case btnUP: { lcd.clear(); currentmenu = mnuNumpics; break; } case btnDOWN: { lcd.clear(); delay(50); currentmenu = mnuStart; break; } case btnSELECT: { //lcd.print("SELECT"); break; } case btnNONE: { //lcd.print("NONE "); break; } } } else if(currentmenu == mnuRunShow) { lcd.setCursor(0,0); lcd.print("Running : "); lcd.setCursor(10,0); lcd.print(intervalNames[currentinterval]); lcd.setCursor(0,1); //lcd.print(" "); lcd.setCursor(11,0); //lcd.print(picstaken); unsigned long currentMillis = millis(); interval = intervals[currentinterval] * 1000; if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; // do something picstaken++; lcd.setCursor(0,1); lcd.print(picstaken); // if the LED is off turn it on and vice-versa: if (ledState == LOW) { ledState = HIGH; interval = 1000; } else { ledState = LOW; interval = 10000; } digitalWrite(ledPin, ledState); digitalWrite(focusPin, HIGH); delay(10); digitalWrite(shutterPin, HIGH); } else if(currentMillis - previousMillis > 200){ digitalWrite(focusPin, LOW); delay(10); digitalWrite(shutterPin, LOW); } } else { currentmenu == mnuStart; } }