
راه اندازی ماژول پالس اکسیمتر و ضربان قلب با آردوینو
در این مقاله با استفاده از ماژول پالس اکسیمتر و ضربان قلب MAX30102 و آردوینو، یک پروژه اندازه گیری ضربان قلب (BPM) و غلظت اکسیژن خون (SP02) را کار خواهیم کرد. پس اگر علاقمند به آشنایی با روش راه اندازی و کار این پروژه جذاب و کاربردی هستید تا انتهای این مقاله همراه ما باشید.
سنسور پالس اکسیمتر MAX30102:
MAX30102 یک ماژول بیوسنسور پالس اکسیمتری و مانیتور ضربان قلب یکپارچه براساس PPG(PhotoPlethysmoGraphy) است. این سنسور را می توان با هر میکروکنترلر مانند Arduino ، ESP8266 ، ESP32 STM32 یا Raspberry Pi Pico با استفاده از پروتکل ارتباطی I2C ادغام کرد. BPM مخفف «ضربان در دقیقه» است که معمولاً برای یک فرد معمولی از 65 تا 75 در هنگام استراحت متغیر است. ورزشکاران ممکن است نرخ BPM کمتر از این محدوده را داشته باشند. SpO2 نشان دهنده سطح اشباع اکسیژن است که برای یک فرد عادی بالای 95 درصد است.این دستگاه نه تنها ضربان قلب، بلکه می تواند غلظت اکسیژن خون را نیز اندازه گیری کند. این سنسوری است که توسط آنالوگ دیوایس طراحی شده است و در پیکربندی های مختلف توسط سازندگان مختلف وجود دارد.

از کاربردهای این سنسور میتوان به موارد ذیل اشاره کرد:
اندازهگیری اکسیژن خون (SpO2):
MAX30102 قادر به اندازهگیری اشباع اکسیژن خون با دقت بالا است. این ویژگی برای مراقبت از سلامتی و تشخیص مشکلات تنفسی مفید است.
اندازهگیری ضربان قلب:
این سنسور میتواند ضربان قلب را به طور دقیق و پیوسته اندازهگیری کند که کاربردهای متعددی مانند سنجش سلامت قلب و تناسب اندام دارد.
مصرف توان پایین و ابعاد کوچک:
MAX30102 مصرف توان بسیار پایین دارد که آن را برای استفاده در دستگاههای پوشیدنی و قابل حمل مناسب میکند.
همچنین در بستهبندیهای کوچک 5.6×2.8×1.2 میلیمتری ارائه میشود. در واقع این سنسور MAX30102 به دلیل قابلیتهای متنوع، کاربردهای گستردهای از جمله، تجهیزات پزشکی و پروژههای sIOT دارد.
وسایل مورد نیاز برای راه اندازی سنسور پالس اکسیمتر MAX30102:



اما بیایید نگاهی به طراحی ماژول سنسور پالس اکسی متر MAX30102 بیندازیم. اینجا بلوک دیاگرام این ماژول را میبینیم:

سنسور MAX30102 به طور کامل از طریق رجیسترهای نرم افزاری قابل تنظیم است و داده های خروجی دیجیتال را میتوان در یک FIFO با عمق 32 در داخل IC ذخیره کرد. FIFO به MAX30102 اجازه می دهد تا به یک میکروکنترلر یا پردازنده در یک گذرگاه مشترک متصل شود، جایی که داده ها به طور مداوم از رجیسترهای MAX30102 خوانده نمیشوند و دارای آدرس I2C ثابت 0xAE (برای عملیات نوشتن) و 0xAF (برای عملیات خواندن)است.
ساب سیستم SpO2 (اندازه گیری اشباع اکسیژن خون)
ساب سیستم SpO2 MAX30102 شامل حذف نور محیط یا کاهش نور محیطی (ALC) که یک تکنیک استفاده شده در انواع دستگاه های الکترونیکی مانند نمایشگرها، دوربین ها و سنسورها است تا اثرات نور محیطی ناخواسته را کاهش دهد. هدف اصلی ALC بهبود عملکرد و دقت این دستگاه ها با کاهش تداخل ناشی از نور محیطی است. ALC دارای یک مدار Track/Hold داخلی برای حذف نور محیط و افزایش محدوده دینامیکی موثر است.همچنین ALC می تواند تا 200µA جریان محیط را حذف کند.
ADC داخلی یک مبدل سیگما-دلتا با بیشنمونهبرداری مداوم با وضوح 18 بیت است. نرخ نمونه برداری ADC ؛ 10.24 مگاهرتز است. نرخ داده خروجی ADC را می توان از 50sps (نمونه در ثانیه) تا 3200sps برنامه ریزی کرد.
سنسور دما
MAX30102 دارای سنسور دمای روی تراشه برای کالیبره کردن وابستگی دمایی ساب سیستم SpO2 است. سنسور دما دارای وضوح ذاتی 0.0625 درجه سانتیگراد است. دادههای خروجی دستگاه نسبتاً به طول موج LED IR حساس نیستند، جایی که طول موج LED قرمز برای تفسیر صحیح دادهها حیاتی است. یک الگوریتم SpO2 که با سیگنال خروجی MAX30102 استفاده میشود، میتواند خطای SpO2 مرتبط با تغییرات دمای محیط را جبران کند.
درایور LED
MAX30102 درایورهای LED قرمز و IR را برای تعدیل پالس های LED برای اندازه گیری SpO2 و HR ادغام می کند. جریان LED را می توان از 0 تا 50 میلی آمپر با ولتاژ تغذیه مناسب برنامه ریزی کرد. عرض پالس LED را می توان از 69 میکرو ثانیه تا 411 میکرو ثانیه برنامه ریزی کرد تا به الگوریتم اجازه دهد تا دقت SpO2 و HR و مصرف انرژی را بر اساس موارد استفاده بهینه کند.
آی سی MAX30102 با یک منبع تغذیه 1.8 ولت کار می کند، اما برای LED های داخلی به یک منبع تغذیه 3.3 ولت جداگانه نیاز است. بنابراین ماژول دارای رگولاتورهای 3.3 ولت و 1.8 ولت است.

سنسور پالس اکسی متر MAX30102 چگونه کار می کند؟
MAX30102 با تابش هر دو نور به انگشت یا اساساً در هر جایی که پوست خیلی ضخیم نیست،( هر دو نور می توانند به راحتی به بافت نفوذ کنند) و با استفاده از ردیاب نوری، میزان نور منعکس شده را اندازه گیری می کند. این روش تشخیص پالس از طریق نور Photoplethysmogram نامیده می شود.
عملکرد MAX30102 را می توان به دو بخش تقسیم کرد: اندازه گیری ضربان قلب و پالس اکسیمتری (اندازه گیری سطح اکسیژن خون).
اندازه گیری ضربان قلب
هموگلوبین اکسیژن دار (HbO2) در خون شریانی دارای ویژگی جذب نور IR است. هر چه خون قرمزتر باشد (هموگلوبین بالاتر)، نور IR بیشتری جذب می شود.

همانطور که خون با هر ضربان قلب از طریق انگشت پمپ می شود، مقدار نور منعکس شده تغییر می کند و یک شکل موج متغیر در خروجی آشکارساز نور ایجاد می کند. همانطور که به تابش نور و خواندن ردیاب نوری ادامه می دهید، به سرعت شروع به خواندن نبض ضربان قلب (HR) می کنید.
پالس اکسیمتری
مبتنی بر میزان جذب نور قرمز و مادون قرمز بسته به میزان اکسیژن خون شما متفاوت باشد، است.

اجازه دهید حسگر پالس اکسیمتر MAX30102 را با آردوینو راه اندازی کنیم:

پین VIN و پین GND MAX30102 را به پایه 3.3 ولت و GND آردوینو وصل کنید. به طور مشابه، پایه SCL و SDA MAX30102 را به ترتیب به پایه A5 و A4 در آردوینو Uno وصل کنید. طبق نقشه عکس بالا اتصالات را انجام دهید.

اندازه گیری ضربان قلب، اکسیژن و دمای خون با MAX30102 و آردوینو
در قسمت کدنویسی این پروژه میتوانیم از کتابخانه MAX30102 Arduino برای اندازهگیری مقدار ضربان قلب بر حسب BPM، اکسیژن خون برحسب درصد و دما بر حسب درجه سانتیگراد استفاده کنیم. قبل از آن باید کتابخانه MAX30102 را نصب کنیم.
نصب کتابخانه آردوینو MAX30102
چندین کتابخانه برای سنسور MAX30102 برای اندازهگیری ضربان قلب، اکسیژن خون و دما وجود دارد. یکی از محبوبترین همه این کتابخانه ها، کتابخانه Sparkfun Electronics است.
برای نصب کتابخانه، MAX3010x را جستجو کنید. کتابخانه SparkFun MAX3010x Pulse and Proximity Sensor را پیدا کرده و بر روی install کلیک کنید.

اندازه گیری ضربان قلب (BPM) با MAX30102 و آردوینو
این کد یک سنسور MAX30102 را در آردوینو راه اندازی می کند تا ضربان قلب را بر حسب ضربان در دقیقه اندازه گیری کند، داده های خوانده شده را برای دقت میانگین می گیرد، و همراه با مقدار سنسور مادون قرمز به نمایشگر سریال ارسال می کند، که نشان می دهد آیا انگشت روی سنسور قرار گرفته است یا خیر.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<span class="line"><span style="color: #89DDFF; font-style: italic">#include</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF"><</span><span style="color: #C3E88D">Wire.h</span><span style="color: #89DDFF">></span></span> <span class="line"><span style="color: #89DDFF; font-style: italic">#include</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">MAX30102.h</span><span style="color: #89DDFF">"</span></span> <span class="line"><span style="color: #89DDFF; font-style: italic">#include</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">heartRate.h</span><span style="color: #89DDFF">"</span><span style="color: #546E7A; font-style: italic">// Create an instance of the MAX30102 class to interact with the sensor<br>MAX30102 particleSensor;// Define the size of the rates array for averaging BPM; can be adjusted for smoother results<br></span></span> <span class="line"><span style="color: #C792EA">const</span><span style="color: #EEFFFF"> byte RATE_SIZE </span><span style="color: #89DDFF">=</span><span style="color: #EEFFFF"> </span><span style="color: #F78C6C">4</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Increase this for more averaging. 4 is a good starting point.<br></span></span> <span class="line"><span style="color: #EEFFFF">byte rates</span><span style="color: #89DDFF">[</span><span style="color: #EEFFFF">RATE_SIZE</span><span style="color: #89DDFF">];</span><span style="color: #546E7A; font-style: italic"> // Array to store heart rate readings for averaging<br></span></span> <span class="line"><span style="color: #EEFFFF">byte rateSpot </span><span style="color: #89DDFF">=</span><span style="color: #EEFFFF"> </span><span style="color: #F78C6C">0</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Index for inserting the next heart rate reading into the array<br></span></span> <span class="line"><span style="color: #C792EA">long</span><span style="color: #EEFFFF"> lastBeat </span><span style="color: #89DDFF">=</span><span style="color: #EEFFFF"> </span><span style="color: #F78C6C">0</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Timestamp of the last detected beat, used to calculate BPM<br> <br></span></span> <span class="line"><span style="color: #C792EA">float</span><span style="color: #EEFFFF"> beatsPerMinute</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Calculated heart rate in beats per minute<br></span></span> <span class="line"><span style="color: #C792EA">int</span><span style="color: #EEFFFF"> beatAvg</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Average heart rate after processing multiple readings<br> <br></span></span> <span class="line"><span style="color: #C792EA">void</span><span style="color: #EEFFFF"> </span><span style="color: #82AAFF">setup</span><span style="color: #89DDFF">()</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF">{</span></span> <span class="line"></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">begin</span><span style="color: #89DDFF">(</span><span style="color: #F78C6C">115200</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Start serial communication at 115200 baud rate<br> </span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">println</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">Initializing...</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Attempt to initialize the MAX30105 sensor. Check for a successful connection and report.<br></span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">if</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(!</span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">begin</span><span style="color: #89DDFF">(</span><span style="color: #F07178">Wire</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> I2C_SPEED_FAST</span><span style="color: #89DDFF">))</span><span style="color: #F07178"> </span><span style="color: #89DDFF">{</span><span style="color: #546E7A; font-style: italic"> // Start communication using fast I2C speed<br> </span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">println</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">MAX30102 was not found. Please check wiring/power. </span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">while</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #F78C6C">1</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Infinite loop to halt further execution if sensor is not found<br> }</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">println</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">Place your index finger on the sensor with steady pressure.</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">setup</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Configure sensor with default settings for heart rate monitoring </span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">setPulseAmplitudeRed</span><span style="color: #89DDFF">(</span><span style="color: #F78C6C">0x0A</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Set the red LED pulse amplitude (intensity) to a low value as an indicator<br> </span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">setPulseAmplitudeGreen</span><span style="color: #89DDFF">(</span><span style="color: #F78C6C">0</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Turn off the green LED as it's not used here<br>}</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #C792EA">void</span><span style="color: #F07178"> </span><span style="color: #82AAFF">loop</span><span style="color: #89DDFF">()</span><span style="color: #F07178"> </span><span style="color: #89DDFF">{</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #C792EA">long</span><span style="color: #F07178"> irValue </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">getIR</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Read the infrared value from the sensor</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">if</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">checkForBeat</span><span style="color: #89DDFF">(</span><span style="color: #F07178">irValue</span><span style="color: #89DDFF">)</span><span style="color: #F07178"> </span><span style="color: #89DDFF">==</span><span style="color: #F07178"> </span><span style="color: #89DDFF">true)</span><span style="color: #F07178"> </span><span style="color: #89DDFF">{</span><span style="color: #546E7A; font-style: italic"> // Check if a heart beat is detected<br> </span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #C792EA">long</span><span style="color: #F07178"> delta </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #82AAFF">millis</span><span style="color: #89DDFF">()</span><span style="color: #F07178"> </span><span style="color: #89DDFF">-</span><span style="color: #F07178"> lastBeat</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Calculate the time between the current and last beat</span></span> <span class="line"><span style="color: #F07178"> lastBeat </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #82AAFF">millis</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Update lastBeat to the current time</span></span> <span class="line"><span style="color: #F07178"> beatsPerMinute </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #F78C6C">60</span><span style="color: #F07178"> </span><span style="color: #89DDFF">/</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #F07178">delta </span><span style="color: #89DDFF">/</span><span style="color: #F07178"> </span><span style="color: #F78C6C">1000.0</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Calculate BPM</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Ensure BPM is within a reasonable range before updating the rates array</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">if</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #F07178">beatsPerMinute </span><span style="color: #89DDFF"><</span><span style="color: #F07178"> </span><span style="color: #F78C6C">255</span><span style="color: #F07178"> </span><span style="color: #89DDFF">&&</span><span style="color: #F07178"> beatsPerMinute </span><span style="color: #89DDFF">></span><span style="color: #F07178"> </span><span style="color: #F78C6C">20</span><span style="color: #89DDFF">)</span><span style="color: #F07178"> </span><span style="color: #89DDFF">{</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">rates</span><span style="color: #89DDFF">[</span><span style="color: #F07178">rateSpot</span><span style="color: #89DDFF">++]</span><span style="color: #F07178"> </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #F07178">byte</span><span style="color: #89DDFF">)</span><span style="color: #F07178">beatsPerMinute</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Store this reading in the rates array</span></span> <span class="line"><span style="color: #F07178"> rateSpot </span><span style="color: #89DDFF">%=</span><span style="color: #F07178"> RATE_SIZE</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Wrap the rateSpot index to keep it within the bounds of the rates array</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Compute the average of stored heart rates to smooth out the BPM<br> </span></span> <span class="line"><span style="color: #F07178"> beatAvg </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #F78C6C">0</span><span style="color: #89DDFF">;</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">for</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #F07178">byte x </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #F78C6C">0</span><span style="color: #F07178"> </span><span style="color: #89DDFF">;</span><span style="color: #F07178"> x </span><span style="color: #89DDFF"><</span><span style="color: #F07178"> RATE_SIZE </span><span style="color: #89DDFF">;</span><span style="color: #F07178"> x</span><span style="color: #89DDFF">++)</span></span> <span class="line"><span style="color: #F07178"> beatAvg </span><span style="color: #89DDFF">+=</span><span style="color: #F07178"> </span><span style="color: #EEFFFF">rates</span><span style="color: #89DDFF">[</span><span style="color: #F07178">x</span><span style="color: #89DDFF">];</span></span> <span class="line"><span style="color: #F07178"> beatAvg </span><span style="color: #89DDFF">/=</span><span style="color: #F07178"> RATE_SIZE</span><span style="color: #89DDFF">;</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF">}</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF">}</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Output the current IR value, BPM, and averaged BPM to the serial monitor<br> </span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">IR=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #F07178">irValue</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">, BPM=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #F07178">beatsPerMinute</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">, Avg BPM=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #F07178">beatAvg</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Check if the sensor reading suggests that no finger is placed on the sensor</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">if</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #F07178">irValue </span><span style="color: #89DDFF"><</span><span style="color: #F07178"> </span><span style="color: #F78C6C">50000</span><span style="color: #89DDFF">)</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D"> No finger?</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">println</span><span style="color: #89DDFF">();</span></span> <span class="line"><span style="color: #89DDFF">}</span></span> |
از منوی Tools، Arduino UNO Board و COM Port را انتخاب کنید. برای آپلود کد روی دکمه آپلود کلیک کنید. پس از بارگذاری کد، سنسور پالس اکسی متر MAX30102 آماده آزمایش است.

برای جریان خون ثابت و داده های قابل اعتماد، حسگر فشار را ثابت نگه دارید. اعمال فشار بهینه بر روی سنسور پالس – باید نه خیلی محکم باشد و نه خیلی سبک.

اندازه گیری اکسیژن خون (SpO2) با MAX30102 و آردوینو
این کد با استفاده از حسگر MAX30105 ضربان قلب و سطح اکسیژن را از انگشت می خواند، سپس این اطلاعات را به یک صفحه نمایش می فرستد. به صورت پویا بافر داده را بر اساس مدل آردوینو تنظیم می کند تا محدودیت های حافظه را در نظر بگیرد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
<span class="line"><span style="color: #89DDFF; font-style: italic">#include</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF"><</span><span style="color: #C3E88D">Wire.h</span><span style="color: #89DDFF">></span></span> <span class="line"><span style="color: #89DDFF; font-style: italic">#include</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">MAX30102.h</span><span style="color: #89DDFF">"</span><span style="color: #EEFFFF"> </span><span style="color: #546E7A; font-style: italic">// Include MAX30102 sensor library</span></span> <span class="line"><span style="color: #89DDFF; font-style: italic">#include</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">spo2_algorithm.h</span><span style="color: #89DDFF">"</span><span style="color: #EEFFFF"> </span><span style="color: #546E7A; font-style: italic">// Include SpO2 calculation algorithm</span></span> <span class="line"><span style="color: #EEFFFF">MAX30102 particleSensor</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Create an instance of the MAX30102 class</span></span> <span class="line"><span style="color: #89DDFF; font-style: italic">#define</span><span style="color: #EEFFFF"> </span><span style="color: #82AAFF">MAX_BRIGHTNESS</span><span style="color: #EEFFFF"> </span><span style="color: #F78C6C">255</span><span style="color: #546E7A; font-style: italic"> // Define maximum LED brightness</span></span> <span class="line"><span style="color: #546E7A; font-style: italic">// Adjust buffer size based on the microcontroller's memory capacity</span></span> <span class="line"><span style="color: #89DDFF; font-style: italic">#if</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF; font-style: italic">defined</span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">__AVR_ATmega328P__</span><span style="color: #89DDFF">)</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF">||</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF; font-style: italic">defined</span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">__AVR_ATmega168__</span><span style="color: #89DDFF">)</span></span> <span class="line"><span style="color: #C792EA">uint16_t</span><span style="color: #EEFFFF"> irBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F78C6C">100</span><span style="color: #89DDFF">];</span><span style="color: #546E7A; font-style: italic"> // Buffer for IR data (16-bit for memory-limited devices)<br></span></span> <span class="line"><span style="color: #C792EA">uint16_t</span><span style="color: #EEFFFF"> redBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F78C6C">100</span><span style="color: #89DDFF">];</span><span style="color: #546E7A; font-style: italic"> // Buffer for red LED data</span></span> <span class="line"><span style="color: #89DDFF; font-style: italic">#else</span></span> <span class="line"><span style="color: #C792EA">uint32_t</span><span style="color: #EEFFFF"> irBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F78C6C">100</span><span style="color: #89DDFF">];</span><span style="color: #546E7A; font-style: italic"> // Buffer for IR data (32-bit for devices with more memory)</span></span> <span class="line"><span style="color: #C792EA">uint32_t</span><span style="color: #EEFFFF"> redBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F78C6C">100</span><span style="color: #89DDFF">];</span><span style="color: #546E7A; font-style: italic"> // Buffer for red LED data</span></span> <span class="line"><span style="color: #89DDFF; font-style: italic">#endif</span></span> <span class="line"><span style="color: #C792EA">int32_t</span><span style="color: #EEFFFF"> bufferLength </span><span style="color: #89DDFF">=</span><span style="color: #EEFFFF"> </span><span style="color: #F78C6C">100</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Length of data buffer</span></span> <span class="line"><span style="color: #C792EA">int32_t</span><span style="color: #EEFFFF"> spo2</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Variable to store calculated SpO2 value</span></span> <span class="line"><span style="color: #C792EA">int8_t</span><span style="color: #EEFFFF"> validSPO2</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Flag indicating if SpO2 calculation is valid</span></span> <span class="line"><span style="color: #C792EA">int32_t</span><span style="color: #EEFFFF"> heartRate</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Variable to store calculated heart rate</span></span> <span class="line"><span style="color: #C792EA">int8_t</span><span style="color: #EEFFFF"> validHeartRate</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Flag indicating if heart rate calculation is valid</span></span> <span class="line"><span style="color: #EEFFFF">byte pulseLED </span><span style="color: #89DDFF">=</span><span style="color: #EEFFFF"> </span><span style="color: #F78C6C">11</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // LED pin for pulse indication (must support PWM)</span></span> <span class="line"><span style="color: #EEFFFF">byte readLED </span><span style="color: #89DDFF">=</span><span style="color: #EEFFFF"> </span><span style="color: #F78C6C">13</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // LED pin to indicate data read operation</span></span> <span class="line"><span style="color: #C792EA">void</span><span style="color: #EEFFFF"> </span><span style="color: #82AAFF">setup</span><span style="color: #89DDFF">()</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF">{</span></span> <span class="line"><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">begin</span><span style="color: #89DDFF">(</span><span style="color: #F78C6C">115200</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Initialize serial communication</span></span> <span class="line"><span style="color: #82AAFF">pinMode</span><span style="color: #89DDFF">(</span><span style="color: #F07178">pulseLED</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> OUTPUT</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Set pulseLED as output</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #82AAFF">pinMode</span><span style="color: #89DDFF">(</span><span style="color: #F07178">readLED</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> OUTPUT</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Set readLED as output<br> <br> </span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Initialize MAX30105 sensor</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">if</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(!</span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">begin</span><span style="color: #89DDFF">(</span><span style="color: #F07178">Wire</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> I2C_SPEED_FAST</span><span style="color: #89DDFF">))</span><span style="color: #F07178"> </span><span style="color: #89DDFF">{</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">println</span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">F</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">MAX30105 not found. Check wiring/power.</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">));</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">while</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #F78C6C">1</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Halt execution if sensor not found</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF">}</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">println</span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">F</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">Attach sensor to finger. Press key to start.</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">));</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">while</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">available</span><span style="color: #89DDFF">()</span><span style="color: #F07178"> </span><span style="color: #89DDFF">==</span><span style="color: #F07178"> </span><span style="color: #F78C6C">0</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Wait for user input to proceed</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">read</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Clear the serial buffer</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Sensor configuration settings<br> </span></span> <span class="line"><span style="color: #F07178"> byte ledBrightness </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #F78C6C">60</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // LED brightness (0-255)</span></span> <span class="line"><span style="color: #F07178">byte sampleAverage </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #F78C6C">4</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Averaging (1, 2, 4, 8, 16, 32)</span></span> <span class="line"><span style="color: #F07178"> byte ledMode </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #F78C6C">2</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // LED mode (1=Red, 2=Red+IR, 3=Red+IR+Green)</span></span> <span class="line"><span style="color: #F07178"> byte sampleRate </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #F78C6C">100</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Sampling rate (50, 100, 200, 400, 800, 1000, 1600, 3200)</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #C792EA">int</span><span style="color: #F07178"> pulseWidth </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #F78C6C">411</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Pulse width (69, 118, 215, 411)</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #C792EA">int</span><span style="color: #F07178"> adcRange </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #F78C6C">4096</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // ADC range (2048, 4096, 8192, 16384)</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Apply configuration settings to the sensor</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">setup</span><span style="color: #89DDFF">(</span><span style="color: #F07178">ledBrightness</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> sampleAverage</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> ledMode</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> sampleRate</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> pulseWidth</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> adcRange</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #89DDFF">}</span></span> <span class="line"><span style="color: #C792EA">void</span><span style="color: #EEFFFF"> </span><span style="color: #82AAFF">loop</span><span style="color: #89DDFF">()</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF">{</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Collect 100 samples and output raw red and IR data</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">for</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #F07178">byte i </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #F78C6C">0</span><span style="color: #89DDFF">;</span><span style="color: #F07178"> i </span><span style="color: #89DDFF"><</span><span style="color: #F07178"> bufferLength</span><span style="color: #89DDFF">;</span><span style="color: #F07178"> i</span><span style="color: #89DDFF">++)</span><span style="color: #F07178"> </span><span style="color: #89DDFF">{</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">while</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(!</span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">available</span><span style="color: #89DDFF">())</span><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">check</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Wait for new data</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">redBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F07178">i</span><span style="color: #89DDFF">]</span><span style="color: #F07178"> </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">getRed</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Store red LED data<br> </span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">irBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F07178">i</span><span style="color: #89DDFF">]</span><span style="color: #F07178"> </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">getIR</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Store IR data<br> </span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">nextSample</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Move to next sample</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">F</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">red=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">));</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #EEFFFF">redBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F07178">i</span><span style="color: #89DDFF">],</span><span style="color: #F07178"> DEC</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">F</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">, ir=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">));</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">println</span><span style="color: #89DDFF">(</span><span style="color: #EEFFFF">irBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F07178">i</span><span style="color: #89DDFF">],</span><span style="color: #F07178"> DEC</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF">}</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Calculate heart rate and SpO2 from the first 100 samples</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #82AAFF">maxim_heart_rate_and_oxygen_saturation</span><span style="color: #89DDFF">(</span><span style="color: #F07178">irBuffer</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> bufferLength</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> redBuffer</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> </span><span style="color: #89DDFF">&</span><span style="color: #F07178">spo2</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> </span><span style="color: #89DDFF">&</span><span style="color: #F07178">validSPO2</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> </span><span style="color: #89DDFF">&</span><span style="color: #F07178">heartRate</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> </span><span style="color: #89DDFF">&</span><span style="color: #F07178">validHeartRate</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Continuously update heart rate and SpO2 values with new samples</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">while</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #F78C6C">1</span><span style="color: #89DDFF">)</span><span style="color: #F07178"> </span><span style="color: #89DDFF">{</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Shift the last 75 samples to the beginning and fill the remaining with new data</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">for</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #F07178">byte i </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #F78C6C">25</span><span style="color: #89DDFF">;</span><span style="color: #F07178"> i </span><span style="color: #89DDFF"><</span><span style="color: #F07178"> </span><span style="color: #F78C6C">100</span><span style="color: #89DDFF">;</span><span style="color: #F07178"> i</span><span style="color: #89DDFF">++)</span><span style="color: #F07178"> </span><span style="color: #89DDFF">{</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">redBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F07178">i </span><span style="color: #89DDFF">-</span><span style="color: #F07178"> </span><span style="color: #F78C6C">25</span><span style="color: #89DDFF">]</span><span style="color: #F07178"> </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #EEFFFF">redBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F07178">i</span><span style="color: #89DDFF">];</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">irBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F07178">i </span><span style="color: #89DDFF">-</span><span style="color: #F07178"> </span><span style="color: #F78C6C">25</span><span style="color: #89DDFF">]</span><span style="color: #F07178"> </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #EEFFFF">irBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F07178">i</span><span style="color: #89DDFF">];</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF">}</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Collect new samples to refill the buffer</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">for</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #F07178">byte i </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #F78C6C">75</span><span style="color: #89DDFF">;</span><span style="color: #F07178"> i </span><span style="color: #89DDFF"><</span><span style="color: #F07178"> </span><span style="color: #F78C6C">100</span><span style="color: #89DDFF">;</span><span style="color: #F07178"> i</span><span style="color: #89DDFF">++)</span><span style="color: #F07178"> </span><span style="color: #89DDFF">{</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">while</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(!</span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">available</span><span style="color: #89DDFF">())</span><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">check</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Wait for new data</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #82AAFF">digitalWrite</span><span style="color: #89DDFF">(</span><span style="color: #F07178">readLED</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> </span><span style="color: #89DDFF">!</span><span style="color: #82AAFF">digitalRead</span><span style="color: #89DDFF">(</span><span style="color: #F07178">readLED</span><span style="color: #89DDFF">));</span><span style="color: #546E7A; font-style: italic"> // Blink LED with each data read</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">redBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F07178">i</span><span style="color: #89DDFF">]</span><span style="color: #F07178"> </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">getRed</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Store new red data</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">irBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F07178">i</span><span style="color: #89DDFF">]</span><span style="color: #F07178"> </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">getIR</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Store new IR data</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">nextSample</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Move to next sample</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Output raw data and calculated heart rate/SpO2 values</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">F</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">red=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">));</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #EEFFFF">redBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F07178">i</span><span style="color: #89DDFF">],</span><span style="color: #F07178"> DEC</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">F</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">, ir=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">));</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #EEFFFF">irBuffer</span><span style="color: #89DDFF">[</span><span style="color: #F07178">i</span><span style="color: #89DDFF">],</span><span style="color: #F07178"> DEC</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">F</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">, HR=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">));</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #F07178">heartRate</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> DEC</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">F</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">, HRvalid=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">));</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #F07178">validHeartRate</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> DEC</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">F</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">, SPO2=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">));</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #F07178">spo2</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> DEC</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #82AAFF">F</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">, SPO2Valid=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">));</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">println</span><span style="color: #89DDFF">(</span><span style="color: #F07178">validSPO2</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> DEC</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF">}</span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Recalculate heart rate and SpO2 with the updated buffer<br> </span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #82AAFF">maxim_heart_rate_and_oxygen_saturation</span><span style="color: #89DDFF">(</span><span style="color: #F07178">irBuffer</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> bufferLength</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> redBuffer</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> </span><span style="color: #89DDFF">&</span><span style="color: #F07178">spo2</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> </span><span style="color: #89DDFF">&</span><span style="color: #F07178">validSPO2</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> </span><span style="color: #89DDFF">&</span><span style="color: #F07178">heartRate</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> </span><span style="color: #89DDFF">&</span><span style="color: #F07178">validHeartRate</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF">}</span></span> <span class="line"><span style="color: #89DDFF">}</span></span> |
پس از آپلود کد، انگشت خود را روی سنسور پالس اکسی متر MAX30102 قرار دهید. مانیتور سریال میزان اکسیژن خون را به صورت درصد نمایش می دهد.

اندازه گیری دما با MAX30102 و آردوینو
کد زیر یک سنسور MAX30102 را برای اندازهگیری دما مقداردهی اولیه میکند، سپس به طور مداوم دما را بر حسب سلسیوس و فارنهایت بر روی نمایشگر سریال خوانده و نمایش میدهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<span class="line"><span style="color: #89DDFF; font-style: italic">#include</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF"><</span><span style="color: #C3E88D">Wire.h</span><span style="color: #89DDFF">></span></span> <span class="line"><span style="color: #89DDFF; font-style: italic">#include</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">MAX30102.h</span><span style="color: #89DDFF">"</span><span style="color: #EEFFFF"> </span><span style="color: #546E7A; font-style: italic">// Include library for MAX30102 sensor</span></span> <span class="line"><span style="color: #EEFFFF"> </span></span> <span class="line"><span style="color: #EEFFFF">MAX30102 particleSensor</span><span style="color: #89DDFF">;</span><span style="color: #546E7A; font-style: italic"> // Create an instance of the MAX30102 class</span></span> <span class="line"><span style="color: #EEFFFF"> </span></span> <span class="line"><span style="color: #C792EA">void</span><span style="color: #EEFFFF"> </span><span style="color: #82AAFF">setup</span><span style="color: #89DDFF">()</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF">{</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">begin</span><span style="color: #89DDFF">(</span><span style="color: #F78C6C">115200</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Start serial communication at 9600 baud rate</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">println</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">Initializing...</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span></span> <span class="line"><span style="color: #89DDFF"> </span><span style="color: #546E7A; font-style: italic">// Check if MAX30105 sensor is properly connected</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">if</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(!</span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">begin</span><span style="color: #89DDFF">(</span><span style="color: #F07178">Wire</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> I2C_SPEED_FAST</span><span style="color: #89DDFF">))</span><span style="color: #F07178"> </span><span style="color: #89DDFF">{</span><span style="color: #546E7A; font-style: italic"> // Initialize sensor with fast I2C speed</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">println</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">MAX30102 was not found. Please check wiring/power. </span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">);</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF; font-style: italic">while</span><span style="color: #F07178"> </span><span style="color: #89DDFF">(</span><span style="color: #F78C6C">1</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Infinite loop if sensor is not found</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #89DDFF">}</span></span> <span class="line"><span style="color: #F07178"> </span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">setup</span><span style="color: #89DDFF">(</span><span style="color: #F78C6C">0</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Initialize sensor with LEDs turned off to prevent local heating</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">enableDIETEMPRDY</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Enable temperature ready interrupt for reading temperature</span></span> <span class="line"><span style="color: #89DDFF">}</span></span> <span class="line"><span style="color: #EEFFFF"> </span></span> <span class="line"><span style="color: #C792EA">void</span><span style="color: #EEFFFF"> </span><span style="color: #82AAFF">loop</span><span style="color: #89DDFF">()</span><span style="color: #EEFFFF"> </span><span style="color: #89DDFF">{</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #C792EA">float</span><span style="color: #F07178"> temperature </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">readTemperature</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Read temperature in Celsius</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D">temperatureC=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Print temperature in Celsius</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #F07178">temperature</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> </span><span style="color: #F78C6C">4</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Print with 4 decimal places</span></span> <span class="line"><span style="color: #F07178"> </span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #C792EA">float</span><span style="color: #F07178"> temperatureF </span><span style="color: #89DDFF">=</span><span style="color: #F07178"> </span><span style="color: #EEFFFF">particleSensor</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">readTemperatureF</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // Convert temperature to Fahrenheit</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #89DDFF">"</span><span style="color: #C3E88D"> temperatureF=</span><span style="color: #89DDFF">"</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Print temperature in Fahrenheit</span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">print</span><span style="color: #89DDFF">(</span><span style="color: #F07178">temperatureF</span><span style="color: #89DDFF">,</span><span style="color: #F07178"> </span><span style="color: #F78C6C">4</span><span style="color: #89DDFF">);</span><span style="color: #546E7A; font-style: italic"> // Print with 4 decimal places</span></span> <span class="line"><span style="color: #F07178"> </span></span> <span class="line"><span style="color: #F07178"> </span><span style="color: #EEFFFF">Serial</span><span style="color: #89DDFF">.</span><span style="color: #82AAFF">println</span><span style="color: #89DDFF">();</span><span style="color: #546E7A; font-style: italic"> // New line for readability</span></span> <span class="line"><span style="color: #89DDFF">}</span></span> |
پس از آپلود کد، انگشت خود را روی سنسور پالس اکسی متر MAX30102 قرار دهید. مانیتور سریال میزان اکسیژن خون را به صورت درصد نمایش می دهد.

پس از آپلود کد، مانیتور سریال را باز کنید. مانیتور سریال مقدار دما را در مقیاس سلسیوس و فارنهایت نشان می دهد.
شما میتوانید این ماژول را با آردوینو نانو هم راه اندازی کرده و یک نمایشگر oled نیز برای مشاهده داده های سنسور روی نمایشگر اضافه کنید.
سلام وقت بخیر
یه سوال داشتم
میشه هر سه تا کارو که دما ،اکسیژن و ضربان هست رو باهم دیگه با یک سنسور داشته باشیم ؟
همین سنسور هر سه کار رو انجام میده