در روزگاری که تکنولوژی قدرت بلامنازع خود را به رخ می کشد، داده ها یکی از حیاتی ترین و مهم ترین اجزای فناوری به شمار می روند. با در اختیار داشتن داده ها، می توان ارزش های افزوده بسیاری ایجاد نمود. به عنوان مثال با اندازه گیری میزان دمای یک منطقه، می توان در رابطه با رفتار آب و هوایی آن منطقه، پیشبینی هایی داشت. در طرف دیگر، با اندازه گیری پارامترها حیاتی بدن نظیر دما، اکسیژن خون و ضربان قلب، می توان شرایط فیزیکی بدن را مانیتور کرده و به اطلاعات ارزشمند بسیاری، دست یافت. یکی از موارد بسیار مهم که همواره در کنار داده ها وجود دارد، بحث نویز و خطاست. به عبارت دیگر، داده های دریافت شده از یک سنسور بنا به دلایل مختلف، می توانند دچار خطا شوند. به عنوان مثال، هنگام خواندن داده های سنسور دمای LM35 از ورودی آنالوگ، این احتمال وجود دارد که داده ها با خطا مواجه شوند. در این شرایط، نیاز است تا با روش های سخت افزاری و نرم افزاری، خطای محاسبات را کاهش داده تا به جواب دقیق، نزدیک شویم. در این آموزش به تحلیل و بررسی کتابخانه movingAvg.h می پردازیم. به کمک این کتابخانه، می توانیم داده های دریافتی از سنسورها را اصلاح کرده و خطای آن ها را کاهش دهیم. در ادامه با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
توضیح و کاربرد روش میانگین متحرک
همانطور که بیان شد، جهت کاهش خطا و جلوگیری از نویز، دو روش سخت افزاری و نرم افزاری وجود دارد. یکی از روش های معمول و متداول در کاهش نویز نرم افزاری، استفاده از روش میانگین متحرک است. روش میانگین متحرک که در تحلیل های بازار سرمایه نیز استفاده می شود، سعی در نزدیک سازی داده ها به یک مقدار میانگین دارد. برای روشن تر شدن موضوع، تصویر زیر را مشاهده نمایید.
مطابق نمودار فوق، خط آبی داده دریافتی از ورودی آنالوگ و خط قرمز رنگ، میانگین متحرک داده هاست. همانطور که مشاهده می کنید، میانگین متحرک توانسته مقدار شفاف تر و نزدیک به واقعیت را در خروجی ترسیم کند. اگر بخواهیم مفهوم میانگین متحرک را به صورت خلاصه و در ۴ پله تعریف کنیم، خواهیم داشت.
- از ورودی تعداد زیادی داده می خوانیم.
- میانگین این مقادیر را محاسبه می کنیم.
- ورودی هایی با فاصله از میانگین را به عنوان نویز در نظر می گیریم.
- ورودی های نزدیک به میانگین را به عنون داده معتبر انتخاب می کنیم.
پس از آشنایی با مفهوم میانگین متحرک، نوبت به تحلیل و استفاده از کتابخانه می رسد. کتابخانه movingAvg.h، یک کتابخانه جهت محاسبه میانگین متحرک داده های ورودیست. به کمک این کتابخانه می توانید به سادگی و بدون درگیر شدن با جزییات، الگوریتم میانگین متحرک را بر روی داده های خود پیاده سازی کنید. به این ترتیب می توانید داده های دقیق تری در خروجی، دریافت نمایید. به همین منظور، ابتدا در قسمت بعدی به نحوه نصب این کتابخانه می پردازیم. در ادامه الزامات، بردهای مورد پشتیبانی و نکات فنی را مورد بررسی قرار می دهیم. پس از این، به بررسی توابع کلیدی و کاربردی پرداخته و در نهایت با ارائه مثالی از کاربرد، به بحث خاتمه می دهیم.
نصب کتابخانه movingAvg.h
اولین قدم در استفاده از یک کتابخانه، نصب آن در محیط آردوینو است. برای نصب کتابخانه، دو روش دستی و خودکار وجود دارد. در روش دستی، پس از دانلود فایل های کتابخانه، می بایست آن را در مسیر نصب آردویینو قرار دهید. اما در روش خودکار، تنها با تایپ نام کتابخانه در قسمت مدیریت کتابخانه ها، کتابخانه مورد نظر به صورت خودکار در مخازن آردوینو جستجو شده و پس از یافتن آن، نصب خواهد شد. به همین منظور، ابتدا در نرم افزار آردوینو، بر روی گزینه Tools و سپس Manage Libraries کلید کنید. با کلیک بر روی گزینه Manage Libraries، می توانید وضعیت کتابخانه های نصب شده و لیستی از کتابخانه های جدید و بروز را مشاهده کنید. این مورد در تصویر زیر، قابل مشاهده است.
مطابق فلش قرمز رنگ تصویر فوق، در کادر جستجو، با تایپ نام کتابخانه، می توان آن را یافته و سپس نصب نمود. در اینجا ما عبارت “movingAvg” را تایپ می کنیم. پس از چند لحظه، کتابخانه مورد نظر به شکل تصویر زیر، به نمایش در می آید. با کلیک بر روی گزینه install، این کتابخانه را نصب نمایید.
توجه: ورژن کتابخانه مورد استفاده در این آموزش، ۲٫۲٫۰ است.
الزامات و بردهای مورد پشتیبانی
کتابخانه movingAvg.h، جهت محاسبه میانگین متحرک است. از این کتابخانه می توان در بردهای مختلف آردوینو و ESP بهره برد. خروجی میانگین متحرک این کتابخانه یک عدد ۱۶ بیتی علامت دار است. بنابراین می توان از این کتابخانه در بردهای مختلف آردوینو و ESP بهره برد. این کتابخانه دارای توابع بسیار ساده جهت محاسبه میانگین متحرک است. از این کتابخانه می توانید در افزایش دقت مقادیر اندازه گیری شده از سنسورهای مختلف، به خصوص سنسورهای آنالوگ استفاده نمود. در این کتابخانه، جهت محاسبه میانگین متحرک، می بایست تعداد نمونه ها جهت محاسبه را تعیین نمود. این تعداد در یک آرایه با حافظه پویا ذخیره می شوند. هنگام انتخاب تعداد نمونه ها، به حجم حافظه برد مورد استفاده، دقت کافی داشته باشید.
توابع کتابخانه movingAvg.h
در این قسمت به بررسی توابع کلیدی کتابخانه movingAvg.h می پردازیم. در این قسمت هر تابع، ضمن معرفی ورودی ها، تشریح می گردد.
تابع | ورودی | شرح |
void begin() | بدون ورودی | به کمک این تابع، مکتابخانه راه اندازی می شود. |
int reading(int newReading) | ورودی از نوع صحیح |
در این کتابخانه، یک ارایه جهت ذخیره سازی مقادیر به منظور میانگین گیری، تعریف شده است. به کمک این تابع، یک نمونه جدید درون آرایه نمونه ها که قرار است میانگین گیری صورت بگیرد، اضافه می شود. همچنین با فراخوانی این تابع، میانگین متحرک مقادیری که درون آرایه هستند، در خروجی قرار می گیرد. |
int getAvg() | بدون ورودی | این تابع میانگین مقادیر حاضر در آرایه را محاسبه کرده و در خروجی قرار می دهد. |
int getCount() | بدون ورودی | این تابع تعداد مقادیر حاضر در آرایه مخصوص نمونه ها را در خروجی قرار می دهد. |
void reset() | بدون ورودی | این تابع کلیه مقادیر را پاک می کند. این مقادیر شامل اعضای حاضر در آرایه و موقعیت مکان اشاره گر آن است. |
int* getReadings() | بدون ورودی | این تابع مقادیر آرایه نمونه گیری را در خروجی قرار می دهد. خروجی به صورت آرایه(اشاره گر به مقادیر آرایه) خواهد بود. |
توجه ۱: همانطور که گفته شد، داده های مربوط به نمونه بردازی جهت میانگین گیری، در آرایه ذخیره می شوند. در این کتابخانه، می بایست تعداد نمونه ها جهت میانگین گیری، تعیین شود. در صورتیکه تعداد مقادیر قرار گرفته در آرایه کمتر از حد تعیین شده باشد، میانگین گیری از بین داده های موجود صورت خواهد گرفت.
توجه ۲: این مورد را با یک مثال شرح می دهیم. فرض کنید تعداد داده ها جهت نمونه گیری بر روی ۱۰ تنظیم شده است. با ورود داده های جدید و بیشتر شدن از مقدار ۱۰، داده های جدید بر روی داده های قبلی نوشته خواهند شد. به عبارت دیگر، یازدهمین داده، بر روی داده نخست قرار خواهد گرفت. این روال برای داده های بعدی نیز صادق است.
اجرای نمونه برنامه
در این قسمت به اجرای یک نمونه برنامه می پردازیم. برنامه زیر، میانگین متحرک مقادیر خوانده شده از سنسور فتوسول را محاسبه می کند. این مقادیر از پایه ورودی A0 آنالوگ خوانده می شود.
#include <movingAvg.h> //فراخوانی کتابخانه میانگین متحرک const uint8_t PHOTOCELL_PIN(A0); // تعیین پایه A0 جهت خواندنن مقادیر ورودی movingAvg photoCell(10); //ایجاد یک شی از کتابخانه توجه: عدد قرار گرفته، تعیین کننده تعداد مقادیر برای نمونه گیری است. در اینجا عدد ۱۰ بیانگر تعداد نمونه هاست. void setup() { pinMode(PHOTOCELL_PIN, INPUT_PULLUP); //تعیین مقدار پیشفرض پایه فوتوسل بر روی یک در صورت تغییر مقدار، آن را می توانیم بخوانیم. Serial.begin(115200); photoCell.begin(); // راه اندازی کتابخانه } void loop() { int pc = analogRead(PHOTOCELL_PIN); // خواندن مقدار آنالوگ فوتوسل int avg = photoCell.reading(pc); // محاسبه میانگین متحرک Serial.print(pc); // نمایش مقدار خوانده شده Serial.print(' '); Serial.println(avg); // نمایش مقدار میانگین متحرک delay(1000); }
در نمونه برنامه زیر، مقادیری را در آرایه مخصوص نمونه ها ذخیره می کنیم. سپس این مقادیر را از آرایه خوانده و چاپ می کنیم.
#include <movingAvg.h> // فراخوانی کتابخانه movingAvg foo(6); //ایجاد نمونه از کتابخانه با تعیین ۶ مقدار جهت میانگین گیری void setup() { Serial.begin(115200); foo.begin();// راه اندازی کتابخانه for (int j = 0; j < 6; j++) //قراردادن مقادیر ۰ الی ۶ در آرایه نمونه ها foo.reading(j); //قرار گیری داده در آرایه نمونه ها جهت میانگین گیری int *readings = foo.getReadings(); // خواندن مقادیر آرایه ها و ذخیره در آرایه reading int n = foo.getCount(); //خواندن تعداد مقادیر حاضر در آرایه Serial.print("There are "); Serial.print(n); Serial.println(" readings:"); for (int i = 0; i < n; i++) { //چاپ مقادیر قرار گرفته در آرایه Serial.println(*readings++); } Serial.print("-----------------"); delay(1000); } void loop() { }
جمع بندی
در این آموزش به تحلیل و بررسی کتابخانه movingAvg پرداختیم. به کمک این کتابخانه می توانیم با محاسبه میانگین متحرک داده های دریافتی، خطا را کم کرده و دقت اطلاعات پردازش شده را بیشتر نماییم. در رابطه با بحث میانگین متحرک، در ابتدای آموزش سخن گفته ایم. پس از آن به نحوه نصب و الزامات سخت افزاری/نرم افزاری کتابخانه پرداختیم. پس از این مرحله، توابع کتابخانه را به طور کامل، تشریح نمودیم. در نهایت با ارائه دو مثال، نحوه استفاده و کاربرد توابع را مورد بررسی قرار دادیم. از آنجاییکه داده های سنسورهای مختلف، به خصوص سنسورهای آنالوگ ممکن است با خطا مواجه باشند، لذا استفاده از این کتابخانه جهت افزایش دقت و نزدیک شدن به مقدار واقعی، بسیار مفید خواهد بود.
لوازم متناسب با کتابخانه
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.