ساعة رقمية باستخدام الاردوينو

في هذا المشروع سنتعلم كيفية استخدام الأردوينو لعمل ساعة رقمية. سنقوم بعرض الوقت على شاشة الـ LCD والتحكم في ضبط الوقت من خلال مفاتيح الـ Push Buttons.

ساعة رقمية باستخدام الاردوينو

المكونات المطلوبة

arduino uno r3

Arduino Uno

16×2 LCD

10K Ohms Resistors

Push Buttons

220 Ω resistor

220 Ohm Resistor

Full size breadboard 830

Breadboard

Breadboard Jumper Wire 65 pcs

Wires

الشاشة LCD

استخدام-حساس-الموجات-فوق-الصوتية-مع-ال
تعمل الشاشة في احد الحالات التالية:

استقبال الأوامر من الأردوينو وتنفيذها، مثلا : أمر تهيئة ومسح الشاشة :

lcd.begin(16,2);
lcd.clear();

استقبال المعلومات من الأردوينو وعرضها، مثلا : كتابة جملة معينة :

lcd.print("Hello");

 

توصيل الدارة :

قم بتوصيل الدارة كما هو موضح بالصورة التالية :

ساعة رقمية باستخدام الاردوينو

سنقوم بعمل كود يقوم على حساب التوقيت لتعمل الساعة بشكل صحيح، حيث سيقوم بحساب مرور 60 ثانية ليقوم بزيادة عدد الدقائق وهكذا ايضا مع الساعات. سيتم استخدام مفاتيح الضغط ليقوم البرنامج بمراقبتها في البداية ليتم ضبط التوقيت الصحيح.

ساعة رقمية باستخدام الاردوينو

 

الكود البرمجي

قم برفع الكود التالي على الأردوينو :

#include <LiquidCrystal.h>

#define HOUR_BUTTON 6
#define MINUTE_BUTTON 7
#define TICK_LENGTH 60000
#define CHECK_TIME 250


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

unsigned int minute = 0;
unsigned int hour = 01;
unsigned long previousMillis = 0;
unsigned char am = 1;

void setup() {
  // put your setup code here, to run once:
  lcd.begin(16, 2);
  pinMode(HOUR_BUTTON, INPUT);
  pinMode(MINUTE_BUTTON, INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  checkTick();
  lcd.setCursor(0,0);
  lcd.print("Time:");
  lcd.setCursor(6,1);
  lcd.print(hour);
  lcd.print(":");
  lcd.print(minute);
  if(am == 1) lcd.print(" AM");
  else lcd.print(" PM");
}

void checkTick() {
   unsigned long currentMillis = millis();
   
   if ((unsigned long)(currentMillis - previousMillis) >= TICK_LENGTH) {
      tick();
      previousMillis = currentMillis;
   }
   if((unsigned long)(currentMillis - previousMillis) >= CHECK_TIME){
      readHourButton();
      readMinuteButton();
   }
}

void tick() {
  minuteUp();
}

  
void readHourButton() {
  if (digitalRead(HOUR_BUTTON) == HIGH) {
    delay(200);
    hourUp();
  }
}

void readMinuteButton() {
  if (digitalRead(MINUTE_BUTTON) == HIGH) {
    delay(200);
    minuteUp();
  }
}

void hourUp() {
  hour = hour + 1;
  if (hour > 12) {
    lcd.clear();
    hour = 1;
    if(am == 1) am = 0;
    else am = 1;
  }
}

void minuteUp() {
  minute = minute + 1;
  if (minute > 59) {
    minute = 0;
    hourUp();
  }
}

شرح الكود :

في البداية نقوم بإضافة مكتبة شاشة الـ LCD وتسمية منافذ الأردوينو المستخدمة مع مفاتيح الضبط :

#include <LiquidCrystal.h>

#define HOUR_BUTTON 6
#define MINUTE_BUTTON 7

ثم نقوم نقوم بالإعلان عن بعض الثوابت التي سيتم استخدامها لاحقا :

#define TICK_LENGTH 60000
#define CHECK_TIME 250

بعد ذلك نقوم بالإعلان عن بعض المتغيرات. يستخدم المتغير minute لحفظ الدقائق. والمتغير hour لحفظ الساعات. والمتغير am لتسجيل ما إذا كان التوقيت صباحا أم مساءاً. وسيتم تسجيل الوقت الخاص بأخر مرة تم حساب التوقيت في المتغير previousMillis .

unsigned int minute = 0;
unsigned int hour = 01;
unsigned long previousMillis = 0;
unsigned char am = 1;

في الدالة ()setup قمنا بضبط الاعدادات اللازمة للمشروع مثل ضبط ارجل الاردوينو كمخارج للمفاتيح وتشغيل الشاشة LCD :

void setup() {
  // put your setup code here, to run once:
  lcd.begin(16, 2);
  pinMode(HOUR_BUTTON, INPUT);
  pinMode(MINUTE_BUTTON, INPUT);
}

في الدلة ()loop، نقوم بحساب عدد الثوان التي مرت، فإذا كانت 60 ثانية نقوم بزيادة عدد الدقائق في المتغير minute. كما نقوم بإختبار الدقائق التي مرت، فعند مرور 60 دقيقة نقوم بزيادة عدد الساعات في المتغير hour. ثم نقوم بالنهاية بعرض الدقائق والساعات على شاشة الـ LCD.

أيضا اثناء الإختبار نقوم بإختبار المفاتيح إذا ما تم الضغط عليها ام لا عبر استدعاء الدالة ()checkTick . فإذا تم الضغط على مفتاح الدقائق نقوم بزيادة عدد الدقائق في المتغير minute، ويعمل بنفس الطريقة عند الضغط على مفتاح الساعات.

void loop() {
  // put your main code here, to run repeatedly:
  checkTick();
  lcd.setCursor(0,0);
  lcd.print("Time:");
  lcd.setCursor(6,1);
  lcd.print(hour);
  lcd.print(":");
  lcd.print(minute);
  if(am == 1) lcd.print(" AM");
  else lcd.print(" PM");
}

سنقوم بعمل عدد من الدوال المستخدمة في المشروع :

الدالة ()checkTick ، في كل مرة يتم استدعائها تقوم بحفظ الوقت الذي مضى منذ عمل Reset للأردوينو. ثم تتم مقارنة الوقت الحالي بقيمة مسبقة فإذا اصبح الفارق بين التوقيتين يتعدى الـ TICK_LENGTH الذي تم تحديده في أول البرنامج، فهذا يعني انه قد مرة دقيقة فنقوم بزيادتها بإستخدام الدالة ()tick. ثم نقوم بتسجيل هذا التوقيت لإستخدامه مرة ارخى لمعرفة هل مر دقيقة أخرى ام لا.

 unsigned long currentMillis = millis();
   
   if ((unsigned long)(currentMillis - previousMillis) >= TICK_LENGTH) {
      tick();
      previousMillis = currentMillis;
   }

ايضا يتم التحقق ما إذا تعدى الفارق في التوقيت قيمة CHECK_TIME ، فعندها نقوم بقراءة المفاتيح المستخدمة في تعديل التوقيت.

   if((unsigned long)(currentMillis - previousMillis) >= CHECK_TIME){
      readHourButton();
      readMinuteButton();
   }

الدالة ()tick، تقوم بإستدعاء الدالة ()minuteUp، والتي بدورها تقوم بزيادة عداد الدقائق.

void tick() {
  minuteUp();
}

 

الدالة ()readHourtButton تقوم بقراءة المفتاح الخاص بتعديل خانة الساعات فإذا تم الضغط عليه تقوم بتشغيل الدالة ()hourUp التي تقوم بزيادة عداد الساعات.

void readHourButton() {
  if (digitalRead(HOUR_BUTTON) == HIGH) {
    delay(200);
    hourUp();
  }
}

الدالة readMinuteButton() تقوم بقراءة المفتاح الخاص بتعديل خانة الدقائق فإذا تم الضغط عليه تقوم بإستدعاء دالة ()minuteUp التي تقوم بزيادة عداد الدقائق.

void readMinuteButton() {
  if (digitalRead(MINUTE_BUTTON) == HIGH) {
    delay(200);
    minuteUp();
  }
}

الدالة hourUp() في كل مرة يتم إستعداء هذه الدالة تقوم بزيادة عداد الساعات بمقدار واحد وعمل اختبار اذا كان التوقيت تغير من الصباح إلى المساء .

void hourUp() {
  hour = hour + 1;
  if (hour > 12) {
    lcd.clear();
    hour = 1;
    if(am == 1) am = 0;
    else am = 1;
  }
}

الداله minuteUp() في كل مرة يتم إستدعائها تقوم بزيادة عداد الدقائق بمقدار واحد وعمل اختبار اذا وصل عداد الدقائق الى 60 تقوم بتصفير عداد الدقائق و زيادة عداد الساعات بمقدار واحد .

void minuteUp() {
  minute = minute + 1;
  if (minute > 59) {
    minute = 0;
    hourUp();
  }
}



اردوينو – الدرس الثاني عشر – التحكم بشاشة LCD (الجزء الأول)

مقدمة

في هذا الدرس ستتعلم تركيب وتشغيل شاشة LCD.

الشاشة الكرستالية LCD  تمتلك اضاءة خلفية وتعرض سطرين، كل سطر يحتوى على 16 حرف كحد أقصى.

arduino-lesson-12-lcd

المواد والأدوات

lcd

LCD Display (16×2 characters)

arduino-lesson-12-lcd

1× مقاوم متغير 10kΩ variable resistor (pot)

Half-size Breadboard

1× لوحة التجارب (Half-size Breadboard)

Arduino Uno R3

 1× اردوينو اونو

Jumper wire pack

حزمة أسلاك توصيل (ذكر-ذكر)

Arduino cable

1× سلك اردوينو
220-ohm

1 × مقاومة 220

تلحيم رؤوس التوصيل للشاشة LCD

قد تجد أن الشاشة لا تمتلك رؤوس ‘pins’ ليتم تركيبها على لوح التجارب كما تجري العاده لبعض القطع الالكترونية الاخرى كالازرار مثلاً.

الشاشة تحتاج إلى 16 رأس توصيل، لذا ان كنت نمتلك شريط رؤوس أكثر من ذلك، ما عليك سوى قصها ليكون مجموعها 16 رأس فقط.

LCD Pins

ضع الشاشة على شريط الرؤوس (الجهة الأقصر) ولحّم كل رأس على حدة كما في الصورة التالية: (كن حذرًا)

LCD pins soldering

توصيل الدائرة

شاشة الـ LCD تحتاج إلى 6 منافذ رقمية  ‘digital pins’ من الأردوينو  كمخارج رقمية ‘digital outputs’ .

كما تحتاج لطاقة 5V و مخرج أرضي GND.

Lcd

هنالك بعض التوصيلات التي عليك ربطها، لذلك من الأفضل أن تضع شاشة الـLCD بمحاذاة لوح التجارب حتى نتعقب التوصيلات بشكل صحيح كما في صورة التصميم السابقة.
تذكر أن السلك الأصفر الطويل هو ما يربط المقاوم المتغير بمنفذ pin 3  لشاشة الـLCD. المقاوم المتغير وظيفته هنا هي لتغيير درجة سطوع الشاشة.

arduino-lesson-12-lcd

الكود البرمجي

برنامج الأردوينو IDE يحتوى على مكتبة من الأمثلة خاصة بإستخدام شاشة الـLCD والتي ستقوم باستخدام احدها الآن.
تستطيع ان تجدها عبر الذهاب إلى:
File> Examples> Liquid Crystal > HelloWorld

#include <LiquidCrystal.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}
void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis() / 1000);
}

هنا استخدمنا منافذ مختلفة من لوحة الاردوينو.

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

هذا السطر يطلب من الأردوينو استعمال مكتبة الشاشة الكرستالية  (حتى يستطيع الأردوينو من استيعاب الاوامر الخاصة بالشاشة)

#include <LiquidCrystal.h>

هذا السطر يوضح أي من منافذ الأردوينو التي قمت بإستخدامها للربط مع منافذ (رؤوس) الشاشة:

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;

في دالة setup هنالك سطرين:

السطر الأول يخبر مكتبة الشاشة الكرستالية العدد الأقصى لخانات السطر الواحد وعدد السطور الأقصى التي تسمح بها الشاشة.
والسطر الثاني لإظهار الجملة التي ترغب بإظهارها في الشاشة.

  lcd.begin(16, 2);
  lcd.print("hello, world!");

في دالة loop هنالك سطرين:

السطر الأول لإعداد المؤشر على الشاشة (حيث ستظهر الجمل التي نرغب بإظهارها)
السطر الثاني لاظهار أجزاء الثانية منذ أن بدأ تشغيل البرنامج على الأردوينو.

  lcd.setCursor(0, 1);
  lcd.print(millis()/1000);

ارفع الكود إلى متحكم الاردوينو وسترى جملة ‘Hello World’ تظهر على الشاشة يتبعها رقم (عداد بدأ من الرقم صفر).

أنشطة أخرى

جرب الضغط على زر الإعادة reset في الاردوينو، ولاحظ أن العداد يبدأ مرة أخرى من الصفر.

يمكنك تغيير اعداد المؤشر (موضع الجملة والرقم).