جستجو
برای جستجو متن مورد نظر وارد کنید و Enter بزنید برای بستن Esc بزنید.
در این آموزش قصد کنترل و نمایش متن روی نمایشگر کارکتری توسط پروتکل سریال را داریم.برنامه فرستنده روی میکروکنترلر اردوینو Master اجرا می شود و میکروکنترلر اردوینو Slave با دریافت فرامین انها را اجرا می کند.هدف این پروژه اموزشی یادگیری کار با نمایشگر کارکتری , ارتباط سریال در محیط اردوینو و ساخت یک پروتکل ارتباطی ساده بین دو میکروکنترلر برای کنترل نمایشگر می باشد.
در بسیاری از پروژه ها نیاز به شبکه سازی میکروکنترلرها می باشد برای مثال می توان گلخانه را مثال زد که باید اطلاعات دما , رطوبت و … توسط بردهای حاوی سنسور به برد کنترلی مرکزی ارسال شوند.
یا در محیط های صنعتی بخشهای مختلف باید اطلاعات خود را به برد مرکزی در اتاق کنترل و مانیتورینگ ارسال کنند.
بنابراین اشنایی با پروتکلهای ارتباطی و نحوه تبادل پیام میان میکروکنترلرها شما را برای انتخاب نحوه شبکه سازی درست در پروژه های مورد نظر اماده می کند.
برای شروع کار اموزش مفهوم شبکه سازی ما یک ارتباط یک طرفه سریال بین دو میکروکنترلر را بررسی می کنیم.در ابتدا نیاز است تا با راه اندازی نمایشگر کارکتری در اردوینو اشنا شویم.
برای شروع باید کتابخانه مربوط به نمایشگر کارکتری را فراخوانی نماییم.
#include <LiquidCrystal.h>
#define rs 13
#define e 12
#define db4 4
#define db5 5
#define db6 6
#define db7 7
LiquidCrystal lcd(rs, e, db4, db5, db6, db7);
از کتابخانه نمایشگر یک شئی برای دسترسی به توابع ان ایجاد می نماییم و همچنین پایه های اتصالی نمایشگر به اردوینو را مشخص می کنیم.
نکته : برای کاهش حجم سیم کشی مدار بجای 8 پایه دیتای نمایشگر ما فقط از 4 پایه پرارزش استفاده می کنیم و همچنین چون نیازی به پایه ی RW نداریم (زیرا می خواهیم فقط اطلاعات به نمایشگر بفرستیم و قصد خواندن از ان را نداریم) این پایه را به زمین متصل می کنیم.
void setup() {
lcd.begin(16, 2);
lcd.clear();
lcd.print("HI");
lcd.setCursor(0,1);
lcd.print("ELECTRONIC");
}
void loop() {
}
در قسمت setup برنامه باید توسط تابع begin تعداد ستون و سطر نمایشگر را مشخص و ان را راه اندازی نماییم.
و همچنین بعد از راه اندازی کل نمایشگر را پاک می نماییم.توسط تابع print می توانیم متن دلخواه خود را روی نمایشگر نمایش دهیم ورودی این تابع می تواند string , عدد صحیح یا اعشاری باشد.
توسط تابع setCursor می توانیم مکان نمای خود برای نمایش اطلاعات را تغییر دهیم.این تابع در ورودی خود ابتدا مکان ستون و سپس سطر را از ما دریافت می کند که ما دراینجا مکان نما را در سطر دوم و ستون اول قرار داده ایم.
نکته : ادرس ستون و سطر از صفر شروع می شود یعنی برای یک نمایشگر 16 * 2 ادرس سطر از 0 تا 1 و همچنین برای ستون از 0 تا 15 می باشد.

در قسمت setup برنامه سریال را با بادریت مناسب خود راه اندازی می کنیم و برای تست سریال میکروکنترلر توسط تابع print یک متن دلخواه را می فرستیم.
void setup() {
Serial.begin(38400);
Serial.print("HI ELECTRONIC");
}
و همچنین نیاز داریم روتین وقفه دریافت پورت سریال را در برنامه اضافه کنیم تا بتوانیم اطلاعات ارسالی از Master را دریافت کنیم.
#include <LiquidCrystal.h>
#define rs 13
#define e 12
#define db4 4
#define db5 5
#define db6 6
#define db7 7
LiquidCrystal lcd(rs, e, db4, db5, db6, db7);
void setup() {
Serial.begin(38400);
Serial.print("HI ELECTRONIC");
lcd.begin(16, 2);
lcd.clear();
lcd.print("Serial Test");
}
void loop() {
}
String inCome_Data = "";
تعریف یک متغییر از نوع string برای نگه داری کل کارکترهای دریافت شده یک فریم اطلاعاتی
void serialEvent() {
روتین وقفه دریافت اطلاعات سریال
while (Serial.available()) {
منتظر در حلقه تا وقتی اطلاعاتی برای خواندن موجود است
char temp_char = (char)Serial.read();
خواندن یک بایت از پورت سریال (اطلاعات در سریال بصورت بایت ارسال و دریافت می شوند) لذا ابتدا به کارکتر تبدیل و سپس در متغییری از نوع char ذخیره میکنیم
inCome_Data += temp_char;
ذخیره کارکتر جدید درون متغییر string ما
if (temp_char == '\n') {
در صورتی که به پایان اطلاعات رسیدیم در اینجا ما کارکتر خط جدید (\n) را بعنوان پایان در نظر گرفتیم.فرستنده در پایان دیتای خود این کارکتر را می فرستد.
lcd.clear();
lcd.print(inCome_Data);
نمایش متن دریاقتی
inCome_Data = "";
خالی کردن متغییر string برای اماده شدن دریافت بعدی
Serial.flush();
پاکسازی بافر دریافت سریال
}
}
}
برنامه فرستنده :
void setup() {
Serial.begin(38400);
بادریت فرستنده و گیرنده باید یکی باشند.
delay(1000);
تاخیر برای اینکه گیرنده اماده دریافت شود.
}
int i = 0;
void loop() {
Serial.println(i);
در تابع println کارکتر \n بصورت خودکار در انتهای اطلاعات ما ارسال می شود.و همچنین این تابع بصورت خودکار اطلاعات متغییر i را به رشته تبدیل می نماید.
i++;
delay(500);
}

برای تکمیل برنامه نیاز است تا چند شرط بعد از دریافت دیتا قرار دهیم تا با دریافت انها اردوینو نمایشگر را کنترل کرده یا متنی را نمایش دهد.
ما اولین کارکتر دریافتی خود را برای تشخص نوع دستور تعیین کرده ایم برای مثال اگر کارکتر اول برابر با صفر باشد یعنی گیرنده باید متن را روی نمایشگر نشان دهد.
if(inCome_Data.charAt(0) == '0'){
inCome_Data.remove(0,1);
حذف کارکتر اول و نمایش متن روی نمایشگر.
تابع remove ابتدا مکان شروع حذف را گرفته و در ورودی دوم تعداد کارکترهای حذف شده, چون ما می خواهیم کارکتر کنترلی حذف شود و مکان ان در رشته خانه صفرم است ارگومان اول را با صفر و تعداد کارکترهای حذف شده را یک قرار می دهیم.مابقی اطلاعات فرستنده متن نمایش می باشد.
lcd.print(inCome_Data);
}
else{
if(inCome_Data.charAt(0) == '1'){
اگر کارکتر کنترلی برابر با 1 باشد نمایشگر را باید پاکسازی نماییم.
lcd.clear();
}
if(inCome_Data.charAt(0) == '2'){
اگر کارکتر کنترلی برابر با 2 باشد باید چشمک زن نمایشگر فعال شود.
lcd.blink();
}
if(inCome_Data.charAt(0) == '3'){
اگر کارکتر کنترلی برابر با 3 باشد باید چشمک زن نمایشگرغیرفعال شود.
lcd.noBlink();
}
if(inCome_Data.charAt(0) == '4'){
برای تنظیم مکان نما ما اطلاعات ستون و سطر را با هم دریافت می کنیم
int pos = inCome_Data.indexOf(',');
بین اطلاعات ستون و سطر یک کاما فرستنده قرار می دهد و در گیرنده باید مکان قرار گیری این کاما را توسط دستور بالا پیدا نماییم.
String col = inCome_Data.substring(1,pos);
جدا سازی اطلاعات ستون از خانه یک (خانه صفرم برای کارکتر کنترلی می باشد و ان را در نظر نمی گیریم) رشته تا موقعیت pos بدست امده(البته خود تابع مکان pos را در نظر نمی گیرد و تا قبل از ان را جداسازی می کند.)
String row = inCome_Data.substring(pos + 1 , inCome_Data.length());
چون در نمایشگر ما شماره سطر در یک کارکتر جا می شود و ان همیشه تک کارکتری است از موقعیت بعد از کاما تا موقعیت اخرین کارکتر (اینجا اخرین کارکتر \n می باشد البته تابع فوق اخرین کارکتر را در نظر نمی گیرد) را جدا می کنیم
lcd.setCursor(col.toInt() , row.toInt());
تبدیل اطلاعات به نوع int و دادن به تابع setCursor
}
}
برنامه فرستنده :
void setup() {
Serial.begin(38400);
delay(1000);
Serial.println("1");
ارسال عدد یک برای پاکسازی نمایشگر در سمت گیرنده
delay(400);
Serial.println("47,0");
تعیین ستون و سطر که ابتدا عدد کنترلی 4 را قرار داده تا گیرنده متوجه شود قصد تعیین مکان نما را داریم و سپس ادرس ستون وسطر که با کاما از هم جدا شده اند.
delay(400);
Serial.println("0GIL");
ارسال متن خود که در ابتدا کارکتر کنترلی صفر را قرار دادیم
delay(400);
Serial.println("40,1");
ارسال ستون و سطر جدید
delay(400);
Serial.println("0ELECTRONIC");
ارسال متن دوم خود
delay(400);
Serial.println("415,0");
قرار گیری مکان نما در ستون اخر سطر اول
}
void loop() {
delay(1000);
Serial.println("2");
ایجاد انیمیشن چشمک با دو دستورblink و noBlink
delay(1000);
Serial.println("3");
}
درادامه می توانید برنامه تست و فایل شبیه سازی را دانلود نمایید: