جدول المحتويات:

ساعة رقمية على Arduino باستخدام آلة الحالة المحدودة: 6 خطوات
ساعة رقمية على Arduino باستخدام آلة الحالة المحدودة: 6 خطوات

فيديو: ساعة رقمية على Arduino باستخدام آلة الحالة المحدودة: 6 خطوات

فيديو: ساعة رقمية على Arduino باستخدام آلة الحالة المحدودة: 6 خطوات
فيديو: أعلى مستوى وصلتوا في البرمجة 2024, شهر نوفمبر
Anonim
ساعة رقمية على Arduino باستخدام آلة الحالة المحدودة
ساعة رقمية على Arduino باستخدام آلة الحالة المحدودة

مرحبًا ، سأوضح لك كيف يمكن إنشاء ساعة رقمية باستخدام أدوات YAKINDU Statechart وتشغيلها على Arduino ، الذي يستخدم لوحة مفاتيح LCD.

النموذج الأصلي للساعة الرقمية مأخوذ من David Harel. لقد نشر ورقة حول

"[…] امتداد واسع للشكليات التقليدية لآلات الدولة ومخططات الدولة."

في هذه الورقة ، استخدم مثال الساعة الرقمية في بحثه. لقد استخدمتها كمصدر إلهام وأعدت تصميم الساعة باستخدام YAKINDU Statechart Tools (أداة لإنشاء نماذج رسومية لآلات الحالة وإنشاء كود C / C ++ معها) وأعدتها إلى الحياة على Arduino.

اللوازم

المعدات:

  • اردوينو أونو أو ميجا
  • شاشة LCD Keypad Shield

برمجة:

  • YAKINDU Statechart Tools
  • Eclipse C ++ IDE لـ Arduino

الخطوة 1: كيف تعمل الساعة الرقمية

Image
Image

لنبدأ بتحديد كيفية عمل الساعة الرقمية. هل تتذكر هذه … دعنا نقول … الساعات الرقمية "الرائعة جدًا" التي كان الجميع قد عاد إليها في التسعينيات؟ ساعة توقيت متكاملة ، منبهات مختلفة وصوتها المزعج كل ساعة كاملة. إذا لم يكن كذلك ، فقم بإلقاء نظرة: 90 ساعة رقمية.

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

  • عرض الوقت (الساعة)
  • عرض التاريخ (التاريخ)
  • ضبط المنبه (المنبه 1 ، المنبه 2)
  • تمكين / تعطيل الرنين (ضبط الرنين)
  • استخدم ساعة الإيقاف (Stop Watch)

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

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

الخطوة 2: آلة الدولة

درع لوحة مفاتيح LCD
درع لوحة مفاتيح LCD

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

ينقسم النموذج إلى جزأين - رسومي ونصي. في الجزء النصي ، سيتم تحديد الأحداث والمتغيرات وما إلى ذلك. في الجزء الرسومي - مخطط الحالة - يتم تحديد التنفيذ المنطقي للنموذج. لإنشاء آلة حالة ، تحقق السلوك المحدد ، يلزم إدخال بعض أحداث الإدخال ، والتي يمكن استخدامها في النموذج: onoff ، و set ، و mode ، و light ، و light_r. ضمن قسم التعريف ، يتم استخدام حدث داخلي ، والذي يزيد من قيمة الوقت كل 100 مللي ثانية:

كل 100 مللي ثانية / مرة + = 1

بناءً على خطوات 100 مللي ثانية ، سيتم حساب الوقت الحالي بتنسيق HH: MM: SS:

display.first = (time / 36000)٪ 24 ؛

display.second = (time / 600)٪ 60 ؛ العرض الثالث = (الوقت / 10)٪ 60 ؛

سيتم توصيل القيم بشاشة LCD باستخدام تحديث التشغيل في كل مرة يتم استدعاء جهاز الحالة:

display.updateLCD (display.first ، display.second ، display.th third ، display.text)

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

الخطوة 3: LCD Keypad Shield

يعد LCD Keypad Shield رائعًا جدًا للمشروعات البسيطة ، والتي تتطلب شاشة للتصور وبعض الأزرار كمدخلات - واجهة HMI بسيطة نموذجية (واجهة الإنسان والآلة). يحتوي LCD Keypad Shield على خمسة أزرار للمستخدم وآخر لإعادة التعيين. الأزرار الخمسة جميعها متصلة بدبوس A0 في Arduino. كل واحد منهم متصل بمقسم الجهد ، والذي يسمح بالتمييز بين الأزرار.

يمكنك استخدام analogRead (0) للعثور على القيم المحددة ، والتي يمكن بالطبع أن تختلف باختلاف الشركة المصنعة. يعرض هذا المشروع البسيط القيمة الحالية على شاشة LCD:

# تضمين "Arduino.h"

# تتضمن "LiquidCrystal.h" LiquidCrystal lcd (8 ، 9 ، 4 ، 5 ، 6 ، 7) ؛ إعداد باطل () {lcd.begin (16، 2) ؛ lcd.setCursor (0 ، 0) ؛ lcd.write ("القيمة المقاسة") ؛ } حلقة فارغة () {lcd.setCursor (0، 1)؛ lcd.print ("") ؛ lcd.setCursor (0 ، 1) ؛ lcd.print (analogRead (0)) ؛ تأخير (200) ؛ }

هذه هي نتائجي التي تم قياسها:

  • لا شيء: 1023
  • اختر: 640
  • اليسار: ٤١١
  • للأسفل: 257
  • لأعلى: 100
  • اليمين: 0

باستخدام هذه العتبات ، يمكن قراءة الأزرار:

#define NONE 0 # حدد SELECT 1 #define LEFT 2 #define DOWN 3 #define UP 4 #define RIGHT 5 static int readButton () {int result = 0 ؛ النتيجة = analogRead (0) ؛ إذا (نتيجة <50) {return RIGHT؛ } if (نتيجة <150) {return UP؛ } if (نتيجة <300) {return DOWN؛ } إذا (نتيجة <550) {إرجاع LEFT؛ } if (نتيجة <850) {return SELECT؛ } إرجاع NONE؛ }

الخطوة 4: الربط بين آلة الدولة

التواصل مع آلة الدولة
التواصل مع آلة الدولة

يوفر كود C ++ الذي تم إنشاؤه لجهاز الحالة واجهات ، والتي يجب تنفيذها للتحكم في جهاز الحالة. تتمثل الخطوة الأولى في ربط الأحداث بمفاتيح Keypad Shield. لقد أوضحت بالفعل كيفية قراءة الأزرار ، ولكن من أجل ربطها بجهاز الحالة ، فإن إلغاء الأزرار مطلوب - وإلا ، فسيتم رفع الأحداث عدة مرات ، مما يؤدي إلى سلوك غير متوقع. إن مفهوم رفض البرامج ليس بجديد. يمكنك إلقاء نظرة على وثائق Arduino.

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

int oldState = NONE؛ static void liftEvents () {int buttonPressed = readButton ()؛ تأخير (80) ؛ oldState = buttonPressed ؛ if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button () -> lift_mode ()؛ استراحة؛ } الحالة اليسرى: {stateMachine-> getSCI_Button () -> lift_set () ؛ استراحة؛ } الحالة DOWN: {stateMachine-> getSCI_Button () -> lift_light () ؛ استراحة؛ } الحالة UP: {stateMachine-> getSCI_Button () -> lift_light_r () ؛ استراحة؛ } الحالة RIGHT: {stateMachine-> getSCI_Button () -> lift_onoff ()؛ استراحة؛ } الافتراضي: {break؛ }}}}

الخطوة 5: توصيل الأشياء معًا

البرنامج الرئيسي يستخدم ثلاثة أجزاء:

  • آلة الدولة
  • مؤقت
  • معالج شاشة (طباعة شاشة LCD نموذجية (…))

DigitalWatch * stateMachine = new DigitalWatch () ؛ CPPTimerInterface * timer_sct = new CPPTimerInterface () ؛ DisplayHandler * displayHandler = new DisplayHandler () ؛

تستخدم آلة الحالة معالج عرض وتحصل على مؤقت ، والذي سيتم تحديثه للتحكم في الأحداث الموقوتة. بعد ذلك ، يتم تهيئة آلة الحالة وإدخالها.

إعداد باطل () {stateMachine-> setSCI_Display_OCB (displayHandler) ؛ stateMachine-> setTimer (timer_sct) ؛ stateMachine-> init () ؛ stateMachine-> أدخل () ؛ }الحلقة تفعل ثلاثة أشياء:

  • رفع أحداث الإدخال
  • احسب الوقت المنقضي وقم بتحديث المؤقت
  • اتصل بجهاز الدولة

الوقت الحالي الطويل = 0 ؛ وقت_دورة_الأخيرة الطويلة = 0 ؛ حلقة باطلة () {liftEvents () ، وقت_دورة_الأخيرة = الوقت الحالي ؛ current_time = مللي () ؛ timer_sct-> updateActiveTimer (stateMachine ، current_time - last_cycle_time) ؛ stateMachine-> runCycle () ؛ }

الخطوة 6: احصل على المثال

هذا كل شيء. ربما لم أذكر كل تفاصيل التنفيذ ، ولكن يمكنك إلقاء نظرة على المثال أو ترك تعليق.

أضف المثال إلى IDE قيد التشغيل باستخدام: ملف -> جديد -> مثال -> أمثلة YAKINDU Statechart -> التالي -> Arduino - Digital Watch (C ++)

> يمكنك تنزيل IDE من هنا <<

يمكنك البدء بتجربة مدتها 30 يومًا. بعد ذلك ، يجب أن تحصل على ترخيص مجاني للاستخدام غير التجاري!

موصى به: