صنع ساعة توقيت تلقائية للعدائين والرياضيين والرياضيين

جرب أداة القضاء على المشاكل





في هذا المنشور ، سنقوم ببناء ساعة توقيت تبدأ تلقائيًا في تشغيل المؤقت عندما يبدأ العداء في التشغيل ويتوقف المؤقت عندما يصل العداء إلى النهاية. يتم عرض الوقت المنقضي بين نقطة البداية والنهاية على شاشة LCD مقاس 16 × 2.

لنبدأ أولاً بتعلم كيفية تكوين دائرة مراقبة توقف Arduino بسيطة ودقيقة للغاية.



ساعة الإيقاف هي جهاز ساعة توقيت يتم التحكم فيه يدويًا ، وهو مصمم لقياس طول الوقت الذي قد يكون قد انقضى بدءًا من نقطة زمنية معينة عند تنشيطه ، وبحلول الوقت الذي تم فيه إلغاء تنشيطه أخيرًا. يسمى البديل الأكبر من نفس الجهاز ساعة التوقف التي تُستخدم لمراقبة الحركة من مسافة ، وعادة ما توجد في الاستاد الرياضي وما إلى ذلك.

ساعة توقيت ميكانيكية مقابل إلكترونية

في وقت سابق ، كانت ساعة الإيقاف الميكانيكية اليدوية التقليدية أكثر شيوعًا ، ويستخدمها الجميع لهذا الغرض.



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

عملت ساعة الإيقاف الميكانيكية بشكل أساسي من خلال قوة الزنبرك ، والتي تطلبت فترة من التصفية يدويًا عن طريق تدوير المقبض المخرش المعطى أعلى جهاز الساعة.

ومع ذلك ، بالمقارنة مع ساعات التوقف الرقمية الحديثة ، يمكن اعتبار الأنواع الميكانيكية بدائية وغير دقيقة إلى حد كبير في نطاق أجزاء من الثانية.

باستخدام Arduino

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

دائرة مراقبة Arduino المقدمة هنا هي واحدة من هذه التصميمات الحديثة التي تعمل بالمتحكم الدقيق والتي يمكن توقعها بدقة لتكون على قدم المساواة مع أدوات ساعة التوقف التجارية الحديثة.

دعنا نتعلم كيفية بناء دائرة ساعة الإيقاف المقترحة من Arduino:

ستحتاج إلى فاتورة المواد التالية للبناء:

الأجهزة مطلوبة

لوحة مفاتيح Arduino LCD KeyPad Shield (SKU: DFR0009)

لوحة مفاتيح Arduino LCD KeyPad Shield (SKU: DFR0009)

لوحة Arduino ONE

اردوينو UNO

كابل USB من نوع Arduino

كابل usb اردوينو

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

الرمز

/*
Standalone Arduino StopWatch
By Conor M - 11/05/15
Modified by Elac - 12/05/15
*/
// call the necessary libraries
#include
#include
// these are the pins used on the shield for this sketch
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7)
// variables used on more than 1 function need to be declared here
unsigned long start, finished, elapsed
boolean r = false
// Variables for button debounce time
long lastButtonPressTime = 0 // the last time the button was pressed
long debounceDelay = 50 // the debounce time keep this as low as possible
void setup()
{
lcd.begin(16, 2) // inicialize the lcd (16 chars, 2 lines)
// a little introduction :)
lcd.setCursor(4, 0) // set the cursor to first character on line 1 - NOT needed (it sets automatically on lcd.begin()
lcd.print('Arduino')
lcd.setCursor(3, 1) // set the cursor to 4th character on line 2
lcd.print('StopWatch')
delay(2000) // wait 2 seconds
lcd.clear() // clear the display
lcd.print('Press select for')
lcd.setCursor(2, 1) // set the cursor to 3rd character on line 2
lcd.print('Start & Stop')
}
void loop()
{
CheckStartStop()
DisplayResult()
}
void CheckStartStop()
{
int x = analogRead (0) // assign 'x' to the Arduino's AnalogueInputs (Shield's buttons)
if (x 600 ) // if the button is SELECT
{
if ((millis() - lastButtonPressTime) > debounceDelay)
{
if (r == false)
{
lcd.clear()
lcd.setCursor(2, 0) // needed
lcd.print('Elapsed Time')
start = millis() // saves start time to calculate the elapsed time
}
else if (r == true)
{
lcd.setCursor(2, 0) // needed
lcd.print(' Final Time ')
}
r = !r
}
lastButtonPressTime = millis()
}
}
void DisplayResult()
{
if (r == true)
{
finished = millis() // saves stop time to calculate the elapsed time
// declare variables
float h, m, s, ms
unsigned long over
// MATH time!!!
elapsed = finished - start
h = int(elapsed / 3600000)
over = elapsed % 3600000
m = int(over / 60000)
over = over % 60000
s = int(over / 1000)
ms = over % 1000
// display the results
lcd.setCursor(0, 1)
lcd.print(h, 0) // display variable 'h' - the 0 after it is the
number of algorithms after a comma (ex: lcd.print(h, 2) would print
0,00
lcd.print('h ') // and the letter 'h' after it
lcd.print(m, 0)
lcd.print('m ')
lcd.print(s, 0)
lcd.print('s ')
if (h <10)
{
lcd.print(ms, 0)
lcd.print('ms ')
}
}
}

إضافة عرض 7 شرائح

الآن دعنا ننتقل إلى التفاصيل المتعلقة بإنشاء دائرة ساعة توقيت باستخدام شاشة LED ذات 7 مقاطع و Arduino. سنقوم باستكشاف المفاهيم المتعلقة بالمقاطعات والدوائر المتكاملة لبرنامج تشغيل العرض والتي تعتبر ضرورية لفهم هذا المشروع. اقترح هذا المشروع السيد أبو حفص ، وهو أحد القراء النهمين لهذا الموقع.

كما نعلم بالفعل أن Stopwatch هو جهاز يساعد على تتبع فترة وجيزة من الوقت من نطاق ساعات إلى نطاق ملي ثانية (في الغالب). تقريبًا جميع ساعات المعصم الرقمية الرخيصة المزودة بوظيفة ساعة الإيقاف ، ولكن لا يمكن لأي من الساعات أن تعطي الحماس في صنع واحدة لأنفسنا وأيضًا العثور على ساعة توقيت مع شاشة LED ذات 7 أجزاء أمر استثنائي.

اقترح علينا السيد أبو حفص تصميم ساعة توقيت بأربع شاشات ، اثنتان للدقائق واثنتان للثواني (MM: SS). ولكن بالنسبة لمعظمنا ، قد لا يكون تصميمًا ممكنًا ، لذلك أضفنا شاشتين أخريين لنطاق ملي ثانية ، لذا سيكون التصميم المقترح الآن بتكوين MM: SS: mS.

إذا كنت تحتاج فقط إلى تكوين MM: SS لسبب ما ، فلا داعي لتوصيل شاشات العرض المكونة من 7 أجزاء ذات النطاق المللي ثانية و ICs الخاصة ببرنامج التشغيل الخاص بها ، فإن الوظيفة الكاملة للدائرة لا تزال غير متأثرة.

الدائرة:

تتكون ساعة الإيقاف المقترحة من ستة IC 4026 وهي عبارة عن برنامج تشغيل للعرض ذي سبع مقاطع وستة شاشات LED ذات 7 مقاطع ولوحة Arduino واحدة واثنين من أزرار الضغط واثنين من المقاومات 10K.

الآن دعونا نفهم كيفية توصيل IC 4026 بشاشة عرض ذات 7 مقاطع.

يمكن أن تكون شاشة العرض ذات الأجزاء السبعة أي عرض الكاثود المشترك من أي لون. يمكن أن تتعرض الشاشة ذات الأجزاء السبعة للتلف بسهولة عن طريق إمداد 5 فولت ، لذا فإن المقاوم 330 أوم إلزامي في كل جزء من الشاشة.

الآن دعنا نرى الرسم التخطيطي للدبوس IC 4026:

  • الدبوس رقم 1 هو إدخال الساعة.
  • الدبوس رقم 2 معطل على مدار الساعة ، يقوم بتعطيل العد على الشاشة إذا كان هذا الدبوس مرتفعًا.
  • يتم تمكين العرض رقم 3 إذا كان هذا الدبوس منخفضًا ، فسيتم ضبط الشاشة والعكس صحيح.
  • يتم تنفيذ الدبوس رقم 5 ، والذي يصبح مرتفعًا عند احتساب IC لـ 10.
  • الدبابيس 6 ، 7 ، 9 ، 10 ، 11 ، 12 ، 13 هي مخرجات عرض.
  • الرقم 8 هو GND.
  • الدبوس رقم 16 هو Vcc.
  • يتم إعادة تعيين الدبوس رقم 15 ، إذا رفعنا هذا الدبوس ، يتحول العدد إلى الصفر.
  • الدبابيس # 4 و # 14 غير مستخدمة.

عرض مخطط الاتصال:

مخطط اتصال شاشة LCD:

يمكن توصيل أي واحد من دبوس GND لشاشة عرض 7 مقاطع بالأرض. يجب أن يتم تشغيل IC من مصدر 5V أو دبوس إخراج Arduino 5V.

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

هنا بقية التخطيطي:

ساعة توقيت باستخدام اردوينو مع عرض 7 قطاعات

قد يتم تشغيل الدائرة من بطارية 9V. يتوفر الزران هنا أحدهما لبدء الوقت والآخر للتوقف. بالضغط على زر إعادة الضبط في Arduino ، سيتم إعادة تعيين عدد الوقت إلى الصفر على الشاشة.

يتم توصيل زري الضغط بالدبوس رقم 2 ورقم 3 وهما مقاطعة الأجهزة لمتحكم Arduino / Atmega328P.

دعونا نفهم ما هي المقاطعة:

هناك نوعان من المقاطعات: مقاطعة الأجهزة ومقاطعة البرامج. نحن هنا نستخدم فقط مقاطعة الأجهزة.

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

لا يوجد سوى اثنين من دبابيس مقاطعة الأجهزة في لوحات Arduino مع دبوس متحكم ATmega328P # 2 و # 3. يحتوي Arduino mega على أكثر من دبابيس لمقاطعة الأجهزة.

لا تستطيع المتحكمات الدقيقة القيام بوظيفتين في نفس الوقت. على سبيل المثال التحقق من الضغط على الزر وعد الأرقام.

لا يمكن للميكروكونترولر تنفيذ حدثين في وقت واحد ، إذا كتبنا رمزًا للتحقق من الضغط على الزر وعد الأرقام ، فسيتم اكتشاف الضغط على الزر فقط عندما يقرأ المتحكم الدقيق زر الكشف عن الكود ، وباقي الوقت (يحسب الأرقام) زر لا يعمل.

لذلك سيكون هناك تأخير في اكتشاف الضغط على الزر ولسبب ما إذا تم إيقاف الرمز مؤقتًا ، فقد لا يتم اكتشاف الضغط على الزر. لتجنب هذه الأنواع من المشاكل يتم تقديم المقاطعة.

تُمنح إشارة المقاطعة دائمًا أولوية قصوى ، وسيتم إيقاف الوظيفة الرئيسية (الأسطر الرئيسية للشفرة) وتنفذ الوظيفة (جزء آخر من الكود) المعينة لتلك المقاطعة المعينة.

هذا مهم جدًا للتطبيقات ذات الأهمية الزمنية مثل ساعة الإيقاف أو أنظمة الأمان وما إلى ذلك حيث يحتاج المعالج إلى اتخاذ إجراء فوري استجابةً لحدث ما.

في Arduino ، نقوم بتعيين مقاطعة الأجهزة على النحو التالي:

attachInterrupt (0، start، RISING)

  • '0' يعني رقم المقاطعة صفر (في الميكروكونترولر كل شيء يبدأ من الصفر) وهو رقم التعريف الشخصي رقم 2.
  • 'البدء' هو اسم وظيفة المقاطعة ، يمكنك تسمية أي شيء هنا.
  • 'RISING' إذا ارتفع الطرف رقم 2 (الذي يقطع الصفر) ، فسيتم تنفيذ وظيفة المقاطعة.

مرفق المقاطعة (1 ، توقف ، صعود)

  • '1' يعني رقم المقاطعة الأول وهو رقم التعريف الشخصي رقم 3.
  • 'Stop' هو اسم المقاطعة.

يمكننا أيضًا استبدال 'RISING' بـ 'FALLING' ، الآن عندما ينتقل دبوس المقاطعة إلى LOW ، يتم تنفيذ وظيفة المقاطعة.

يمكننا أيضًا استبدال 'RISING' بـ 'CHANGE' ، الآن كلما انتقل دبوس المقاطعة من مرتفع إلى منخفض أو منخفض إلى مرتفع ، يتم تنفيذ وظيفة المقاطعة.

يمكن تعيين وظيفة المقاطعة على النحو التالي:

البداية الباطلة () // البداية هي اسم المقاطعة.

{

// البرنامج هنا

}

يجب أن تكون وظيفة المقاطعة قصيرة قدر الإمكان ولا يمكن استخدام وظيفة التأخير ().

يخلص هذا إلى أنه سيتم شرح مقاطعة برنامج مقاطعة الأجهزة المتعلقة بـ Arduino في المقالة المستقبلية.

أنت تعرف الآن سبب توصيل أزرار البدء والإيقاف لمقاطعة المسامير.

قم بتوصيل الدائرة وفقًا للرسم التخطيطي ، فإن بقية الدائرة لا تحتاج إلى شرح.

برنامج:

//----------------Program Developed by R.GIRISH---------------//
int vmin = 0
int vsec = 0
int vms = 0
boolean Run = false
const int Min = 7
const int sec = 6
const int ms = 5
const int reset_pin = 4
void setup()
{
pinMode(Min, OUTPUT)
pinMode(sec, OUTPUT)
pinMode(ms, OUTPUT)
pinMode(reset_pin, OUTPUT)
digitalWrite(Min, LOW)
digitalWrite(sec, LOW)
digitalWrite(ms, LOW)
digitalWrite(reset_pin, HIGH)
digitalWrite(reset_pin, LOW)
attachInterrupt(0, start, RISING)
attachInterrupt(1, Stop, RISING)
}
void loop()
{
if (Run)
{
vms = vms + 1
digitalWrite(ms, HIGH)
delay(5)
digitalWrite(ms, LOW)
delay(5)
if (vms == 100)
{
vsec = vsec + 1
digitalWrite(sec, HIGH)
digitalWrite(sec, LOW)
vms = 0
}
if (vsec == 60)
{
vmin = vmin + 1
digitalWrite(Min, HIGH)
digitalWrite(Min, LOW)
digitalWrite(reset_pin, HIGH)
digitalWrite(reset_pin, LOW)
vsec = 0
}
}
}
void start()
{
Run = true
}
void Stop()
{
Run = false
}
//----------------Program Developed by R.GIRISH---------------//

الآن هذا يختتم الكود.

ساعة توقيت تم تطويرها خصيصًا للرياضيين

أخيرًا ، لنتعرف على كيفية ترقية كاميرا المفاهيم المذكورة أعلاه للرياضيين الذين يرغبون في تطوير مهاراتهم في الجري دون الاعتماد على الآخرين في البداية الضرورية وإيقاف المؤقت / ساعة الإيقاف. من الأفضل بدء تشغيل المؤقت تلقائيًا عن طريق اكتشاف حركتك بدلاً من قيام شخص ما ببدء / إيقاف ساعة الإيقاف ، مما قد يضيف وقت رد الفعل أيضًا.

ملاحظة: تم تصميم هذا المشروع لقياس الوقت بين النقطة 'أ' والنقطة 'ب' التي يغطيها مستخدم واحد في كل مرة.

يتكون الإعداد من جهازي ليزر موضوعين عند نقطة البداية ونقطة النهاية ، كما يتم وضع اثنين من LDRs مقابل وحدتي ليزر. عندما يقاطع اللاعب ليزر 'البداية' ، يبدأ الوقت في الحساب وعندما يصل الرياضي إلى النهاية ، يقطع الليزر 'الإنهاء' ويتوقف المؤقت ويعرض الوقت المنقضي بين نقطتين. هذه هي الطريقة المستخدمة لقياس الوقت المنقضي في الفكرة المقترحة.

دعونا نلقي نظرة على كل مكون من مكونات الدائرة بالتفصيل.

تفاصيل عمل المكونات

تظل الدائرة بسيطة إلى حد ما ، فهي تتكون من وحدة LCD مقاس 16 × 2 وعدد قليل من المقاومات واثنين من LDRs وزر ضغط.

تعد الواجهة بين LCD و arduino قياسية يمكننا أن نجد اتصالًا مشابهًا في العديد من المشاريع القائمة على شاشات LCD.

يتم استخدام دبابيس تماثلية A0 و A1 لاكتشاف انقطاع الليزر. يتم توصيل الدبوس التناظري A2 بواسطة زر ضغط يستخدم لتسليح ساعة الإيقاف.

ثلاثة مقاومات ، اثنان 4.7 كيلو وواحد 10 كيلو مقاومات منسدلة مما يساعد دبابيس الإدخال على البقاء عند مستوى منخفض.

يتم توفير مقياس جهد 10K لضبط التباين في وحدة LCD للحصول على رؤية مثالية.

الدائرة المقترحة مصممة بآلية الكشف عن الأعطال لليزر. إذا كان أي من أجهزة الليزر معيبًا أو لم يتم محاذاته بشكل صحيح مع LDR ، فإنه يعرض رسالة خطأ على شاشة LCD.

· إذا كان START laser لا يعمل ، فإنه يعرض 'بدء الليزر لا يعمل'

· إذا كان الليزر STOP لا يعمل ، فإنه يعرض 'توقف' الليزر لا يعمل '

· إذا كان كلا الليزر لا يعمل ، فإنه يعرض 'كلا الليزرين لا يعملان'

· إذا كان كلا الليزرين يعملان بشكل صحيح ، فإنه يعرض 'كلا الليزرين يعملان بشكل جيد'

تظهر رسالة الخطأ حتى يتم إصلاح وحدة الليزر أو إجراء المحاذاة بشكل صحيح باستخدام LDR.

بمجرد خلو هذه الخطوة من المشكلة ، ينتقل النظام إلى وضع الاستعداد ويعرض '-system standby-'. في هذه المرحلة ، يمكن للمستخدم تسليح الإعداد بالضغط على زر الضغط في أي وقت.

بمجرد الضغط على زر الدفع ، يكون النظام جاهزًا لاكتشاف الحركة من المستخدم ويعرض 'النظام جاهز'.

قد يكون العداء على بعد بوصات قليلة من ليزر 'البداية'.

إذا تمت مقاطعة ليزر 'البدء' ، يبدأ الوقت في العد ويظهر 'يتم حساب الوقت ……' يتم حساب الوقت في الخلفية.

لن يتم عرض الوقت المنقضي حتى يصل العداء / يقطع ليزر 'التوقف'. هذا لأن عرض الوقت المنقضي على شاشة LCD كما تفعل ساعة الإيقاف التقليدية ، يتطلب عدة تعليمات إضافية ليتم تنفيذها في وحدة التحكم الدقيقة ، مما يؤدي إلى تدهور دقة الإعداد بشكل كبير.

ملاحظة: اضغط على زر إعادة الضبط على اردوينو لمسح القراءات.

كيفية ضبط الدائرة على مسار الجري:

يرجى استخدام أسلاك سميكة للتوصيل بين LDRs ودائرة اردوينو حيث قد تكون المسافة بين هذين الأمتار عدة أمتار ، ويجب ألا ينخفض ​​الجهد بشكل كبير. يمكن أن تكون المسافة بين LDR1 و LDR2 بضع مئات من الأمتار كحد أقصى.

كيفية تركيب LDR:

يجب تثبيت LDR داخل أنبوب مجوف معتم ويجب أيضًا تغطية الجزء الأمامي وفقط ثقب بقطر بضعة ملليمترات للسماح بدخول شعاع الليزر.

يجب حماية LDR من أشعة الشمس المباشرة حيث لا يمكن تمييزه عن شعاع الليزر ومصدر الضوء الآخر وقد لا يسجل الحركة من المستخدم.

كود البرنامج:

//-------- Program developed by R.GIRISH-------//
#include
LiquidCrystal lcd(12,11,5,4,3,2)
int strt = A0
int stp = A1
int btn = A2
int M = 0
int S = 0
int mS = 0
float dly = 10.0
void setup()
{
lcd.begin(16,2)
pinMode(strt,INPUT)
pinMode(stp,INPUT)
pinMode(btn,INPUT)
}
void loop()
{
if(digitalRead(strt)==HIGH && digitalRead(stp)==HIGH)
{
lcd.setCursor(0,0)
lcd.print('Both lasers are')
lcd.setCursor(0,1)
lcd.print(' working fine')
delay(4000)
{
while(digitalRead(btn)==LOW)
{
lcd.clear()
lcd.print('-System Standby-')
lcd.setCursor(0,1)
lcd.print('Press Start btn')
delay(100)
}
lcd.clear()
lcd.setCursor(0,0)
lcd.print('System is ready')
lcd.setCursor(0,1)
lcd.print('----------------')
while(digitalRead(strt)==HIGH)
{
delay(1)
}
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Time is being')
lcd.setCursor(0,1)
lcd.print('Calculated......')
while(digitalRead(stp)==HIGH)
{
delay(dly)
mS = mS+1
if(mS==100)
{
mS=0
S = S+1
}
if(S==60)
{
S=0
M = M+1
}
}
while(true)
{
lcd.clear()
lcd.setCursor(0,0)
lcd.print(M)
lcd.print(':')
lcd.print(S)
lcd.print(':')
lcd.print(mS)
lcd.print(' (M:S:mS)')
lcd.setCursor(0,1)
lcd.print('Press Reset')
delay(1000)
}
}
}
if(digitalRead(strt)==HIGH && digitalRead(stp)==LOW)
{
lcd.setCursor(0,0)
lcd.print(''Stop' laser is')
lcd.setCursor(0,1)
lcd.print(' not working')
delay(100)
}
if(digitalRead(strt)==LOW && digitalRead(stp)==HIGH)
{
lcd.setCursor(0,0)
lcd.print(''Start' laser is')
lcd.setCursor(0,1)
lcd.print(' not working')
delay(100)
}
if(digitalRead(strt)==LOW && digitalRead(stp)==LOW)
{
lcd.setCursor(0,0)
lcd.print('Both lasers are')
lcd.setCursor(0,1)
lcd.print(' not working')
delay(100)
}
lcd.clear()
}
//-------- Program developed by R.GIRISH-------//

النموذج الأولي للمؤلف:

الترقية باستخدام خاصية Split Timer

دائرة ساعة الإيقاف التلقائية المقترحة مع مؤقت الانقسام هي امتداد لدائرة ساعة توقيت أوتوماتيكية ، حيث تتعقب ساعة الإيقاف الوقت تلقائيًا بمجرد أن يترك العداء الفردي نقطة البداية ويتوقف المؤقت ويظهر الوقت المنقضي عندما يصل العداء إلى نقطة النهاية.

مقدمة

تم اقتراح هذا المشروع من قبل أحد القراء المتحمسين لهذا الموقع السيد أندرو والكر.

في هذا المشروع ، نقدم 4 LDRs أخرى لقياس الوقت المنقسم للعداء الفردي. هناك 6 LDRs إجمالاً يمكن وضعها جميعًا في مضمار الجري بمسافة موحدة بينها أو حسب الظروف واختيار المستخدم.

يتم الاحتفاظ بمعظم الأجهزة دون تغيير باستثناء إضافة 4 LDRs ، لكن الكود خضع لتعديل كبير.

رسم تخطيطي يوضح تقسيم الوقت:

ساعة توقيت أوتوماتيكية مع تقسيم الوقت

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

كيفية توصيل LDRs:

يظهر LDR 2 على مخطط الدائرة الرئيسي ، قم بتوصيل 4 LDRs أخرى بالتوازي كما هو موضح في الرسم البياني أعلاه.

مخطط التخطيط:

ما سبق هو الترتيب الأساسي لكيفية وضع الليزر. يرجى ملاحظة أن المسافة بين LDRs يمكن أن يختارها المستخدم حسب طول المسار.

برنامج:

//------------Developed By R.Girish-------//
#include
LiquidCrystal lcd(12,11,5,4,3,2)
const int start = A2
const int strt = A0
const int END = A1
boolean y = true
boolean x = true
unsigned int s1 = 0
unsigned int s2 = 0
unsigned int s3 = 0
unsigned int s4 = 0
unsigned int s5 = 0
unsigned int m1 = 0
unsigned int m2 = 0
unsigned int m3 = 0
unsigned int m4 = 0
unsigned int m5 = 0
unsigned int ms1 = 0
unsigned int ms2 = 0
unsigned int ms3 = 0
unsigned int ms4 = 0
unsigned int ms5 = 0
unsigned int S = 0
unsigned int M = 0
unsigned int mS = 0
unsigned int count = 0
void setup()
{
lcd.begin(16,2)
pinMode(start, INPUT)
pinMode(strt, INPUT)
pinMode(END, INPUT)
if(digitalRead(strt) == LOW)
{
while(true)
{
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Start Laser is')
lcd.setCursor(0,1)
lcd.print(' not working')
delay(2500)
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Please align the')
lcd.setCursor(0,1)
lcd.print('lasers properly')
delay(2500)
lcd.clear()
lcd.setCursor(0,0)
lcd.print('and press reset.')
delay(2500)
}
}
if(digitalRead(END) == LOW)
{
while(true)
{
lcd.clear()
lcd.setCursor(0,0)
lcd.print('All 5 lasers')
lcd.setCursor(0,1)
lcd.print('are misaligned')
delay(2500)
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Please align the')
lcd.setCursor(0,1)
lcd.print('lasers properly')
delay(2500)
lcd.clear()
lcd.setCursor(0,0)
lcd.print('and press reset.')
delay(2500)
}
}
lcd.clear()
lcd.setCursor(0,0)
lcd.print('-System Standby-')
lcd.setCursor(0,1)
lcd.print('Press Start btn')
if(digitalRead(start) == LOW)
{
while(x)
{
if(digitalRead(start) == HIGH)
{
x = false
}
}
}
lcd.clear()
lcd.setCursor(0,0)
lcd.print('System is ready')
lcd.setCursor(0,1)
lcd.print('----------------')
while(y)
{
if(digitalRead(strt) == LOW)
{
y = false
}
}
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Time is being')
lcd.setCursor(0,1)
lcd.print('Calculated....')
mS = 12
}
void loop()
{
delay(1)
mS = mS + 1
if(mS==1000)
{
mS=0
S = S+1
}
if(S==60)
{
S=0
M = M+1
}
if(digitalRead(END) == LOW)
{
count = count + 1
if(count == 1)
{
ms1 = mS
s1 = S
m1 = M
delay(500)
}
if(count == 2)
{
ms2 = mS
s2 = S
m2 = M
delay(500)
}
if(count == 3)
{
ms3 = mS
s3 = S
m3 = M
delay(500)
}
if(count == 4)
{
ms4 = mS
s4 = S
m4 = M
delay(500)
}
if(count == 5)
{
ms5 = mS
s5 = S
m5 = M
Display()
}
}
}
void Display()
{
ms1 = ms1 + 500
ms2 = ms2 + 500
ms3 = ms3 + 500
ms4 = ms4 + 500
ms5 = ms5 + 500
if(ms1 >= 1000)
{
ms1 = ms1 - 1000
s1 = s1 + 1
if(s1 >= 60)
{
m1 = m1 + 1
}
}
if(ms2 >= 1000)
{
ms2 = ms2 - 1000
s2 = s2 + 1
if(s2 >= 60)
{
m2 = m2 + 1
}
}
if(ms3 >= 1000)
{
ms3 = ms3 - 1000
s3 = s3 + 1
if(s3 >= 60)
{
m3 = m3 + 1
}
}
if(ms4 >= 1000)
{
ms4 = ms4 - 1000
s4 = s4 + 1
if(s4 >= 60)
{
m4 = m4 + 1
}
}
if(ms5 >= 1000)
{
ms5 = ms5 - 1000
s5 = s5 + 1
if(s5 >= 60)
{
m5 = m5 + 1
}
}
while(true)
{
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Spilt 1)')
lcd.print(m1)
lcd.print(':')
lcd.print(s1)
lcd.print(':')
lcd.print(ms1)
lcd.setCursor(0,1)
lcd.print('Split 2)')
lcd.print(m2)
lcd.print(':')
lcd.print(s2)
lcd.print(':')
lcd.print(ms2)
delay(2500)
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Split 3)')
lcd.print(m3)
lcd.print(':')
lcd.print(s3)
lcd.print(':')
lcd.print(ms3)
lcd.setCursor(0,1)
lcd.print('Split 4)')
lcd.print(m4)
lcd.print(':')
lcd.print(s4)
lcd.print(':')
lcd.print(ms4)
delay(2500)
lcd.clear()
lcd.setCursor(0,0)
lcd.print('Split 5)')
lcd.print(m5)
lcd.print(':')
lcd.print(s5)
lcd.print(':')
lcd.print(ms5)
lcd.setCursor(0,1)
lcd.print('---Press Reset--')
delay(2500)
}
}
//------------Developed By R.Girish-------//

كيفية تشغيل ساعة التوقيت التلقائية هذه:

• بعد اكتمال الإعداد ، قم بتشغيل الليزر أولاً ثم قم بتشغيل دائرة Arduino بعد ذلك.
• إذا تمت محاذاة جميع أنواع الليزر بشكل صحيح مع LDRs ، فلن تظهر رسائل خطأ على الشاشة. إذا وجدت ، يرجى محاذاتها بشكل صحيح.
• الآن تعرض الدائرة 'النظام في وضع الاستعداد'. الآن اضغط على زر 'ابدأ' وسيعرض 'النظام جاهز'.
• في هذه المرحلة عندما يقاطع اللاعب الفردي شعاع الضوء LDR 1 ، يبدأ المؤقت ويعرض 'يتم حساب الوقت ...'
• بمجرد أن يصل المشغل إلى نقطة النهاية ، أي LDR 6 ، يتوقف المؤقت ويعرض 5 فترات الانقسام التي سجلتها الدائرة.
• يجب على المستخدم الضغط على زر إعادة الضبط على اردوينو لإعادة ضبط المؤقت.
لماذا لا تستطيع ساعة الإيقاف التلقائية إظهار التوقيت المباشر على الشاشة كما تفعل ساعة الإيقاف التقليدية (ولكنها تعرض نصًا ثابتًا 'يتم حساب الوقت ...')؟
لعرض التوقيت في الوقت الفعلي ، يتعين على Arduino تنفيذ تعليمات إضافية لشاشة LCD. سيؤدي ذلك إلى إضافة بضع ميكروثانية إلى بضع ميلي ثانية من التأخير إلى جزء تتبع الوقت الرئيسي من الشفرة ، مما يؤدي إلى نتائج غير دقيقة.

إذا كان لديك أي استفسارات أخرى ، فيرجى التعبير عنها من خلال قسم التعليقات.




السابق: ورقة بيانات Arduino LCD KeyPad Shield (SKU: DFR0009) التالي: Arduino Random RGB Light Generator Circuit