Skip to content

Instantly share code, notes, and snippets.

@jeremy5189
Created February 25, 2014 11:12
Show Gist options
  • Save jeremy5189/9207033 to your computer and use it in GitHub Desktop.
Save jeremy5189/9207033 to your computer and use it in GitHub Desktop.
#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
#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