آموزش دریافت ورودی کاربر از سریال مانیتور آردوینو

مانیتور سریال معمولاً برای نمایش دادهها از آردوینو روی صفحه نمایش کامپیوتر استفاده میشود. اما میتواند به عنوان یک دستگاه ورودی نیز عمل کند و اطلاعات را از کاربر دریافت کرده و به آردوینو ارسال کند. این ویژگی برای ساخت منوهای مبتنی بر سریال، ماشین حسابها و ورود با رمز عبور مفید است، جایی که از کاربر خواسته میشود اطلاعاتی وارد کند و آردوینو بر اساس آن اطلاعات عملی را انجام دهد.
در این مقاله ابتدا یاد میگیریم چگونه ورودی کاربر را از مانیتور سریال دریافت کنیم و سپس چند برنامه نمونه را بررسی میکنیم تا ببینیم چگونه میتوان یک منو، یک ماشین حساب وزن و یک رابط ورود با رمز عبور ایجاد کرد.
نحوه دریافت ورودی کاربر از مانیتور سریال
برای دریافت ورودی کاربر از مانیتور سریال، اولین قدم درخواست اطلاعات از کاربر است. این میتواند یک سؤال مانند “چند بار میخواهید LED چشمک بزند؟” یا “یک گزینه از منو انتخاب کنید” باشد. این فقط متنی است که به کاربر اطلاع میدهد باید چیزی وارد کند. برای این کار میتوان از تابع ساده Serial.print() استفاده کرد که سؤال را روی مانیتور سریال چاپ میکند.
کاربر میتواند داده از نوع int، float یا string وارد کند، اما باید از قبل بدانید چه نوع دادهای قرار است وارد شود.
استفاده از Serial.available()
مرحله بعدی استفاده از تابع Serial.available() در یک حلقه خالی while است. تابع Serial.available() تعداد بایتهای موجود برای خواندن از پورت سریال را برمیگرداند.
- وقتی هیچ ورودی از کاربر وجود ندارد، مقدار بازگشتی
0است. - وقتی کاربر دادهای وارد کرده و Enter را فشار میدهد، مقدار غیر صفر بازگردانده میشود.
این مقدار به عنوان شرط یک حلقه خالی while استفاده میشود تا برنامه منتظر ورود داده از کاربر بماند:
while (Serial.available() == 0) {
}
در اینجا شرط حلقه خالی Serial.available() == 0 است. وقتی هیچ ورودی از کاربر وجود نداشته باشد، تابع Serial.available() صفر باز میگرداند و شرط درست است. برنامه داخل حلقه میماند تا کاربر دادهای وارد کند و تابع Serial.available() مقدار غیر صفر بازگرداند.
خواندن ورودی کاربر و پردازش آن
مرحله نهایی خواندن اطلاعات وارد شده توسط کاربر و انجام عملی بر اساس آن است. برای این کار، باید اطلاعات ذخیره شده در بافر سریال را پردازش (parse) کنیم. برای پردازش اطلاعات میتوان از یکی از این سه تابع استفاده کرد:
Serial.parseInt() Serial.parseFloat() Serial.readString()
نوع داده ورودی کاربر مشخص میکند که کدام تابع استفاده شود:
- اگر ورودی
intباشد، ازSerial.parseInt()استفاده کنید. - اگر ورودی
floatباشد، ازSerial.parseFloat()استفاده کنید. - اگر ورودی
stringباشد، ازSerial.readString()استفاده کنید.
قبل از استفاده از این توابع، باید یک متغیر برای ذخیره داده پردازش شده تعریف کنیم. نوع داده این متغیر باید با نوع داده ورودی همخوانی داشته باشد.
مثالها:
- پردازش یک عدد صحیح:
int integerVariable = Serial.parseInt();
- پردازش یک عدد اعشاری:
float floatVariable = Serial.parseFloat();
- پردازش یک رشته:
String stringVariable = Serial.readString();
حالا میتوانیم ببینیم این روش با چند مثال عملی چگونه کار میکند.
نحوه پردازش دادههای عدد صحیح (Integer)
برای نمونهای از گرفتن دادههای عدد صحیح از ورودیهای کاربر در مانیتور سریال، به یک برنامه نمونه نگاه میکنیم که منویی را ایجاد میکند و از کاربر میخواهد یک سنجش از سنسور فشار بارومتریک یا رطوبت را انتخاب کند:
int temp;
int Rh;
int pressure;
void setup() {
Serial.begin(9600);
Serial.println("1. Temperature");
Serial.println("2. Humidity");
Serial.println("3. Barometric Pressure");
}
void loop() {
Serial.println("Which sensor would you like to read? ");
while (Serial.available() == 0) {
}
int menuChoice = Serial.parseInt();
switch (menuChoice) {
case 1:
// کد سنسور دما اینجا قرار میگیرد
Serial.print("The temperature is: ");
Serial.println(temp);
break;
case 2:
// کد سنسور رطوبت اینجا قرار میگیرد
Serial.print("The humidity is: ");
Serial.println(Rh);
break;
case 3:
// کد سنسور فشار اینجا قرار میگیرد
Serial.print("The barometric pressure is: ");
Serial.println(pressure);
break;
default:
Serial.println("Please choose a valid selection");
}
}
در بالای برنامه، چند متغیر برای ذخیره دادههای سنسور تعریف شده است:
tempبرای ذخیره دماRhبرای ذخیره رطوبتpressureبرای ذخیره فشار بارومتریک
در بخش setup()، مانیتور سریال با Serial.begin(9600) راهاندازی میشود و سپس با چند تابع Serial.print() منو روی مانیتور سریال چاپ میشود.
در بخش loop() ابتدا از کاربر میخواهیم یک گزینه منو وارد کند. سپس با استفاده از یک حلقه while خالی و شرط Serial.available()==0 منتظر میمانیم تا کاربر دادهای وارد کند. بعد داده وارد شده با Serial.parseInt() پردازش شده و در متغیر menuChoice ذخیره میشود.
برای انتخاب بین سه گزینه منو، به جای استفاده از چند if، از دستور switch استفاده میکنیم. بسته به انتخاب کاربر، یکی از سه بخش case اجرا شده و مقدار مناسب سنسور چاپ میشود. اگر کاربر عدد دیگری وارد کند، بخش default پیغام خطا نمایش میدهد.
نحوه پردازش دادههای اعشاری (Float)
مثالی دیگر برای گرفتن دادههای نوع float، برنامهای است که وزن را از کیلوگرم به پوند تبدیل میکند:
void setup() {
Serial.begin(9600);
Serial.println("**** Kilograms to pounds calculator ****");
}
void loop() {
Serial.print("Please enter weight in kg: ");
while (Serial.available() == 0) {
}
float weightKg = Serial.parseFloat();
Serial.println(weightKg);
float weightLbs = weightKg * 2.2046;
Serial.print("Weight in pounds: ");
Serial.println(weightLbs);
}
در بخش setup() ابتدا مانیتور سریال راهاندازی شده و متن “ماشین حساب کیلوگرم به پوند” چاپ میشود.
در بخش loop()، ابتدا از کاربر خواسته میشود وزن خود را وارد کند. سپس با حلقه while خالی و شرط Serial.available()==0 منتظر میمانیم تا کاربر عددی وارد کند.
وزن وارد شده به صورت float در متغیر weightKg ذخیره شده و سپس با ضرب در 2.2046 به پوند تبدیل میشود و در متغیر weightLbs ذخیره میشود. در نهایت مقدار وزن به پوند روی مانیتور سریال چاپ میشود.
نحوه پردازش دادههای متنی (String)
مثالی دیگر برای ورودی متنی، برنامهای است که از کاربر رمز عبور میگیرد:
String password = "ABCDEF";
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Please enter your password: ");
while(Serial.available() == 0){
}
String input = Serial.readString();
if(input == password){
Serial.println("Password correct");
}
else
Serial.println("Password incorrect");
}
ابتدا متغیر password با مقدار رمز تعریف میشود.
در بخش setup() مانیتور سریال با Serial.begin(9600) راهاندازی میشود.
در بخش loop() ابتدا پیام “Please enter your password:” چاپ میشود. سپس با یک حلقه while خالی منتظر میمانیم تا کاربر رمز را وارد کند.
ورودی کاربر با Serial.readString() خوانده شده و در متغیر input ذخیره میشود. سپس با استفاده از دستور if-else ورودی کاربر با رمز تعریف شده مقایسه میشود. اگر رمز درست باشد، پیام “Password correct” چاپ میشود و در غیر این صورت، پیام “Password incorrect” چاپ خواهد شد.
امیدواریم این مقاله به شما در یادگیری دریافت و پردازش ورودیها در آردوینو کمک کرده باشد. اگر سوالی دارید، میتوانید در بخش نظرات مطرح کنید.









