- सामग्री की आवश्यकता:
- पूर्व-आवश्यकताएं:
- सर्किट आरेख:
- अलार्म घड़ी के लिए प्रोग्रामिंग:
- सिमुलेशन:
- PIC16F877A का उपयोग करके डिजिटल अलार्म घड़ी का कार्य:
1950 में शुरू हुई डिजिटल क्रांति ने सभी मौजूदा मैकेनिकल और एनालॉग इलेक्ट्रॉनिक संरचनाओं को डिजिटल कंप्यूटर में बदल दिया। चूँकि डिजिटल इलेक्ट्रॉनिक्स का विकास तेजी से हुआ है, इसलिए आज किसी भी व्यक्ति के लिए किसी भी इलेक्ट्रॉनिक उपकरण का उपयोग करना रोकना लगभग असंभव है। अलार्म घड़ी से शुरू जो आपको जगाती है और टोस्टर जो आपको नाश्ता परोसता है, सब कुछ डिजिटल इलेक्ट्रॉनिक्स से एक योगदान है। इन सभी के बारे में सोचते हुए यह हमारे अपने सामान को प्रोग्राम करने के लिए वास्तव में रोमांचक है कि अलार्म क्लॉक जैसी सरल और उपयोगी कार्य कर सकता है, जिसे हम PIC माइक्रोकंट्रोलर के साथ इस परियोजना में बनाने जा रहे हैं । हमने पहले अन्य माइक्रोकंट्रोलर्स के साथ अलार्म घड़ी का निर्माण किया है:
- रास्पबेरी पाई अलार्म घड़ी RTC मॉड्यूल DS1307 का उपयोग कर
- Arduino अलार्म के साथ डिजिटल घड़ी आधारित है
- ATmega32 माइक्रोकंट्रोलर का उपयोग करते हुए अलार्म घड़ी
इस अलार्म घड़ी में 16x2 एलसीडी डिस्प्ले होगा जो वर्तमान समय और निर्धारित समय प्रदर्शित करेगा। जब भी आवश्यकता हो अलार्म समय सेट करने के लिए हम कुछ पुश बटन का उपयोग करेंगे। वर्तमान समय को DS3231 RTC मॉड्यूल का उपयोग करके ट्रैक में रखा जाएगा और हम RTC मॉड्यूल से इन मूल्यों को प्राप्त करने के लिए IIC संचार का उपयोग करेंगे। हमने आरटीसी मॉड्यूल के बारे में और PIC के साथ इंटरफ़ेस करने के तरीके के बारे में पहले ही जान लिया है। तो उस ट्यूटोरियल के माध्यम से पढ़ने की सिफारिश की जाती है, हम उस ट्यूटोरियल में शामिल की गई अधिकांश जानकारी को छोड़ देंगे।
सामग्री की आवश्यकता:
- ब्रेड बोर्ड - 2Nos
- PIC16F877A
- 5 वी शक्ति स्रोत - आपूर्ति मॉड्यूल
- 20 मेगाहर्ट्ज क्रिस्टल
- 33pf संधारित्र - 2Nos
- DS3231 RTC मॉड्यूल
- 16 * 2 एलसीडी डिस्प्ले मॉड्यूल
- 10K पॉट
- 10k और 1K रोकनेवाला
- पुश बटन - 5Nos
- बजर
- तारों को जोड़ना
पूर्व-आवश्यकताएं:
इस परियोजना के लिए आपको PIC माइक्रोकंट्रोलर और इसे कैसे प्रोग्राम करना है, इसके बारे में कुछ मूल बातें जानना आवश्यक है। हम इस परियोजना के लिए GPIO, LCD डिस्प्ले और RTC मॉड्यूल का उपयोग करेंगे। इसलिए यह सीखना बेहतर है कि इन मॉड्यूल का उपयोग पहले से कैसे करें। निम्नलिखित लिंक आपको वही सीखने में मदद करेंगे
- PIC माइक्रोकंट्रोलर के साथ अपना पहला कार्यक्रम लिखना
- PIC के साथ एलसीडी की जगह
- PIC का उपयोग कर I2C संचार
- DS3231 RTC PIC के साथ इंटरफेस
सर्किट आरेख:
इस PIC आधारित अलार्म क्लॉक प्रोजेक्ट के लिए सर्किट आरेख नीचे दिखाया गया है, जो प्रोटीस सॉफ्टवेयर का उपयोग करके बनाया गया था। इस परियोजना में आगे भी सिमुलेशन के लिए वसीयत का उपयोग किया जाएगा।
पांच पुश बटन आवश्यक समय के लिए अलार्म सेट करने के लिए एक इनपुट के रूप में कार्य करेंगे। इसलिए सभी पुश बटन का एक सिरा जमीन से जुड़ा होता है और दूसरा छोर PORTB पिन से जुड़ा होता है, इन पिंस पर इनर पिंस का इस्तेमाल किया जाएगा ताकि पिंस तैरने से बच सकें। बजर एक आउटपुट के रूप में कार्य करेगा और अलार्म बजने पर हमें बीप देगा और पोर्ट एस पिन से जुड़ा होगा। वर्तमान समय को हमेशा DS3231 RTC मॉड्यूल द्वारा ट्रैक में रखा जाता है, जिसमें से PIC I2C बस के माध्यम से डेटा प्राप्त करता है, इसलिए RTC मॉड्यूल के SCL और SDA पिन SCL और PIC नियंत्रक के SDA पिन से जुड़े होते हैं। एक एलसीडी डिस्प्ले PIC के PORTD से जुड़ा होता है जो वर्तमान समय और निर्धारित समय को प्रदर्शित करने के लिए उपयोग किया जाता है। यहाँ PIC के साथ DS3231 RTC मॉड्यूल का उपयोग करने के बारे में अधिक जानें।
पूरा सर्किट ब्रेडबोर्ड के ऊपर बनाया जा सकता है। चूंकि कनेक्ट करने के लिए दर्जनों तारों के जोड़े हैं, इसलिए बस धैर्य रखें और सुनिश्चित करें कि कनेक्शन सही हैं। कनेक्शन के साथ किए जाने के बाद मेरा हार्डवेयर सेट-अप कुछ इस तरह से दिखता है
मैंने मॉड्यूल को पावर देने के लिए ब्रेडबोर्ड मॉड्यूल और 12 वी एडेप्टर का उपयोग किया है। यह मेरा स्रोत है + 5V आपूर्ति वोल्टेज। इसके अलावा मुझे सर्किट को साफ रखने के लिए दो ब्रेडबोर्ड का उपयोग करना होगा। यदि आप अधिक मजबूत परियोजना बनाना चाहते हैं, तो आप एक संपूर्ण बोर्ड को पूरे सर्किट को भी मिला सकते हैं।
अलार्म घड़ी के लिए प्रोग्रामिंग:
इस अलार्म घड़ी परियोजना के लिए पूरा पीआईसी कार्यक्रम इस पेज के नीचे पाया जा सकता है। इस परियोजना में PIC के साथ LCD, I2C और RTC का उपयोग करने के लिए तीन पुस्तकालयों की भी आवश्यकता है। हेडर फ़ाइलों के साथ पूरा कोड यहाँ ज़िप फ़ाइल से डाउनलोड किया जा सकता है और निकालने के बाद MPLABX का उपयोग करके खोला जा सकता है। आगे मैं सिर्फ मुख्य सी फाइल को छोटे स्निपेट के रूप में समझा रहा हूं। यदि आप यह जानना चाहते हैं कि हेडर फाइलें कैसे काम करती हैं, तो आप उपर्युक्त ट्यूटोरियल्स पर वापस जा सकते हैं।
मुख्य कार्यक्रम में जाने से पहले, हमें उन पिनों को परिभाषित करना होगा जिनका हमने अधिक सार्थक नाम के साथ उपयोग किया है। इस तरह से प्रोग्रामिंग के दौरान उनका उपयोग करना आसान होगा। हमारे कार्यक्रम में परिभाषित पिन नीचे दिखाए गए हैं
// एलसीडी पिन को परिभाषित करें #define रुपये RD2 // एलसीडी की पिन रीसेट #define एन RD3 // एलसीडी की पिन सक्षम #define D4 RD4 // डाटा एलसीडी के 0 सा #define D5 RD5 // डाटा एलसीडी के सा 1 #define D6 RD6 // डेटा बिट 2 का LCD #define D7 RD7 // एलसीडी का डेटा बिट 3 // परिभाषित बटन #define MB RB1 // मध्य बटन #define LB RB0 // वाम बटन #define BB RB2 // राइट बटन # परिभाषित UB RB3 // ऊपरी बटन #define BB RB4 // निचला बटन // बज़ को परिभाषित करें #define BUZZ RD1 // बजर RD1 से जुड़ा है
मुख्य फ़ंक्शन के अंदर हम इनपुट और आउटपुट पिन घोषित करके शुरू करते हैं । हमारी परियोजना में PORTB का उपयोग पुश बटन के लिए किया जाता है जो एक इनपुट डिवाइस है इसलिए हम उनके पिन को इनपुट के रूप में सेट करते हैं और PORTD का उपयोग एलसीडी और बजर के लिए किया जाता है इसलिए हम उनके पिन को आउटपुट के रूप में सेट करते हैं। इसके अलावा एक पिन को कभी भी फ्लोटिंग अर्थ नहीं छोड़ा जाना चाहिए, I / O पिन को हमेशा ग्राउंड या + 5V वोल्टेज से जोड़ा जाना चाहिए। पुश बटन के लिए हमारे मामले में पिन कुछ भी नहीं जुड़ा होगा जब बटन दबाया नहीं जाता है, इसलिए हम एक आंतरिक पुल-अप रोकनेवाला का उपयोग करते हैं जो पिन का उपयोग करते समय उच्च पर सेट करता है। यह नियंत्रण रजिस्टरों का उपयोग करके किया जाता है जैसा कि नीचे दिखाया गया है
TRISD = 0x00; // पोर्ट डी पिंस को एलसीडी इंटरफेसिंग TRISB = 0xFF के लिए आउट्प्टू के रूप में बनाएं ; // स्विच को इनपुट पिन के रूप में घोषित किया जाता है OPTION_REG = 0b00000000; // BUZZ = 0 स्विच करने के लिए पोर्ट बी पर रेसिस्टर को पुल अप सक्षम करें ; // बजर की बारी
चूँकि हमारे पास LCD और I2C हेडर फाइल मुख्य प्रोग्राम से जुड़ी हैं, इसलिए हम एक साधारण फ़ंक्शन को कॉल करके LCD इनिशियलाइज़ेशन शुरू कर सकते हैं । I2C आरंभीकरण के लिए भी यही किया जा सकता है । यहाँ हम 100kHz पर I2C संचार शुरू कर रहे हैं क्योंकि RTC मॉड्यूल 100kHz के साथ काम करता है।
Lcd_Start (); // प्रारंभिक एलसीडी मॉड्यूल I2C_Initialize (100); // 100KHz घड़ी के साथ प्रारंभिक I2C मास्टर
आरटीसी मॉड्यूल पर समय और तारीख निर्धारित करने के लिए नीचे दिए गए फ़ंक्शन का उपयोग किया जाता है, एक बार समय और दिनांक सेट करने के बाद इस लाइन को हटा दें। हर बार जब आप कार्यक्रम शुरू करते हैं तो समय और दिनांक बार-बार सेट किया जाएगा
// रेखा से नीचे निकालें एक बार समय और तारीख है पहली बार के लिए निर्धारित किया है। Set_Time_Date (); // सेट समय और दिनांक RTC मॉड्यूल पर
यह इंगित करने के लिए कि कार्यक्रम शुरू हो रहा है हम एक छोटी परिचय स्क्रीन प्रदर्शित करते हैं जो प्रोजेक्ट और वेबसाइट का नाम प्रदर्शित करता है जैसा कि नीचे दिखाया गया है
// एलसीडी Lcd_Clear () पर एक परिचय संदेश दें ; Lcd_Set_Cursor (1,1); Lcd_Print_String ("अलार्म घड़ी"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Circuit Digest"); __delay_ms (1500);
अगला अंदर जबकि पाश हम की जरूरत है आरटीसी मॉड्यूल से वर्तमान समय और दिनांक पढ़ा, यह सिर्फ समारोह नीचे फोन करके किया जा सकता है।
Update_Current_Date_Time (); // RTC मॉड्यूल से वर्तमान तिथि और समय पढ़ें
उपरोक्त फ़ंक्शन को कॉल करने से वर्तमान मान के साथ चर सेकंड, मिनट और घंटे अपडेट होंगे। एलसीडी स्क्रीन पर उन्हें प्रदर्शित करने के लिए हमें नीचे दिए गए कोड का उपयोग करके उन्हें अलग-अलग पात्रों में विभाजित करना होगा ।
// lcd char sec_0 = sec% 10 पर प्रदर्शित करने के लिए char में विभाजन करें ; char sec_1 = (sec / 10); char min_0 = min% 10; char min_1 = min / 10; char घंटे_0 = घंटा% 10; char hour_1 = hour / 10;
अगला, हम एलसीडी स्क्रीन पर मूल्यों को अपडेट करते हैं । वर्तमान समय को पहली पंक्ति में प्रदर्शित किया जाएगा और निर्धारित समय जिस पर अलार्म को चालू करना है वह दूसरी पंक्ति में प्रदर्शित होता है। जो कोड करता है वही नीचे दिखाया गया है।
// एलसीडी स्क्रीन पर वर्तमान समय प्रदर्शित करें LCD_Clear (); Lcd_Set_Cursor (1, 1); Lcd_Print_String ("TIME:"); Lcd_Print_Char (घंटे 1 + '0'); Lcd_Print_Char (घंटे_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (min_1 + '0'); Lcd_Print_Char (min_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (sec_1 + '0'); Lcd_Print_Char (sec_0 + '0'); // एलसीडी स्क्रीन पर दिनांक प्रदर्शित करें LCD_Set_Cursor (2, 1); Lcd_Print_String ("अलार्म:"); Lcd_Print_Char (अलार्म_वल + '0'); Lcd_Print_Char (अलार्म_वल + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (अलार्म_वल + '0 '); Lcd_Print_Char (अलार्म_वल + '0');
अब, हमने एलसीडी पर समय और सेट समय प्रदर्शित किया है हमें यह जांचना है कि क्या उपयोगकर्ता अलार्म समय निर्धारित करने की कोशिश कर रहा है । ऐसा करने के लिए उपयोगकर्ता को मध्य बटन दबाना होगा, इसलिए हम यह जांच करेंगे कि मध्य बटन दबाया गया है और अलार्म सेट मोड में प्रवेश करने के लिए एक चर को चालू करें। मूल्यों को सेट करने की पुष्टि करने के लिए एक ही बटन फिर से दबाया जाएगा और उस स्थिति में हमें अलार्म सेट मोड से बाहर आना होगा। इसलिए हम चर set_alarm की स्थिति को बदलने के लिए कोड की निचली पंक्ति का उपयोग करते हैं ।
// यदि अलार्म को सेट करना है, तो जांचने के लिए मध्य बटन का उपयोग करें (MB == 0 && set_alarm == 0) {// यदि मध्य बटन दबाया गया है और अलार्म चालू नहीं है (!! एमबी) // प्रतीक्षा करें जब तक बटन सेट नहीं हो जाता है set_alarm = 1; // अलार्म मूल्य निर्धारित करना शुरू करें } यदि (MB == 0 && set_alarm == 1) {// यदि मध्य बटन दबाया गया है और अलार्म बंद नहीं किया गया है जबकि (! एमबी) // प्रतीक्षा करें जब तक बटन जारी नहीं किया जाता है set_alarm = 0; // अलार्म मूल्य निर्धारित करना बंद करो }
यदि उपयोगकर्ता ने मध्य बटन दबाया है, तो इसका मतलब है कि वह अलार्म समय निर्धारित करने की कोशिश कर रहा है। इस मामले में कार्यक्रम ऊपर दिए गए कोड का उपयोग करके अलार्म सेट मोड में प्रवेश करता है। अलार्म सेट मोड के अंदर अगर उपयोगकर्ता बाएं या दाएं बटन को दबाता है तो इसका मतलब है कि हमें कर्सर को बाएं या दाएं ले जाना है। ऐसा करने के लिए हम बस उस स्थिति का मान बढ़ाते हैं जिस पर कर्सर रखा जाना है
if (LB == 0) {// यदि बाएं बटन को दबाया जाता है ((LB)); // प्रतीक्षा करें जब तक बटन जारी न हो जाए - // फिर कर्सर को बाईं ओर ले जाएं } if (RB == 0) {// अगर राइट बटन दबाया जाता है जबकि (! RB); // प्रतीक्षा करें जब तक बटन जारी न हो जाए ++; // कर्सर को दाईं ओर ले जाएं }
माइक्रोकंट्रोलर या माइक्रोप्रोसेसर के साथ पुश बटन का उपयोग करते समय एक सामान्य समस्या है। इस समस्या को स्विच बाउंसिंग कहा जाता है । जब बटन दबाया जाता है तो यह MCU / MPU को शोर दालों दे सकता है जो कई प्रविष्टियों के लिए MCU नकली हो सकता है। इस समस्या को स्विच में संधारित्र जोड़कर या बटन दबाते ही विलंब फ़ंक्शन का उपयोग करके हल किया जा सकता है । इस तरह के समाधान को डी-बाउंसिंग कहा जाता है। यहां हमने प्रोग्राम जारी करने के लिए थोड़ी देर के लूप का उपयोग किया है जब तक कि बटन जारी न हो जाए। यह एक सर्वश्रेष्ठ डी-बाउंसिंग समाधान नहीं है, लेकिन हमारे लिए यह ठीक काम करेगा।
जबकि (आरबी);
बाएं और दाएं बटन के समान, हमारे पास ऊपरी और निचले बटन भी हैं जिनका उपयोग अलार्म समय के मूल्य को बढ़ाने या घटाने के लिए किया जा सकता है । ऐसा करने का कोड नीचे दिखाया गया है। ध्यान दें कि सेट अलार्म समय के प्रत्येक वर्ण को सरणी के सूचकांक मूल्य द्वारा संबोधित किया जाता है। यह हम आवश्यक चरित्र तक आसानी से पहुंच सकते हैं, जिनके मूल्यों को बदलना होगा।
if (UB == 0) {// यदि ऊपरी बटन दबाया जाता है जबकि (UB); // प्रतीक्षा करें जब तक बटन जारी नहीं किया जाता है Alarm_val ++; // उस विशेष चार मूल्य को बढ़ाएँ } यदि (BB == 0) {// यदि निचला बटन दबाया जाता है जबकि (! UB); // प्रतीक्षा करें जब तक बटन जारी नहीं किया जाता है Alarm_val--; // उस विशेष मूल्य को घटाएं }
अलार्म का समय निर्धारित होने के बाद उपयोगकर्ता मध्य बटन को फिर से दबाएगा । फिर हम निर्धारित समय के साथ वर्तमान समय की तुलना करना शुरू कर सकते हैं। यदि वर्तमान समय का हर एक वर्ण निर्धारित समय के वर्ण के बराबर है, तो जाँच करके तुलना करें। यदि मान बराबर हैं, तो हम ट्रिगर_अलार्म चर सेट करके अलार्म को ट्रिगर करते हैं और हम केवल तब तक तुलना करते हैं जब तक यह बराबर नहीं हो जाता।
// यदि अलार्म सेट किया गया है, तो यदि सेट मान वर्तमान मान के बराबर है, तो चेक करें (set_alarm == 0 && Alarm_val == hour_1 && अलार्म_val == घंटा_0 और& अलार्म_वल == min_1 && अलार्म_val == min_0) trig_alarm = 1; // वैल्यू मैच होने पर ट्रिगर चालू करें
यदि अलार्म सेट है, तो हमें अलार्म के लिए उपयोगकर्ता को सचेत करने के लिए बजर को बीप करना होगा । यह नीचे दिए गए अनुसार नियमित अंतराल पर बस बजर को टॉगल करके किया जा सकता है।
if (trig_alarm) {// अगर अलार्म चालू हो जाता है // बजर बज़ को खोलें = 1; __delay_ms (500); BUZZ = 0; __delay_ms (500); }
सिमुलेशन:
इस कार्यक्रम को प्रोटीस सॉफ्टवेयर का उपयोग करके भी अनुकरण किया जा सकता है। बस ऊपर दिखाए गए सर्किट को फिर से बनाएं और हेक्स फ़ाइल को PIC में लोड करें। इस परियोजना के लिए हेक्स कोड जिप फाइल में पाया जा सकता है जो यहां लिंक है। सिमुलेशन के दौरान लिया गया एक स्क्रीन शॉट नीचे दिखाया गया है
जब आप प्रोजेक्ट में नई सुविधाएँ जोड़ने का प्रयास कर रहे हों, तो सिमुलेशन बहुत उपयोगी हो जाता है। I2C बस के माध्यम से क्या डेटा अंदर जा रहा है और यह जांचने के लिए आप I2C डिबगर मॉड्यूल का उपयोग कर सकते हैं। आप बटन दबाने की कोशिश कर सकते हैं और अलार्म का समय भी निर्धारित कर सकते हैं। जब निर्धारित समय वर्तमान समय के बराबर होगा तब बजर उच्च जाएगा।
PIC16F877A का उपयोग करके डिजिटल अलार्म घड़ी का कार्य:
ब्रेडबोर्ड पर सर्किट बनाएं, डाउनलोड लिंक से कोड प्राप्त करें और इसे MplabX और XC8 कंपाइलर का उपयोग करके संकलित करें। यदि आपने यहां प्रदान की गई ज़िप फ़ाइल से कोड डाउनलोड किया है, तो आपको इसे संकलित करने में कोई समस्या नहीं होनी चाहिए क्योंकि हेडर फाइलें पहले से ही संलग्न हैं।
PicKit3 प्रोग्रामर का उपयोग करके प्रोग्राम को आप पर अपलोड करने के लिए तैयार करने के बाद। पिकेट प्रोग्रामर को PIC IC से जोड़ने का कनेक्शन सर्किट आरेख में भी दिखाया गया है। कार्यक्रम अपलोड होने के बाद आपको इंट्रो स्क्रीन को देखना चाहिए और फिर प्रदर्शित होने वाला समय फिर अलार्म बटन को सेट करने के लिए पुश बटन का उपयोग कर सकते हैं। मेरा हार्डवेयर सेट-अप जब पावर्ड इस तरह दिखता है।
जब अलार्म समय मौजूदा समय के साथ मेल खाता है तो बजर उपयोगकर्ता को अलार्म करने के लिए बीप करने लगेगा । पूरा काम नीचे दिए गए वीडियो पर पाया जा सकता है । इस परियोजना के निर्माण के लिए कई विकल्पों की अधिकता है। आरटीसी मॉड्यूल किसी भी समय और तारीख का ट्रैक रख सकता है, इसलिए आप किसी भी समय / तिथि पर निर्धारित कार्य कर सकते हैं। आप पंखे या लाइट की तरह एक एसी उपकरण भी कनेक्ट कर सकते हैं और आवश्यकता पड़ने पर चालू या बंद करने के लिए इसे शेड्यूल कर सकते हैं। अभी भी बहुत कुछ है जो आप इस परियोजना पर बना सकते हैं, मुझे बताएं कि इस परियोजना के उन्नयन के रूप में आपके दिमाग में क्या विचार आया है और मुझे आपकी बात सुनकर खुशी होगी।
आशा है कि आपने परियोजना को समझा और प्रक्रिया से उपयोगी कुछ सीखा। यदि आपको इस परियोजना में कोई संदेह है तो उन्हें पोस्ट करने के लिए टिप्पणी अनुभाग का उपयोग करें या किसी तकनीकी मदद के लिए मंचों का उपयोग करें।
हेडर फ़ाइलों के साथ पूरा PIC कोड यहां पाया जा सकता है