جدید مانیتور سریال در آردوینو
مانیتور سریال آردوینو ابزار بسیار مفیدی است که در خود IDE آردوینو تعبیه شده است. بنابراین برای برقراری ارتباط با آردوینو از طریق پورت سریال نیازی به یک ترمینال خارجی ندارید. فقط مانیتور سریال را باز کنید، باود ریت صحیح را برای ارتباط تنظیم کنید، و برنامه را آپلود نمایید.در اینجا یک برنامه ساده آردوینو را مشاهده می کنید که هر ثانیه یک بار پیام “Hello karakit” را از طریق پورت سریال به ترمینال IDE می فرستد و ما آن را در مانیتور سریال مشاهده خواهیم کرد.
void setup() { Serial.begin(115200); } void loop() { Serial.println("Hello karakit"); delay(1000); }
تابع setup یک بار زمانی که برد روشن یا ریست می شود فراخوانی می شود. در این کد با استفاده از Serial.begin(115200) ارتباط سریال را با باودریت 115200 مقداردهی اولیه می کند.
حلقه loop پس از تکمیل تابع setup به طور مداوم اجرا می شود. این کد عبارت “Hello karakit” را با استفاده از دستور Serial.println (“Hello karakit”) در مانیتور سریال چاپ می کند و سپس قبل از تکرار فرآیند، با استفاده از delay (1000) 1 ثانیه منتظر می ماند.
اگر باودریت مانیتور سریال با باودریت تعیین شده در برنامه برابر نبود می توانید آن را تغییر دهید و تنظیم کنید:
دریافت ورودی از کاربر در پورت سریال
سه نوع داده رشته ای، صحیح و اعشاری را می توان با استفاده از سه تابع زیر از کاربر دریافت نمود:
Serial.readString() Serial.parseInt() Serial.parseFloat()
با 3 مثال این توابع را بررسی می کنیم.
دریافت ورودی رشته ای در مانیتور سریال آردوینو
در اینجا یک برنامه آردوینو نوشته شده که از کاربر می خواهد نام خود را وارد کند و سپس با “Hello” و نام پاسخ می دهد:
String name=""; void setup() { Serial.begin(115200); } void loop() { Serial.println("What is your name?"); while (Serial.available() == 0) {} name = Serial.readString(); Serial.print("Hello "); Serial.println(name); }
قبل از تابع setup یک متغیر رشته ای خالی با نام name تعریف کرده ایم تا بعدا نام کاربر در آن ذخیره شود.
تابع setup ارتباط سریال را با نرخ باود 115200 با استفاده از Serial.begin(115200) راه اندازی می کند.
تابع loop از کاربر می خواهد که نام خود را با استفاده از Serial.println(“What is your name?”) وارد کند.
کد while (Serial.available() == 0) منتظر می ماند تا کاربر نام خود را وارد کند و سپس بقیه برنامه را ادامه دهد.
تابع Serial.available تعداد بایت هایی را که پورت سریال آردوینو دریافت کرده و آماده خواندن هستند برمی گرداند. در این کد حلقه while منتظر می ماند تا کاربر نام خود را وارد کند و حداقل یک بایت داده برای خواندن از پورت سریال موجود باشد. هنگامی که کاربر نام خود را وارد کرد، حلقه تمام می شود و کد ورودی با استفاده از name = Serial.readString خوانده می شود.
در نهایت، “Hello” و نام را با استفاده از Serial.print (“Hello”) و Serial.println(name) چاپ می کند:
What is your name
Hello karakit
دریافت عدد صحیح در ورودی مانیتور سریال آردوینو
در اینجا یک برنامه آردوینو نوشته ایم که از کاربر می خواهد سن خود را وارد کند و سپس با یک جمله سن او را نمایش می دهد:
int age=0 void setup() { Serial.begin(115200); } void loop() { Serial.println("Enter your age:"); while (Serial.available() == 0) {} age = Serial.parseInt(); Serial.print("You are "); Serial.print(age); Serial.println(" years old"); }
قبل از تابع setup یک متغیر int با نام age تعریف کرده ایم تا بعدا سن کاربر در آن ذخیره شود.
تابع setup ارتباط سریال را با باود ریت 115200 با استفاده از Serial.begin(115200) راه اندازی می کند.
حلقه loop از کاربر می خواهد که سن خود را با استفاده از Serial.println(“Enter your age:”) وارد کند. سپس منتظر می ماند تا کاربر با استفاده از while (Serial.available() == 0) سن خود را وارد کند. هنگامی که کاربر سن خود را وارد کرد، ورودی را با استفاده از int age = Serial.parseInt می خواند. در نهایت، “You are” و سن و “old” را با استفاده از Serial.print (“You are”)، Serial.print (age) و Serial.println(“ old”) چاپ می کند.
اگر این برنامه را اجرا کنید خواهید دید که با وارد کردن یک عدد صحیح مثلا 25 پیام زیر چاپ می شود:
You are 25 years old
اما بلافاصله پیغام دیگری هم دریافت خواهید کرد:
You are 0 years old
علت این مساله این است که بعد از وارد کردن عدد و زدن کلید Enter یک کاراکتر پایان خط یعنی “\n” نیز ارسال می شود و بعد از خواندن عدد صحیح این کاراکتر در بافر پورت سریال باقی می ماند. بنابراین برنامه فکر می کند که کاراکتر دیگری آماده خواندن است و عدد 0 را دریافت می کند و نمایش می دهد.
برای رفع این مشکل دو کار می توانید انجام دهید. اول اینکه بالای پنجره مانیتور سریال گزینه No Line Ending را انتخاب کنید. این گزینه به صورت پیش فرض روی New Line است.
و یا اینکه بعد از دستور Serial.parseInt این دستور را اضافه کنیم:
Serial.read();
تا کاراکترهای باقی مانده در بافر پاک شود.
دریافت عدد اعشاری در ورودی مانیتور سریال آردوینو
به عنوان آخرین مثال برنامه ای می نویسیم که دما را در واحد فارنهایت از کاربر بگیرد و بر حسب سلسیوس یا سانتی گراد نمایش دهد:
float fahrenheit=0; float celsius =0; void setup() { Serial.begin(115200); } void loop() { Serial.println("Enter the temperature in Fahrenheit:"); while (Serial.available() == 0) {} fahrenheit = Serial.parseFloat(); Serial.read(); // clear the remaining characters in the buffer celsius = (fahrenheit - 32) * 5 / 9; Serial.print("The temperature in Celsius is: "); Serial.println(celsius); }
ابتدا دو متغیر فارنهایت و سلسیوس را مقداردهی اولیه کرده ایم که هر دو از نوع float هستند. تابع setup ارتباط سریال را با باود ریت 115200 راه اندازی می کند. در ابتدای تابع ()loop از کاربر می خواهیم که دما را بر حسب فارنهایت وارد کند. سپس برنامه منتظر میماند تا کاربر دما را در پورت سریال وارد کند. هنگامی که داده در دسترس بود، ورودی را با استفاده از Serial.parseFloat می خواند و آن را در متغیر fahrenheit ذخیره می کند. کاراکترهای باقی مانده در بافر با استفاده از Serial.read پاک می شوند. سپس دما بر حسب سانتیگراد با استفاده از فرمول محاسبه شده و در متغیر celsius ذخیره می شود. در نهایت، درجه حرارت بر حسب سانتیگراد با استفاده از Serial.println روی مانیتور سریال چاپ می شود.
Enter the temperature in Fahrenheit:
The temperature in Celsius is: 29.83
جمع بندی
در این مطلب با چگونگی استفاده از مانیتور سریال آردوینو آشنا شدیم و توانستیم داده ها را به پورت سریال آردوینو ارسال و از آن دریافت کنیم. همچنین سه نوع داده ورودی رشته ای و صحیح و اعشاری در پورت سریال آردوینو نیز معرفی شدند.