Tư vấn: 0979.466.469 / 0938.128.290

MENU

GIAO TIẾP GIỮA CẢM BIẾN XUNG VÀ ARDUINO

Báo giá đặt hàng nhập

Giao tiếp giữa cảm biến xung và Arduino, cảm biến xung hay cảm biến nhịp tim, nguyên lý hoạt động của cảm biến xung

 

GIAO TIẾP GIỮA CẢM BIẾN XUNG VÀ ARDUINO

 

Trong bài viết này, chúng ta sẽ học cách giao tiếp một cảm biến xung với Arduino. Cảm biến xung chúng ta sẽ sử dụng để cảm nhận và theo dõi nhịp tim. Cảm biến này khá dễ sử dụng. Đặt ngón tay của bạn lên trên cảm biến và nó sẽ cảm nhận nhịp tim bằng cách đo sự thay đổi cường độ ánh sáng hồng ngoại phát ra từ led phát hồng ngoại phản xạ vào led thu, sự thay đổi cường độ này bắt nguồn từ sự giãn nở của các mao mạch máu.

 

Sơ đồ chân cảm biến xung

GND: Chân nối với mass

Vcc: Chân nối nguồn

A0: Chân Analog (tín hiệu tương tự)

 

 

Hoạt động của cảm biến xung

Đầu tiên ta chạm đầu ngón tay vào cảm biến nhịp tim, khi tim đập, mật độ máu trong mạch máu giảm, các chùm tia hồng ngoại chiếu vào ngón tay bị phản xạ nhưng không nhiều, đầu ra của cảm biến nhịp tim sẽ hiểu đây là một xung mức thấp. Khi tim đập và co lại, mật độ máu trong mạch máu tăng, các chùm tia hồng ngoại chiếu vào ngón tay bị phản xạ nhiều hơn, đầu ra của cảm biến nhịp tim sẽ hiểu đây là một xung mức cao. Tuy sự chênh lệnh trong sự phản xạ tia hồng ngoại không lớn nhưng Arduino có thể phân biệt và hiểu được đâu là xung mức cao, đâu là xung mức thấp, nhờ đó chúng ta có thể theo dõi nhịp tim bằng cảm biến.

 

Sơ đồ kết nối cảm biến xung với Arduino

Kết nối cảm biến xung với Arduino như sau:

- Chân GND của cảm biến xung đến GND của Arduino

- Vcc của cảm biến xung đến 5V của Arduino

- A0 của cảm biến xung đến A0 của Arduino

  Sau đó, kết nối đèn LED với chân 13 và GND của Arduino như trong hình bên dưới. Đèn LED sẽ nhấp nháy theo nhịp tim.

Chương trìnnh              

int sensor_pin = 0;                

int led_pin = 13;                  

volatile int heart_rate;          

volatile int analog_data;              

volatile int time_between_beats = 600;            

volatile boolean pulse_signal = false;    

volatile int beat[10];         //giá trị nhịp tim lưu trong mảng này

volatile int peak_value = 512;          

volatile int trough_value = 512;        

volatile int thresh = 525;              

volatile int amplitude = 100;                 

volatile boolean first_heartpulse = true;      

volatile boolean second_heartpulse = false;    

volatile unsigned long samplecounter = 0;   // Đây là biến đếm xung

volatile unsigned long lastBeatTime = 0;

 

void setup()

{

  pinMode(led_pin,OUTPUT);        

  Serial.begin(115200);           

  interruptSetup();                  

}

 

void loop()

 Serial.print("BPM: ");

 Serial.println(heart_rate);

 delay(200); //  take a break

}

 

void interruptSetup() 

{    

  TCCR2A = 0x02;  // Vô hiệu hoá xung PWM tại chân 3 và chân 11

  OCR2A = 0X7C;   // Đưa giá trị đếm tối đa lên 124 với tốc độ lấy mẫu 500Hz

  TCCR2B = 0x06;  // bộ chia trước 256 bit

  TIMSK2 = 0x02;  // Cho phép ngắt giữa OCR2A và Timer

  sei();          // Cho phép ngắt toàn cục chương trình

}

 

ISR(TIMER2_COMPA_vect)

  cli();                                     

  analog_data = analogRead(sensor_pin);            

  samplecounter += 2;                        

  int N = samplecounter - lastBeatTime;      

  if(analog_data < thresh && N > (time_between_beats/5)*3)

    {     

      if (analog_data < trough_value)

      {                       

        trough_value = analog_data;

      } 

    }

  if(analog_data > thresh && analog_data > peak_value)

    {        

      peak_value = analog_data;

    }                          

 

   if (N > 250)

  {                             

  if ( (analog_data > thresh) && (pulse_signal == false) && (N > (time_between_beats/5)*3) )

      {       

        pulse_signal = true;          

Quảng cáo đặt hàng nhập

        digitalWrite(led_pin,HIGH);

        time_between_beats = samplecounter - lastBeatTime;

        lastBeatTime = samplecounter;     

 

       if(second_heartpulse)

        {                        

          second_heartpulse = false;   

          for(int i=0; i<=9; i++)    

          {            

            beat[i] = time_between_beats; // Lệnh gán giá trị nhịp tim cho mảng

          }

        }

        if(first_heartpulse)

        {                        

          first_heartpulse = false;

          second_heartpulse = true;

          sei();            

          return;           

        }  

      word runningTotal = 0;  

      for(int i=0; i<=8; i++)

        {               

          beat[i] = beat[i+1]; 

          runningTotal += beat[i];

        }

      beat[9] = time_between_beats;             

      runningTotal += beat[9];   

      runningTotal /= 10;        

      heart_rate = 60000/runningTotal;

    }                      

  }

 

  if (analog_data < thresh && pulse_signal == true)

    {  

      digitalWrite(led_pin,LOW); 

      pulse_signal = false;             

      amplitude = peak_value - trough_value;

      thresh = amplitude/2 + trough_value; 

      peak_value = thresh;           

      trough_value = thresh;

    }

 

  if (N > 2500)

    {                          

      thresh = 512;                     

      peak_value = 512;                 

      trough_value = 512;               

      lastBeatTime = samplecounter;     

      first_heartpulse = true;                 

      second_heartpulse = false;               

    }

 

  sei();                                

}

Giải thích chương trình

Bằng lệnh ngắt, chúng ta thiết lập bộ hẹn giờ sẽ thực hiện ngắt theo ý muốn, tốc độ lấy mẫu là 500Hz, tương đương với chu kỳ lấy mẫu 2ms. Điều này sẽ vô hiệu hóa đầu ra PWM trên chân 3 và 11 và cũng sẽ vô hiệu hóa hàm tone (). Hàm sei () đảm bảo rằng chế độ ngắt toàn cục được bật:

TCCR2A = 0x02; 

 

 TCCR2B = 0x06; 

 

 OCR2A = 0X7C;  

 

 TIMSK2 = 0x02; 

 

 sei();

Các lệnh sau đây chạy sau mỗi 2mS. Arduino đọc dữ liệu từ cảm biến xung sau mỗi 2mS và mỗi lần như vậy Arduino tăng giá trị số lần đếm lên 1. Bộ đếm mẫu được sử dụng để theo dõi thời gian và biến N được sử dụng để tránh nhiễu:

ISR(TIMER2_COMPA_vect)

{   cli();                                     

  analog_data = analogRead(sensor_pin);             

  samplitudeleCounter += 2;                        

  int N = sampleCounter - lastBeatTime;

Hai vòng lặp sau đây sẽ theo dõi các giá trị cao nhất và thấp nhất của các giá trị được đọc từ cảm biến xung. Biến thresh được khởi tạo ở 512 là điểm giữa của của tín hiệu Analog (theo ngôn ngữ lập trình Arduino). Biến này được sử dụng để theo dõi điểm giữa này:

if(analog_data < thresh && N > (time_between_beats/5)*3)

    {           if (analog_data < trough_value)

      {                      

        trough_value = analog_data;

     }  

  }

Các lệnh sau đây sẽ dò nhịp tim. Nếu giá trị đọc vào vượt ngưỡng giá trị của biến thresh (512) kéo dài sự vượt ngưỡng này sau một khoảng thời gian bằng 3/5 giá trị thời gian là khoảng thời gian cách nhau giữa các nhịp tim đập thì lúc đó sẽ có một xung mức cao tại ngõ ra, lúc này đèn led sẽ sáng nhờ nguồn cấp là xung mức cao này. Sau lệnh này chúng ta sẽ lập trình các lệnh để cập nhật giá trị lasttimebeat bằng cách xác định thời gian kể từ nhịp cuối cùng:

if (N > 250)

  {                        

 

 

 

 

Gia công pcb 932*150
Sản phẩm nổi bật
Sale 0%
145000 /Cái
/ Cái

Code: M-7006-010 Còn hàng

Lưu xem sau
Sale 0%
35000 /Bộ
/ Bộ

Code: 7007-030 Còn hàng

Lưu xem sau
Sale 0%
50000 /Cái
/ Cái

Code: 7006-060 Còn hàng

Lưu xem sau
Sale 0%
9000 /Sợi
/ Sợi

Code: M-7006-052 Còn hàng

Lưu xem sau
Hỗ trợ liên kết
0979466469
0899909838
0938128290
0899909838
Khiếu nại: 0964238397
0979466469
0868565469
0868565469

Hotline: 0979 466 469

Loading
0979 466 469
Bạn cần linh kiện mẫu ? 7-11 ngày