Part List :
- CNY70(或者其他種類的上照式光遮斷器)
- 紅色LED
- 10k Ohm可變電阻
- 220 Ohm電阻 X 2
- 4.7k Ohm電阻
- 1k Ohm電阻
- 100k Ohm電阻
- 1M Ohm電阻
- 0.1uF陶瓷、積層、無極性電解電容 X 2
- 1uF陶瓷、積層、無極性電解電容
- LM358雙運算放大器(我買到的上面寫HA17358,但是我發現不是所有運放都可以,例如NE5532、JRC4556AD就不行,所以這邊就用原本的358運放,可能還是要請有電子背景的朋友研究一下datasheet解答差別)
電路說明:
左邊那個四腳的IC就是CNY70,將CNY70的紅外線發射(負極)與接收(射極)晶體接地,紅外線發射正極接上220Ohm的電阻再接上5V電源,接著將10k的可變電阻左端接上4.7k的電阻再接上5V電源分壓,然後右端接地,接著中間輸出腳(圖中黃色接線的部份)分別接上CNY70的接收晶體(集極)以及1uF的電容,並且將電容另一隻腳接到LM358的第三隻腳(正向輸入端),而這隻腳還要再接一個 100k的電阻接地,接著LM358的第二隻腳(反向輸入端)要接一個1k電阻接地,並且還要連接一個1M電阻與0.1uF電容到LM358的第一隻腳(輸出端)做回授,然後LM358的第四隻腳要接地,LM358的第八隻腳要接5V電源
並且要再接一個0.1uF電容接地消除雜訊,最後將LM358的第一隻腳(輸出端)分別接到一個220k的電阻與LED上(圖中綠色接線的部份)以及接到Arduino的Analog Pin 0(圖中紫色接線部份)。
程式:
每秒取樣50次左右,並且確定積分值是否有達到形成PWM的程度來判斷是否有PWM,並且以每個PWM的波谷區隔每個波來更新心跳次數。
int sensor_pin = 0;
int n = 0;
int n_1 = 0;
int diff = 0;
int count = 0;
int elapse_up = 0;
int elapse_down = 0;
int integral_plus = 0;
int integral_minus = 0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
n = analogRead(sensor_pin); //取得現在得到的值
diff = (n - n_1); //將現在的值減去上次得到的值(N -(N-1))
n_1 = n; //更新上一次的值
//如果差值趨近零,則表示到達波谷又要進到新的一個PWM中。
//並且在確定上個PWM的爬升(integral_plus)與下降(integral_minus)
//是否有到達積分值來確定是否有PWM。
//兩者成立則更新所有狀態。
if(diff < 10 && diff > -10 &&
integral_plus > 160 && integral_minus < -200){
if(elapse_up > 50 && elapse_up < 400 &&
elapse_down > 96 && elapse_down < 800){
++count;
Serial.print(count);
Serial.println(" Heartbeat");
}
elapse_up = 0;
elapse_down = 0;
integral_plus = 0;
integral_minus = 0;
}
else if(diff > 20 && diff < 280){
//PWM上升
integral_plus += diff;
elapse_up += 20;
}
else if(diff < -20 && diff > -200){
//PWM下降
integral_minus += diff;
elapse_down += 20;
}
//每20ms取樣,即一秒取樣50次。
delay(20);
}
DEMO:
使用的時候要先調整10k可變電阻,將手指放上CNY70完全蓋住但是不能大力壓緊,接著觀察到LED會隨著心跳變動就可以了,如果不行則繼續調整可變電阻的分壓。
=============2012/09/17===============
最近有空把它Layout成板子,有+ -號那邊就是電源。