آردوینو آموزش آردوینو

آموزش آردوینو بخش نهم – استفاده از توابع مهم ریاضی در برنامه نویسی آردوینو

arduino-basic-tutorial-part-nine-math-functions-in-programming-digispark
نوشته شده توسط پریسا پوربلورچیان

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

 

 

در برنامه نویسی آردوینو، توابع ریاضی زیر قابل استفاده هستند:
  • abs(x) : بازگرداندن مقدار مطلق از x
  • sqrt(x) : بازگرداندن ریشه مربع از x
  • pow(x, y) : بازگرداندن x به توان y
  • exp(x) : بازگرداندن e به توان x
  • log(x) : بازگرداندن لگاریتم طبیعی از x
  • log10(x) : بازگرداندن لگاریتم اعشاری از x
  • sin(x) : بازگرداندن سینوس x (به رادیان)
  • cos(x) : بازگرداندن کسینوس x (به رادیان)
  • tan(x) : بازگرداندن تانژانت x (به رادیان)
  • asin(x) : بازگرداندن آرک سینوس x (به رادیان)
  • acos(x) : بازگرداندن آرک کسینوس x (به رادیان)
  • atan(x) : بازگرداندن آرک تانژانت x (به رادیان)
  • atan2(y, x) : بازگرداندن آرک تانژانت y/x (به رادیان)
  • ceil(x) : بازگرداندن کوچکترین عدد صحیح بزرگتر مساوی با x
  • floor(x) : بازگرداندن بزرگترین عدد صحیح کوچکتر مساوی با x
  • round(x) : بازگرداندن عدد نزدیکتر به x
  • min(x, y) : بازگرداندن کوچکترین مقدار بین x و y
  • max(x, y) : بازگرداندن بزرگترین مقدار بین x و y
  • random() : بازگرداندن یک عدد تصادفی بین ۰ و RAND_MAX
  • random(min, max) : بازگرداندن یک عدد تصادفی بین min و max
  • map(x, in_min, in_max, out_min, out_max) : بازگرداندن x با مقیاس برای محدوده جدید out_min تا out_max

 


تابع ریاضی ()abs


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

abs(x)

X میتواند یک عدد صحیح باشد
if x =  500 then  |500| = 300, or  abs(500) == 500
if x = -500 then |-500| = 300, or abs(-500) == 500
 x = abs(-5);

    Result x is 5.
int a = -5;

    x = abs(a);

    Result x is 5.

 


دستور ()map در آردوینو ( تناسب گیری بین محدوده ها )


توسط تابع map در برنامه نویسی آردوینو یک مقدار دلخواه از یک بازه به بازه دیگر نگاشت می‌شود. تابع map در آردوینو برای تبدیل مقدار یک متغیر از یک بازه به بازه دیگر استفاده می‌شود. متغیر اولیه، مقداری بین یک بازه مشخص از مقادیر عددی است و مقدار دومی که به آن تبدیل می‌شود، نیز مقداری بین بازه دیگری از مقادیر عددی است. در برنامه‌نویسی آردوینو، تابع map() یک تابع ریاضی است که برای تبدیل مقادیر از یک محدوده به محدوده دیگر استفاده می‌شود. این تابع به شما این امکان را می‌دهد که مقادیر را از یک دامنه‌ی ورودی (به عنوان ورودی) به یک دامنه‌ی خروجی (به عنوان خروجی) تبدیل کنید.

  •  int map(int value, int fromLow, int fromHigh, int toLow, int toHigh);

در این تعریف، پارامتر value به مقداری بین fromLow و fromHigh تبدیل می‌شود و مقدار حاصل، مقداری بین toLow و toHigh خواهد بود. به عنوان مثال، فرض کنید می‌خواهید مقدار یک متغیر از بازه مقادیر ۰ تا ۱۰۲۳ را به بازه مقادیر ۰ تا ۲۵۵ تبدیل کنید. با استفاده از تابع map، می‌توانید به صورت زیر عمل کنید.

  • int value = analogRead(A0); // خواندن مقدار سنسور
  • int mappedValue = map(value, 0, 1023, 0, 255); // تبدیل مقدار به بازه ۰ تا ۲۵۵

در این مثال، مقدار خوانده شده از سنسور در متغیر value ذخیره شده است و سپس با استفاده از تابع map به بازه ۰ تا ۲۵۵ تبدیل می‌شود و در متغیر mappedValue ذخیره می‌شود. تعریف تابع map در آردوینو به صورت زیر است.

 

map(value, fromLow, fromHigh, toLow, toHigh)
  • From low: حد پایین رنج فعلی
  • From high: حد بالا رنج فعلی
  • To low: حد پایین رنج جدید
  • To high: حد بالا رنج جدید

در ادامه یک نمونه کد با دستور map در آردوینو نوشته شده است. از یک ولوم پتانسیومتر و یک سرو موتور برای تست تابع map در آردوینو میتوانید استفاده کنید.

/* Map an analog value to 8 bits (0 to 255) */
void setup() {}

void loop() {
  int val = analogRead(0);
  val = map(val, 0, 1023, 0, 255);
  analogWrite(9, val);
}

 

در این کد مقادیز دخیره شده در متغیر val نگاشت تابع map شده است. مقادیر دریافتی از ورودی آنالوگ بین بازه ۰ تا ۱۰۲۳ است که برای تبدیل به داده ی دیجیتال به عدد ۰ تا ۲۵۵ نگاشت شده است.

 

int led=9;

 int hold=10;

void setup() {

Serial.begin(9600);}

void loop(){

int value=analogRead(A5);

value=map(value,0,1023,0,255);

if(A5 > hold)

{

analogWrite(led, value);

Serial.println(value);

delay(10);

}}

نمونه پروژه با دستور map در آردوینو - دانشجو کیت

 


تابع ریاضی ()max


برای محاسبه ی ماکزیمم بین دو عدد از تابع ریاضی max استفاده می‌کنیم. در آردوینو، شما می‌توانید از تابع max() برای یافتن بزرگترین عدد بین دو مقدار استفاده کنید. این تابع به شکل زیر عمل می‌کند:

  • max(value1, value2)

value1 و value2: دو عدد که باید بزرگترین عدد بین آنها یافته شود و تابع max() مقدار بزرگترین عدد بین value1 و value2 را برمی‌گرداند.

int num1 = 20;
int num2 = 35;

int maximum = max(num1, num2); // بزرگترین عدد بین num1 و num2 را برمی‌گرداند

در این مثال، تابع max() مقدار بزرگترین عدد بین num1 (که برابر با ۲۰ است) و num2 (که برابر با ۳۵ است) را برمی‌گرداند و مقدار آن را در maximum ذخیره می‌کند. در این صورت، maximum برابر با ۳۵ خواهد بود.

 

max(x, y)


به ترتیب x و y دو عدد هستند که از هر نوع داده ای میتواند باشد
sensVal = max(sensVal, 20);

 


تابع ریاضی ()min


برای محاسبه ی مینیمم بین دو عدد از تابع ریاضی min استفاده می‌کنیم. در آردوینو، شما می‌توانید از تابع min() برای یافتن کمترین عدد بین دو مقدار استفاده کنید. این تابع به شکل زیر عمل می‌کند:

min(value1, value2)

 

min(x, y)

به ترتیب x , y دو عدد با هر نوع داده اس هستند.
sensVal = min(sensVal, 100);

 


تابع ریاضی ()constrain


برای محدود کردن یک عدد در یک رنج از تابع ریاضی constrain() استفاده می‌شود. تابع constrain() در آردوینو به شما اجازه می‌دهد مقداری را در یک محدوده معین نگه دارید. این تابع بسیار مفید است زمانی که شما می‌خواهید مطمئن شوید که یک مقدار حتما در محدوده‌ای خاص باشد. سینتکس تابع constrain() به صورت زیر است:

constrain(value, minVal, maxVal)

 

constrain(x, a, b)


X = مقداری که قرار است محدود شود 

A= حد پایین رنج
B= جد بالا رنج

 

value: مقداری که می‌خواهید در محدوده‌ی minVal تا maxVal نگه دارید.
minVal: حد پایین محدوده مورد نظر.
maxVal: حد بالای محدوده مورد نظر.

تابع constrain() مقدار value را به گونه‌ای تغییر می‌دهد که حتما در محدوده‌ی minVal تا maxVal قرار بگیرد.

 

int inputValue = 25;
int minVal = 0;
int maxVal = 50;

  • int constrainedValue = constrain(inputValue, minVal, maxVal); // مقدار ورودی را در محدوده ۰ تا ۵۰ نگه می‌دارد

در این مثال، تابع constrain() مقدار inputValue (که برابر با ۲۵ است) را در محدوده‌ی minVal تا maxVal (یعنی ۰ تا ۵۰) نگه می‌دارد و مقدار نهایی را در constrainedValue ذخیره می‌کند. در این صورت، constrainedValue برابر با ۲۵ خواهد بود، چرا که inputValue در محدوده مشخص شده قرار دارد. اگر inputValue کمتر از minVal باشد، مقدار constrainedValue به minVal تنظیم می‌شود، و اگر inputValue بیشتر از maxVal باشد، مقدار constrainedValue به maxVal تنظیم می‌شود.

 

 


تابع ریاضی ()asin


تابع asin برای محاسبه آرک سینوس اعداد استفاده می‌شود.

double asin (double arg)

 


تابع ریاضی ()acos


تابع acos برای محاسبه ی آرک کسینوس اعداد استفاده می‌شود.

double acos (double arg)

 


تابع ریاضی ()pow


تابع pow توان های یک مبنا را محاسبه می‌کند. حاصل این تابع عبارت base به توان exp است. اگر مبنا صفر باشد و یا توان منفی یا صفر باشد، تابع عمل نمی‌کند. اگر مبنا منفی باشد و توان exp از نوع صحیح نباشد، نتیجه ای ندارد.

double pow (double base , double exp )

 

نمونه کد آردوینو pow

#include <math.h>  

float Value = 8.85 * pow(10,-12);

void setup()
{
 Serial.begin(9600);
}

void loop()
{
Serial.println(Value,19);
}

 


تابع ریاضی ()sq


تابع ریاضی sq مریع یک عدد را محاسبه می‌کند یعنی تعداد ضرب شده در خودش که به صورت زیر در برنامه تعریف می‌شود.

sq(x)

مقدار x یک عدد است که هر نوع داده ای میتواند باشد
int input = Serial.parseInt();  // keep other operations outside the sq function
int inputSquared = sq(input);

 


تابع ریاضی ()sqrt


تابع ریاضی sqrt جذر یک عدد مثبت را محاسبه می‌کند.

double sqrt (double num)

 


تابع ریاضی ()atan


تابع atan برای محاسبه آرک تانژانت یک عدد به کار میرود.

double atan (double arg)

 


تابع ریاضی ()cos


تابع cos برای محاسبه ی کسینوس یک زاویه بر حسب رادیان استفاده می‌شود.

double cos (double arg)

 


تابع ریاضی ()sin


تابع cos برای محاسبه ی سینوس یک زاویه بر حسب رادیان استفاده می‌شود.

double sin (double arg)

 


تابع ریاضی ()exp


تابع exp برای محاسبه ی توانی از e استفاده می‌شود.

double exp(double arg)

 


تابع ریاضی ()log


تابع log لگاریتم طبیعی یک عدد مثبت را محاسبه می‌کند.

double log (double num)

 


جمع بندی لیدی پای


تمام تلاشم را کرده ام تا کاربردی ترین توابع ریاضی وابسته به کدنویسی آردوینو در یک پست به صورت جامع آموزش دهم. کاربردی ترین تابع ریاضی در حال حاضر map است که برای سهولت در کدنویسی استفاده می‌شود. از کتابخانه ی math.h برای فراخوانی توابع ریاضی میتوانید استفاده کنید که به صورت پیش فرض در لیست کتابخانه ها قرار دارد. با نصب کتایخانه روش استفاده بسیار ساده است.

 

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

 

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

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

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

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

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

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

۳۴ دیدگاه

  • سلام من تو برنامه‌ نویسی آردوینو به این ارور برخوردم و هرکاری میکنم برطرف نمیشه. لطفا راهنمایی کنید
    expected ‘}’ at end of input

    • سلام
      هر تابع از برنامه نویسی بین {} است. بر روی یکی از } موس را نگه دارید تا پایان دستور را در برنامه نمایش دهد. در صورتیکه هر تابع با آکولاد باز شده و بسته نشود، این ارور را دریافت می‌کند. حتی پس از کامپایل هم در ارورها خطی که نیاز به } دارد را نمایش میدهد.

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

      • سلام من به کمک تابع millis یک داده که زمان هست رو دریافت میکنم
        حالا میخوام در لحظه مقدار این داده رو اندازه گیری کنم.
        مثلا بگم اگر ۲۰ تا اضافه شد فلان کار رو بکن، توجه داشته باشید که این داده ثابت نیست و هر لحظه در حال افزایشه.

        • با سلام
          یک متغیر برای ذخیره آخرین مقدار ثبت‌شده زمان (lastMillis) ایجاد کنید.
          سپس در هر لحظه مقدار فعلی millis() را با مقدار قبلی مقایسه کنید.
          اگر اختلاف دو مقدار بیشتر یا مساوی ۲۰ میلی‌ثانیه بود، عملیاتی که نیاز دارید را انجام دهید و مقدار millis() فعلی را در lastMillis ذخیره کنید.

    • با سلام
      بله فرمول های ریاضی در حل مسائل بسیار کاربردی و جذاب است و تعدادهای خط های برنامه را هم کاهش میدهد.

    • با سلام
      از ایتکه تجربه خود را با دیگران به اشتراک می‌گذارید، صمیمانه سپاسگزاریم.

    • با سلام
      کاربر گرامی از اینکه تجربه ی خود را با دیگر کاربران به اشتراک می‌گذارید، صمیمانه سپاسگزاریم.

    • با سلام
      کاربر گرامی سپاس از همراهی شما
      از اینکه تجربه ی خود را با دیگر کاربران به اشتراک می‌گذارید، صمیمانه سپاسگزاریم.

  • واقعا ترکیب ریاضی و کد نویسی سخت تر میشه اما خیلی شیرین تر میشه
    مرسی از شما برای انتشار این آموزش های خوب

    • با سلام
      خیر این مورد بسته به تغییرات در کد برنامه دارد. اگر بخواهید یک بازه بر روی بازه دیگر نگاشت شود از map استفاده می‌کتیم.

    • با سلام
      برای تمرین همین آموزش را مطالعه کنید تا در صورت نیاز بتوانید از آن استفاده کنید.

    • با سلام
      قطعا انتخاب بازه ی دقیق تغییر اعداد تاثیر در بهینه شدن داده ی دریافتی خواهد داشت.

    • در برنامه‌نویسی آردوینو، تابع ریاضی لگاریتم (logarithm) ممکن است در موارد زیر استفاده شود:

      محاسبات پیچیده: وقتی که نیاز به انجام عملیات‌های پیچیده ریاضی داشته باشید، از جمله محاسبه لگاریتم اعداد، ممکن است از تابع لگاریتم در آردوینو استفاده کنید. به طور معمول، آردوینو دارای تابع‌های log() (لگاریتم طبیعی) و log10() (لگاریتم عدد ۱۰) است که می‌توانید از آن‌ها برای محاسبه لگاریتم اعداد استفاده کنید.

      پردازش سیگنال: در برخی از برنامه‌های آردوینو که به پردازش سیگنال‌ها مرتبط هستند، ممکن است نیاز به استفاده از لگاریتم برای محاسبه مقیاس‌های صوتی، قدرت سیگنال و غیره داشته باشید.

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

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