ایجاد یک دماسنج تلویزیون در آردوینو

Ratings
(0)

برای ایجاد یک دماسنج تلویزیون، ما می خواهیم دوباره از یک سنسور TMP36 استفاده کنیم؛ بنابراین ما می خواهیم مداری که در مقاله ی "افزایش دقت با سنسور دما در آردوینو" در ص 86 ایجاد کردیم را با مداری که برای تولید سیگنال ویدئو ایجاد کردیم، ترکیب کنیم. شما می توانید نتیجه ی این کار را در تصویر 24، ایجاد یک دماسنج تلویزیون در صفحه 135 مشاهده کنید.

 (تصویر 24، مدار دماسنج تلویزیون)

 


 با نگاه به مدار بالا، گیج نشوید. ما اینگونه می توانیم مدار خود را در یک برد برد ایجاد کنیم.  البته ما هنوز هم می توانیم مستقیما، کابل RCA که آن را اصلاح کردیم را به آردوینو متصل کنیم. سپس مدار مورد نظر را به سنسور TMP36 متصل کنیم. قبل از اینکه به کدها بپردازیم، نگاهی به چیزی که می خواهیم بسازیم می اندازیم:

 در سمت چپ صفحه ی بالا، می توانید یک نمایش(representation ) گرافیکی از یک دماسنج معمولی را مشاهده کنید. این دماسنج، مقیاسی از 5.5 تا 40 درجه ی سلسیوس را اندازه گیری می کند. این دماسنج، یک تصویر استاتیک(static) نیست. میله ی این دماسنج، بسته به دمای فعلی، افزایش یا کاهش می یابد. در سمت راست صفحه ی بالا، ما دمای فعلی(current temperature) را به صورت متنی نشان داده ایم. در مجموع ما باید مقداری متن(text) و گرافیک را در خروجی ایجاد کنیم.  این یک فرصت عالی است که ما مهمترین توابع TVout را بررسی کنیم، بنابراین اجازه دهید ببینیم این توابع چگونه کار می کنند.

#include <TVout.h>
#include <fontALL.h>
#include "thermometer.h"

const float SUPPLY_VOLTAGE = 5.0;
const float MIN_TEMP = 5.5;
const float MAX_TEMP = 40.0;
const unsigned int SCREEN_WIDTH = 120;
const unsigned int SCREEN_HEIGHT = 96;
const unsigned int TEMP_SENSOR_PIN = A0;
const unsigned int SCALE_X_MIN = 8;
const unsigned int SCALE_Y_MIN = 6;
const unsigned int SCALE_Y_MAX = 75;
const unsigned int SCALE_WIDTH = 3;
const unsigned int SCALE_HEIGHT = SCALE_Y_MAX - SCALE_Y_MIN;

float current_temperature = 0.0;
unsigned long last_measurement = millis();
TVout TV;

برای مشاهده ی کامل کدهای فایل TvThermometer.ino، اینجا کلیک کنید.

 در ابتدای برنامه، ما تعدادی فایل header را اضافه(include) می کنیم. عبارت TVout.h درواقع کلاس اصلی TVout و تمام متدهای آن را تعریف می کند. عبارت fontALL.h حاوی تعریف تمام فونت هایی است که TVout به ما ارائه می دهد. اگر نمی خواهی هیچ متنی در خروجی(output) نشان داده شود، می توانید این فونت ها را اضافه(include) نکنید. فایل thermometer.h نمایش گرافیکی دماسنج را برای ما ایجاد می کند. ما بعداً محتوای آن را توضیح خواهیم داد.

پس از اینکه ما تمام فایل های ضروری را اضافه(include) کردیم، تعدادی ثابت(constant) و متغیر(variable) را تعریف می کنیم. که عبارتند از:

  • ثابت SUPPLY_VOLTAGE منبع ولتاژ آردوینو را تعریف می کند، و ثابت TEMP_SENSOR_PIN حاوی تعداد پین هایی است که م به سنسور TMP36 متصل کرده ایم.
  • ثابت های MIN_TEMP و MAX_TEMP به ترتیب مینیمم و ماکزیمم دما هایی را تعریف می کنند که دماسنج تلویزیون می تواند نمایش دهد(به درجه ی سلسیوس).
  • ثابت های SCREEN_WIDTH و SCREEN_HEIGHT عرض(width) و ارتفاع(height) صفحه ی نمایش را مشخص می کنند. توجه کنید که آردوینو قادر نیست صفحه های نمایشی که رزولوشن بالایی درند را نمایش دهد.  عرض 120 تا 132 پیکسل و ارتفاع 96 پیکسل، مناسب است. 
  • ثابت SCALE_X_MIN مینیمم موقعیت(position)  X مقیاس دماسنج را مشخص می کند.
  • ثابت های SCALE_Y_MIN و SCALE_Y_MAX مینیمم و ماکزیمم مقادیر موقیت Y مقیاس دماسنج را مشخص می کنند. ما به این ثابت ها برا رسم یک مستطیل که مشخص کننده ی دمای فعلی است، بعداً نیاز خواهیم داشت.
  • ثابت های SCALE_WIDTH و SCALE_HEIGHT عرض و ارتفاع مقیاس دماسنج را مشخص می کنند.
  • متغیر current_temperature آخرین دمایی که اندازه گیری کرده ایم را نگهداری می کند. متغیر last_measurement حاوی تایم استامپ(time stamp) به میلی ثانیه است از وقتی که آخرین بار دمای فعلی را اندازه گرفتیم. ما به این متغیر نیاز داریم زیرا نمی خواهیم به طور دائم دما را اندازه بگیریم، بلکه هر چند ثانیه یک بار می خواهیم این کار را انجام دهیم.
  • در خط آخر، TV یک نمونه( instance) از کلاس TVout است و ما از آن برای دسترسی به صفحه ی نمایش تلویزیون با استفاده از آردوینو استفاده خواهیم کرد.

 سپس ما در زیر تابع setup را تعریف می کنیم:

void setup() {
  TV.begin(PAL, SCREEN_WIDTH, SCREEN_HEIGHT);
  TV.bitmap(0, 1, thermometer);
  TV.select_font(font4x6);
  TV.set_cursor(20, 4);
  TV.print("40");
  TV.set_cursor(20, 24);
  TV.print("30");
  TV.set_cursor(20, 44);
  TV.print("20");
  TV.set_cursor(20, 64);
  TV.print("10");
}

 در خط شماره 1، از کدهای بالا، ما متد begin از شیء TV را فراخوانی کرده ایم. و در آن، استاندارد تلویزیون آنالوگ را به PAL تنظیم کرده ایم و سپس عرض(width) و ارتفاع(height) صفحه ی نمایش تلویزیون را مشخص کرده ایم. اگر تلویزیون شما از استاندارد NTSC استفاده می کند، باید در آرگومان اول، از کلمه ی NTSC به جای PAL استفاده کنید. پس از آن، ما متد bitmap را فراخوانی می کنیم تا بتوانیم تصویر دماسنج را در صفحه ی نمایش رسم کنیم. مختصات X آن 0 است و مختصات Y آن 1 است. تصویر(image)  این دماسنج حاوی عددهایی در کنار مقیاس آن نمی باشد، بنابراین ما این عددها را در برنامه ی خود اضافه می کنیم. از این رو، ما باید فونتی که می خواهیم از آن استفاده کنیم را با استفاده از متد select_font  انتخاب کنیم. قابلیت های فونت های TVout بسیار چشمگیر است. این فونت ها، از سه فونت با عرض ثابت(fixed-width) تشکیل شده اند(6×4 و 8×6 و 8×8 )، که برای بسیاری از اهداف مناسب هستند. این فونت ها، همچنین از عرض متغیر(variable-width) نیز پشتیبانی می کنند، و حتی به ما امکان می دهند تا اندازه های خودمان را به آن بدهیم.

در اینجا ما از یک فونت استفاده می کنیم که 4 پیکسل عرض دارد  و 6 پیکسل ارتفاع دارد. متد set_cursor نشانگر ماوس را به یک موقعیت معین حرکت می دهد و متد print یک متن را در آن نقطه چاپ می کند. تابع loop نیز بقیه ی منطق کار دماسنج را انجام می دهد.

void loop() {
  unsigned long current_millis = millis();
  if (abs(current_millis - last_measurement) >= 1000) {
    current_temperature = get_temperature();
    last_measurement = current_millis;
    int y_pos = mapfloat( 
      current_temperature, MIN_TEMP, MAX_TEMP, SCALE_Y_MAX, SCALE_Y_MIN);
    TV.draw_rect(
      SCALE_X_MIN, SCALE_Y_MIN, SCALE_WIDTH, SCALE_HEIGHT, BLACK, BLACK);
    TV.draw_rect(
      SCALE_X_MIN, y_pos, SCALE_WIDTH, SCALE_Y_MAX - y_pos, WHITE, WHITE);
    TV.select_font(font6x8);
    TV.set_cursor(53, 1);
    TV.print("Current");
    TV.set_cursor(40, 11);
    TV.print("Temperature:");
    TV.select_font(font8x8);
    TV.set_cursor(50, 25);
    TV.print(current_temperature, 1);
    TV.print(" C");
    TV.draw_circle(88, 27, 1, WHITE); 
   }
}

const float mapfloat(
  float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

const float get_temperature() {
  const int sensor_voltage = analogRead(TEMP_SENSOR_PIN);
  const float voltage = sensor_voltage * SUPPLY_VOLTAGE / 1024;
  return (voltage * 1000 - 500) / 10;
}

 در کدهای بالا، ما اطمینان حاصل می کنیم که دمای فعلی را تنها یک بار در ثانیه اندازه گیری کنیم. وقتی که ما دمای فعلی را اندازه گیری کردیم، دمای فعلی را مشخص می کنیم ؛ ما در خط شماره 6، موقعیت Y جدید بالایی  مقیاس دماسنج را محاسبه می کنیم.  تابع map_float دمای فعلی را بر اساس مقیاس دماسنج ما می نگارد. سپس ما دو بار از متد draw_rect استفاده می کنیم(که یک مستطیل را در صفحه ی نمایش رسم می کند). اولین فراخوانی این متد، مقیاس دماسنج را کاملا پاک می کند. این کار ضروری است،  زیرا دماسنج ما می تواند بالا یا پایین برود. پس ما می توانیم محتویات آن را پاک کنیم و هر وقت خواستیم، صفحه را دوباره رسم کنیم. در دومین فراخوانی، یک مستطیل سفید را بر روی مقیاسی که دمای فعلی را مشخص می کند، رسم می کنیم.

 سپس ما دمای فعلی را به صورت متنی چاپ می کنیم. برای این کار، ما از متدهای  select_font و set_cursor و print استفاده می کنیم تا عبارت Current Temperature را با فونتی که 6 پیکسل عرض و 8 پیکسل ارتفاع دارد، چاپ کنیم. پس از آن، ما دمای فعلی را به درجه ی سلسیوس با استفاده از یک فونت 8×8 به خروجی(output) می دهیم. کتابخانه ی TVout، هیچ نمادی را برای درجه ی سلسیوس مشخص نمی کند، بنابراین ما از  متد draw_circle در خط 21 استفاده می کنیم تا یک دایره ی کوچک برای نشان دادن نماد درجه ایجاد کنیم.

اکنون کار ما انجام شد. تمام کدهایی که برای ایجاد دماسنج تلویزیون نیاز داشتیم همین بود. تنها چیزی که با جزئیات کامل به آن نپرداخته ایم، این است که تصویر دماسنج چگونه در خروجی نشان داده می شود. که در بخش بعدی به این موضوع خواهیم پرداخت.

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

  • بازدید: 556

نوشتن دیدگاه

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

ارسال