विषयसूची:

एक परिमित राज्य मशीन का उपयोग करके Arduino पर डिजिटल घड़ी: 6 कदम
एक परिमित राज्य मशीन का उपयोग करके Arduino पर डिजिटल घड़ी: 6 कदम

वीडियो: एक परिमित राज्य मशीन का उपयोग करके Arduino पर डिजिटल घड़ी: 6 कदम

वीडियो: एक परिमित राज्य मशीन का उपयोग करके Arduino पर डिजिटल घड़ी: 6 कदम
वीडियो: Workshop on IoT using Arduino and Tinker CAD | DoECE | TIEIT | TEQIP-III RGPV | Day-1 2024, नवंबर
Anonim
एक परिमित राज्य मशीन का उपयोग करके Arduino पर डिजिटल घड़ी
एक परिमित राज्य मशीन का उपयोग करके Arduino पर डिजिटल घड़ी

अरे वहाँ, मैं आपको दिखाने जा रहा हूँ कि कैसे YAKINDU Statechart Tools के साथ एक डिजिटल घड़ी बनाई जा सकती है और एक Arduino पर चलती है, जो एक LCD कीपैड शील्ड का उपयोग करती है।

डिजिटल घड़ी का मूल मॉडल डेविड हरेल से लिया गया था। उन्होंने के बारे में एक पेपर प्रकाशित किया है

"[…] राज्य मशीनों और राज्य आरेखों की पारंपरिक औपचारिकता का व्यापक विस्तार।"

इस पत्र में, उन्होंने अपने शोध के लिए डिजिटल घड़ी का उदाहरण इस्तेमाल किया। मैंने इसे एक प्रेरणा के रूप में इस्तेमाल किया है और YAKINDU Statechart Tools (राज्य मशीनों के ग्राफिकल मॉडल बनाने और इसके साथ C/C++ कोड जेनरेट करने के लिए एक उपकरण) के साथ घड़ी का पुनर्निर्माण किया है और इसे Arduino पर वापस जीवन में लाया है।

आपूर्ति

हार्डवेयर:

  • Arduino Uno या मेगा
  • एलसीडी कीपैड शील्ड

सॉफ्टवेयर:

  • YAKINDU स्टेटचार्ट टूल्स
  • Arduino के लिए ग्रहण C++ IDE

चरण 1: डिजिटल वॉच कैसे काम करती है

Image
Image

आइए यह परिभाषित करके शुरू करें कि डिजिटल घड़ी को कैसे काम करना चाहिए। क्या आपको ये याद हैं… मान लीजिए… "अल्ट्रा कूल" डिजिटल घड़ियाँ जो 90 के दशक में सभी के पास थीं? एक एकीकृत स्टॉपवॉच, विभिन्न अलार्म और हर पूरे घंटे में इसकी कष्टप्रद बीप। अगर नहीं, तो देखिए: 90 की डिजिटल घड़ी।

तो मूल रूप से यह विभिन्न मोड के साथ एक विन्यास योग्य घड़ी है। मुख्य रूप से, वर्तमान समय प्रदर्शित किया जाएगा, लेकिन कुछ अन्य विशेषताएं हैं। इनपुट के रूप में, आपके पास एक चालू/बंद, एक मोड और एक सेट बटन है। इसके अतिरिक्त, आप प्रकाश को चालू और बंद कर सकते हैं। मोड बटन से आप मोड के बीच अंतर कर सकते हैं और घड़ी की सुविधाओं को सक्रिय/अक्षम कर सकते हैं:

  • समय प्रदर्शित करें (घड़ी)
  • दिनांक प्रदर्शित करें (दिनांक)
  • अलार्म सेट करें (अलार्म 1, अलार्म 2)
  • झंकार सक्षम/अक्षम करें (चाइम सेट करें)
  • स्टॉपवॉच का उपयोग करें (स्टॉप वॉच)

मेनू के भीतर, आप मोड को कॉन्फ़िगर करने के लिए चालू/बंद बटन का उपयोग कर सकते हैं। सेट बटन आपको समय निर्धारित करने की अनुमति देता है - उदा। घड़ी या अलार्म के लिए। स्टॉपवॉच को लाइट ऑन और लाइट ऑफ बटन का उपयोग करके नियंत्रित - शुरू और बंद किया जा सकता है। आप एक एकीकृत लैप काउंटर का भी उपयोग कर सकते हैं

इसके अलावा, एक झंकार है, जो हर पूरे घंटे में बजती है, और एक नियंत्रणीय बैकलाइट एकीकृत है। पहले चरण में, मैंने उन्हें Arduino से तार-तार नहीं किया।

चरण 2: राज्य मशीन

एलसीडी कीपैड शील्ड
एलसीडी कीपैड शील्ड

मैं इस उदाहरण की व्याख्या के लिए अधिक विस्तार में नहीं जाना चाहता। ऐसा इसलिए नहीं है क्योंकि यह बहुत जटिल है, यह थोड़ा बहुत बड़ा है। मैं मूल विचार को समझाने की कोशिश करूंगा कि यह कैसे काम करता है। मॉडल पर एक नज़र डालकर या इसे डाउनलोड और अनुकरण करके निष्पादन को आत्म-व्याख्या करना चाहिए। राज्य मशीन के कुछ हिस्सों को उप क्षेत्रों में जोड़ा जाता है, जैसे निर्धारित समय क्षेत्र। इसके साथ ही राज्य मशीन की पठनीयता सुनिश्चित की जाए।

मॉडल को दो भागों में विभाजित किया गया है - एक ग्राफिकल और एक टेक्स्टुअल। पाठ्य भाग में घटनाओं, चरों आदि को परिभाषित किया जाएगा। चित्रमय भाग में - राज्य आरेख - मॉडल का तार्किक निष्पादन निर्दिष्ट है। एक राज्य मशीन बनाने के लिए, जो निर्दिष्ट व्यवहार को पूरा करती है, कुछ इनपुट ईवेंट की आवश्यकता होती है, जिसका उपयोग मॉडल में किया जा सकता है: ऑनऑफ़, सेट, मोड, लाइट और लाइट_आर। परिभाषा अनुभाग के भीतर एक आंतरिक घटना का उपयोग किया जाता है, जो हर 100 एमएस में समय मान बढ़ाता है:

हर १०० एमएस/समय += १

100 एमएस चरणों के आधार पर वर्तमान समय की गणना एचएच: एमएम: एसएस प्रारूप में की जाएगी:

डिस्प्ले.फर्स्ट = (समय / ३६०००)% २४;

डिस्प्ले.सेकंड = (समय / ६००)% ६०; डिस्प्ले.थर्ड = (समय / 10)% 60;

हर बार स्टेट मशीन को कॉल करने पर ऑपरेशन अपडेटएलसीडी का उपयोग करके मूल्यों को एलसीडी डिस्प्ले पर तार दिया जाएगा:

डिस्प्ले.अपडेटएलसीडी (डिस्प्ले.फर्स्ट, डिस्प्ले.सेकंड, डिस्प्ले.थर्ड, डिस्प्ले.टेक्स्ट)

स्टेट मशीन का मूल निष्पादन पहले से ही अनुभाग में परिभाषित किया गया है कि डिजिटल वॉच कैसे काम करती है। उपकरण के भीतर मैंने कुछ "विशेष" मॉडलिंग तत्वों जैसे समग्र स्थिति, इतिहास, उप-आरेख, निकास नोड्स, आदि का उपयोग किया है। एक विस्तृत विवरण उपयोगकर्ता मार्गदर्शिका में पाया जा सकता है।

चरण 3: एलसीडी कीपैड शील्ड

एलसीडी कीपैड शील्ड सरल परियोजनाओं के लिए काफी अच्छा है, जिसमें विज़ुअलाइज़ेशन के लिए एक स्क्रीन और इनपुट के रूप में कुछ बटन की आवश्यकता होती है - एक विशिष्ट, सरल एचएमआई (ह्यूमन मशीन इंटरफेस)। एलसीडी कीपैड शील्ड में पांच उपयोगकर्ता बटन होते हैं और दूसरा रीसेट के लिए होता है। सभी पांच बटन एक साथ Arduino के A0 पिन से जुड़े हैं। उनमें से प्रत्येक एक वोल्टेज विभक्त से जुड़ा है, जो बटनों के बीच अंतर करने की अनुमति देता है।

आप विशिष्ट मूल्यों को खोजने के लिए एनालॉग रीड (0) का उपयोग कर सकते हैं, जो निश्चित रूप से निर्माता द्वारा भिन्न हो सकते हैं। यह सरल परियोजना एलसीडी पर वर्तमान मूल्य प्रदर्शित करती है:

#शामिल "Arduino.h"

#include "LiquidCrystal.h" लिक्विड क्रिस्टल एलसीडी(८, ९, ४, ५, ६, ७); शून्य सेटअप () {lcd.begin (१६, २); LCD.setCursor(0, 0); LCD.write ("मापा मान"); } शून्य लूप () {lcd.setCursor(0, 1); एलसीडी.प्रिंट (""); LCD.setCursor(0, 1); एलसीडी.प्रिंट (एनालॉगरीड (0)); देरी (200); }

ये मेरे मापा परिणाम हैं:

  • कोई नहीं: 1023
  • चुनें: 640
  • बाएं: 411
  • नीचे: 257
  • ऊपर: 100
  • दाएं: 0

इन थ्रेसहोल्ड के साथ बटन पढ़ना संभव है:

# परिभाषित करें कोई नहीं 0 # परिभाषित करें 1 चुनें # बाएं 2 परिभाषित करें # 3 नीचे परिभाषित करें # यूपी 4 परिभाषित करें # परिभाषित करें 5 स्थिर int readButton() {int परिणाम = 0; परिणाम = एनालॉगरेड (0); अगर (परिणाम <50) {रिटर्न राइट; } अगर (परिणाम <150) {यूपी लौटें; } अगर (परिणाम <300) {नीचे लौटें; } अगर (परिणाम <550) {वापस लौटें; } अगर (परिणाम <850) {वापसी चुनें; } कोई नहीं लौटाएं; }

चरण 4: राज्य मशीन का इंटरफेसिंग

राज्य मशीन इंटरफेसिंग
राज्य मशीन इंटरफेसिंग

राज्य मशीन का उत्पन्न सी ++ कोड इंटरफेस प्रदान करता है, जिसे राज्य मशीन को नियंत्रित करने के लिए लागू किया जाना चाहिए। पहला कदम इन इवेंट्स को कीपैड शील्ड की चाबियों से जोड़ रहा है। मैंने पहले ही दिखाया है कि बटनों को कैसे पढ़ा जाता है, लेकिन उन्हें राज्य मशीन में इंटरफेस करने के लिए, बटनों को डिबगिंग करना आवश्यक है - अन्यथा, घटनाओं को कई बार उठाया जाएगा, जिसके परिणामस्वरूप अप्रत्याशित व्यवहार होता है। सॉफ्टवेयर डिबगिंग की अवधारणा नई नहीं है। आप Arduino दस्तावेज़ीकरण पर एक नज़र डाल सकते हैं।

मेरे कार्यान्वयन में, मैं एक गिरने वाले किनारे (बटन को जारी करना) का पता लगाता हूं। मैंने बटन के मूल्य को पढ़ा, 80 एमएस की प्रतीक्षा करें (50 के बजाय 80 के साथ बेहतर परिणाम प्राप्त करें), परिणाम सहेजें और नया मान पढ़ें। यदि पुराना परिणाम कोई नहीं (अनप्रेस्ड) नहीं था और नया परिणाम कोई नहीं है, तो मुझे पता है कि बटन पहले दबाया गया है और अब जारी किया गया है। फिर, मैं राज्य मशीन के अनुसार इनपुट ईवेंट बढ़ाता हूं।

इंट ओल्डस्टेट = कोई नहीं; स्थिर शून्य वृद्धि () {इंट बटन दबाया = रीडबटन (); देरी (80); ओल्डस्टेट = बटन दबाया गया; अगर (ओल्डस्टेट! = कोई नहीं && रीडबटन () == कोई नहीं) {स्विच (ओल्डस्टेट) {केस सेलेक्ट: {स्टेटमैचिन-> getSCI_Button ()->raise_mode (); टूटना; } मामला बाएँ: { StateMachine->getSCI_Button()->raise_set(); टूटना; } मामला नीचे: { StateMachine->getSCI_Button()->raise_light (); टूटना; } मामला यूपी: { StateMachine->getSCI_Button()->raise_light_r(); टूटना; } मामला सही: { StateMachine->getSCI_Button()->raise_onoff(); टूटना; } डिफ़ॉल्ट: {ब्रेक; } } } }

चरण 5: चीजों को एक साथ जोड़ना

मुख्य कार्यक्रम तीन भागों का उपयोग करता है:

  • राज्य मशीन
  • एक टाइमर
  • एक डिस्प्ले हैंडलर (विशिष्ट LCD.print(…))

DigitalWatch* StateMachine = new DigitalWatch (); CPPTimerInterface* timer_sct = new CPPTimerInterface (); डिस्प्लेहैंडलर* डिस्प्लेहैंडलर = नया डिस्प्लेहैंडलर ();

स्टेट मशीन एक डिस्प्ले हैंडलर का उपयोग करती है और एक टाइमर प्राप्त करती है, जिसे समयबद्ध घटनाओं को नियंत्रित करने के लिए अपडेट किया जाएगा। बाद में, स्टेट मशीन को इनिशियलाइज़ किया जाता है और दर्ज किया जाता है।

शून्य सेटअप () { StateMachine-> setSCI_Display_OCB (डिस्प्लेहैंडलर); StateMachine->setTimer(timer_sct); राज्य मशीन-> init (); राज्य मशीन-> दर्ज करें (); }लूप तीन काम करता है:

  • इनपुट इवेंट बढ़ाएं
  • बीते हुए समय की गणना करें और टाइमर को अपडेट करें
  • राज्य मशीन को बुलाओ

लंबा करंट_टाइम = 0; लॉन्ग लास्ट_साइकिल_टाइम = 0; शून्य लूप () { raiseEvents (); last_cycle_time = current_time; current_time = मिली (); timer_sct->updateActiveTimer(stateMachine, current_time - last_cycle_time); स्टेटमशीन-> रनसाइकिल (); }

चरण 6: उदाहरण प्राप्त करें

बस, इतना ही। शायद, मैंने कार्यान्वयन के हर विवरण का उल्लेख नहीं किया है, लेकिन आप उदाहरण पर एक नज़र डाल सकते हैं या एक टिप्पणी छोड़ सकते हैं।

उदाहरण के साथ चल रहे IDE में उदाहरण जोड़ें: फ़ाइल -> नया -> उदाहरण -> YAKINDU स्टेटचार्ट उदाहरण -> अगला -> Arduino - डिजिटल वॉच (C++)

> आप यहां आईडीई डाउनलोड कर सकते हैं <<

आप 30 दिनों के परीक्षण के साथ शुरुआत कर सकते हैं। बाद में, आपको एक लाइसेंस प्राप्त करना होगा, जो गैर-व्यावसायिक उपयोग के लिए निःशुल्क है!

सिफारिश की: