کار کردن با گرافیک در TVout آردوینو

Ratings
(0)

ما در فایل TvThermometer.ino، فایل thermometer.h را اضافه کردیم، بدون اینکه در مورد محتویات آن صحبت کنیم. کدهای آن به صورت زیر است و می توانید با کلیک روی اینجا، آن را دانلود کنید:

#ifndef THERMOMETER_H
#define THERMOMETER_H
extern const unsigned char thermometer[];
#endif

کمی ناامید کننده است! این فایل تنها یک متغیر به نام thermometer را تعریف می کند. این متغیر، یک آرایه(array) است که مقادیر کاراکترهای آن بی علامت(unsigned ) هستند. و کلمه ی کلیدی  extern به کامپایلر می گوید که ما تنها می خواهیم این متغیر را تعریف(declare)  کنیم. به این معنا که ما می توانیم در برنامه ی خود به آن رجوع کنیم، اما فعلا باید آن را تعریف کنیم تا مقداری حافظه(memory)  به آن اختصاص یابد. ما به طور حقیقی، متغیر thermometer را در فایل thermometer.cpp تعریف می کنیم. (ما برای اختصار، چند خط از کدها را نادیده گرفتیم).

 برای دانلود فایل thermometer.cpp اینجا کلیک کنید. آدرس این فایل در بسته ی دانلودی:

Video/TvThermometer/thermometer.cpp

 کدهای فایل:

#include <Arduino.h>
#include <avr/pgmspace.h>
#include "thermometer.h"
PROGMEM const unsigned char thermometer[] = { 
  20, 94, 
  B00000000, B11110000, B00000000,
  B00000001, B00001000, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000111, B10000000, // 40.0
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  // ...
  B00000010, B00000111, B10000000, // 35.0
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000111, B10000000, // 30.0
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000111, B10000000, // 25.0
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000111, B10000000, // 20.0
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000111, B10000000, // 15.0
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000111, B10000000, // 10.0
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000,
  B00000010, B00000100, B00000000, // 5.5
  B00000111, B11111110, B00000000,
  B00001111, B11111111, B00000000,
  B00011111, B11111111, B10000000,
  B00111111, B11111111, B11000000,
  B01111111, B11111111, B11100000,
  B01111111, B11111111, B11100000,
  B11111111, B11111111, B11110000,
  B11111111, B11111111, B11110000,
  B11111111, B11111111, B11110000,
  B11111111, B11111111, B11110000,
  B11111111, B11111111, B11110000,
  B11111111, B11111111, B11110000,
  B01111111, B11111111, B11100000,
  B01111111, B11111111, B11100000,
  B00111111, B11111111, B11000000,
  B00011111, B11111111, B10000000,
  B00001111, B11111111, B00000000,
  B00000111, B11111110, B00000000,
  B00000001, B11111000, B00000000,
  B00000001, B11111000, B00000000,
};

 این فایل در ابتدا عجیب و غریب به نظر می رسد، اما بسیار ساده است.  در این فایل، ما ابتدا فایل Arduino.h را اضافه(include ) می کنیم؛ زیرا بعدا نیاز خواهیم داشت که ثابت های باینری(binary constants) را تعریف کنیم. پس از آن، ما فایل avr/pgmspace.h را تعریف می کنیم، زیرا می خواهیم داده های تصویر(image) خود را در فلش RAM  آردوینو ذخیره کنیم. در نهایت، ما فایل thermometer.h را اضافه(include) می کنیم، زیرا به تعریف داده های تصویر دماسنج نیاز خواهیم داشت. در خط 4، ما در نهایت متغیر thermometer را که قبلا در فایل thermometer.h  تعریف کرده بودیم را تعریف می کنیم. این تعریف، کمی با اعلان(declaration ) تفاوت دارد، زیرا حاوی دستور PROGMEM است. برای اطلاعات بیشتر در مورد این دستور به این لینک مراجعه کنید. این دستور به کامپایلر فرمان می دهد که داده ها ذخیره شده در متغیر thermometer  را در فلش مموری آرودینو کپی کند.

 معمولا وقتی که ما یک متغیر را در برنامه ی آردوینو تعریف می کنیم، این متغیر حافظه ای را در SRAM اشغال می کند. اکثر بردهای آردوینو حاوی مقدار زیادی SRAM نیستند(آردوینو UNO تنها حاوی 2 کیلوبایت است)، بنابراین این مقدار حافظه بسیار ارزشمند است و نباید آن را هدر دهیم. بعنوان یک قاعده ی کلی، ما باید تمام داد های  ثابت(constant) را در فلش RAM آردوینو ذخیره کنیم. و از SRAM تنها برای اطلاعاتی که ممکن است در حین اجرای برنامه تغییر کنند استفاده کنیم.

 داده های تصویر دماسنج، معمولا تغییر نمی کنند، بنابراین ما همواره باید آنها را با استفاده از دستور PROGMEM  در فلش RAM ذخیره کنیم. کتابخانه ی TVout انتظار دارد که داده های عکس به شکل خام(raw format) باشند. در این داده ها، دو بایت اول، حاوی عرض و ارتفاع تصویر است. و داده هایی که به دنبال آن می آیند، حاوی داده های تصویر به صورت خط به خط هستند.

در فایل thermometer.cpp هر خط از داده های تصویر شامل سه بایت است، زیرا تصویر مورد نظر 20 پیکسل عرض دارد و 20 پیکسل، سه بایت را اشغال می کند. در نتیجه، فایل ما حاوی 94 خط است که هرکدام از آنها مشخص کننده ی یک خط از تصویر دماسنج است.  چون که ما  از لیترال های( literal) باینری برای رمزگذاری داده های تصویر استفاده کرده ایم، وقتی که سورس کد را ، بخوانیم  مشاهده خواهیم کرد که تصویر ما چگونه است. عدد 1 مشخص کننده ی یک پیکسل سفید(white) است و عدد 0 مشخص کننده ی یک پیکسل سیاه(black)  است.

 {module کمک نقدی به نویسنده}

  • بازدید: 570

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.

ارسال