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

माप के आंकड़ों को रिकॉर्ड करने के लिए एक ROM के रूप में, मैंने एक क्लासिक 24XX512 ROM (512 केबीपीएस) रखने का फैसला किया, जिसे I2C इंटरफ़ेस के माध्यम से नियंत्रित किया जाता है। मैंने एसडी / एमएमसी मेमोरी कार्ड के उपयोग से परेशान नहीं किया। डिवाइस में एक और महत्वपूर्ण कार्य घड़ी है। वे तारीख और समय के लिए कुछ मापा विशिष्ट मापदंडों (उदाहरण के लिए, अधिकतम गति) को बांधने की सेवा करते हैं, और आंकड़ों में समय टिकटों की रिकॉर्डिंग के लिए भी आवश्यक हैं। एक घड़ी के रूप में, मैंने माइक्रोकंट्रोलर से एक अलग वास्तविक समय घड़ी (RTC) चिप का उपयोग किया, जिसमें स्वतंत्र बैटरी शक्ति है और I2C के माध्यम से नियंत्रक के साथ संचार भी करता है।
मैंने प्रोग्राम लिखने के चरण में डिवाइस की कार्यक्षमता में अतिरिक्त माध्यमिक आवश्यकताओं को लागू किया। इसमें सभी प्रकार के संगठनात्मक मुद्दे शामिल हैं: शामिल बटनों की संख्या, विभिन्न तत्वों के प्रदर्शन पर स्थान, इंटरफ़ेस पर नेविगेशन, और इसी तरह। नेविगेशन के संदर्भ में, मैंने पहले से तय किया कि कार्यक्रम को जटिल न करें, उदाहरण के लिए, सेटिंग्स मेनू को लागू करने के लिए नहीं, विशेष रूप से, दिनांक और समय सेटिंग्स। घड़ी एक बार सेट है। RTC चिप में ही घड़ी स्वतंत्र रूप से टिक रही है, 32.768 KHz क्वार्ट्ज और लंबे समय तक चलने वाली बैटरी के लिए धन्यवाद। स्पीडोमीटर के UART इंटरफ़ेस के माध्यम से दिनांक और समय की सेटिंग्स को एक क्लिक के साथ कंप्यूटर के COM पोर्ट से जोड़ा जाता है। एक ही इंटरफ़ेस के माध्यम से, यह ROM से एक कंप्यूटर के आँकड़े डेटा को पढ़ना था। इस सब के लिए, आपको कंप्यूटर के लिए उपयुक्त प्रोग्राम लिखना होगा। हालांकि, जैसा कि आगे दिखाया गया था, बाद में छोड़ दिया गया था। सबसे पहले, कंप्यूटर प्रोग्राम लिखने के चरण में नियंत्रक से कंप्यूटर तक डेटा के रिसेप्शन को लागू करने की समस्या थी। और, और भी महत्वपूर्ण रूप से, नियंत्रक के लिए कार्यक्रम की मात्रा बढ़ गई। एक हटाने योग्य प्लेटफॉर्म पर ROM (SMIC हाउसिंग SOIC-8 में), सिम कार्ड के साथ कमैंसुरेट करना और मोबाइल फोन पर उपयुक्त फ्री स्लॉट का उपयोग करना अधिक दिलचस्प था। ऐसा करने के लिए, I2 ROM रोमर की प्रसिद्ध योजनाओं में से एक के अनुसार एक सिम रीडर पर आधारित ROM रीडर का निर्माण करना आवश्यक है। जैसा कि बाद में पता चला, इस निर्णय से अनावश्यक असुविधा नहीं हुई।
एक अन्य महत्वपूर्ण मुद्दा ग्राफिक डिस्प्ले पर प्रतीकात्मक (डिजिटल सहित) जानकारी का आउटपुट है। इसके लिए किसी विशेष प्रतीक के बारे में ग्राफिक जानकारी की आवश्यकता होती है। यह जानकारी प्रदर्शित पैरामीटर के आकार जैसे ऐसे पैरामीटर से निकटता से संबंधित है। मुख्य पैरामीटर को प्रदर्शित करने के लिए, आंदोलन की गति, अच्छी स्पष्टता के लिए, एक बड़े फ़ॉन्ट का उपयोग करना वांछनीय है। हालांकि, जैसा कि बाद में दिखाया जाएगा, दस अंकों के बारे में ऐसी ग्राफिक जानकारी एमके की याद में फिट नहीं होगी, और समान बाहरी अधिक कैपेसिटिव रॉम का उपयोग फ़ॉन्ट को खींचने की गति को धीमा कर देगा। मैंने सबसे बड़े फ़ॉन्ट के रूप में 8 अंक की ऊंचाई के साथ एक फ़ॉन्ट का उपयोग करने का निर्णय लिया। मैंने MS DOS के कुछ प्रोग्राम की फाइल "8X8.FNT" से इस फॉन्ट के लिए ग्राफिक जानकारी खींची थी, पहले इसकी संरचना को खोल दिया और आगे की प्रक्रिया की।

जैसा कि बाद में व्यवहार में निकला, यह आकार गति की स्पष्टता के लिए काफी पर्याप्त है। अतिरिक्त फ़ॉन्ट के लिए आकार के रूप में, मैंने आकार 3x5 चुना और स्वतंत्र रूप से इस आकार की संख्याओं के लिए ग्राफिक्स आकर्षित किया। ये छोटी संख्याएं अतिरिक्त पैरामीटर प्रदर्शित करती हैं: दिनांक / समय, औसत और अधिकतम गति, पथ।
दोनों फोंट की ग्राफिक जानकारी कुछ दो आयामी सरणियों में संग्रहीत की जाती है। प्रत्येक सरणी तत्व, आकार में 1 बाइट, एक विशिष्ट अंक के विशेष कॉलम के पिक्सेल वितरण को दर्शाता है। बड़े प्रिंट के लिए, प्रत्येक अंक के लिए 8 कॉलम आवंटित किए जाते हैं, और 3 के लिए 3. छोटे प्रिंट के लिए, 3X5 आकार में, औपचारिक ऊंचाई 5 नहीं है, लेकिन 8 अंक (एक बाइट के लिए गोल)। यह आपको 4-दिशा विधियों में से एक का उपयोग करके ऊर्ध्वाधर दिशा में 8-स्थिति क्षेत्र के भीतर 5-स्थिति फ़ॉन्ट के स्थान को पूर्व-व्यवस्थित करने की अनुमति देता है। इन तथ्यों को नीचे दिए गए आंकड़े में अच्छी तरह से प्रदर्शित किया गया है, जो इस फ़ॉन्ट के पहले दो अंकों के लिए ग्राफिक्स के मॉडलिंग को प्रदर्शित करता है। एक्सेल मॉडलिंग के लिए अच्छी तरह से जाना जाता है। प्रारंभिक डेटा वांछित ग्राफिक्स के लिए उपयुक्त क्षेत्रों में "इकाइयों" की व्यवस्था है। इनमें से, सूत्र सी भाषा कोड तक, सरणियों के मूल्यों की गणना करते हैं, जिन्हें बाद में माइक्रोकंट्रोलर के लिए प्रोग्राम टेक्स्ट में कॉपी किया जा सकता है।

अब हम उपयोग किए गए डिस्प्ले के नियंत्रण सुविधाओं के बारे में बात करेंगे। यह डिस्प्ले मोनोक्रोम है और इसका आयाम 84 बाई 48 पिक्सल है। MK से प्रदर्शन नियंत्रण SPI इंटरफ़ेस के माध्यम से किया जाता है। एसपीआई द्वारा प्रेषित बाइट्स को दो मोड में डिस्प्ले में व्याख्या किया गया है: प्रदर्शन कमांड के बाइट्स और कॉन्फ़िगरेशन कमांड के बाइट्स। ये मोड एमके द्वारा एक विशिष्ट डिस्प्ले पिन (डी / सी) के लिए निर्धारित किए गए हैं। डिस्प्ले पर डेटाशीट में कमांड की पूरी सूची दी गई है। इनमें से कुछ कमांड का उपयोग मेरे डिवाइस में किया जाता है, और जब डिवाइस पर पावर लागू किया जाता है तो डिस्प्ले को इनिशियलाइज़ करने के लिए उपयोग किया जाता है: तापमान गुणांक, इसके विपरीत, अनुक्रमिक ड्राइंग मोड (क्षैतिज या ऊर्ध्वाधर), आदि। मैं तुरंत ध्यान देता हूं कि क्षैतिज ड्राइंग मोड लागू किया गया है। इसका मतलब यह है कि डिस्प्ले मोड में बाइट ट्रांसफर करते समय, पता स्वचालित रूप से दाईं ओर एक लाइन से बढ़ जाता है। जब रेखा समाप्त होती है, तो स्थिति पता अगली पंक्ति की शुरुआत में जाता है। यह पहली बार एक विशेष पोजिशनिंग कमांड को एक विशिष्ट पंक्ति और कॉलम एड्रेस (प्रारंभिक स्थिति) में भेजने के लिए पर्याप्त है, और फिर ग्राफिक्स प्रदर्शित करने के लिए एक के बाद एक डेटा बाइट्स क्रमिक रूप से भेजें। यह डिस्प्ले स्पेस की विशेषता और प्रदर्शन द्वारा प्राप्त बाइट्स के आधार पर ग्राफिक्स की व्याख्या के लायक है। मैं ध्यान देता हूं कि मोनोक्रोम ग्राफिक्स के लिए, एक बाइट में एक साथ आठ पिक्सल के बारे में जानकारी होती है।
विचाराधीन प्रदर्शन को 8 क्षैतिज रेखाओं में 8 पंक्ति प्रत्येक (6 * 8 = 48) के साथ लंबवत रूप से विभाजित किया गया है। प्रत्येक ज़ोन का प्रत्येक कॉलम एक विशिष्ट बाइट के अनुरूप होगा, जिसे संबंधित कॉलम (0 ... 83) और ज़ोन नंबर (0 ... 5) के पते के साथ भेजा जाता है। पता एक से नहीं, खरोंच से गिना जाता है। उदाहरण के लिए, यदि आप खुद को पते (34; 2) पर रखते हैं और 255 का डेटा बाइट (बाइनरी फॉर्म "11111111") में भेजते हैं, तो सभी 8 पिक्सेल 16 से 23 तक लंबवत और 35 वें कॉलम में क्षैतिज रूप से प्रकाश करेंगे। मेरी राय में, इस सुविधा से एक कमियां इस प्रकार हैं: प्रत्येक पिक्सेल की स्थिति को व्यक्तिगत रूप से हार्डवेयर स्तर पर नियंत्रित करने में असमर्थता। एक बाइट ग्राफिक्स के लिए डेटा का सबसे छोटा टुकड़ा है। जब एक बाइट को वर्तमान पते पर प्रेषित किया जाता है, तो वर्तमान क्षेत्र के सभी 8 संबंधित पिक्सेल अपडेट किए जाते हैं। प्रदर्शन माइक्रोकंट्रोलर की ओर वर्तमान में प्रदर्शित ग्राफिक जानकारी को पढ़ने का समर्थन नहीं करता है। इसलिए, यदि आवश्यक हो, तो आउटपुट जानकारी को पहले से समर्पित बफ़र में संग्रहीत करना आवश्यक है, और किसी भी पिक्सेल (बिट्स) की स्थिति को बदलने के लिए, इस बफ़र से बाइट्स के लिए बिट मास्क लागू करें और उन्हें फिर से प्रदर्शन में स्थानांतरित करें।
प्रदर्शन पर एक विशेष ग्राफिक जानकारी के स्थान पर मॉडलिंग और सोच उपरोक्त सुविधाओं को ध्यान में रखते हुए किया गया था। यह प्रोग्राम लिखते समय कोड को सरल बनाने के लिए किया गया था। और यह कोई दुर्घटना नहीं है कि फ़ॉन्ट आकार को श्रेणी 8, 16, 24 से माना जाता था, अर्थात् 8. का एक बहुवचन। मैंने ग्राफिक जानकारी को भी डिस्प्ले के साथ 6 क्षैतिज क्षेत्रों में विभाजित करके विभाजित किया है। पहले ज़ोन में, निरपेक्ष और वर्तमान (डिवाइस चालू होने से) आरपीएम मान छोटे प्रिंट में प्रदर्शित होते हैं। दूसरे क्षेत्र में, पथ के पूर्ण और वर्तमान मान (गोलाई से सौवें भाग तक)। तीसरे क्षेत्र में - औसत गति। चौथी में - अधिकतम गति और बड़े प्रिंट में - वर्तमान गति। पांचवें ज़ोन में, रोम भरा हुआ है और ओवरराइट की संख्या इंगित करने के लिए दो प्रगति पट्टियाँ प्रदर्शित की जाती हैं। छठे, अंतिम क्षेत्र, दिनांक और समय में। यह पांचवां क्षेत्र है जो अपवाद है जब किसी भी कॉलम के ऊर्ध्वाधर दिशा में अलग-अलग जानकारी से संबंधित पिक्सेल होते हैं। इसलिए, बिट मास्क का उपयोग करने वाली यह जानकारी एक बफर में एकत्र की जाती है, जिसकी सामग्री इस पांचवें क्षेत्र पर प्रदर्शित की जाती है। इसके अलावा, 3-5 ज़ोन में प्रदर्शित गति मान के चारों ओर एक फ्रेम खींचने के लिए जानकारी है। अंतिम क्षेत्र में, सभी स्तंभों पर प्रत्येक पहला (सबसे कम महत्वपूर्ण) विभाजक रेखा (40 वीं पंक्ति) खींचने के लिए "1" पर सेट किया गया है। इस सिमुलेशन और पते के विज़ुअलाइज़ेशन के लिए, मैंने उपरोक्त सभी को एक्सेल कोशिकाओं में दर्शाया है।

इस तरह से पहली डिस्प्ले विंडो दिखती है। केवल दो खिड़कियां। दूसरी विंडो आंदोलन के ग्राफ (हिस्टोग्राम) का आउटपुट है। इसके लिए, 5 ज़ोन को (40 पंक्तियों) लंबवत और सभी 84 स्तंभों को क्षैतिज रूप से सौंपा गया है। घड़ी के साथ छठा क्षेत्र दोनों खिड़कियों के लिए समान है।
जब प्रोग्रामिंग, मैंने इस प्रदर्शन के साथ काम करने के लिए किसी भी पुस्तकालय का उपयोग नहीं करने का फैसला किया। निजी तौर पर, लाइब्रेरी को समझने की तुलना में, मेरे लिए कार्यपत्रक को लागू करना, डेटाशीट को समझना आसान है। इसके अलावा, इसमें कुछ फायदे पाए गए थे। हाल ही में, पुस्तकालयों में से एक को डाउनलोड करने के बाद, मैंने इसके कार्यात्मक विशेषताओं का पता लगाया। यह सार्वभौमिक है, इसकी मदद से आप व्यक्तिगत रूप से पिक्सेल को नियंत्रित कर सकते हैं और वास्तविक पिक्सेल पते पर खुद को स्थिति दे सकते हैं। लेकिन पुस्तकालय आकार में 84 * 6 बाइट्स के एक बफर का उपयोग करता है, और यह टाइमर बफर को समय-समय पर प्रदर्शन के लिए भेजा जाता है, ग्राफिक्स को अपडेट करता है। इस प्रकार, मेमोरी एमके का टाइमर और हिस्सा व्यस्त है। मेरे विशेष मामले में, पुस्तकालय का उपयोग करने की कोई आवश्यकता नहीं है, क्योंकि मॉडलिंग करते समय, मैंने पहले से ही प्रदर्शित क्षेत्रों के बीच सूचना के पृथक्करण को अधिकतम करने के लिए ध्यान रखा था, जो प्रदर्शन क्षेत्रों के पूर्ण अनुपालन में हैं। और प्रदर्शन पर जानकारी को समय-समय पर अपडेट करने की कोई आवश्यकता नहीं है: जानकारी केवल तभी अपडेट की जाती है जब वह (केवल व्हील के प्रत्येक घुमाव के साथ, एक बटन के प्रत्येक प्रेस के साथ, आदि)। इस प्रकार, मैं एक बार फिर जोर देता हूं: कार्य के आधार पर, आप किसी भी पुस्तकालयों के उपयोग से बच सकते हैं।
एक घड़ी माइक्रोकिरिट और रोम के साथ काम करने के लिए, मैंने पुस्तकालयों के उपयोग का भी सहारा नहीं लिया: इन घटकों के लिए डेटशीट का अध्ययन करने के बाद मेरे द्वारा सभी कार्य काफी सरल और कार्यान्वित किए जाते हैं।
अब डिवाइस के इलेक्ट्रिकल सर्किट पर विचार करें।

स्पीडोमीटर का लेआउट अपेक्षाकृत सरल है। उपरोक्त सभी के अलावा, सर्किट में एक IC5 MAX756 तत्व शामिल है, जो नोकिया 3310 मोबाइल फोन की मूल बैटरी से विश्वसनीय बिजली आपूर्ति के लिए 3 से 5 वोल्ट बिजली कनवर्टर के रूप में कार्य करता है। मैंने उचित MK और बाह्य उपकरणों की कमी के कारण 3-वोल्ट बिजली की आपूर्ति के लिए सर्किट को लागू नहीं किया है। वर्तमान समय में, मैंने अभी तक MAX756 का अधिग्रहण नहीं किया है, और पूरे सर्किट को अभी भी एक बाहरी क्रोना बैटरी द्वारा संचालित किया जाता है, जो LM7805 रेगुलेटर (सबसे अच्छा विकल्प नहीं) का उपयोग कर रहा है। यह फोन के निचले हिस्से में हेडफोन जैक से कनेक्ट होता है। रीड स्विच SF1, जो एक व्हील रोटेशन सेंसर है, INT0 MK इंटरप्ट पोर्ट (पिन 32) से जुड़ा है। यह फोन के नीचे से चार्जिंग पोर्ट तक सुरक्षित रूप से कनेक्ट होता है। मोबाइल फोन के "1", "2", "3" बटन से जुड़े कार्यात्मक बटन S1-S3 मनमाने ढंग से बंदरगाहों (पिन 23, 27, 28) से जुड़े हैं। एक पिन S4 एमके रीसेट के 29 पिन से जुड़ा हुआ है, जो मोबाइल फोन पर पॉवरिंग के लिए ऊपरी छोर बटन के साथ मेल खाता है। मैंने ऐसा ही किया। डिवाइस में स्वयं एक स्टैंडबाय मोड नहीं है और शक्ति के साथ चालू होता है। एक IC2 डिस्प्ले और फ्लैशिंग X1 के लिए एक कनेक्टर कंट्रोलर के SPI पोर्ट (पिन 15-17) से जुड़ा होता है। कनेक्टर के साथ, जिसे मैं मूल मदरबोर्ड पर मौजूदा "स्पॉट" के आधार पर एक पीसी (एक ही जगह) के साथ बाँधने के लिए बनाना चाहता था, मुझे थोड़ा रोड़ा मिला, और भविष्य में मैं इसे दूसरी जगह स्थानांतरित करूँगा। कंप्यूटर के लिए उपयोगकर्ता कनेक्शन के लिए एक UART इंटरफ़ेस उसी कनेक्टर से जुड़ा हुआ है, जिसके माध्यम से डिवाइस पर दिनांक और समय कॉन्फ़िगर किया गया है (पिन 30-31, RX / TX)। डिस्प्ले प्रतिरोधक पर डिवाइडर के माध्यम से कंट्रोलर से जुड़ा होता है, जो वोल्टेज को कम करने का काम करता है, क्योंकि डिस्प्ले 3.3 V के वोल्टेज पर काम करता है। इसके अलावा, डिस्प्ले पिन D / C (डेटा / कमांड), SCE (स्ट्रोब) और RES (डिस्प्ले रीसेट) मनमाने पोर्ट से जुड़े होते हैं। एमके पीबी 0, पीबी 1 और पीबी 2, क्रमशः (पिन 12-14)। डिस्प्ले डायोड डी 1-डी 3 और रोकनेवाला आर 6 के माध्यम से संचालित होता है, जो एक रैखिक नियामक के उपयोग से बचने के लिए वोल्टेज को 5 से 3.3 वी तक कम करने के लिए काम करता है। 4.5 मेगाहर्ट्ज के मामूली मूल्य के साथ एमके द्वारा देखे गए क्वार्ट्ज सीआर 1 को यादृच्छिक रूप से चुना गया था, लेकिन जानबूझकर। वह बस मेरी बांह में गिर गया, और मैंने इसे इस्तेमाल करने का फैसला किया। ट्रांजिस्टर Q1 और Q2 PD4 और PD5 MK (पिन 2 और 9) के पोर्ट से जुड़े हैं, जिस पर डिस्प्ले और कीबोर्ड की बैकलाइट के लिए एलईडी लोड किए गए हैं। नियंत्रक व्यक्तिगत रूप से बैकलाइट को नियंत्रित करने की क्षमता प्रदान करता है, जैसा कि मोबाइल फोन का मूल लेआउट प्रदान करता है (यह हार्डवेयर स्तर पर था, और उपयोगकर्ता स्तर पर नहीं), हालांकि व्यवहार में यह आवश्यक नहीं है। I2C बस PC2-PC3 बंदरगाहों (25-26 पिन) से जुड़ा हुआ है और, सादगी के लिए, उपयुक्त पुस्तकालय का उपयोग करके प्रोग्रामेटिक रूप से लागू किया जाता है (हालांकि यह हार्डवेयर TWI बंदरगाहों से जुड़ा है)। IC3 ROM और वास्तविक समय की घड़ी (RTC) IC4 बस में निलंबित हैं। तुरंत आरक्षण करें ताकि टिप्पणियों में कोई आलोचना न हो: मुझे पता है कि DS1307 सबसे अच्छा समाधान नहीं है, लेकिन सर्किट के विकास के समय मुझे DS3231 के अस्तित्व के बारे में नहीं पता था। ROM सिम कार्ड के समान एक हटाने योग्य कनेक्टर पर स्थित है। पीसी 1 कंट्रोलर (पिन 24) का एक अतिरिक्त पोर्ट आरटीसी के साथ 1 हर्ट्ज की आवृत्ति के साथ दालों को प्राप्त करने के लिए उपयोग किया जाता है, जिसके द्वारा डिस्प्ले पर समय अपडेट किया जाता है। सभी निष्क्रिय शरीर किट घटक - प्रत्येक सक्रिय घटक के लिए डेटाशीट्स के अनुसार।
कुछ मापदंडों की गणना के लिए गणितीय विचारों पर विचार करें। जैसा कि पहले से ही उल्लेख किया गया है, गति को मापने का सिद्धांत पहिया की क्रांति की अवधि की गणना पर आधारित है, और इस तरह की क्रांतियों की संख्या को मापने के आधार पर दूरी की गणना की जाती है। नियंत्रक रीड और पिछले स्विच के बीच के समय को रीड स्विच से मापता है। माप परिणाम को क्रांति की अवधि तक पहिया के परिधि के मूल्य को विभाजित करके गति मान में परिवर्तित किया जाता है, और इस मूल्य को प्रत्येक पल्स (पहिया क्रांति) के साथ डिस्प्ले पर अपडेट किया जाता है। यहां यह ध्यान देने योग्य है कि, भौतिकी के दृष्टिकोण से, पहिया के परिधि के अनुरूप पथ के एक खंड पर एक साइकिल की औसत गति की गणना की जाती है। अलग-अलग, दालों की संख्या की गणना की जाती है, फिर दूरी मूल्य में परिवर्तित की जाती है। पहिया के रोटेशन की अवधि को मापने के लिए, नियंत्रक अपने स्वयं के टाइमर का उपयोग करता है। ATmega8 में 8-बिट और 16-बिट टाइमर है। माप की गतिशील सीमा टाइमर की थोड़ी गहराई पर निर्भर करती है। मेरे मामले में, एक 16-बिट टाइमर का उपयोग किया जाता है, क्योंकि 8 बिट्स (काउंट्स की 256 गिनती) स्पष्ट रूप से अपर्याप्त हैं। अधिकतम माप अवधि (टाइमर ओवरफ्लो से पहले) न्यूनतम मापा गति के अनुरूप होगी। आप तथाकथित सॉफ्टवेयर टाइमर में प्रवेश कर सकते हैं, जो बड़ी अवधि को मापेगा। हालांकि, कार्यक्रम को सरल बनाने के लिए, मैंने ऐसा नहीं किया। 4.5 मेगाहर्ट्ज के उपयोग किए गए क्वार्ट्ज और टाइमर कॉन्फ़िगरेशन में 1024 के अधिकतम विभक्त मूल्य के साथ, हमारे पास है: (1 / (4500000/1024) = 0.000227556 सेकंड। यह मान खाते की न्यूनतम अवधि से मेल खाता है। और अधिकतम खाता अवधि 0.000227556 * 65536 = 14.913 सेकंड होगी। न्यूनतम औसत दर्जे की अवधि के लिए अधिकतम औसत दर्जे की गति लगभग 30,000 किमी / घंटा होगी। यह निर्धारित करने के लायक भी नहीं था, "ऊपर से रिजर्व" बस विशाल है।
लेकिन अधिकतम मापा अवधि के अनुरूप न्यूनतम मापा गति 2.26 / 14.913 / 1000 * 3600 = 0.54 किमी / घंटा होगी। यहाँ 2.26 मेरे मामले में साइकिल के पहिया (मीटर में) की परिधि है। मैं इस न्यूनतम मापा मूल्य से काफी खुश हूं। यदि बाइक 0.54 किमी / घंटा से कम की गति से चलती है, तो साइकिल स्पीडोमीटर आंदोलन की कमी (और टाइमर अतिप्रवाह) रिकॉर्ड करेगा। इस क्वार्ट्ज के साथ 4.5 मेगाहर्ट्ज UART इंटरफ़ेस एक स्वीकार्य स्वीकार्य त्रुटि के साथ 2400 बॉड की गति से ठीक काम करता है। यह गति भी काफी पर्याप्त है, खासकर जब से मैं एक कंप्यूटर से एक बार की घड़ी की सेटिंग के लिए UART का उपयोग करता हूं (कंप्यूटर से डिवाइस के लिए दिनांक और समय की प्रतिलिपि बनाने के लिए)। यदि आप उच्च आवृत्ति में क्वार्ट्ज लेते हैं, तो न्यूनतम मापनीय गति में वृद्धि होगी, जो मेरे लिए अस्वीकार्य होगा,और आपको एक सॉफ्टवेयर टाइमर का उपयोग करने की आवश्यकता होगी। और अगर आप इसे नीचे लेते हैं, तो पूरे के रूप में डिवाइस का प्रदर्शन कम हो जाता है। इसलिए, मैंने इस विशेष क्वार्ट्ज को छोड़ने का फैसला किया।मैं ध्यान देता हूं कि अवधि और गति मान व्युत्क्रमानुपाती होते हैं, और माइक्रोकंट्रोलर टाइमर अवधि को विवेकपूर्वक मापता है। हमारे मामले में, मापने की सीमा (0.000227556 ... 14.913) को समान रूप से 65535 की राशि में डॉट्स के साथ चिह्नित किया गया है, इसे कई समान अंतरालों में विभाजित किया गया है। और ये बिंदु सभी प्रकार के मापा मूल्यों के अनुरूप हैं। समय-समय पर अंतराल के रूपांतरण का उपयोग करते हुए, अंतराल की यह प्रणाली वर्दी से व्युत्क्रम आनुपातिक में परिवर्तित होती है। इसलिए, विभिन्न मापा गति की सीमा असमान अंतराल में विभाजित है। इन अंतरालों की लंबाई बढ़ती वेग मूल्य के साथ ही बढ़ जाती है। इस तथ्य को देखते हुए, विशाल "ऊपर से रिजर्व", जिसके बारे में मैंने थोड़ा अधिक लिखा था, वह एमिस नहीं होगा। व्यवहार में, साइकिल की अधिकतम मापा गति के लिए 100 किमी / घंटा का मान लेना काफी होगा।यह सिर्फ एक नया अंक (सैकड़ों) नहीं शुरू करना है और प्रदर्शन पर प्रदर्शित पैरामीटर की चौड़ाई में वृद्धि नहीं करना है। हम गणना करते हैं कि पड़ोस में एक गति पर आसन्न संभावित मूल्यों के बीच अंतराल की लंबाई, उदाहरण के लिए, 90 किमी / घंटा के बराबर है। व्युत्क्रम सूत्र या चयन का उपयोग करके, गणना करना आसान है कि टाइमर 397 (65536 में से संभव) के मूल्य के लिए मापा गति 90.06 किमी / घंटा से मेल खाती है। और 398 के पड़ोसी टाइमर मूल्य के साथ - 89.83 किमी / घंटा। और गति के बीच का अंतर 0.23 किमी / घंटा है, जो पहले से ही स्वीकार्य से अधिक है। और कम गति पर, यह अंतर और भी छोटा होगा। प्रदर्शन गति मान को निकटतम सौवें स्थान पर दिखाता है। हालांकि, व्यवहार में, निकटतम पूरे या दसियों तक गोलाई आमतौर पर पर्याप्त होती है। पूर्वगामी से, हम निष्कर्ष निकाल सकते हैं: गति के "ग्रिड" की गैर-एकरूपता की उपेक्षा की जा सकती है,चूंकि इसकी वजह से होने वाली माप त्रुटि अनुमेय त्रुटि से अधिक नहीं है।दूरी की गणना करने के लिए, यह पहिया की परिधि द्वारा दालों (क्रांतियों) की संख्या को गुणा करने के लिए पर्याप्त है। इस मामले में, निश्चित रूप से, पहिया की परिधि के लिए दूरी की सही गणना की जाती है, जो काफी स्वीकार्य है। वर्तमान औसत गति की गणना उस समय के वर्तमान मान के अनुपात के रूप में की जाती है, जिस समय इसे चालू किया गया था। यह वह समय है जब नियंत्रक आरटीसी के साथ प्रति सेकंड एक बार पहुंचने वाली दालों की संख्या की गणना करके विचार करता है। डिस्प्ले पर औसत गति समय अद्यतन (एक बार प्रति सेकंड) के साथ अद्यतन की जाती है। पहिया के प्रत्येक क्रांति के साथ अन्य सभी मापदंडों को अपडेट किया जाता है।अब इंटरफ़ेस की छोटी विशेषताओं के बारे में। पहला बटन मोड (ग्राफिकल मोड या वैल्यू डिस्प्ले मोड) को स्विच करने के लिए उपयोग किया जाता है। दूसरा बटन - इसे धारण करते समय रिश्तेदार के बजाय पूर्ण (सभी समय के लिए) अधिकतम गति प्रदर्शित करने के लिए। साथ ही, इस गति तक पहुँचने की तिथि और समय को वर्तमान तिथि और समय के स्थान पर प्रदर्शित किया जाता है। और यह भी, वर्तमान रॉम पते का मूल्य सापेक्ष गति (नियंत्रण के लिए) के मूल्य के स्थान पर प्रदर्शित होता है। इस मूल्य का अनुमान प्रदर्शन की 38 वीं पंक्ति पर क्षैतिज प्रगति पट्टी से लगाया जा सकता है। इस ROM पर, 65536 बाइट्स (512 kbit) की क्षमता के साथ, मापा पैरामीटर दर्ज किए जाते हैं। जैसा कि बाद में कहा जाएगा, यह प्रारंभिक समय स्टैम्प के साथ शुरू में मापा पैरामीटर (पहिया के रोटेशन की अवधि) को रिकॉर्ड करने के लिए पर्याप्त है।अन्य सभी मापदंडों को आसानी से ROM स्कैनिंग के चरण में एक कंप्यूटर प्रोग्राम द्वारा गणना की जाती है। तीसरे बटन का उपयोग बैकलाइट को नियंत्रित करने के लिए किया जाता है। ऊपर स्क्रीन स्केच के विपरीत, मैंने बाद में माध्यमिक मापदंडों पर तुच्छ शून्य को हटा दिया और उन्हें स्पष्ट रूप से प्रदर्शित करने के लिए। ग्राफिकल मोड में, गति की गति का एक हिस्टोग्राम बाएं से दाएं की ओर खींचा जाता है, जो पहिया के 84 क्रांतियों की दूरी के एक छोटे से हिस्से पर गति को बदलने की प्रक्रिया को स्पष्ट रूप से प्रदर्शित करता है। हिस्टोग्राम मूल्य 1 पिक्सेल प्रति 1 किमी / घंटा के पैमाने पर गति है। यदि गति 40 किमी / घंटा से अधिक हो जाती है, तो छवि को स्केल से बाहर जाने से बचने के लिए 2 गुना से नीचे स्केल किया जाता है। यहाँ वर्णित किए जाने के लिए डिवाइस के व्यवहार की पूरी विशेषताओं की आवश्यकता नहीं है।बाद में मैंने माध्यमिक मापदंडों पर महत्वहीन शून्य हटा दिया और उन्हें अधिक स्पष्ट रूप से प्रदर्शित करने के लिए। ग्राफिकल मोड में, गति की गति का एक हिस्टोग्राम बाएं से दाएं की ओर खींचा जाता है, जो पहिया के 84 क्रांतियों की दूरी के एक छोटे से हिस्से पर गति को बदलने की प्रक्रिया को स्पष्ट रूप से प्रदर्शित करता है। हिस्टोग्राम मूल्य 1 पिक्सेल प्रति 1 किमी / घंटा के पैमाने पर गति है। यदि गति 40 किमी / घंटा से अधिक हो जाती है, तो छवि को स्केल से बाहर जाने से बचने के लिए 2 गुना से नीचे स्केल किया जाता है। यहाँ वर्णित किए जाने के लिए डिवाइस के व्यवहार की पूरी विशेषताओं की आवश्यकता नहीं है।बाद में मैंने माध्यमिक मापदंडों पर महत्वहीन शून्य हटा दिया और उन्हें अधिक स्पष्ट रूप से प्रदर्शित करने के लिए। ग्राफिकल मोड में, गति की गति का एक हिस्टोग्राम बाएं से दाएं की ओर खींचा जाता है, जो पहिया के 84 क्रांतियों की दूरी के एक छोटे से हिस्से पर गति को बदलने की प्रक्रिया को स्पष्ट रूप से प्रदर्शित करता है। हिस्टोग्राम मूल्य 1 पिक्सेल प्रति 1 किमी / घंटा के पैमाने पर गति है। यदि गति 40 किमी / घंटा से अधिक हो जाती है, तो छवि को स्केल से बाहर जाने से बचने के लिए 2 गुना से नीचे स्केल किया जाता है। यहाँ वर्णित किए जाने के लिए डिवाइस के व्यवहार की पूरी विशेषताओं की आवश्यकता नहीं है।हिस्टोग्राम मूल्य 1 पिक्सेल प्रति 1 किमी / घंटा के पैमाने पर गति है। यदि गति 40 किमी / घंटा से अधिक हो जाती है, तो छवि को स्केल से बाहर जाने से बचने के लिए 2 गुना से नीचे स्केल किया जाता है। यहाँ वर्णित किए जाने के लिए डिवाइस के व्यवहार की पूरी विशेषताओं की आवश्यकता नहीं है।हिस्टोग्राम मूल्य 1 पिक्सेल प्रति 1 किमी / घंटा के पैमाने पर गति है। यदि गति 40 किमी / घंटा से अधिक हो जाती है, तो छवि को स्केल से बाहर जाने से बचने के लिए 2 गुना से नीचे स्केल किया जाता है। यहाँ वर्णित किए जाने के लिए डिवाइस के व्यवहार की पूरी विशेषताओं की आवश्यकता नहीं है।यह मेरे स्पीडोमीटर और खरीदे गए सस्ते के बीच की विशेषताओं में से एक है। इसमें डिस्प्ले पर स्पीड इंडिकेशन को अपडेट करने की गति शामिल है। मेरे डिवाइस में, पहिया के प्रत्येक घुमाव के साथ, गणना के अनुसार इसे तुरंत अपडेट किया जाता है। खरीदे गए उपकरणों में, यह एक निश्चित देरी से अपडेट किया जाता है। शायद यह देरी अधिक विस्तृत स्पष्टता के लिए प्रदर्शन पर गति प्रदर्शन को स्थिर करने के लिए माप शोर (उदाहरण के लिए चलती औसत विधि का उपयोग करके) को फ़िल्टर करने के प्रयास के कारण है। या शायद प्रदर्शन को नियमित अंतराल पर पूरी तरह से अपडेट किया जाता है (उदाहरण के लिए, दो बार एक सेकंड)। यह सुविधाजनक हो सकता है, लेकिन मैं पहिया की हर क्रांति के साथ एक गति अद्यतन को लागू करना चाहता था।मुद्रित सर्किट बोर्ड LUT विधि द्वारा उपयोग किए गए मोबाइल फोन के मूल सर्किट बोर्ड के रूप में बनाया गया है। सर्किट बोर्ड के निर्माण में, मैंने SLayout प्रोग्राम का उपयोग किया। उसी समय, मैंने पहले से स्कैनर के दोनों किनारों पर मूल बोर्ड की एक तस्वीर ली और छवियों को टेम्पलेट के रूप में SLayout में डाल दिया। विशेष रूप से आवश्यक स्थानों में प्रदर्शन, बटन और कनेक्टर्स को जोड़ने के लिए पैड खींचने के लिए यह आवश्यक है। बोर्ड के निर्माण में, लगभग 0.5 मिमी की त्रुटि उत्पन्न हुई। पैड और तत्वों के संयोजन के मामले में यह त्रुटि स्वीकार्य थी। हालांकि, इस त्रुटि ने बैकलाइट की गुणवत्ता को प्रभावित किया: सीलबंद एल ई डी को मिलीमीटर के एक अंश द्वारा स्थानांतरित कर दिया गया था और प्रकाश-बिखरने वाले मंडलों के फोकस में नहीं आया था। इस वजह से, बैकलाइट की चमक कम हो गई, दक्षता कम हो गई।नीचे दिए गए आंकड़े SLayout में एक सिम कार्ड के रूप में ROM के लिए तीन छोटे मुद्रित सर्किट बोर्डों के साथ मिलकर सर्किट बोर्ड का दृश्य दिखाते हैं। इसके अलावा, दो पक्षों से मूल मुद्रित सर्किट बोर्ड के स्कैन दिखाए जाते हैं।
कुछ तत्व (बटन, कनेक्टर) पटरियों को बिछाने की क्षमता की कमी के लिए पतले तार कूदने वालों द्वारा परस्पर जुड़े हुए हैं। सभी उपलब्ध बटन के लिए एक मार्जिन है, अर्थात, किसी भी उपलब्ध बटन का उपयोग करना संभव है। डिस्प्ले मोड स्विच करने के लिए केंद्र में बड़े बटन को बटन बनाना सुविधाजनक हो सकता है। बोर्ड के ऊपरी बाएं कोने में एक 3-वोल्ट आरटीसी पावर बैटरी है। सामान्य तौर पर, बोर्ड के सभी तत्वों को मामले के आयामों के साथ उनके आयामों के समन्वय के साथ सही ढंग से रखा जाता है। गिल्ड मूल के विपरीत, इन-हाउस बोर्ड साधारण मिलाप के साथ लेपित है। जैसा कि प्रारंभिक अभ्यास द्वारा दिखाया गया है, प्रदर्शन और अन्य बाह्य उपकरणों के साथ संपर्क खो नहीं है।एमके के लिए कार्यक्रम काफी बड़ा निकला और इसकी स्मृति का एक महत्वपूर्ण हिस्सा है। इसके अलावा, कार्यक्रम आवश्यक जानकारी को रिकॉर्ड करने और सहेजने के लिए नियंत्रक (EEPROM) की अपनी गैर-वाष्पशील मेमोरी के उपयोग के लिए प्रदान करता है। नीचे दी गई तालिका EEPROM पते द्वारा इस जानकारी के वितरण को दर्शाती है।पता | आकार | डेटा |
0 | 4 | n (S के लिए) |
4 | 2 | t_min (v_max के लिए) |
6 | 6 | T_min की तिथि |
12 | 2 | पता EEPROM |
14 | 1 | EEPROM RW काउंट |
128 | 80 | अंक 8X8 |
208 | 30 | अंक 3X5 |
पहले चार बाइट्स दूरी को पहिया के क्रांतियों की संख्या के रूप में यात्रा करते हैं। मैंने विशेष रूप से इस चर के लिए 32-बिट पूर्णांक प्रकार चुना है, क्योंकि व्यवहार में यात्रा के पथ के मूल्य अपेक्षाकृत बड़े हैं। उदाहरण के लिए, एक पूर्णांक 16-बिट चर अधिकतम 65,536 क्रांतियों (लगभग 148 किमी) को बचा सकता है, जो स्वाभाविक रूप से छोटा है। दो बाइट्स अधिकतम अधिकतम गति बनाए रखने के लिए अनुसरण करते हैं। वास्तव में, न्यूनतम पहिया रोटेशन का समय बचाया जाता है। चर दो बाइट्स लेता है, क्योंकि इसका मूल्य 16-बिट टाइमर को मापने का परिणाम है। अगले 6 बाइट्स वह तारीख और समय है जो उपरोक्त अधिकतम गति तक पहुँच गया था। डेटा बिल्कुल उस प्रारूप में प्रस्तुत किया जाता है जिसमें इसे RTC चिप (सप्ताह के दिन को छोड़कर) से पढ़ा जाता है। अगला, दो बाइट जो बाहरी रॉम के वर्तमान पते के मूल्य को संग्रहीत करते हैं। यह एक प्रकार का सूचक है, जो डिवाइस पर अगले मोड़ के बाद रॉम पर आंकड़ों की रिकॉर्डिंग जारी रखने की संभावना के लिए आवश्यक है। एमके को पता होना चाहिए कि बाहरी रॉम के पता स्थान की स्थिति अंतिम समय के लिए बंद हो गई। इस स्थिति से एमके रिकॉर्डिंग जारी रखेगा। यह मान 2 बाइट्स आवंटित किया गया है, क्योंकि बाहरी रॉम का पता स्थान 16-बिट है। यह 64 kB ROM आकार से आता है। अगला एक एकल-बाइट चर है जो ROM ओवरराइट की संख्या के मूल्य को संग्रहीत करता है। ओवरराइटिंग वह स्थिति है जब उपरोक्त पॉइंटर अधिकतम मूल्य तक पहुंच जाता है और शून्य हो जाता है। इस मामले में, ROM पर नई प्राप्त जानकारी बहुत शुरुआत से दर्ज की जाएगी, जो उस पर उपलब्ध पुरानी जानकारी को मिटा देगा। एक पूर्णांक एकल-बाइट चर अधिकतम 256 मान संग्रहीत करने में सक्षम है। मैं आपको याद दिलाता हूं कि ROM एड्रेस पॉइंटर के मान और ओवरराइट की संख्या डिस्प्ले पर दो प्रगति बार द्वारा दिखाई जाती है। इसके अलावा, EEPROM MK के एक बड़े बैकअप स्थान के बाद, पता 128 पर शुरू होने से, 8x8 अंकों के बारे में ग्राफिक जानकारी संग्रहीत होती है। इसके लिए, 80 बाइट्स आवंटित हैं (प्रत्येक अंक के लिए 8 बाइट्स, जैसा कि पहले उल्लेख किया गया है)। और अंत में, पता 208 पर शुरू, 30 बाइट्स छोटे 3x5 अंकों (प्रति अंक तीन बाइट्स) के बारे में चित्रमय जानकारी के लिए संग्रहीत किए जाते हैं।
माइक्रोकंट्रोलर के लिए मुख्य कार्यक्रम के अलावा, मैंने कंप्यूटर के लिए तीन और सहायक कार्यक्रम लिखे, जिनके बारे में नीचे चर्चा की जाएगी। सभी कार्यक्रमों में एक चित्रमय इंटरफ़ेस नहीं है और विंडोज एक्सपी की कमांड लाइन से काम करता है।
पहला प्रोग्राम आपको कंप्यूटर और बाइक के स्पीडोमीटर से दिनांक और समय को COM पोर्ट के माध्यम से कॉपी करने की अनुमति देता है। बाइक स्पीडोमीटर MAX232 चिप के माध्यम से कंप्यूटर से जुड़ा है। WinAPI का उपयोग करते हुए, प्रोग्राम को SYSTEMTIME प्रकार के एक विशेष संरचनात्मक चर में वर्तमान दिनांक और समय प्राप्त होता है। दशमलव प्रारूप में वर्तमान दिन, माह, वर्ष, कार्यदिवस संख्या, घंटे, मिनट, सेकंड इस चर से निकाले जाते हैं। ये सभी संख्याएं, वर्ष के अपवाद के साथ, दो दशमलव स्थानों (100 से कम) से अधिक नहीं होती हैं और एक बाइट के भीतर होती हैं। वर्ष का मान 2000 अंकों से घटाकर दो अंकों की संख्या में बदल जाता है, वर्तमान सहस्राब्दी का मान। इन दो अंकों में से प्रत्येक दशमलव संख्या बाइनरी दशमलव प्रारूप आरटीसी चिप की विशेषता में बदल जाती है। इस प्रारूप में, दो अंकों की संख्या में एक बाइट की मात्रा भी होती है। सबसे महत्वपूर्ण 4 बिट्स दसियों के अंक एन्कोडेड हैं, और कम से कम महत्वपूर्ण - इकाइयों की संख्या। इसके बाद, इन नंबरों से एक 13-बाइट पार्सल बनता है, एक प्रोटोकॉल के अनुसार जो मैंने पहले निर्धारित किया था। पहले पांच बाइट मानक ASCII एन्कोडिंग के अनुसार "टाइम =" शब्द का प्रतिनिधित्व करते हैं। फिर सेकंड, मिनट, घंटे, सप्ताह का दिन, दिन, महीना, वर्ष का पालन करें। अंतिम बाइट संदेश के अंत के चरित्र के रूप में "#" चरित्र है। यह पैकेज कंप्यूटर से डिवाइस तक COM पोर्ट के माध्यम से भेजा जाता है। माइक्रोकंट्रोलर कार्यक्रम पैकेज को प्राप्त करता है और इसे उपरोक्त प्रारूप के अनुसार, शुद्धता के लिए जांचता है। यदि पहले पाँच बाइट्स "TIME =" हैं और अंतिम "#" है, तो भेजने को सही माना जाता है, और अंदर के बाइट्स को इसी क्रम में व्याख्या किया जाता है। इस बाइट स्ट्रिंग को बदले बिना, नियंत्रक इसे I2C बस के माध्यम से RTC चिप को भेजता है, इसे वर्तमान तिथि और समय के लिए कॉन्फ़िगर करता है। मैं ध्यान देता हूं कि यह माइक्रोकिरिट 1 से 7 तक सप्ताह के दिनों की गणना का समर्थन करता है, हालांकि ऐसे कैलेंडर के रूप में जो सप्ताह की तारीख और दिन के पत्राचार को निर्धारित करता है, यह नहीं है। मैंने अपने डिवाइस में सप्ताह के दिन के बारे में जानकारी प्रदर्शित करने के लिए प्रदान नहीं किया।
दूसरा प्रोग्राम बाहरी रॉम की सामग्री से डेटा को संसाधित करने के लिए डिज़ाइन किया गया है। प्रारंभ में, यह माना गया था कि इस सामग्री को ROM से छवि फ़ाइल में कुछ प्रसिद्ध प्रोग्राम का उपयोग करके कॉपी किया जाना चाहिए जो कि प्रसिद्ध एमके और रोम प्रोग्रामर (उदाहरण के लिए, "icprog") के साथ काम करता है। हालांकि, I2C ऑपरेशन के सिद्धांत का अधिक विस्तार से अध्ययन करने के बाद, मैंने इस कार्यक्षमता को लागू करने में कामयाबी हासिल की और इसे अपने कार्यक्रम में शामिल किया। इस श्रृंखला के रॉम प्रोग्रामर की योजना, जिसे मैंने डिवाइस में उपयोग किया था, नीचे दिए गए आंकड़े में प्रस्तुत किया गया है।

ROM कंप्यूटर के COM पोर्ट से जुड़ा है, जिसका उपयोग RS-232 के माध्यम से सूचनाओं के आदान-प्रदान के साधन के रूप में नहीं किया जाता है (जहाँ यह TX, RX, GND के आउटपुट का उपयोग करने के लिए पर्याप्त है), लेकिन तार्किक संकेतों के मनमाने इनपुट-आउटपुट के साधन के रूप में। TX टर्मिनल के माध्यम से, ROM संचालित होता है, जिसे 78L05 नियामक द्वारा 5V तक स्थिर किया जाता है। कंप्यूटर से TX आउटपुट को नियंत्रित करके, हम ROM चिप को चालू या बंद कर सकते हैं। SCL यूनिडायरेक्शनल क्लॉक लाइन COM पोर्ट के RTS पिन पर केंद्रित है, और SDA द्वि-दिशात्मक डेटा लाइन दो पिनों पर केंद्रित है: CTS (डेटा रिसेप्शन) और DTR (डेटा ट्रांसमिशन)। प्रतिरोधों और जेनर डायोड डी 1 और डी 2 का उपयोग सिग्नल स्तर को टीटीएल तक सीमित करने के लिए किया जाता है, जिस पर रोम काम करता है।
मैंने अपने विशेष मामले के लिए यह मानक प्रोग्रामर बनाया, जहां ROM के लिए सॉकेट के बजाय, एक टूटे हुए मोबाइल फोन से एक सिम रीडर का उपयोग किया जाता है।

WinAPI के माध्यम से, प्रोग्राम कंप्यूटर के COM पोर्ट के पिन तक पहुंचता है, उनके लिए आवश्यक मान (0 या 1) सेट करता है, और सीटीएस पिन से रोम से आने वाले द्विआधारी मूल्य को भी हटा देता है। इस टूलकिट के आधार पर, I2C कार्यक्षमता को प्रासंगिक विनिर्देश के अनुसार लागू किया गया था, जिसके बारे में मैं विवरण में नहीं जाऊंगा। कार्यक्रम रोम की सामग्री को एक फ़ाइल छवि (एक नियमित प्रोग्रामर की तरह) में पढ़ सकता है, और इस तरह की फ़ाइल को संसाधित कर सकता है, या सीधे रोम से जानकारी संसाधित कर सकता है। सूचना प्रसंस्करण में ROM से इनपुट जानकारी के आधार पर एक पूर्व निर्धारित सारणीबद्ध प्रारूप में आउटपुट आँकड़े फाइलें प्राप्त करना शामिल है। ऐसी प्रत्येक फ़ाइल एक ट्रिप (करंट के क्षण से लेकर अगली बार डिवाइस चालू होने तक) से मेल खाती है। सबसे पहले, मैं पहले से परिभाषित इनपुट प्रारूप का संक्षिप्त वर्णन करूंगा। जब भी डिवाइस चालू होता है, शून्य के दो बाइट्स वर्तमान पते पर लिखे जाते हैं, जो कि माइक्रोकंट्रोलर के EEPROM से पढ़ा जाता है। जब पहिया एक टाइमआउट के बाद या डिवाइस को चालू करने के बाद (पहले आवेग पर) घूमना शुरू करता है, तो वर्तमान तिथि और समय बाइनरी दशमलव प्रारूप में लिखा जाता है (क्योंकि यह आरटीसी चिप के रजिस्टरों में संग्रहीत होता है)। और फिर "इकाइयों" के दो बाइट्स 0xFF दर्ज किए जाते हैं। पहिया के रोटेशन के दौरान, प्रत्येक k-th नाड़ी (k = 2,3, ...) के लिए, (k-1) वें और k-th नाड़ी के बीच पहिया रोटेशन का समय दो बाइट्स (उच्च और निम्न) द्वारा दर्ज किया जाता है। जाहिर है, यह जानकारी वर्तमान (निरपेक्ष नहीं) दूरी की यात्रा और तारीख और समय की गति को जोड़ने के लिए पर्याप्त है। आउटपुट स्वरूप पाठ है और * .csv फ़ाइलों में एक सारणीबद्ध तालिका है जो माउस को डबल-क्लिक करके एक्सेल में खोली जाती है। इस तालिका में पंक्तियाँ पहिया क्रांतियों के अनुरूप हैं, और स्तंभ मान नीचे दिखाए गए हैं।
एडीआर | रॉम पता मान |
दिनांक / समय | प्रारंभ दिनांक और समय |
डीईसी | दशमलव समय मान |
समय | वर्तमान समय |
टी | सत्ता से यात्रा के समय |
v | गति |
n | क्रांतियों की संख्या |
एस | जिस तरह से |
एक | क्रांतियों की पूर्ण संख्या (केवल वर्तमान ROM के भीतर) |
aS | पूर्ण पथ (केवल वर्तमान ROM के भीतर) |
n_day | वर्तमान दिन के लिए क्रांतियों की संख्या |
S_day | वर्तमान दिन के लिए रास्ता |
v_max | वर्तमान यात्रा के लिए अधिकतम गति |
av_max | पूर्ण अधिकतम गति (केवल वर्तमान ROM के भीतर) |
v_mid | वर्तमान यात्रा के लिए औसत गति |
एक्सेल में ऐसी फ़ाइल की सामग्री का स्क्रीनशॉट नीचे दिए गए चित्र में दिखाया गया है। इसके अलावा, एक समन्वय प्रणाली में विभिन्न रंगों में वर्तमान, औसत और अधिकतम गति में परिवर्तन के ग्राफ दिखाए जाते हैं। तर्क (एक्स अक्ष) - इनपुट डेटा के रूप में गति मान। यह आंकड़ा पहले 730 क्रांतियों के लिए पैरामीटर परिवर्तन दिखाता है। यात्रा की गई दूरी इस चर रैखिक निर्भरता (730 क्रांतियों के साथ लगभग 1650 मीटर) से जुड़ी है। इसलिए, हम कह सकते हैं कि रेखांकन समय पर गति की पारंपरिक निर्भरता के विपरीत, दूरी (क्षैतिज पैमाने पर सटीक) पर गति की निर्भरता को दर्शाता है, जिस पर ध्यान दिया जाना चाहिए। जैसा कि पहले ही उल्लेख किया गया है, यह विशेषता पहिया गति द्वारा गति को मापने की विचारधारा और सिद्धांत के कारण है। लेकिन आखिरकार, समय का एक निश्चित समय पहिया की प्रत्येक क्रांति (चुंबक के दृष्टिकोण और रीड स्विच) के लिए सौंपा जाता है। स्वाभाविक रूप से, टाइमस्टैम्प का यह क्रम एक समान नहीं है। हालांकि, औपचारिकता और सुविधा के लिए, एक्सेल में ग्राफ़ के लिए एक तर्क के रूप में मार्ग या वर्तमान समय में समय मूल्यों की एक सरणी निर्दिष्ट करने की क्षमता है। लेकिन सभी एक ही, यह याद रखना चाहिए कि समय पर गति की वास्तविक निर्भरता (असतत मामले के लिए एक समान समय अंतराल पर) एक भिन्न क्षैतिज पैमाने के साथ, अलग दिखेगी।


नीचे दिया गया आंकड़ा क्रांतियों पर गति की समान निर्भरता को दर्शाता है, लेकिन पहले से ही 11 क्रांतियों की खिड़की की चौड़ाई के साथ चलती औसत विधि का उपयोग करके फ़िल्टर का उपयोग कर रहा है। सभी रेखांकन एक्सेल में अच्छी तरह से ज्ञात विधियों का उपयोग करके बनाए गए हैं।

गति में परिवर्तन के दो ग्राफ़ों की तुलना करते हुए, यह स्पष्ट है कि फ़िल्टर किए गए ग्राफ़ में उच्च-आवृत्ति घटक अनुपस्थित है, अर्थात। शोर हटा। मेरी राय में, 11 क्रांतियों (लगभग 25 मीटर) की चलती औसत खिड़की की चौड़ाई बहुत बड़ी है। यदि आप वास्तव में शोर से रीडिंग को फ़िल्टर करने का सवाल उठाते हैं, तो यह एक छोटी खिड़की की चौड़ाई लेने के लिए पर्याप्त है, उदाहरण के लिए, तीन के बराबर। इस एल्गोरिथ्म को बाइक स्पीडोमीटर प्रोग्राम में शामिल किया जा सकता है, क्योंकि इसका उपयोग न केवल रीडिंग का विश्लेषण करने के लिए किया जा सकता है, बल्कि वास्तविक समय में इन रीडिंग को प्रदर्शित करने के लिए भी किया जा सकता है। इस एल्गोरिथ्म की सादगी के बावजूद, मैं इसके विवरण के विवरण में नहीं जाऊंगा, क्योंकि यह विषय गणित के पाठ्यक्रम में शामिल है और इस लेख के दायरे से परे है। और यहां औसत गति के बारे में एक और स्पष्टीकरण है। जैसा कि मैंने पहले ही लिखा है, औसत गति एकमात्र पैरामीटर है जिसे पहिया के हर घुमाव के साथ नहीं, बल्कि हर सेकंड में अपडेट किया जाता है। मैंने यह सुनिश्चित करने के लिए ऐसा किया कि प्रदर्शन बहुत धीमी गति से भी औसत गति में बदलाव दिखाता है। इसलिए, वास्तविक समय में डिस्प्ले पर रीडिंग के मान रोम को स्कैन करने के चरण में कंप्यूटर प्रोग्राम द्वारा भविष्य में गणना किए गए मानों से थोड़ा भिन्न होंगे। निरपेक्ष गति, पूर्ण पथ और पूर्ण अधिकतम गति की रीडिंग भी भिन्न होगी। प्रदर्शन वास्तव में निरपेक्ष मूल्यों (डिवाइस के पूरे जीवन के लिए) को दिखाता है, और आउटपुट तालिकाओं में - केवल वर्तमान रॉम की सीमा के भीतर पढ़ा जा रहा है।
तीसरा कार्यक्रम, संक्षेप में, फर्मवेयर माइक्रोकंट्रोलर के लिए एक ही कार्यक्रम है। मैं कंप्यूटर के एलपीटी पोर्ट से जुड़े सबसे सरल एसटीके 200 प्रोग्रामर के साथ काम करता हूं, या इसके एनालॉग के साथ, यदि आप इसे कॉल कर सकते हैं, क्योंकि सरलतम मामले में प्रोग्रामर में कोई सक्रिय तत्व नहीं है। वास्तव में, एसपीआई इंटरफ़ेस के माध्यम से एमके सीधे एलपीटी पोर्ट के विशिष्ट पिन से जुड़ता है और एक गुलाम के रूप में काम करता है। कार्यक्रम अपने डेटाशीट (पृष्ठ 237) के अनुसार ATmega8 नियंत्रक के साथ डेटा के आदान-प्रदान के लिए एक प्रोटोकॉल लागू करता है। SPI भौतिक परत को अच्छी तरह से ज्ञात गतिशील पुस्तकालय "inpout32.dll" का उपयोग करके LPT पोर्ट रजिस्टरों का प्रबंधन करके कार्यान्वित किया जाता है। मेरी लाइब्रेरी एक प्रोजेक्ट के रूप में नहीं जुड़ी हुई है (क्योंकि मैंने एक सरल "फ़ाइल" बनाकर "देव-सीपीपी" के रूप में एक प्रोजेक्ट बनाने से परहेज किया था, लेकिन हिनस्टैन्स स्ट्रक्चरल प्रकार का उपयोग करके लोडलॉउटर फ़ंक्शन का उपयोग करके। "Inpout32.dll" लाइब्रेरी को इस प्रकार के एक वैरिएबल पर मैप किया जाता है, और बाद में इस लायब्रेरी से कार्यों के लिए संकेत अलग-अलग चर में निकाले जाते हैं। Inpout32.dll में केवल दो फ़ंक्शन हैं जो डेटा के इनपुट और आउटपुट के लिए जिम्मेदार हैं। ये फ़ंक्शंस प्री-एक्सट्रैक्टेड पॉइंटर्स का उपयोग करके एक्सेस किए जाते हैं। LPT पोर्ट पिन को बिट मास्क का उपयोग करके व्यक्तिगत रूप से नियंत्रित किया जाता है। मेरे विशेष मामले में, मैंने जो प्रोग्राम लिखा था, वह नियंत्रक के EEPROM क्षेत्र के साथ काम करता है और इसे उस स्टोर किए गए डेटा की बैकअप प्रतिलिपि से पढ़ने, रिज़र्व करने, लिखने, सही करने और पुनर्स्थापित करने के लिए डिज़ाइन किया गया है, जिसे मैंने पहले चित्रित किया था। अन्य सभी कार्यक्रमों की तरह, प्रोग्राम कमांड लाइन से चलता है। ऐसे मामलों में, कार्यक्रम की बहुक्रियाशीलता को लागू करने के लिए, "स्विच-केस" फ़ंक्शन और एक पाठ उपयोगकर्ता संवाद का उपयोग किया जाता है, उदाहरण के लिए, "ऑपरेशन नंबर 1 के लिए '1' दर्ज करें, ..., प्रोग्राम से बाहर निकलने के लिए '0' दर्ज करें।" डेटा मेरे लिए सुविधाजनक विभिन्न प्रारूपों में प्रदर्शित किया गया है। उपरोक्त के अलावा, प्रोग्राम स्क्रीन पर 512 बाइट्स में EEPROM नियंत्रक का एक पूर्ण डंप प्रदर्शित कर सकता है। साथ ही, प्रोग्राम नियंत्रक की मेमोरी में उपयोग किए गए फोंट के बारे में ग्राफिक जानकारी रिकॉर्ड कर सकता है। छोटे प्रिंट के मामले में, आकार 3X5, कार्यक्रम पाठ फ़ाइल "फ़ॉन्ट्स 3X5.txt" से जानकारी लेता है, जो इसके साथ एक ही निर्देशिका में स्थित है। फ़ाइल में हेक्साडेसिमल प्रारूप में लिखित 30 बाइट्स (3 बाय 10) की एक सारणी तालिका है। यदि वांछित है, तो यह आसानी से एक पाठ संपादक में संपादित किया जा सकता है, इस प्रकार इस फ़ॉन्ट के ग्राफिक्स को बदल सकता है। जैसा कि पहले ही उल्लेख किया गया है, यह छोटा प्रिंट इतना सरल है कि इसके ग्राफिक्स को बदलने का कोई मतलब नहीं है। केवल एक चीज यह है कि इसकी ऊर्ध्वाधर पारी की केवल आवश्यकता हो सकती है, क्योंकि 8 पिक्सेल की ऊंचाई में अंतरिक्ष का एक स्टॉक है, और फ़ॉन्ट की ऊंचाई 5 के बराबर है। बड़े फ़ॉन्ट के मामले में, आकार 8X8, जो वर्तमान गति को प्रदर्शित करता है, मैंने कार्यक्षमता को और अधिक दिलचस्प प्रदान किया। इस फ़ॉन्ट के बारे में ग्राफिक जानकारी टेक्स्ट फाइल में बाइट्स की तालिका के रूप में नहीं, बल्कि ग्राफिक विज़ुअल बीएमपी फाइलों में प्रस्तुत की जाती है। प्रत्येक अंक एक ऐसी फ़ाइल से मेल खाता है। इसके मापदंडों का आकार 8X8 है, एक काले और सफेद पैलेट के साथ मोनोक्रोम। नीचे “8.bmp” फाइल के साथ प्रसिद्ध ग्राफिक एडिटर “MS Paint” का स्क्रीनशॉट खुला है।

जाहिर है, मैंने एमएस पेंट से प्राप्त मोनोक्रोम बीएमपी फाइलों की संरचना का अध्ययन किया, और इस आधार पर मैं मोनोक्रोम बीएमपी छवि (संरचनाओं और सहायक पुस्तकालयों के उपयोग को छोड़कर) के प्रत्येक पिक्सेल को पढ़ने में सक्षम था। नीचे से ऊपर क्षैतिज लाइन-बाय-लाइन पढ़ने के चरण में (यह बीएमपी फ़ाइल की संरचना कैसे व्यवस्थित है), कार्यक्रम उपयोग किए गए प्रदर्शन के लिए विशिष्ट जानकारी को ऊर्ध्वाधर प्रारूप में परिवर्तित करता है। यह ऑपरेशन एक पास में किया जाता है, जहां बिट मास्क और चर मानों के संचय का उपयोग किया जाता है। नीचे मैं i-th अंक के लिए कोड की इस धारा को दिखाऊंगा, प्रक्रिया की सादगी पर ध्यान देना।
for(k=0; k<8; k++){ fnt[i][k] = 0; } for(j=0; j<8; j++){ fseek(f, 62+4*j, SEEK_SET); byte = ~fgetc(f); for(k=0; k<8; k++){ if(byte & pow2(7-k)){ fnt[i][k] += pow2(7-j); } } }
पहले लूप में, फ़ेंट ऐरे के तत्वों को ज़ीरोस से आरंभ किया जाता है। इसके अलावा, इस सरणी के प्रत्येक k- वें तत्व (k = 0 ... 7) के लिए i-th अंक (i = 0 ... 9) प्रत्येक संगत अंक के प्रत्येक कॉलम के बारे में ग्राफिक जानकारी ले जाएगा। अगला चक्र बीएमपी फ़ाइल की छवि की तर्ज पर चलाया जाता है। Fseek ऑपरेटर के साथ, हम पूर्वनिर्धारित बीएमपी फ़ाइल f के 62 + 4 * j के ऑफसेट पर खुद को बाइट करते हैं। सूत्र की वह विशिष्टता जिसके द्वारा ऑफ़ लाइन संख्या j के आधार पर ऑफ़सेट की गणना BMP फ़ाइल की संरचना द्वारा की जाती है। बाइट इंटरमीडिएट चर में, हमें उपरोक्त ऑफसेट पर बाइट मान मिलता है। यह बाइट वर्तमान लाइन जम्मू में एक मोनोक्रोम चित्र के सभी आठ पिक्सेल के बारे में जानकारी संग्रहीत करता है। '~' ऑपरेटर बाइट का एक बिटवाइस उलटा करता है, जिससे प्रत्येक पिक्सेल का रंग उलटा हो जाता है। यह इस तथ्य के कारण है कि मोनोक्रोम बीएमपी फ़ाइल के पैलेट में एक काला पिक्सेल एक तार्किक "0" और सफेद - "1" से मेल खाता है। लागू प्रदर्शन में, इसके विपरीत। नेस्टेड लूप में, बाइट का एक बाइट विश्लेषण होता है और एक ही समय में, जानकारी fnt आउटपुट सरणी में जमा होती है। समारोह pow2 - एक गैर-नकारात्मक पूर्णांक शक्ति के लिए एक दो को ऊपर उठाना, स्वतंत्र रूप से लिखा गया। इस फ़ंक्शन के बजाय, आप अधिक कुशल बिटवाइज़ शिफ्ट ऑपरेटर "<<" का उपयोग कर सकते हैं, लेकिन इस कार्यक्रम को लिखने के समय मैं इसका उपयोग नहीं कर रहा था।
इसके अलावा, यह प्रोग्राम मेरी पसंद के इस फॉन्ट के लिए एमके की कई ग्राफिक विकल्पों में से एक को लिखने की क्षमता प्रदान करता है। इन विकल्पों को "v1", "v2", "v3", आदि नाम के साथ निर्देशिका (फ़ोल्डर) का उपयोग करके कार्यान्वित किया जाता है, जो प्रोग्राम के समान निर्देशिका में "फ़ॉन्ट्स 8X8" फ़ोल्डर में स्थित हैं। और पहले से ही इन फ़ोल्डरों में आवश्यक बीएमपी फाइलें हैं। उपर्युक्त कार्यक्षमता के लिए धन्यवाद, यह एक आलेखीय संपादक में "रिक्त शीट" से संख्याओं को सही या आकर्षित करना संभव है, उन्हें निर्देशिकाओं के माध्यम से सहेजना और वितरित करना। मेरे पास तीन फ़ॉन्ट विकल्प हैं। पहला विकल्प मूल है। दूसरा - मूल की तरह, लेकिन एक पार किए गए शून्य और एक संशोधित इकाई (अंडरस्कोर के बिना) के साथ। तीसरा एक आयताकार सीमा वाला एक फ़ॉन्ट है।
नीचे दी गई तस्वीरें दिखाती हैं: पीछे से डिवाइस का निर्मित सर्किट बोर्ड; मेज पर एक उपकरण जिसमें पावर जुड़ा हुआ है (फर्मवेयर के एक गैर-अंतिम संस्करण के साथ); ऑपरेशन में एक उपकरण उस पर प्रदर्शित गति परिवर्तन के ग्राफ के साथ एक साइकिल पर घुड़सवार।



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



मैंने एक सीएनसी मिलिंग मशीन पर 17 मिमी मोटी plexiglass के टुकड़े से डिवाइस के लिए मामला बनाया। ऐसा करने के लिए, मैंने प्रारंभिक कार्यक्रम में कथानक के नमूने को स्केलेच किया, लगभग पूरी तरह से ड्राइंग, सीएडी, आदि के विषय को नहीं जानता था।

ये रेखाचित्र सामान्य प्रस्तुति और नियंत्रण बिंदुओं के निर्देशांक प्राप्त करने के लिए आवश्यक हैं। उनके आधार पर, सीएनसी मशीन के लिए एक कार्यक्रम लिखा जाता है, जिसमें मिलिंग के सामान्य सिद्धांतों और अनुक्रमों को ध्यान में रखा जाता है। मैंने एक्सेल में मैन्युअल रूप से सीएनसी प्रोग्राम लिखा था, दोहराया संचालन के लिए स्वत: पूर्ण कार्यों का उपयोग करते हुए।


मैंने डिवाइस लेआउट को भी थोड़ा ठीक किया, यह नीचे दिए गए आंकड़े में प्रस्तुत किया गया है।

कीबोर्ड के पहले से ही अनावश्यक बैकलाइटिंग के बजाय, सुंदरता के लिए एक एलईडी है जो पहिया के हर मोड़ के साथ चमकती है। कनेक्टर्स भी फिर से डिज़ाइन किए गए हैं, और ऐसे कोई अन्य तत्व नहीं हैं जिन्हें डिज़ाइन के अपडेट किए गए संस्करण में आवश्यक नहीं था। इसके अलावा, मैंने अपने स्वयं के कार्यक्रम के स्रोत कोड में कुछ स्थिरांक को सही करते हुए क्वार्ट्ज 4.433619 मेगाहर्ट्ज पाया और स्थापित किया। कार्यक्रम में कुछ छोटे बदलाव भी किए गए।
तैयार उत्पाद की एक तस्वीर नीचे प्रस्तुत की गई है। डिवाइस एक बैटरी द्वारा संचालित होता है जो बाइक पर सवार होता है। इससे, अंधेरे में यात्राओं के लिए प्रकाश व्यवस्था भी प्रदान की जाती है।

यह इस डिजाइन में था कि डिवाइस पूरी तरह से बिना किसी ग्लिच के काम करता था। एकमात्र दोष एक बहुत उच्च गुणवत्ता वाली आरटीसी चिप का उपयोग नहीं है: कम तापमान पर सर्दियों में, समय जल्दी में है, आपको इसे महीने में एक बार समायोजित करना होगा।