दो अंकों का थर्मामीटर



लेखक ने अपने मित्र के बेटे के जन्मदिन के रूप में इस दो अंकों के एलईडी थर्मामीटर को बनाया। वह केवल दो साल का है, और वह पहले से ही संख्याएं पढ़ रहा है, लेकिन पत्र नहीं हैं। अब वह खिड़की के बाहर का तापमान अपने दम पर पता लगा सकता है। थर्मामीटर में सेंसर 1-वायर प्रोटोकॉल के अनुसार एक DS18B20 चिप ऑपरेटिंग है, और माइक्रोकंट्रोलर ATtiny84 प्रकार का है। बोर्ड 25 मिमी के किनारे के साथ वर्ग है, आकार में यह 50 पेंस के सिक्के के बराबर है। लेखक बोर्ड को एक जलरोधी मामले में रखने और इसे खिड़की के बाहर रखने की योजना बनाता है। संकेत हर 24 सेकंड में बदल जाता है, और CR2032 बैटरी लगभग एक साल तक चलती है।
थर्मामीटर -19 से +99 डिग्री सेल्सियस तक की सीमा में संचालित होता है। यदि आवश्यक हो, तो माइनस और एक एक साथ उच्च क्रम में प्रदर्शित होते हैं। सीमा से बाहर, पत्र लो या हाय प्रदर्शित होते हैं। आप एक माइनस के रूप में एक डॉट के साथ एक खंड का उपयोग करके -19 डिग्री सेल्सियस से नीचे तापमान प्रदर्शित करने के लिए डिवाइस को "सिखा" सकते हैं।

इस योजना के अनुसार, डिवाइस को पहले एक ब्रेडबोर्ड पर इकट्ठा किया गया था:



माइक्रोकंट्रोलर के सभी आउटपुट शामिल हैं, अंतर्निहित 8 मेगाहर्ट्ज घड़ी जनरेटर का उपयोग किया जाता है। प्रोटोटाइप इस प्रकार था:



प्रोटोटाइप ने TO-92 पैकेज में DS18B20, PDIP पैकेज में ATtiny84 और 3.6 इंच के 362100 इंडिकेटर का इस्तेमाल किया। तब लेखक ने ईगल में बोर्ड विकसित किया और इसे पीसीबीवे में आदेश दिया। यहां माइक्रोकंट्रोलर पहले से ही SOIC केस में है, सेंसर ,SOP केस में है, और रेसिस्टर्स, कैपेसिटर और डिस्प्ले साइज 0805 हैं। डिस्प्ले को छोड़कर बाकी सब कुछ Youyue 858D / हेअर ड्रायर 250 डिग्री सेल्सियस के तापमान पर टांका लगाता है।

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



एक 20 मिमी लिथियम सेल के लिए एक धारक (20 के साथ शुरू होने वाले पदनाम के साथ कोई भी, यानी 2016, 2025 या 2032) पीछे की तरफ मिला हुआ है:



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

void OneWireSetup () { TCCR1A = 0<<WGM10; // Normal mode TCCR1B = 0<<WGM12 | 2<<CS10; // Normal mode, divide clock by 8 } 

DelayMicros () सबरटीन OCR0A आउटपुट तुलना रजिस्टर के आधार पर एक विशिष्ट संख्या में माइक्रोसेकंड की देरी प्रदान करता है:

 void DelayMicros (unsigned int micro) { TCNT1 = 0; TIFR1 = 1<<OCF1A; OCR1A = micro; while ((TIFR1 & 1<<OCF1A) == 0); } 

डिस्प्लेटेन्स () रूटीन सेंसर से तापमान मान पढ़ता है और इसे प्रदर्शित करता है। चूंकि बस में केवल एक सेंसर होता है, आप सीरियल नंबर को अनदेखा कर सकते हैं और सिर्फ स्किप रोम कमांड दे सकते हैं, जिसके बाद निम्नलिखित सभी कमांड किसी भी डिवाइस पर भेज दिए जाते हैं:

 void DisplayTemperature () { cli(); // No interrupts if (OneWireReset() != 0) { sei(); DisplayError(0); // Device not found } else { OneWireWrite(SkipROM); OneWireWrite(ConvertT); while (OneWireRead() != 0xFF); OneWireReset(); OneWireWrite(SkipROM); OneWireWrite(ReadScratchpad); OneWireReadBytes(9); sei(); // Interrupts if (OneWireCRC(9) == 0) { int temp = DataWords[0]; Display((temp+8)>>4); // Round to nearest degree } else DisplayError(1); // CRC error } } 

अनुरोध के जवाब में, सेंसर 1/16 डिग्री के बराबर इकाइयों में 16-बिट हस्ताक्षरित पूर्णांक के रूप में तापमान मान लौटाता है। यह संख्या निकटतम पूर्णांक डिग्री तक होती है और प्रदर्शन () दिनचर्या को कॉल करके प्रदर्शित की जाती है।

प्रदर्शन-तार () सबरूटीन 1-तार बस पर सेंसर के साथ माइक्रोकंट्रोलर की बातचीत में त्रुटियों को प्रदर्शित करता है:

 void DisplayError (int no) { Buffer[0] = Error; Buffer[1] = no; } 

E0 - सेंसर का पता नहीं लगा, E1 - CRC त्रुटि।

डायनेमिक संकेत के लिए डेटा बफ़र [] सरणी से लिया गया है। उदाहरण के लिए, संख्या 20 प्रदर्शित करने के लिए, आपको यह करना होगा:

 Buffer[0]=2; Buffer[1]=0; 

टाइमर काउंटर 0 125 हर्ट्ज की आवृत्ति पर व्यवधान उत्पन्न करता है, जो झिलमिलाहट को खत्म करने के लिए पर्याप्त है। सबसे पहले, टाइमर सेटअप () में कॉन्फ़िगर किया गया है

 TCCR0A = 2<<WGM00; // CTC mode; count up to OCR0A TCCR0B = 0<<WGM02 | 4<<CS00; // Divide by 256 OCR0A = 250-1; // Compare match at 125Hz TIMSK0 = 0; // Interrupts initially off 

तुलना के दौरान मैचिंग इंटरप्ट हैंडलिंग रूटीन, डिस्प्लेनेटगिजिट () रूटीन को कॉल करता है और फिर विपरीत दिशा में गिना जाता है:

 ISR(TIM0_COMPA_vect) { DisplayNextDigit(); Ticks--; } 

DisplayNextDigit () सबरूटीन बफ़र [] सरणी में संबंधित सेल से डेटा पढ़ता है और इसमें संबंधित सेगमेंट बिट बिट में वांछित खंड शामिल हैं। एक सामान्य कैथोड या एनोड के साथ एक संकेतक के बीच चयन करने के लिए कार्यक्रम #define का उपयोग करता है। यदि सभी सेगमेंट पावर-अप पर तुरंत जलाए जाते हैं, तो प्रदर्शन प्रकार फर्मवेयर में निर्दिष्ट एक से मेल नहीं खाता है। एक सामान्य कैथोड के लिए, सबरूटीन को निम्नलिखित के साथ प्रतिस्थापित किया जाना चाहिए:

 void DisplayNextDigit () { PORTB = PORTB | 1<<digit; // Turn old digit off digit = digit ^ 1; // Toggle between 0 and 1 char segs = charArray[Buffer[digit]]; PORTA = segs; // Lit segments high PORTB = PORTB & ~(1<<digit); // Turn new digit on } 

अंत में, प्रदर्शन () दिनचर्या बफ़र [] सरणी को लिखने के लिए दो अंकों की संख्या पैदा करता है:

 void Display (int n) { int units = n % 10; int tens = n / 10; int temp0 = tens; int temp1 = abs(units); if (tens < -1) {temp0 = Lo; temp1 = Lo+1; } else if (tens > 9) {temp0 = Hi; temp1 = Hi+1; } else if (tens == -1) temp0 = Minus1; else if ((tens == 0) && (units >= 0)) temp0 = Blank; else if ((tens == 0) && (units < 0)) temp0 = Minus; Buffer[0] = temp0; Buffer[1] = temp1; } 

यह उच्च क्रम में इकाई के साथ-साथ माइनस को प्रदर्शित करने के मामलों को भी ध्यान में रखता है, साथ ही सीमा के बाहर के तापमान के बारे में भी संदेश देता है।

अधिकतम संभव ऊर्जा बचत के लिए, ADC, USI और ADC घड़ी जनरेटर अक्षम हैं, और PWR_DOWN स्लीप मोड सक्षम है:

  ADCSRA &= ~(1<<ADEN); // Disable ADC to save power PRR = 1<<PRUSI | 1<<PRADC; // Turn off clocks to USI & ADC to save power set_sleep_mode(SLEEP_MODE_PWR_DOWN); 

मुख्य कार्यक्रम एक सेकंड के दसवें के लिए तापमान प्रदर्शित करता है, फिर स्लीप मोड को चालू करता है। यह पता चला कि यह न्यूनतम संकेत समय है, पढ़ने के लिए सुविधाजनक है। तापमान प्रदर्शित होने से दो सेकंड पहले, डॉट थोड़ी देर में चमकता है:

 void loop () { Buffer[0] = DP; Buffer[1] = Blank; DisplayOn(12); WDDelay(6); // Sleep for 1 second Buffer[0] = Blank; Buffer[1] = DP; DisplayOn(12); WDDelay(6); // Sleep for 1 second DisplayTemperature(); DisplayOn(12); WDDelay(9); // Sleep for 8 seconds WDDelay(9); // Sleep for 16 seconds WDDelay(9); // Sleep for 24 seconds } 

प्रदर्शन 8 सेकंड के लिए तीन वॉचडॉग कॉल के कारण 24 सेकंड के लिए बंद रहता है। इंडिकेटर के चलने के साथ, स्लीप मोड में वर्तमान खपत 6.6 mA है - 4.7 μA, औसत वर्तमान खपत 1/240 * 6.6 mA है। CR2032 सेल की विशिष्ट क्षमता 225 mAh है, इसलिए यह (225 / 6.6) x 240/24 = 340 दिनों के लिए पर्याप्त है - एक वर्ष से थोड़ा कम।

घटकों की तापमान श्रेणियां निम्नानुसार हैं: माइक्रोकंट्रोलर और संकेतक - -40 से + 85 डिग्री सेल्सियस, प्रतिरोधों और संधारित्र - -55 से +125 डिग्री सेल्सियस, बैटरी - -20 से +70 डिग्री सेल्सियस तक। एक विस्तारित तापमान रेंज BR2032 के साथ एक तत्व -30 से +85 डिग्री सेल्सियस तक की सीमा में संचालित होगा।

माइक्रोकंट्रोलर को स्पेंस कोंडे विकास के साथ Arduino- संगत बनाया गया है। IDE में, बोर्ड मेनू के ATTinyCore अनुभाग में ATtiny24 / 44/84 का चयन करें। फिर आपको निम्नलिखित विकल्पों को सेट करने की आवश्यकता है, बाकी पर ध्यान न दें:

 Chip: "ATtiny84" Clock: "8 MHz (internal)" BOD: "BOD Disabled" Pin Mapping: "Clockwise (like damellis core)" 

कार्यक्रम को पोमोना परीक्षण क्लिप का उपयोग करके अपलोड किया गया है, जिसे माइक्रोकंट्रोलर के शीर्ष पर रखा गया है और स्पार्कफुन टिनी एवीए प्रोग्रामर से जुड़ा हुआ है। सबसे पहले आपको Burn Bootloader को Select करना होगा, फिर Upload करें।

लिंक: कार्यक्रम का पूरा पाठ , बोर्ड और GitHub पर कार्यक्रम , OSHpark पर बोर्ड

Source: https://habr.com/ru/post/hi454220/


All Articles