فهرست مطالب:

ساعت دیجیتال در آردوینو با استفاده از ماشین حالت محدود: 6 مرحله
ساعت دیجیتال در آردوینو با استفاده از ماشین حالت محدود: 6 مرحله

تصویری: ساعت دیجیتال در آردوینو با استفاده از ماشین حالت محدود: 6 مرحله

تصویری: ساعت دیجیتال در آردوینو با استفاده از ماشین حالت محدود: 6 مرحله
تصویری: 😉 وقتی شوهرش سرکاره، ربات مرد تمام خواسته های زن را برآورده می کند 2024, نوامبر
Anonim
ساعت دیجیتال در آردوینو با استفاده از ماشین حالت محدود
ساعت دیجیتال در آردوینو با استفاده از ماشین حالت محدود

سلام ، من به شما نشان می دهم که چگونه می توان یک ساعت دیجیتالی را با YAKINDU Statechart Tools ایجاد کرد و بر روی Arduino کار کرد ، که از یک صفحه نمایش صفحه کلید LCD استفاده می کند.

مدل اصلی ساعت دیجیتال از دیوید هارل گرفته شده است. او مقاله ای درباره

"[…] بسط گسترده فرمالیسم متعارف ماشین های حالت و نمودارهای حالت."

در این مقاله ، او از نمونه ساعت دیجیتال برای تحقیقات خود استفاده کرد. من از آن به عنوان الهام استفاده کرده و ساعت را با YAKINDU Statechart Tools (ابزاری برای ایجاد مدل های گرافیکی ماشین های حالت و تولید کد C/C ++ با آن) بازسازی کرده و با آردوینو به آن زندگی بخشیده ام.

تدارکات

سخت افزار:

  • آردوینو اونو یا مگا
  • محافظ صفحه کلید LCD

نرم افزار:

  • ابزارهای YACINDU Statechart
  • Eclipse C ++ IDE برای آردوینو

مرحله 1: نحوه عملکرد ساعت دیجیتال

Image
Image

بیایید با تعریف نحوه کار ساعت دیجیتال شروع کنیم. آیا اینها را به خاطر می آورید … بگذارید بگوییم … ساعتهای دیجیتالی "فوق العاده جالب" که همه در دهه 90 داشتند؟ کرونومتر یکپارچه ، آلارم های مختلف و بوق آزاردهنده آن در هر ساعت کامل. اگر نه ، نگاهی بیندازید: ساعت دیجیتال دهه 90.

بنابراین اساساً یک ساعت قابل تنظیم با حالت های مختلف است. به طور عمده ، زمان فعلی نمایش داده می شود ، اما برخی ویژگی های دیگر نیز وجود دارد. به عنوان ورودی ، دکمه روشن/خاموش ، حالت و دکمه تنظیم را دارید. علاوه بر این ، می توانید چراغ را خاموش و روشن کنید. با استفاده از دکمه حالت می توانید بین حالت ها تمایز قائل شوید و ویژگی های ساعت را فعال یا غیرفعال کنید:

  • نمایش زمان (ساعت)
  • نمایش تاریخ (تاریخ)
  • تنظیم زنگ هشدار (زنگ هشدار 1 ، زنگ هشدار 2)
  • فعال/غیرفعال کردن زنگ (تنظیم زنگ)
  • استفاده از کرونومتر (Stop Watch)

در منوها ، می توانید از دکمه روشن/خاموش برای پیکربندی حالت استفاده کنید. دکمه تنظیم به شما امکان می دهد زمان را تنظیم کنید - به عنوان مثال برای ساعت یا زنگ ساعت با استفاده از دکمه روشن و خاموش کردن ، کرونومتر قابل کنترل - شروع و متوقف می شود. همچنین می توانید از دور شمارنده یکپارچه استفاده کنید

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

مرحله 2: ماشین دولتی

محافظ صفحه کلید LCD
محافظ صفحه کلید LCD

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

مدل به دو بخش گرافیکی و متنی تقسیم شده است. در قسمت متنی ، رویدادها ، متغیرها و غیره تعریف خواهند شد. در قسمت گرافیکی - نمودار حالت - اجرای منطقی مدل مشخص شده است. برای ایجاد یک ماشین حالت ، که رفتار مشخص شده را برآورده می کند ، برخی از رویدادهای ورودی مورد نیاز است که می تواند در مدل مورد استفاده قرار گیرد: onoff ، set ، mode ، light و light_r. در بخش تعریف ، از یک رویداد داخلی استفاده می شود که هر 100 میلی ثانیه مقدار زمان را افزایش می دهد:

هر 100 میلی ثانیه / زمان += 1

بر اساس مراحل 100 میلی ثانیه ، زمان فعلی در قالب HH: MM: SS محاسبه می شود:

display.first = (زمان / 36000)٪ 24 ؛

display.second = (time / 600)٪ 60؛ display.third = (time / 10)٪ 60؛

هر بار که دستگاه حالت نامیده می شود ، مقادیر با استفاده از updateLCD به صفحه LCD متصل می شوند:

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

اجرای اصلی ماشین حالت در بخش نحوه کار ساعت دیجیتال مشخص شده است. در داخل ابزار من از برخی المان های مدل سازی "ویژه" مانند CompositeState ، History ، Sub-Diagrams ، ExitNodes و غیره استفاده کرده ام. توضیحات مفصل در راهنمای کاربر یافت می شود.

مرحله 3: محافظ صفحه کلید LCD

محافظ صفحه کلید LCD برای پروژه های ساده که نیاز به یک صفحه نمایش برای تجسم و برخی دکمه ها به عنوان ورودی دارند - یک HMI معمولی و ساده (رابط کاربری ماشین انسان) بسیار مناسب است. محافظ صفحه کلید LCD شامل پنج دکمه کاربر و یکی دیگر برای تنظیم مجدد است. پنج دکمه همه با هم به پین A0 آردوینو متصل هستند. هر یک از آنها به تقسیم کننده ولتاژ متصل شده است ، که امکان تشخیص بین دکمه ها را می دهد.

می توانید از analogRead (0) برای پیدا کردن مقادیر خاص استفاده کنید ، که البته سازنده می تواند متفاوت باشد. این پروژه ساده مقدار فعلی روی LCD را نمایش می دهد:

#شامل "Arduino.h"

#شامل "LiquidCrystal.h" LiquidCrystal LCD (8 ، 9 ، 4 ، 5 ، 6 ، 7) ؛ void setup () {lcd.begin (16 ، 2) ؛ lcd.setCursor (0 ، 0) ؛ lcd.write ("ارزش اندازه گیری شده") ؛ } void loop () {lcd.setCursor (0 ، 1) ؛ lcd.print ("")؛ lcd.setCursor (0 ، 1) ؛ lcd.print (analogRead (0)) ؛ تأخیر (200) ؛ }

این نتایج اندازه گیری شده من است:

  • هیچ: 1023
  • انتخاب کنید: 640
  • سمت چپ: 411
  • پایین: 257
  • بالا: 100
  • راست: 0

با این آستانه ها می توانید دکمه ها را بخوانید:

#تعریف هیچ کدام 0 #تعریف انتخاب 1 #تعریف چپ 2 #تعریف پایین 3 #تعریف UP 4 #تعریف RIGHT 5 static int readButton () {int result = 0؛ result = analogRead (0)؛ if (نتیجه <50) {return RIGHT؛ } if (نتیجه <150) {return UP؛ } if (نتیجه <300) {return DOWN؛ } if (نتیجه <550) {return LEFT؛ } if (نتیجه <850) {return SELECT؛ } بازگشت هیچ }

مرحله 4: ارتباط با دستگاه دولتی

ارتباط با دستگاه دولتی
ارتباط با دستگاه دولتی

کد تولید شده C ++ ماشین حالت رابط هایی را فراهم می کند که برای کنترل ماشین حالت باید اجرا شوند. اولین قدم اتصال رویدادها با کلیدهای Keypad Shield است. من قبلاً نحوه خواندن دکمه ها را نشان دادم ، اما برای اتصال آنها به دستگاه حالت ، حذف دکمه ها لازم است - در غیر این صورت ، رویدادها چندین بار مطرح می شوند ، که منجر به رفتارهای غیرقابل پیش بینی می شود. مفهوم حذف نرم افزار جدید نیست. می توانید به مستندات آردوینو نگاهی بیندازید.

در اجرای خود ، من یک لبه در حال سقوط (رها کردن دکمه) را تشخیص می دهم. مقدار دکمه را می خوانم ، 80 میلی ثانیه صبر می کنم (با 80 به جای 50 نتایج بهتری گرفتم) ، نتیجه را ذخیره کرده و مقدار جدید را می خوانم. اگر نتیجه قدیمی هیچ بود (فشرده نشد) و نتیجه جدید هیچ بود ، من می دانم که دکمه قبلا فشار داده شده و اکنون آزاد شده است. سپس ، رویداد ورودی مطابق ماشین حالت را افزایش می دهم.

int oldState = هیچکدام ؛ static void raiseEvents () {int buttonPressed = readButton ()؛ تأخیر (80) ؛ oldState = buttonPressed؛ if (oldState! = NONE && readButton () == NONE) {switch (oldState) {case SELECT: {stateMachine-> getSCI_Button ()-> raise_mode ()؛ زنگ تفريح؛ } case LEFT: {stateMachine-> getSCI_Button ()-> raise_set ()؛ زنگ تفريح؛ } case DOWN: {stateMachine-> getSCI_Button ()-> raise_light ()؛ زنگ تفريح؛ } case UP: {stateMachine-> getSCI_Button ()-> raise_light_r ()؛ زنگ تفريح؛ } case RIGHT: {stateMachine-> getSCI_Button ()-> raise_onoff ()؛ زنگ تفريح؛ } پیش فرض: {break؛ }}}}

مرحله 5: سیم کشی کارها با هم

برنامه اصلی از سه بخش استفاده می کند:

  • ماشین دولتی
  • یک تایمر
  • Handler Display (ال سی دی چاپ معمولی (…))

DigitalWatch* stateMachine = DigitalWatch جدید () ؛ CPPTimerInterface* timer_sct = جدید CPPTimerInterface () ؛ DisplayHandler* displayHandler = DisplayHandler جدید ()؛

دستگاه دولتی از یک کنترل کننده صفحه نمایش استفاده می کند و یک تایمر دارد ، که برای کنترل رویدادهای زمان بندی شده به روز می شود. پس از آن ، دستگاه حالت اولیه شده و وارد می شود.

void setup () {stateMachine-> setSCI_Display_OCB (displayHandler) ؛ stateMachine-> setTimer (timer_sct) ؛ stateMachine-> init ()؛ stateMachine-> enter ()؛ }حلقه سه کار انجام می دهد:

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

زمان فعلی طولانی = 0 ؛ مدت زمان آخر_چرخه = = 0 ؛ void loop () {raiseEvents ()؛ last_cycle_time = زمان فعلی؛ current_time = millis ()؛ timer_sct-> updateActiveTimer (stateMachine ، current_time - last_cycle_time) ؛ stateMachine-> runCycle ()؛ }

مرحله 6: مثال را دریافت کنید

خودشه. احتمالاً ، من تمام جزئیات پیاده سازی را ذکر نکرده ام ، اما می توانید به مثال نگاه کنید یا نظر خود را بنویسید.

مثال را به یک IDE در حال اجرا اضافه کنید:

> شما می توانید IDE را از اینجا بارگیری کنید <<

می توانید با یک دوره آزمایشی 30 روزه شروع کنید. پس از آن ، باید مجوز دریافت کنید ، که برای استفاده غیر تجاری رایگان است!

توصیه شده: