نصب و استفاده از کلاس Telegraph

 کلاس Telegraph ما کامل شده است و اکنون ما باید چند اسکچ برای مثال ایجاد کنیم که به طور واقعی از این کلاس استفاده کنند. این کار به دو دلیل اهمیت دارد: اول اینکه ما می توانیم کتابخانه ی خود را تست کنیم، و دوم اینکه می توانیم برای کاربران کلاس خود، مستندات خوبی را آماده کنیم.

IDE آردوینو در دو مکان به دنبال کتابخانه ها(libraries) می گردد: در فولدر کتابخانه های سراسری(global libraries folder) بسته به فولدری که در آن نصب شده است و در فولدر محلی sketchbook کاربر. برای پیدا کردن مکان sketchbook می توانید به داخل Preferences بروید. (تصویر 14 را مشاهده کنید).

 اکنون در داخل پوشه ی sketchbook یک فولدر  جدید ایجاد کنید. برای اینکه کلاس Telegraph در دسترس باشد، در فولدر کتابخانه ها(libraries) یک ساب فولدر (زیر پوشه) ایجاد کنید. سپس فایل telegraph.h و telegraph.cpp را کپی کنید و در فولدر libraries/Telegraph قرار دهید. حالا IDE را ری استارت کنید(فایل TelegraphLibrary.ino را نباید کپی کنید).

 اکنون اجازه دهید، با برنامه ای که مادر تمام برنامه هاست، یعنی با برنامه ی Hello world شروع کنیم. یک اسکچ جدید ایجاد کنید و نام آن را HelloWorld  بگذارید و کدهای زیر را در آن وارد کنید:

 

 (تصویر 14: پیدا کردن مکان sketchbook در Preferences)

تصویر 14: پیدا کردن مکان sketchbook در Preferences

 

#include "telegraph.h"
const unsigned int BAUD_RATE  = 9600;
const unsigned int OUTPUT_PIN = 13;
const unsigned int DIT_LENGTH = 200;

Telegraph telegraph(OUTPUT_PIN, DIT_LENGTH);

void setup() {
  Serial.begin(BAUD_RATE);
}
void loop() {
  telegraph.send_message("Hello, world!");
  delay(5000);
}

 این اسکچ، رشته ی Hello, world را هر پنج ثانیه یکبار به صورت کدهای مورس انتشار می دهد. برای انجام این کار، در داخل کدها، ما کلاس Telegraph را اینکلود می کنیم و چند ثابت(constant) را برای پین ای که ال ای دی ما به آن متصل شده است و برای طول دیت ها تعریف می کنیم. سپس ما یک آبجکت Telegraph سراسری() ایجاد می کنیم و یک تابع setup خالی را نیز تعریف می کنیم. سپس در داخل loop برای هر 5 ثانیه یک بار متد send_message را در نمونه ی گرفته شده از کلاس Telegraph فراخوانی می کنیم. وقتی که ما این اسکچ را کامپایل کنیم، IDE آردوینو به طور اتوماتیک کتابخانه ی telegraph را نیز کامپایل می کند. اگر فراموش کرده باشید که این کتابخانه را در فولدر libraries/Telegraph قرار دهید، یک پیغام خطا به صورت زیر دریافت خواهید کرد:

Telegraph does not name a type

 اگر فایل های مذکور را کپی کرده اید اما در سینتکس و نوشتن کدها خطا داشته باشید، اکنون این خطاها به شما تذکر داده خواهند شد. اگر باید چند خطا را تصحیح کنید، فایل های کد اصلی خود را تغییر دهید. پس از اینکه خطاها را تعمیر(fix) کردید، این فایل ها را دوباره در پوشه ی libraries کپی کنید و فراموش نکنید که IDE را ری استارت کنید.

تبدیل یک رشته ی استاتیک به کدهای مورس جالب است، اما آیا بهتر نیست که برنامه ما بتواند بر روی رشته های دلخواه نیز کار کند؟ به همین خاطر اجازه دهید یک مثال پیچیده تر بزنیم.  این دفعه می خواهیم کدی بنویسیم که پیغام ها را از پورت سریال می خواند و آن را به یک نمونه(instance) از کلاس Telegraph می خوراند. بنابراین یک اسکچ جدید به نام MorseCodeGenerator ایجاد کنید و کدهای زیر را در آن وارد کنید:

#include "telegraph.h"

const unsigned int OUTPUT_PIN = 13;
const unsigned int DIT_LENGTH = 200;
const unsigned int MAX_MESSAGE_LEN = 128;
const unsigned int BAUD_RATE = 9600;
const char NEWLINE = '\n';

char message_text[MAX_MESSAGE_LEN];
int index = 0;

Telegraph telegraph(OUTPUT_PIN, DIT_LENGTH);

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

void loop() {
  if (Serial.available() > 0) {
    int current_char = Serial.read();
    if (current_char == NEWLINE || index == MAX_MESSAGE_LEN - 1) {
      message_text[index] = 0;
      index = 0;
      telegraph.send_message(message_text);
    } else {
      message_text[index++] = current_char;
    }
  }
}

 دوباره در کدهای بالا، ما فایل هدر( header) از کلاس Telegraph را اینکلود می کنیم و مانند همیشه چند ثابت(constant) را تعریف می کنیم: ثابت OUTPUT_PIN پین ای را تعریف می کند که ال ای دی ما به آن متصل شده است و ثابت DIT_LENGTH مشخص کننده ی طول یک دیت است در واحد میلی ثانیه. ثابت NEWLINE نیز برابر با کاراکتر اسکی newline (خط جدید) قرار گرفته است. زیرا ما برای تعیین انتهای پیام منتشر شده به عنوان کد مورس به آن نیاز داریم. در نهایت ما ثابت MAX_MESSAGE_LEN را برابر با ماکزیمم طولی از پیام قرار می دهیم که می توانیم آن را ارسال کنیم.

سپس به تعریف سه متغیرهای سراسری(global variables) می پردازیم: متغیر message_text یک بافر کاراکتری(character buffer) است که با داده هایی که در پورت سریال دریافت می کنیم، پر می شود. متغیر index موقعیت فعلی ما را در بافر ثبت می کند. و  متغیر telegraph یک آبجکت (شیء) از کلاس Telegraph است که ما از آن برای تبدیل یک پیغام به ال ای دی های چشمک زن استفاده می کنیم.

 متد setup، پورت سریال را مقدار دهی اولیه(initializes ) می کند و در متد loop نیز با فراخوانی Serial.available  بررسی می کنیم که آیا داده ی جدیدی دریافت شده است یا نه. اگر داده ی جدیدی در دسترس باشد، بایت بعدی را می خوانیم، و بررسی می کنیم که آیا این بایت یک کاراکتر newline  است یا اینکه آخرین بایتی است که در داخل بافر کاراکتری ما قرار می گیرد. در هر دو صورت، ما آخرین بایت پیغام متنی را برابر با 0 قرار می دهیم؛ زیرا رشته ها در C و ++C با کاراکتر null  پایان می یابند.(null-terminated).

ما همچنین index را ریست می کنیم تا بتوانیم پیغام بعدی را بخوانیم و در نهایت ما با استفاده از telegraph خود، پیغام مورد نظر را اجرا می کنیم. در تمام دیگر موارد، ما آخرین بایت را به پیغام متنی فعلی اضافه می کنیم و به کار خود ادامه می دهیم.  اکنون ما باید برنامه را کامپایل و آپلود کنیم.سریال مانیتور را باز کنید و از منوی کشویی line endings در پاین پنجره گزینه ی Newline را انتخاب کنید. با تنظیم این گزینه، سریال مانیتور به طور اتوماتیک یک کاراکتر newline را به هر خطی که به آردوینو ارسال می کند، اضافه می کند.

 یک پیام مثلاً نام خود را بنوسید و بر روی دکمه ی Send کلیک کنید، و مشاهده کنید که آردوینو چگونه آن را به نور تبدیل می کند.  در تصویر زیر، مشاهده می کنید که وقتی نام  من(نویسنده)  را وارد کنید چه اتفاقی برای آن می افتد:

 

 به دلیل اینکه ما تمام منطق کدهای مورس خود را در داخل کلاس Telegraph قرار داده ایم، برنامه ی اصلی ما کوتاه و مختصر است.

 ایجاد نرم افزار برای سیستم های تعبیه شده(embedded devices) به این معنی نیست که ما نمی توانیم از مزیت های برنامه نویسی شیء گرا استفاده کنیم. هنوز باید چند کار جزئی انجام دهیم تا پروژه ی خود را به یک کتابخانه ی عالی تبدیل کنیم. در بخش بعدی، به آموزش آنها خواهیم پرداخت.

برای نظردهی، در سایت عضو شوید یا به آن وارد شوید!

ستاره غیر فعالستاره غیر فعالستاره غیر فعالستاره غیر فعالستاره غیر فعال