Created
February 25, 2014 11:12
-
-
Save jeremy5189/9207033 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define BUTTON0 0x910 | |
#define BUTTON1 0x10 | |
#define BUTTON2 0x810 | |
#define BUTTON3 0x410 | |
#define BUTTON4 0xC10 | |
#define BUTTON5 0x210 | |
#define BUTTON6 0xA10 | |
#define BUTTON7 0x610 | |
#define BUTTON8 0xE10 | |
#define BUTTON9 0x110 | |
#define play 0xA70 | |
#define power 0xA90 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <LiquidCrystal.h> | |
#include <IRremote.h> | |
#include <math.h> | |
#include "keyvalues.h" | |
#define SHUTTER_INTERVAL 100 | |
// 宣告針腳 | |
const int ledPin = 10; | |
const int ledRed = 9; | |
const int cameraPin = 2; | |
//const int radioPin = 0; // analog | |
// LCD相關 | |
LiquidCrystal lcd(12, 11, 7, 6, 5, 4); | |
bool lcdCurrentLine = 0; | |
// 紅外線接收 | |
const int irReceiverPin = 8; | |
IRrecv irrecv(irReceiverPin); | |
decode_results results; | |
int selectMode = 0; // 紀錄目前模式 | |
int interval = 0; // 紀錄縮時攝影間隔 | |
int arr[4]; // 儲存間隔設定 | |
int dig = 0; // 間隔設定數字長度 | |
int offset = 0; // 開機到開始縮時的偏移 | |
int captureCount = 0; // 紀錄快門次數 | |
// 宣告函數 | |
int getRemoteNumValue( int key ); | |
// 擊發快門 | |
void capture() | |
{ | |
digitalWrite( cameraPin, LOW ); | |
digitalWrite( ledPin, HIGH ); | |
captureCount++; | |
delay(SHUTTER_INTERVAL); | |
digitalWrite( cameraPin, HIGH ); | |
digitalWrite( ledPin, LOW ); | |
} | |
// LCD換行 | |
void lcdNewLine() | |
{ | |
lcdCurrentLine = !lcdCurrentLine; | |
lcd.setCursor(0, lcdCurrentLine); | |
} | |
// 次方運算 | |
int mypow( int base, int n) | |
{ | |
int i,ret = 1; | |
for( i = 0; i < n; i++ ) | |
ret *= base; | |
return ret; | |
} | |
// 閃爍紅色 Signal LED 代表接到紅外線 | |
void blinkRed() | |
{ | |
digitalWrite(ledRed, HIGH); | |
delay(100); | |
digitalWrite(ledRed, LOW); | |
} | |
void setup() | |
{ | |
irrecv.enableIRIn(); | |
pinMode( ledPin, OUTPUT ); | |
pinMode( ledRed, OUTPUT ); | |
pinMode( cameraPin, OUTPUT ); | |
digitalWrite( cameraPin, HIGH ); | |
lcd.begin(16, 2); | |
lcd.print("Select Mode:"); | |
lcdNewLine(); | |
lcd.print("1.Remote 2.Auto"); | |
} | |
void loop() | |
{ | |
// 讓使用者選擇模式 1遙控 2自動 | |
if( selectMode == 0 ) | |
{ | |
if (irrecv.decode(&results)) | |
{ | |
blinkRed(); | |
if( results.value == BUTTON1 ) | |
{ | |
selectMode = 1; | |
lcd.clear(); | |
lcdNewLine(); | |
lcd.print("Remote Mode"); | |
lcdNewLine(); | |
lcd.print("Press Power"); | |
} | |
else if( results.value == BUTTON2 ) | |
{ | |
selectMode = 2; | |
irrecv.resume(); | |
lcd.clear(); | |
lcdNewLine(); | |
lcd.print("Interval(sec)"); | |
lcdNewLine(); | |
selectMode = -1; | |
} | |
irrecv.resume(); | |
} | |
} | |
if( selectMode == 1 ) | |
{ | |
// IR | |
if (irrecv.decode(&results)) | |
{ | |
blinkRed(); | |
if( results.value == play || results.value == power) | |
{ | |
// 壓下快門 | |
capture(); | |
// 顯示快門次數 | |
lcd.clear(); | |
lcdNewLine(); | |
lcd.print("Remote Mode"); | |
lcdNewLine(); | |
lcd.print("Count: "); | |
lcd.print(captureCount); | |
} | |
irrecv.resume(); | |
} | |
} | |
// 自動模式 | |
if( selectMode == 2 ) | |
{ | |
capture(); | |
int sec,mins,hr,psec,pmin,times; | |
for( int i = 0; i < interval; i++ ) | |
{ | |
lcd.clear(); | |
lcd.setCursor(0 ,0); | |
lcdCurrentLine = 0; | |
times = (millis()-offset) / 1000; | |
sec = times ; | |
mins = times / 60 ; | |
hr = times / 3600 ; | |
psec = sec - 60 * mins; | |
pmin = mins - 60 * hr; | |
lcd.print("Time: "); | |
lcd.print(hr); | |
lcd.print(":"); | |
lcd.print(pmin); | |
lcd.print(":"); | |
lcd.print(psec); | |
lcdNewLine(); | |
lcd.print("Count: "); | |
lcd.print(captureCount); | |
delay(1000); | |
} | |
} | |
// 設定間隔模式 | |
if( selectMode == -1 ) | |
{ | |
if (irrecv.decode(&results)) | |
{ | |
blinkRed(); | |
int num = getRemoteNumValue(results.value); | |
// 讀取間隔 10代表結束 -1代表未定義的其他按鈕 | |
if( num != 10 && num != -1 ) | |
{ | |
lcd.print(num); | |
arr[dig] = num; | |
dig++; | |
} | |
else if( num == 10 ) | |
{ | |
// 間隔設定完成 轉換陣列成數字 | |
int i; | |
for( i = 0; i < dig; i++ ) | |
interval += arr[i] * mypow(10, dig-i-1); | |
selectMode = 2; | |
offset = millis(); | |
} | |
irrecv.resume(); | |
} | |
} | |
} | |
int getRemoteNumValue( int key ) | |
{ | |
int ret = -1; | |
switch(key) | |
{ | |
case BUTTON0: | |
ret = 0; | |
break; | |
case BUTTON1: | |
ret = 1; | |
break; | |
case BUTTON2: | |
ret = 2; | |
break; | |
case BUTTON3: | |
ret = 3; | |
break; | |
case BUTTON4: | |
ret = 4; | |
break; | |
case BUTTON5: | |
ret = 5; | |
break; | |
case BUTTON6: | |
ret = 6; | |
break; | |
case BUTTON7: | |
ret = 7; | |
break; | |
case BUTTON8: | |
ret = 8; | |
break; | |
case BUTTON9: | |
ret = 9; | |
break; | |
case play: | |
ret = 10; | |
break; | |
} | |
return ret; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment