آردوینو آموزش آردوینو پروژه های آردوینو

آموزش ساخت نمایشگر شمارش ضربان قلب با آردوینو Arduino و LED

heartbeat-neopixel-arduino--Digispark
نوشته شده توسط پریسا پوربلورچیان

هر سیستمی دارای علائمی جهت اعلام وضعیت می باشد. بدن انسان چنن نوع علامت جهت اعلام وضعیت دارد. یکی از این علائم ضربان قلب می باشد.  یکی از پارامترهای سلامتی می باشد. با پیشرفته تر شدن گجت های پوشیدنی بررسی وضعیت ضربان قلب به یک امر عادی تبدیل شده است. در این پست شیوه ی ساخت یک ضربان سنج قابل حمل را آموزش میدهم. در ادامه با مرجع تخصصی آردوینو دیجی اسپارک همراه باشید.

 


ساختار سنسور ضربان قلب


همانطور که میدانید سنسور ضربان قلب در دسته ی بیومتریک ها قرار دارد.  به عبارتی یکی از شگفت انگیز ترین سنسور های بیومتریک می باشد. این ماژول از تراشه آپ امپ MCP6001 در کنار سنسور APDS9008 بهره میبرد. یک ال ای دی پشت سنسور APDS قرار دارد. پس از قرار دادن پوست بدن روی سنسور در اثر بازگشت نور ضربان قلب را شناسایی می کند. سپس از طریق درگاه آنالوگ به مبکروکنترلر ارسال میکند. لازم به ذکر است از بردهای آردوینو و رزبری پای و Node MCU  و دیگر بردهای میروکنترلر میتوانید استفاده کنید.

 


وسایل مورد نیاز


سنسور ضربان قلب pulse sensor

ماژول نمایشگر Neo Pixel

برد آردوینو Arduino UNO یا برد آردوینو Pro micro

چند رشته سیم

 


اتصال ضربان سنج به آردوینو


در این آموزش شیوه ی اتصال به برد آردوینو UNO  و آردوینو Pro micro جهت جاسازی در  لباس را توضیح خواهم داد. اول با برد آردوینو UNO شروع میکنیم.

پایه + سنسور ضربان را به ۵ ولت آردوینو وصل میکنیم.

پایه – سنسور ضربان را به GND آردوینو وصل میکنیم.

پایه S (سیگنال) سنسور را به پایه A0 (آنالوگ) آردوینو وصل میکنیم.

پایه DI از ال ای دی حلقه ای را به پایه ۵ (دیجیتال) آردوینو وصل میکنیم.

پایه VCC ال ای دی حلقه ای را به پابه ۳٫۳ آردوینو وصل میکنیم.

پایه GND ال ای دی حقه ای را به پابه GND آردوینو وصل میکنیم.

Heartbeat - neopixel digispark

 


فراخوانی کتابخانه


در این آموزش من از کتابخانه‌ی neopixel استفاده کرده‌ام. برای دانلود کتابخانه به صفحه محصول حلقه ال ای دی LED Neo Pixel ring RGB مراجعه و در انتهای صفحه لینک کتابخانه وجود دارد.

 


نکته بسیار مهم


از آنجایی که برای ساده شدن و کم حجم بودن کدها از دو کد مجزا استفاده کرده ام ، باید به همگام کامپایل کردن از دو تب مجزا استفاده کنید. برای این منظور کافیست بعد از باز کردن برنامه آردوینو از کلیدهای میانبر Ctrl+Shift+N استفاده کنید همانطور که درتصویر زیر میبینید، یک نام برای تب مورد نظر تعریف میکنید و سپس تایید و سپس در درایور مورد نظر خود ذخیره نمایید . حالا کد اول در یکی از تب ها و کد دوم را در دیگری قرار دهید.

arduino-Digispark

 


کدهای برنامه ضربان قلب آردوینو


 

#include <Adafruit_NeoPixel.h>    // Library containing 
 
// Behavior setting variables
int pulsePin = 0; // Pulse Sensor purple wire connected to analog pin 0
int blinkPin = 13; // Digital pin to blink led at each beat
int fadePin = 5; // pin to do fancy neopixel effects at each beat
int fadeRate = 0; // used to fade LED on with PWM on fadePin
 
// these variables are volatile because they are used during the interrupt service routine
volatile int BPM; // used to hold the pulse rate
volatile int Signal; // holds the incoming raw data
volatile int IBI = 600; // holds the time between beats, the Inter-Beat Interval
volatile boolean Pulse = false; // true when pulse wave is high, false when it's low
volatile boolean QS = false; // becomes true when Arduoino finds a beat.
 
// Set up use of NeoPixels
const int NUMPIXELS = 12; // Put the number of NeoPixels you are using here
const int BRIGHTNESS = 60; // Set brightness of NeoPixels here
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, fadePin, NEO_GRB + NEO_KHZ800);
 
void setup(){
 pinMode(blinkPin,OUTPUT); // pin that will blink to your heartbeat!
// Serial.begin(115200); // Serial output data for debugging or external use
 strip.begin();
 strip.setBrightness(BRIGHTNESS);
 for (int x=0; x < NUMPIXELS; x++) { // Initialize all pixels to 'off'
 strip.setPixelColor(x, strip.Color(0, 0, 0));
 }
 strip.show(); // Ensure the pixels are off 
 delay(1000); // Wait a second
 interruptSetup(); // sets up to read Pulse Sensor signal every 2mS 
}
 
void loop(){
// sendDataSerial('S', Signal); // send Processing the raw Pulse Sensor data
 if (QS == true){ // Quantified Self flag is true when arduino finds a heartbeat
 fadeRate = 255; // Set 'fadeRate' Variable to 255 to fade LED with pulse
// sendDataSerial('B',BPM); // send heart rate with a 'B' prefix
// sendDataSerial('Q',IBI); // send time between beats with a 'Q' prefix
 QS = false; // reset the Quantified Self flag for next time 
 }
 ledFadeToBeat(); // Routine that fades color intensity to the beat
 delay(20); // take a break
}
 
void ledFadeToBeat() {
 fadeRate -= 15; // Set LED fade value
 fadeRate = constrain(fadeRate,0,255); // Keep LED fade value from going into negative numbers
 setStrip(fadeRate); // Write the value to the NeoPixels 
// sendDataSerial('R',fadeRate);
}
 
void sendDataSerial(char symbol, int data ) {
// Serial.print(symbol); // symbol prefix tells Processing what type of data is coming
// Serial.println(data); // the data to send culminating in a carriage return
}
 
void setStrip(int r) { // Set the strip to one color intensity (red)
 int g = 0; // Green is set to zero (for non-red colors, change this)
 int b = 0; // Blue is set to zero (for non-red colors, change this)
 for (int x=0; x < NUMPIXELS; x++) {
 strip.setPixelColor(x, strip.Color(r, g, b));
 }
 strip.show();
}

 

کدهای سنسور ضربان قلب

    
    volatile int rate[10];                    // used to hold last ten IBI values
    volatile unsigned long sampleCounter = 0;          // used to determine pulse timing
    volatile unsigned long lastBeatTime = 0;           // used to find the inter beat interval
    volatile int P =512;                      // used to find peak in pulse wave
    volatile int T = 512;                     // used to find trough in pulse wave
    volatile int thresh = 512;                // used to find instant moment of heart beat
    volatile int amp = 100;                   // used to hold amplitude of pulse waveform
    volatile boolean firstBeat = true;        // used to seed rate array so we startup with reasonable BPM
    volatile boolean secondBeat = true;       // used to seed rate array so we startup with reasonable BPM
     
    void interruptSetup(){     
      // Initializes Timer2 to throw an interrupt every 2mS.
      TCCR2A = 0x02;     // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE
      TCCR2B = 0x06;     // DON'T FORCE COMPARE, 256 PRESCALER 
      OCR2A = 0X7C;      // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE
      TIMSK2 = 0x02;     // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A
      sei();             // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED      
    } 
     
    // THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE. 
    // Timer 2 makes sure that we take a reading every 2 miliseconds
    ISR(TIMER2_COMPA_vect){                         // triggered when Timer2 counts to 124
        cli();                                      // disable interrupts while we do this
        Signal = analogRead(pulsePin);              // read the Pulse Sensor 
        sampleCounter += 2;                         // keep track of the time in mS with this variable
        int N = sampleCounter - lastBeatTime;       // monitor the time since the last beat to avoid noise
     
    //  find the peak and trough of the pulse wave
        if(Signal < thresh && N > (IBI/5)*3){       // avoid dichrotic noise by waiting 3/5 of last IBI
            if (Signal < T){                        // T is the trough
                T = Signal;                         // keep track of lowest point in pulse wave 
             }
           }
          
        if(Signal > thresh && Signal > P){          // thresh condition helps avoid noise
            P = Signal;                             // P is the peak
           }                                        // keep track of highest point in pulse wave
        
      //  NOW IT'S TIME TO LOOK FOR THE HEART BEAT
      // signal surges up in value every time there is a pulse
    if (N > 250){                                   // avoid high frequency noise
      if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){        
        Pulse = true;                               // set the Pulse flag when we think there is a pulse
        digitalWrite(blinkPin,HIGH);                // turn on pin 13 LED
        IBI = sampleCounter - lastBeatTime;         // measure time between beats in mS
        lastBeatTime = sampleCounter;               // keep track of time for next pulse
             
             if(firstBeat){                         // if it's the first time we found a beat, if firstBeat == TRUE
                 firstBeat = false;                 // clear firstBeat flag
                 return;                            // IBI value is unreliable so discard it
                }   
             if(secondBeat){                        // if this is the second beat, if secondBeat == TRUE
                secondBeat = false;                 // clear secondBeat flag
                   for(int i=0; i<=9; i++){         // seed the running total to get a realisitic BPM at startup
                        rate[i] = IBI;                      
                        }
                }
              
        // keep a running total of the last 10 IBI values
        word runningTotal = 0;                   // clear the runningTotal variable    
     
        for(int i=0; i<=8; i++){                // shift data in the rate array
              rate[i] = rate[i+1];              // and drop the oldest IBI value 
              runningTotal += rate[i];          // add up the 9 oldest IBI values
            }
            
        rate[9] = IBI;                          // add the latest IBI to the rate array
        runningTotal += rate[9];                // add the latest IBI to runningTotal
        runningTotal /= 10;                     // average the last 10 IBI values 
        BPM = 60000/runningTotal;               // how many beats can fit into a minute? that's BPM!
        QS = true;                              // set Quantified Self flag 
        // QS FLAG IS NOT CLEARED INSIDE THIS ISR
        }                       
    }
     
      if (Signal < thresh && Pulse == true){     // when the values are going down, the beat is over
          digitalWrite(blinkPin,LOW);            // turn off pin 13 LED
          Pulse = false;                         // reset the Pulse flag so we can do it again
          amp = P - T;                           // get amplitude of the pulse wave
          thresh = amp/2 + T;                    // set thresh at 50% of the amplitude
          P = thresh;                            // reset these for next time
          T = thresh;
         }
      
      if (N > 2500){                             // if 2.5 seconds go by without a beat
          thresh = 512;                          // set thresh default
          P = 512;                               // set P default
          T = 512;                               // set T default
          lastBeatTime = sampleCounter;          // bring the lastBeatTime up to date        
          firstBeat = true;                      // set these to avoid noise
          secondBeat = true;                     // when we get the heartbeat back
         }
      
      sei();                                     // enable interrupts when youre done!
    }// end isr

در این برنامه ال ای دی های نئوپیکسل Neopixel فقط رنگ قرمز را نشان میدهد که شما میتوانید به رنگ دلخواهتان تغییر دهید.

 


نمونه کد ضربان قلب برای برد آردوینو Pro micro


 

volatile int rate[10]; // used to hold last ten IBI values
volatile unsigned long sampleCounter = 0; // used to determine pulse timing
volatile unsigned long lastBeatTime = 0; // used to find the inter beat interval
volatile int P =512; // used to find peak in pulse wave
volatile int T = 512; // used to find trough in pulse wave
volatile int thresh = 512; // used to find instant moment of heart beat
volatile int amp = 100; // used to hold amplitude of pulse waveform
volatile boolean firstBeat = true; // used to seed rate array so we startup with reasonable BPM
volatile boolean secondBeat = true; // used to seed rate array so we startup with reasonable BPM

void interruptSetup(){ 
 // Initializes Timer2 to throw an interrupt every 2mS.
 TCCR1A = 0x02; // DISABLE PWM ON DIGITAL PINS 3 AND 11, AND GO INTO CTC MODE
 TCCR1B = 0x05; // DON'T FORCE COMPARE, 256 PRESCALER 
 OCR1A = 0X7C; // SET THE TOP OF THE COUNT TO 124 FOR 500Hz SAMPLE RATE
 TIMSK1 = 0x02; // ENABLE INTERRUPT ON MATCH BETWEEN TIMER2 AND OCR2A
 sei(); // MAKE SURE GLOBAL INTERRUPTS ARE ENABLED 
} 

// THIS IS THE TIMER 2 INTERRUPT SERVICE ROUTINE. 
// Timer 2 makes sure that we take a reading every 2 miliseconds
ISR(TIMER2_COMPA_vect){ // triggered when Timer2 counts to 124
 cli(); // disable interrupts while we do this
 Signal = analogRead(pulsePin); // read the Pulse Sensor 
 sampleCounter += 2; // keep track of the time in mS with this variable
 int N = sampleCounter - lastBeatTime; // monitor the time since the last beat to avoid noise

// find the peak and trough of the pulse wave
 if(Signal < thresh && N > (IBI/5)*3){ // avoid dichrotic noise by waiting 3/5 of last IBI
 if (Signal < T){ // T is the trough
 T = Signal; // keep track of lowest point in pulse wave 
 }
 }
 
 if(Signal > thresh && Signal > P){ // thresh condition helps avoid noise
 P = Signal; // P is the peak
 } // keep track of highest point in pulse wave
 
 // NOW IT'S TIME TO LOOK FOR THE HEART BEAT
 // signal surges up in value every time there is a pulse
if (N > 250){ // avoid high frequency noise
 if ( (Signal > thresh) && (Pulse == false) && (N > (IBI/5)*3) ){ 
 Pulse = true; // set the Pulse flag when we think there is a pulse
 digitalWrite(blinkPin,HIGH); // turn on pin 13 LED
 IBI = sampleCounter - lastBeatTime; // measure time between beats in mS
 lastBeatTime = sampleCounter; // keep track of time for next pulse
 
 if(firstBeat){ // if it's the first time we found a beat, if firstBeat == TRUE
 firstBeat = false; // clear firstBeat flag
 return; // IBI value is unreliable so discard it
 } 
 if(secondBeat){ // if this is the second beat, if secondBeat == TRUE
 secondBeat = false; // clear secondBeat flag
 for(int i=0; i<=9; i++){ // seed the running total to get a realisitic BPM at startup
 rate[i] = IBI; 
 }
 }
 
 // keep a running total of the last 10 IBI values
 word runningTotal = 0; // clear the runningTotal variable 

 for(int i=0; i<=8; i++){ // shift data in the rate array
 rate[i] = rate[i+1]; // and drop the oldest IBI value 
 runningTotal += rate[i]; // add up the 9 oldest IBI values
 }
 
 rate[9] = IBI; // add the latest IBI to the rate array
 runningTotal += rate[9]; // add the latest IBI to runningTotal
 runningTotal /= 10; // average the last 10 IBI values 
 BPM = 60000/runningTotal; // how many beats can fit into a minute? that's BPM!
 QS = true; // set Quantified Self flag 
 // QS FLAG IS NOT CLEARED INSIDE THIS ISR
 } 
}

 if (Signal < thresh && Pulse == true){ // when the values are going down, the beat is over
 digitalWrite(blinkPin,LOW); // turn off pin 13 LED
 Pulse = false; // reset the Pulse flag so we can do it again
 amp = P - T; // get amplitude of the pulse wave
 thresh = amp/2 + T; // set thresh at 50% of the amplitude
 P = thresh; // reset these for next time
 T = thresh;
 }
 
 if (N > 2500){ // if 2.5 seconds go by without a beat
 thresh = 512; // set thresh default
 P = 512; // set P default
 T = 512; // set T default
 lastBeatTime = sampleCounter; // bring the lastBeatTime up to date 
 firstBeat = true; // set these to avoid noise
 secondBeat = true; // when we get the heartbeat back
 }
 
 sei(); // enable interrupts when youre done!
}// end isr

از آنجایی که وقفه های برد Pro micro با آردوینو Uno متفاوت است ، یک سری از کدها تغییر داده شده است که باید از کد بالا برای Pro micro استفاده نمایید.

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

پریسا پوربلورچیان

تولید کننده محتوا / کارشناس IOT

زندگی یعنی پژوهش و فهمیدن چیزی جدید

تلاشم بر این است تجربیاتم در زمینه IOT‌ را به بهترین شکل با شما در میان بگذارم.

تبادل نظر و رفع عیب با ثبت دیدگاه

۴۸ دیدگاه

  • سلام کدهارو من نتونستم کامپایل کنم امکانش باشه فایل رو برام ایمیل کنید

        • سلام
          ضمن تشکر از توجه شما، کدها را بررسی کردم،متاسفانه یک قسمت از کدها دوبار تکرار شده بود که این مشکل برطرف شد. لطفا کدها را مجددا کپی نمایید و اگر بازهم مشکل داشتید از همین طریق ادامه دهید.

    • خواهش میکنم . اگر به مشکل برخوردید حتما از همین طریق اقدام نمایید.

  • سلام اغلب آموزشهاتون بر مبنای رزبری است اما این یکی رو با آردنیو گفتین
    ممکنه با رزبری رو بگذارین؟
    تشکر

    • سلام
      سعى میکنیم سنسور و ماژول ها رو با میکروکنترل هاى متفاوتى راه اندازى کنیم. چنانچه تقاضا براى این مورد باشد، پس از بررسى در دستور کار قرار خواهیم داد.

      • ممنون از شما،
        تقاضا که همین جا عرض شد
        اما کلا خیلی خوبه که اصلا به این هم پرداخته بشه که کِی بایستی رفت سراغ آردوینو، کِی رزبری و کِی هیچکدوم؟

        • در کنار هم یاد بگیرید. خیلى از پروژه ها ترکیبى از هر دو برد است. و نیاز به دانش آن خواهید داشت. هر دو برد آردوینو و رزبرى را تهیه کنید و مرحله به مرحله با آموزش ها پیش بروید. نحوه اتصال ماژول ها و حتى استفاده از کتابخانه هم کامل در سایت آموزش داده شده است.

  • سلام .
    ممنون آموزش خوبتون.
    چند تا سوال داشتم.
    من قطعات این برد رو ندارم. قصد دارم بخرم.
    میخوام با arduino nano درست کنمش. آیا محدودیتی وجود داره برای این کار؟
    برای اینکه این محصولی تقریبا واقعی باشه و در شرایط واقعی کار کنه. ماژولی وجود داره که بتونم با باتری های ساعت مچی ریز ولتاژ ۳ ولت مناسب رو برای این محصول به دست بیارم؟
    کلا کوچک ترین ماژول پاور برای Aduino که میشناسید چی هست؟ باتری قلمی هست ولی بزرگه.
    این آموزشتون خیلی عالیه. ولی اگر بخواهیم واقعی از هم چین محصولی استفاده کنیم باید محدودیت پاور رو برطرف کنیم.
    تشکر دوباره برای آموزش خوبتون.

    • سلام
      ضمن تشکر از توجه شما، اکثر کدهای آردوینو، با رعایت شرایط قابلیت استفاده در تمامی بردهای آردوینو را دارند. در مورد تغذیه برای برد آردوینو پیشنهاد میکنم از باتری‌های لیتیوم پلیمر Li-Po استفاده کنید. بسته به نوع پردازش آردوینو، به توان باتری مختلف نیاز دارید. ولی در کل میتوانید به پین‌های ۳٫۳ ولت آردوینو اتصال دهید.

      • بازم ممنون از وقتی که برای پاسخ گویی گذاشتین.
        باتری معرفی شده ی شما رو دیدم. خیلی خیلی ممنون بابت راهنماییتون.
        از این باتری کوچکتر سراغ ندارید؟ من میخواهم یک محصول فعلا البته آزمایشگاهی درست کنم که در حد یک دست بند باشه و روی مچ یا بازو بتونه بسته بشه.
        باتری هایی که معرفی کردین کمی حجیم هست. به همین خاطر باتری ساعت مچی رو فکر کردم بهتر میشه ازش استفاده کرد! ولی هیچ ماژولی برای استفاده از باتری های ساعت مچی پیدا نکردم!
        بازم ممنون بابت وقتی که گذاشتید خوندید و جواب دادین.
        تشکر

        • خواهش میکنم.
          بله در حال حاضر ماژولی برای باتری های مورد نظر شما ارائه نشده است.
          برای باتری هم باید در فروشگاه بررسی کنم، حدودا چه ابعادی مد نظرتان است؟

          • در حد ابعاد صفحه ی یک ساعت مچی!
            در سایز ساعت های هوشمند! Samsung watch برای مثال. قصد ندارم یک ساعت هوشمند درست کنم ولی میخوام برای شروع یک دستگاه ضربان قلب درست کنم که مثل ساعت مچی قابل حمل باشد.
            تشکر بابت پاسخ گویی و وقتی که میگذارید برای خوندن .

  • سلام بنده دقیقا مدار رو مثل شما وصل کردم میکروی مورد استفاده هم آردیونو یونو Ardnuino uno استفاده کردم
    ولی سنسور انگار دقیق عمل نمیکنه اصلا در ست نشون نمیده. هی کم و زیاد میشه.
    جرا این طور است ؟

    • سلام
      از توجه شما ممنونم
      توجه داشته باشید که این سنسورها از سطح پوست سنجش میکنند و دقتش بسیار به شرایط محیطى بستگى دارد.

  • سلام وقت بخیر. ممنون از مطالب مفیدتون. درصورت امکان کد arduino میخواستم که اطلاعات از سنسور ضربان قلب خوانده شود و از طریق ماژول بلوتوث Hc05 به نرم افزار اندروید ارسال شود. ممنون میشم کمکم کنید یا سایتی که این کد موجود باشه معرفی کنید. خیلی سایت ها کدها برای ارتباط با وسایل پیچیده است نه سنسور ضربان قلب و من سردر نیاوردم و وقتی هم تغییرشون میدم با error های زیادی مواجه میشم. وقتم محدوده خواهشا کمک کنید

    • سلام
      از توجه شما ممنونم.
      هدف از راه اندازى دیجى اسپارک در این چند سال به اشتراک گذارى و قرار دادن آموزش هاى کاربردى در جهت رشد و پیشرفت اینترنت اشیا بوده است. در اکثر آموزش ها کد هاى لازم براى شروع راه اندازى ماژول ها در اختیار کاربران قرار گرفته شده است به عنوان مثال آموزش راه اندازى سنسور ضربان قلب و ماژول بلوتوث هر دو جداگانه در سایت قرار گرفته شده است. هدف ما این است که شما با استناد به این آموزش ها خودتان با ایجاد تغییر در کدها ، پروژه هایى حرفه اى تر را پیاده سازى کنید که این هم مستلزم تلاش خودتان است.
      سپاسگزارم

  • سلام خانوم پوربلورچیان ، بابت تمام زحماتتون در رابطه با آموزش ممنونم .
    خواستم اگر که ممکنه نحوه کار با ماژول ضربان قلب دیجیتال MAX30100 رو بهمون آموزش بدین .
    من این ماژول رو خریدم ولی نتونستم اون رو راه اندازی کنم .
    متشکرم

    • سلام
      از توجه شما ممنونم.
      کالای مورد نظر خود را به فروشگاه پیشنهاد بدید، در صورتیکه به فروشگاه اضافه شود حتما آموزش راه اندازیش رو منتشر خواهم کرد.

  • سلام
    ببخشید این سنسور پالس برا خودش بطور نامنظم پالس میده نمیشه کاریش کرد این مشکل حل بشه ؟

    • سلام
      توجه کنید که این سنسورها از سطح پوست سنجش می‌کنند و دقتش بسیار به شرایط محیطى بستگى دارد.

  • سلام این کلیپ و اموزشو دیدم شدیدا ترغیب شدم به سمت یادگیری برد های اردینو و رزبری و حتما اموزش هاشو و خوده قطعاتو تابستان خریداری میکنم و استفاده میکنم(الان کنکور دارم نمیشه)در ضمن فکر کنم این سنسور تشخیص ضربان باید روی نبض کاروتید یا نبض مچی تماس پیدا کنه تا دقیق بتونه کار کنه یه سوال دارم این اموزش کاز با برد های ادینو و رزبری و برنامه نویسی شون چندتا سایت دیدم پولی هستن ایا سایتی رو سراغ دارید رایگان در اختیار کاربران قرار بده؟لطفا جوابشو ایمیل بزنید بهم ممنون از خانم پوربلورچیان

    • سلام
      در ابتدا از توجه و دقت نظر شما ممنونم.
      همانطور که مشخص است، دیجی اسپارک تنها مرجع فارسی زبان آردوینو و رزبری پای است. تمامی آموزش ها در سایت رایگان قرار گرفته شده و همچنین از طریق ثبت نظر در هر آموزش با نویسنده پست در ارتباط خواهید بود. برای شروع یادگیری تنها کافیست لینک از کجا شروع کنم را مطالعه نمایید. در منو سایت آموزش های رزبری و آردوینو با چند عنوان مختلف در قالب آموزش و پروژه و کیت دسته بندی شده است و می‌توانید به راحتی به آموزش ها دسترسی داشته باشید.

  • سلام
    ممنون از سایت بسیار خوبتون.
    دو تا سوال داشتم
    من از برد mega 2560 استفاده میکنم میخواستم بدونم کد های وقفه تفاوت دارد یا نه؟
    من از Neopixel کوچکتر استفاده میکنم تفاوتی در کد ها باید بدم؟

    • با سلام
      در خصوص وقفه به آموزش زیر مراجعه کنید.
      آموزش وقفههمچنین در خصوص ال ای دی نئوپیکسل تنها تعداد پیکسل ها را در کدها تغییر دهید.

  • با استفاده از اردینو خیلی اسون هست..
    چطور بدون استفاده از میکروکنترولر(آردینیو) نمایشگر ضربان قلب رو میشه ساخت؟

  • سلام
    من میخوام سنسور ضربان قلب به صورت وایرلس به این برد وصل بشه،
    سنسور ضربان قلب وایرلس وجود داره؟

  • سلام
    من یه دستگاه ضربان قلب میخوام که اخطار بده وقتی ضربان میره بالا
    از اینام چیزی سر در نیوردم
    ممنون میشم یه راه ارتباطی داشته باشیم

    • با سلام
      کاربر گرامی چنین خدماتی نداریم. تمامی آموزش ها در سایت در دسترس کاربران قرار دارد و میتوانید استفاده کنید.