آموزش ساخت یک چراغ راهنمایی ساده با اردوینو با قابلیت تنظیم زمانی

 

در این آموزش هدف ساخت یک چراغ راهنمایی ساده برای یادگیری راه اندازی 7 Segment و کی پد در محیط اردوینو می باشد.

استفاده مستقیم از سون سگمنت باعث افزایش مصرف پایه های اردوینو و سخت بودن درایو ان توسط میکروکنترلر می باشد.

برای راه اندازی راحت تر سون سگمنت از ای سی درایور سون سگمنت مدل Max7219 استفاده کرده ایم که از طریق پروتکل SPI قابل کنترل می باشد.

#include <Keypad.h>
#include <HCMAX7219.h>
#include "SPI.h"

در برنامه کتابخانه های لازم را فراخوانی می کنیم.اولی کتابخانه Keypad برای اسکن کلیدهای ماتریسی 4 * 4 خود و دومین فراخوانی مربوط به کتابخانه Max7219 می باشد.

#define LOAD 10
HCMAX7219 HCMAX7219(LOAD);

سپس پایه Load ای سی را به پایه دلخواه اردوینو خود متصل می کنیم و همچنین یک شئی از کتابخانه Max7219 ایجاد می کنیم.

const byte ROWS = 4;
const byte COLS = 4;

تعیین تعداد سطر و ستون کی پد خود

char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

تعریف یک ارایه به تعداد سطر و ستون خود و نام گذاری دلخواه به هریک از کلیدهای مورد نظر

byte rowPins[ROWS] = {A0, A1, A2, A3};
byte colPins[COLS] = {A4, A5, 3, 2};

مشخص کردن پایه های متصل شده کی پد به اردوینو

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

تعریف شئی از کتابخانه کی پد و دادن اطلاعات بالا به ان

#define Green  7
#define Yellow 6
#define Red    5

معین کردن پایه های متصل به LED توسط اردوینو با یک نام دلخواه

unsigned int greenTime = 0;
unsigned int yellowTime = 0;
unsigned int redTime = 0;

متغییرهای بالا زمان روشن بودن هر یک از led ها را نگه می دارند که کاربر می تواند با توجه به 4 رقمی بودن سون سگمنتها تا 9999 ثانیه تنظیم نماید.

String tempNumber = "";

متغییر فوق برای نگه داری موقت اطلاعات وارد شده توسط کاربر می باشد.

برای نمایش اطلاعات روی سون سگمنت یک تابع تعریف کرده ایم که با هر بار صدا زدن ان سون سگمنت بروز رسانی می شود.

bool set7Segment(String data) {

این تابع در ورودی خود اطلاعات را با فرمت رشته دریافت می کند.

  String str = "";
  if (data.length() == 0) {

در صورت خالی بودن رشته ورودی اجرای تابع متوقف می شود

    return false;
  }

  byte y = 0;
  for (byte x = 4; x >= 1; x--) {

چون سگمنت ما از نوع  4 تایی می باشد پس باید رشته ما 4 کارکتر داشته باشد.

    if (data.length() < x) {
      str += "0";

در صورتی که اندازه رشته ورودی کمتر از شمارشگر حلقه می باشد یک صفر به رشته Str اضافه می کند تا ارقام ورودی در سمت چپ خود با صفر پر شوند

    }
    else {

در صورتی که طول رشته ورودی برابر با شمارشگر حلقه بود کارکتر از رشته ورودی خوانده شده و به متغییر str اضافه می شود.

متغییر y مکان کارکتر در رشته ورودی را مشخص می کند و چون در رشته ما اولین کارکتر در خانه صفر ارایه رشته ما قرار می

گیرد بنابراین y از صفر شروع به زیاد شدن می کند.

      str += data.charAt(y);

      y++;
    }

  }


  HCMAX7219.Clear();

ابتدا پاکسازی کل نمایشگرها

HCMAX7219.print7Seg(str.charAt(0) - 48, 1);
  HCMAX7219.print7Seg(str.charAt(1) - 48, 2);
  HCMAX7219.print7Seg(str.charAt(2) - 48, 3);
  HCMAX7219.print7Seg(str.charAt(3) - 48, 4);

نمایش تک تک 4 کارکتر درون متغییر str بر روی سون سگمنتها.

تابع print7Seg ابتدا در ورودی خود مقدار عددی مورد نظر ما و سپس شماره سون سگمنتی که باید اطلاعات را نمایش دهد از ما دریافت می کند.علت منحی کردن کارکتر با عدد 48 این است تا عدد کارکتری را به نوع integer تبدیل نماییم.

HCMAX7219.Refresh();

سپس اطلاعات جدید را لود می کنیم.

return true;
}


void LED_ON(String str) {

تابع led_on طبق نوع رشته ورودی ما led مورد نظر ما را روشن می کند.

  if (str == "Green") {

اگر ورودی تابع عبارت Green را دریافت کرد led سبز رنگ را روشن می کند.

digitalWrite(Green, HIGH);
    digitalWrite(Yellow, LOW);
    digitalWrite(Red, LOW);
  }

  if (str == "Yellow") {
    digitalWrite(Green, LOW);
    digitalWrite(Yellow, HIGH);
    digitalWrite(Red, LOW);
  }

  if (str == "Red") {
    digitalWrite(Green,  LOW);
    digitalWrite(Yellow, LOW);
    digitalWrite(Red,    HIGH);
  }

  if (str == "Off") {
    digitalWrite(Green,  LOW);
    digitalWrite(Yellow, LOW);
    digitalWrite(Red,    LOW);
  }

}


void setup()
{

در بخش setup ابتدا پایه های led را خروجی و سپس در وضعیت صفر قرار می دهیم.

pinMode(Green, OUTPUT);
  pinMode(Yellow, OUTPUT);
  pinMode(Red, OUTPUT);

  digitalWrite(Green, LOW);
  digitalWrite(Yellow, LOW);
  digitalWrite(Red, LOW);

  set7Segment("0000");

  bool Exit = false;

  while (Exit == false) {

تکرار حلقه تا وقتی که متغییر exit ما true نشده است

char key = ' ';

  key = keypad.getKey();

برای خواندن از تابع getKey یک متغییر از نوع char نیاز داریم زیرا این تابع نام کلید فشرده شده را که نام ان در فرمت char  تعریف شده بود را بر می گرداند.

if (key) {

بررسی اگر کلید فشرده شد

switch (key) {

        case '0':
          tempNumber += "0";
          set7Segment(tempNumber);
          break;
        case '1':
          tempNumber += "1";
          set7Segment(tempNumber);
          break;
        case '2':
          tempNumber += "2";
          set7Segment(tempNumber);
          break;
        case '3':
          tempNumber += "3";
          set7Segment(tempNumber);
          break;
        case '4':
          tempNumber += "4";
          set7Segment(tempNumber);
          break;
        case '5':
          tempNumber += "5";
          set7Segment(tempNumber);
          break;
        case '6':
          tempNumber += "6";
          set7Segment(tempNumber);
          break;
        case '7':
          tempNumber += "7";
          set7Segment(tempNumber);
          break;
        case '8':
          tempNumber += "8";
          set7Segment(tempNumber);
          break;
        case '9':
          tempNumber += "9";
          set7Segment(tempNumber);
          break;

در صورت اینکه کلید فشرده شده یکی از اعداد بود ان را به متغییر tempNumber اضافه می کنیم و سون سگمنت را بروز رسانی می کنیم.

case '*':
          tempNumber = "";
          set7Segment("0000");

اگر کاربر کلید * را انتخاب کرد متغییر مورد نظر پاک و همچنین سون سگمنت با عدد صفر ریست می شود

          break;

case 'A':

اگر کلید a انتخاب شد led سبز ما لحظه ای روشن و اطلاعات متغییر tempNumber به نوع integer تبدیل و متغییر مربوط به زمان روشن بودن led را اپدیت می کنیم.

LED_ON("Green");

          greenTime = tempNumber.toInt();

          delay(1500);

          LED_ON("Off");

          set7Segment("0000");

          tempNumber = "";

          break;

case 'B':

و همچنین برای تنظیم کردن زمان led زرد

LED_ON("Yellow");

          yellowTime = tempNumber.toInt();

          delay(1500);

          LED_ON("Off");

          set7Segment("0000");

          tempNumber = "";

          break;

        case 'C':
          LED_ON("Red");

و همچنین تنظیم led قرمز رنگ ما

redTime = tempNumber.toInt();

          delay(1500);

          LED_ON("Off");

          set7Segment("0000");

          tempNumber = "";

          break;

        case 'D':

اگر کاربر کلید Run را انتخاب کرد از حلقه دریافت تنظیمات  زمانی خارج می شود

          Exit = true;
          
          break;
        default:
          break;
      }

    }

  }


}



void loop()
{

در این قسمت led ها طبق زمان تنظیم شده خود روشن می شوند.

LED_ON("Green");
    Delay(greenTime);

    LED_ON("Yellow");
    Delay(yellowTime);

    LED_ON("Red");
    Delay(redTime);

}




void Delay(unsigned int myDelay){
  for(unsigned int x = 0; x < myDelay; x++){

چون تابع تاخیر در اردوینو به میلی ثانیه می باشد سپس در یک حلقه به مدت یک ثانیه به تعداد تاخیر تنظیم شده کاربر شمارش می کنیم

     set7Segment(String(x + 1));  

و اطلاعات زمان را روی سون سگمنت نمایش می دهیم.

delay(1000);
   
  }
  
}

در ادامه می توانید فایل شبیه سازی و برنامه را دانلود نمایید:

دانلود فایل

 

دیدگاهتان را بنویسید!

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

گیل الکترونیک
سبد خرید
empty basket

هیچ محصولی در سبد خرید نیست.