विषयसूची:

बीएमपी२८० और बीएमई२८० के लिए पुस्तकालय: ७ कदम
बीएमपी२८० और बीएमई२८० के लिए पुस्तकालय: ७ कदम

वीडियो: बीएमपी२८० और बीएमई२८० के लिए पुस्तकालय: ७ कदम

वीडियो: बीएमपी२८० और बीएमई२८० के लिए पुस्तकालय: ७ कदम
वीडियो: GK के ये 2400 प्रश्न Exam में बार-बार Repeat होते आ रहे है | रट ले इन्हें | सभी Exam के लिए रामबाण 🏹 2024, जुलाई
Anonim
बीएमपी२८० और बीएमई२८० के लिए पुस्तकालय
बीएमपी२८० और बीएमई२८० के लिए पुस्तकालय
बीएमपी२८० और बीएमई२८० के लिए पुस्तकालय
बीएमपी२८० और बीएमई२८० के लिए पुस्तकालय
बीएमपी२८० और बीएमई२८० के लिए पुस्तकालय
बीएमपी२८० और बीएमई२८० के लिए पुस्तकालय

परिचय

मैं इस पुस्तकालय को लिखने के लिए तैयार नहीं था। यह एक परियोजना के साइड-इफेक्ट के रूप में "हो गया" जिसे मैंने शुरू किया था जो बीएमपी 280 का उपयोग करता है। वह परियोजना अभी समाप्त नहीं हुई है, लेकिन मुझे लगता है कि पुस्तकालय दूसरों के साथ साझा करने के लिए तैयार है। इसके बाद मुझे BME280 का उपयोग करने की आवश्यकता पड़ी, जो BMP280 के दबाव और तापमान क्षमता में आर्द्रता माप जोड़ता है। BME280 BMP280 के साथ "पिछड़ा-संगत" है - अर्थात, सभी रजिस्टर और BME280 से दबाव और तापमान को पढ़ने के लिए आवश्यक कदम वही हैं जो BMP280 के लिए उपयोग किए जाते हैं। आर्द्रता को पढ़ने के लिए अतिरिक्त रजिस्टर और आवश्यक कदम हैं, जो केवल BME280 पर लागू होते हैं। यह सवाल उठाता है, दोनों के लिए एक पुस्तकालय, या दो अलग पुस्तकालय। दो डिवाइस प्रकारों के लिए हार्डवेयर पूरी तरह से विनिमेय है। यहां तक कि बेचे जा रहे कई मॉड्यूल (उदाहरण के लिए Ebay और AliExpress पर) को BME/P280 लेबल किया गया है। यह पता लगाने के लिए कि यह किस प्रकार का है, आपको सेंसर पर ही (लघु) लेखन को देखना होगा, या डिवाइस आईडी बाइट का परीक्षण करना होगा। मैंने एक ही पुस्तकालय के लिए जाने का फैसला किया। ऐसा लगता है कि ठीक हो गया है।

प्रतिक्रिया, विशेष रूप से सुधार के लिए किसी भी सुझाव की सराहना की जाएगी।

पुस्तकालय की विशेषताएं और क्षमताएं

एक पुस्तकालय सॉफ्टवेयर का एक टुकड़ा है जो एक प्रोग्रामर के लिए डिवाइस की क्षमताओं का प्रयोग करने के लिए एक एप्लीकेशन प्रोग्रामिंग इंटरफेस (एपीआई) प्रदान करता है, बिना आवश्यक रूप से सभी बारीक विवरणों से निपटने के लिए। वांछनीय रूप से, आरंभ करने के लिए सरल आवश्यकताओं के साथ शुरुआत करने वाले के लिए एपीआई आसान होना चाहिए, जबकि डिवाइस क्षमताओं के पूर्ण दोहन के लिए प्रदान करना। वांछनीय रूप से पुस्तकालय को उपकरण निर्माता से किसी विशिष्ट दिशा-निर्देशों का पालन करना चाहिए, साथ ही साथ सामान्य सॉफ्टवेयर अच्छा अभ्यास भी करना चाहिए। मैंने इन सभी को हासिल करने का प्रयास किया है। BMP280 के साथ शुरुआत करते समय, मुझे इसके लिए 3 अलग-अलग पुस्तकालय मिले: Adafruit_BMP280; सीड_बीएमपी280; और एक डिवाइस निर्माता से BMP280 कहा जाता है। न तो एडफ्रूट और न ही सीड ने विस्तारित क्षमताएं प्रदान कीं, हालांकि उन्होंने अच्छी तरह से काम किया और बुनियादी अनुप्रयोगों के लिए उपयोग करना आसान था। मैं समझ नहीं पाया कि डिवाइस निर्माता (बॉश सेंसरोटेक) द्वारा उत्पादित एक का उपयोग कैसे किया जाए। यह मेरी कमी हो सकती है, उनकी नहीं। हालाँकि पुस्तकालय अन्य दो की तुलना में बहुत अधिक जटिल था, मुझे कोई निर्देश या उपयोग के उदाहरण नहीं मिले (बाद में मैंने पाया कि उदाहरण "bmp280_support.c" फ़ाइल में थे, हालांकि ये मेरे लिए विशेष रूप से सहायक नहीं थे)।

इन कारकों के परिणामस्वरूप, मैंने BMP280 के लिए अपना स्वयं का पुस्तकालय लिखने का निर्णय लिया।

BME280 के लिए पुस्तकालय की स्थिति को देखते हुए, मुझे अलग पुस्तकालय Adafruit_BME280, Seed_BME280 और एक अन्य BME280_MOD-1022 एंबेडेड एडवेंचर्स द्वारा लिखित मिले। उनमें से कोई भी BMP280 का उपयोग करने में सक्षम पुस्तकालय में BMP280 के कार्यों को संयोजित नहीं करता है। उनमें से कोई भी स्पष्ट रूप से डेटा के कुछ बिट्स को स्टोर करने के लिए उपकरणों की क्षमता का समर्थन नहीं करता है, जबकि डिवाइस और इसके नियंत्रित माइक्रोप्रोसेसर सो रहे हैं (यह क्षमता डेटाशीट में स्पष्ट है और लाइब्रेरी में समर्थित है जिसे मैंने यहां लिखा और वर्णित किया है)।

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

डिवाइस क्षमताएं

BMP280 और BME280 सतह पर लगे डिवाइस हैं जो लगभग 5 मिमी वर्ग और 1 मिमी ऊंचे हैं। 8 इंटरफ़ेस पैड हैं, जिनमें 2 अलग-अलग पावर इनपुट पैड और दो ग्राउंड पैड शामिल हैं। वे ईबे पर एक मॉड्यूल के रूप में उपलब्ध हैं जिसमें 4 या 6 पिन लाए गए हैं। 4-पिन मॉड्यूल का एक निश्चित I2C पता होता है और इसे SPI प्रोटोकॉल का उपयोग करने के लिए कॉन्फ़िगर नहीं किया जा सकता है।

6-पिन मॉड्यूल या नंगे डिवाइस का उपयोग I2C या SPI प्रोटोकॉल के साथ किया जा सकता है। I2C मोड में इसके दो अलग-अलग पते हो सकते हैं, एसडीओ पिन को या तो ग्राउंड (बेस एड्रेस = 0x76 के लिए) या Vdd (बेस एड्रेस +1 = 0x77) से जोड़कर हासिल किया जा सकता है। SPI मोड में इसमें 1 घड़ी, 2 डेटा (प्रत्येक दिशा के लिए एक) और एक डिवाइस सेलेक्ट पिन (CS) की सामान्य व्यवस्था होती है।

मैंने यहां जो पुस्तकालय लिखा और वर्णन किया है वह केवल I2C का समर्थन करता है। Adafruit_BMP280 और BME_MOD-1022 पुस्तकालयों में i2C और SPI दोनों के लिए समर्थन है।

पुस्तकालय यहाँ डाउनलोड किया जा सकता है:

github.com/farmerkeith/BMP280-library

चरण 1: हार्डवेयर सेट करना

हार्डवेयर की स्थापना
हार्डवेयर की स्थापना

पुस्तकालय के उपयोगी होने से पहले एक माइक्रोकंट्रोलर को BMP280 (या यदि आप चाहें तो उनमें से दो) से कनेक्ट करना आवश्यक है।

मैंने एक WeMos D1 मिनी प्रो का उपयोग किया है, इसलिए मैं इसके कनेक्शन दिखाऊंगा। अन्य माइक्रोकंट्रोलर समान होंगे, आपको बस एसडीए और एससीएल पिन को सही ढंग से कनेक्ट करने की आवश्यकता है।

WeMos D1 मिनी प्रो के मामले में, कनेक्शन हैं:

समारोह WeMos पिन BMP280 पिन नोट्स

SDA D2 SDA SCL D1 SCL Vdd 3V3 विन नाममात्र 3.3V ग्राउंड GND पता नियंत्रण SDO ग्राउंड या Vdd I2C CSB Vdd चुनें (GND SPI का चयन करता है)

ध्यान दें कि कुछ MP280 मॉड्यूल पर एसडीओ पिन को एसडीडी लेबल किया गया है, और वीडीडी पिन को वीसीसी लेबल किया जा सकता है। नोट: एसडीए और एससीएल लाइनों में लाइन और विन पिन के बीच पुल-अप रेसिस्टर्स होने चाहिए। आमतौर पर 4.7K का मान ठीक होना चाहिए। कुछ BMP280 और BME280 मॉड्यूल में मॉड्यूल में शामिल 10K पुल-अप रेसिस्टर्स हैं (जो अच्छा अभ्यास नहीं है, क्योंकि I2C बस में कई डिवाइस लगाने से यह अत्यधिक लोड हो सकता है)। हालाँकि, 10K रेसिस्टर के साथ प्रत्येक में 2 BME/P280 मॉड्यूल का उपयोग करना तब तक अभ्यास में कोई समस्या नहीं होनी चाहिए जब तक कि पुल-अप रेसिस्टर्स के साथ एक ही बस में बहुत अधिक अन्य डिवाइस न हों।

एक बार जब आप हार्डवेयर कनेक्ट कर लेते हैं, तो आप स्केच I2CScan_ID चलाकर आसानी से जांच सकते हैं कि आपका डिवाइस BMP280 है या BME280, जिसे आप यहां देख सकते हैं:

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

चरण 2: पुस्तकालय द्वारा प्रदान किए गए एपीआई

पुस्तकालय द्वारा प्रदान किए गए एपीआई
पुस्तकालय द्वारा प्रदान किए गए एपीआई
पुस्तकालय द्वारा प्रदान किए गए एपीआई
पुस्तकालय द्वारा प्रदान किए गए एपीआई

एक स्केच में पुस्तकालय सहित

पुस्तकालय को स्टेटमेंट का उपयोग करते हुए मानक तरीके से एक स्केच में शामिल किया गया है

#शामिल "farmerkeith_BMP280.h"

सेटअप () फ़ंक्शन की शुरुआत से पहले इस कथन को स्केच के शुरुआती भाग में शामिल करने की आवश्यकता है।

BME या BMP सॉफ़्टवेयर ऑब्जेक्ट बनाना

BMP280 सॉफ़्टवेयर ऑब्जेक्ट बनाने के लिए 3 स्तर हैं। सबसे सरल है

bme280 ऑब्जेक्टनाम; या bmp280 ऑब्जेक्टनाम;

उदाहरण के लिए, BMP280 bmp0;

यह 0x76 (यानी जमीन से जुड़े एसडीओ के लिए) के डिफ़ॉल्ट पते के साथ एक सॉफ्टवेयर ऑब्जेक्ट बनाता है।

BME280 या BMP280 सॉफ़्टवेयर ऑब्जेक्ट बनाने के लिए अगले स्तर का पैरामीटर 0 या 1 है, जो निम्नानुसार है:

bme280 ऑब्जेक्टनामए (0);

bmp280 ऑब्जेक्टनामबी(1);

पैरामीटर (0 या 1) को I2C आधार पते में जोड़ा जाता है, ताकि एक ही I2C बस (प्रत्येक में से एक सहित) पर दो BME280 या BMP280 उपकरणों का उपयोग किया जा सके।

BME या BMP280 सॉफ़्टवेयर ऑब्जेक्ट बनाने के तीसरे स्तर के दो पैरामीटर हैं। पहला पैरामीटर, जो या तो 0 या 1 है, पिछले मामले की तरह, पते के लिए है। दूसरा पैरामीटर डिबग प्रिंटिंग को नियंत्रित करता है। यदि इसे 1 पर सेट किया जाता है, तो सॉफ़्टवेयर ऑब्जेक्ट के साथ प्रत्येक लेन-देन Serial.print आउटपुट में परिणत होता है जो प्रोग्रामर को लेन-देन का विवरण देखने में सक्षम बनाता है। उदाहरण के लिए:

bmp280 ऑब्जेक्टनामबी(1, 1);

यदि डिबग प्रिंटिंग पैरामीटर 0 पर सेट है, तो सॉफ़्टवेयर ऑब्जेक्ट सामान्य व्यवहार (कोई प्रिंटिंग नहीं) पर वापस आ जाता है।

इस स्टेटमेंट या स्टेटमेंट को #include के बाद और setup() फंक्शन से पहले शामिल करने की जरूरत है।

BME या BMP सॉफ़्टवेयर ऑब्जेक्ट को प्रारंभ करना

उपयोग करने से पहले, डिवाइस से अंशांकन मापदंडों को पढ़ना आवश्यक है, और इसे किसी भी माप मोड, ओवरसैंपलिंग और फ़िल्टर सेटिंग्स के लिए कॉन्फ़िगर करने के लिए उपयुक्त है।

एक साधारण, सामान्य प्रयोजन के आरंभीकरण के लिए, कथन है:

ऑब्जेक्टनाम। शुरू ();

प्रारंभ () का यह संस्करण डिवाइस से अंशांकन मापदंडों को पढ़ता है और osrs_t=7 (16 तापमान माप), osrs_p=7 (16 दबाव माप), मोड=3 (निरंतर, सामान्य), t_sb=0 (0.5 ms नींद के बीच सेट करता है) माप सेट), फ़िल्टर = 0 (के = 1, इसलिए कोई फ़िल्टरिंग नहीं) और spiw_en = 0 (एसपीआई अक्षम, इसलिए I2C का उपयोग करें)। BME280 के मामले में, 16 आर्द्रता माप के लिए एक अतिरिक्त पैरामीटर osrs_h=7 है।

start() का एक और संस्करण है जो सभी छह (या 7) पैरामीटर लेता है। उपरोक्त कथन के समतुल्य है

objectName.begin (7, 7, 3, 0, 0, 0); // osrs_t, osrs_p, मोड, t_sb, फ़िल्टर, spiw_en

या objectName.begin(7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, मोड, t_sb, फ़िल्टर, spiw_en, osrs_h

कोड और उनके अर्थ की पूरी सूची BME280 और BMP280 डेटा शीट में है, और लाइब्रेरी में.cpp फ़ाइल में टिप्पणियों में भी है।

सरल तापमान और दबाव माप

तापमान माप प्राप्त करने का सबसे सरल तरीका है

दोहरा तापमान = वस्तु का नाम। पढ़ें तापमान (); // तापमान मापें

दबाव माप प्राप्त करने का सबसे सरल तरीका है

दोहरा दबाव = वस्तु का नाम। पढ़ें दबाव (); // दबाव मापें

आर्द्रता माप प्राप्त करने का सबसे सरल तरीका है

दोहरी आर्द्रता = वस्तु का नाम। पढ़ें आर्द्रता (); // आर्द्रता मापें (केवल BME280)

तापमान और दबाव दोनों प्राप्त करने के लिए उपरोक्त दो कथनों का एक के बाद एक उपयोग किया जा सकता है, लेकिन एक और विकल्प है, जो है:

दोहरा तापमान;

दोहरा दबाव = वस्तु का नाम। पढ़ें दबाव (तापमान); // दबाव और तापमान मापें

यह कथन BME280 या BMP280 डिवाइस के डेटा को केवल एक बार पढ़ता है, और तापमान और दबाव दोनों लौटाता है। यह I2C बस का थोड़ा अधिक कुशल उपयोग है और यह सुनिश्चित करता है कि दो रीडिंग समान माप चक्र के अनुरूप हों।

बीएमई 280 के लिए, एक संयुक्त बयान जो तीनों मान (आर्द्रता, तापमान और दबाव) प्राप्त करता है:

दोहरा तापमान, दबाव; दोहरी आर्द्रता = वस्तु का नाम। पढ़ें आर्द्रता (तापमान, दबाव); // आर्द्रता, दबाव और तापमान को मापें

यह कथन केवल एक बार BMP280 डिवाइस से डेटा पढ़ता है, और तीनों मान लौटाता है। यह I2C बस का थोड़ा अधिक कुशल उपयोग है और यह सुनिश्चित करता है कि तीन रीडिंग समान माप चक्र के अनुरूप हों। ध्यान दें कि वेरिएबल्स के नाम उपयोगकर्ता को पसंद आने वाली किसी भी चीज़ में बदले जा सकते हैं, लेकिन उनका क्रम निश्चित है - तापमान पहले आता है, और दबाव दूसरे स्थान पर आता है।

इन उपयोग के मामलों को पुस्तकालय के साथ प्रदान किए गए स्केच में शामिल किया गया है, जैसे कि basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino और basicHumidityAndTemperatureAndPressure.ino।

अधिक परिष्कृत तापमान और दबाव माप

हालांकि बयानों की उपरोक्त श्रृंखला बिना किसी समस्या के काम करेगी, फिर भी कुछ मुद्दे हैं:

  1. डिवाइस लगातार चल रहा है, और इसलिए अपने अधिकतम स्तर पर बिजली की खपत कर रहा है। यदि बैटरी से ऊर्जा आ रही है, तो इसे कम करना आवश्यक हो सकता है।
  2. खपत की गई बिजली के कारण, डिवाइस गर्म होने का अनुभव करेगा, और इसलिए मापा गया तापमान परिवेश के तापमान से अधिक होगा। मैं इसे बाद के चरण में और अधिक कवर करूंगा।

एक परिणाम जो कम शक्ति का उपयोग करता है, और एक ऐसा तापमान देता है जो परिवेश के करीब है, इसे शुरू करने वाले मापदंडों के साथ शुरू () का उपयोग करके प्राप्त किया जा सकता है (जैसे मोड = 0)। उदाहरण के लिए:

objectName.begin(1, 1, 0, 0, 0, 0[, 1]); // osrs_t, osrs_p, मोड, t_sb, फ़िल्टर, spiw_en [, osrs_h]

फिर, जब एक माप की आवश्यकता होती है, तो F2 (यदि आवश्यक हो) और F4 पंजीकृत करने के लिए कॉन्फ़िगरेशन कमांड के साथ डिवाइस को जगाएं जो osrs_h, osrs_t और osrs_p, प्लस मोड = 1 (एकल शॉट मोड) के उपयुक्त मान सेट करता है। उदाहरण के लिए:

[objectName.updateF2Control(1);] // osrs_h - BMP280 के लिए कभी भी इसकी आवश्यकता नहीं है, // और BME280 के लिए आवश्यक नहीं है यदि माप की संख्या नहीं बदली जा रही है // start() में दिए गए मान से। objectName.updateF4Control(1, 1, 1); // osrs_t, osrs_p, मोड

डिवाइस को जगाने के बाद, यह मापना शुरू कर देगा, लेकिन परिणाम कुछ मिलीसेकंड के लिए उपलब्ध नहीं होगा - कम से कम 4 एमएस, शायद 70 एमएस या अधिक तक, जो निर्दिष्ट किए गए मापों की संख्या पर निर्भर करता है। यदि रीड कमांड तुरंत भेजा जाता है, तो डिवाइस पिछले माप से मान वापस कर देगा - जो कुछ अनुप्रयोगों में स्वीकार्य हो सकता है, लेकिन ज्यादातर मामलों में नया माप उपलब्ध होने तक देरी करना बेहतर होता है।

यह देरी कई तरह से की जा सकती है।

  1. सबसे लंबे समय तक अपेक्षित विलंब को कवर करने के लिए एक निश्चित समय की प्रतीक्षा करें
  2. प्रति माप अधिकतम माप समय (यानी 2.3ms) माप की संख्या, प्लस ओवरहेड, प्लस मार्जिन से गणना किए गए समय की प्रतीक्षा करें।
  3. ऊपर के रूप में गणना किए गए समय की एक छोटी राशि की प्रतीक्षा करें, लेकिन नाममात्र माप समय (यानी 2 एमएस) प्लस ओवरहेड का उपयोग करके, और फिर स्थिति रजिस्टर में "मैं माप रहा हूं" बिट की जांच करना शुरू करें। जब स्थिति बिट 0 पढ़ता है (यानी, माप नहीं), तो तापमान और दबाव रीडिंग प्राप्त करें।
  4. तुरंत स्थिति रजिस्टर की जाँच करना शुरू करें, और तापमान और दबाव रीडिंग प्राप्त करें जब स्थिति बिट 0 पढ़ता है,

मैं इसे थोड़ी देर बाद करने के एक तरीके का एक उदाहरण दिखाऊंगा।

विन्यास रजिस्टर संचालन

यह सब करने के लिए, हमें कई उपकरणों की आवश्यकता है जिन्हें मैंने अभी तक पेश नहीं किया है। वे:

बाइट रीडरजिस्टर (reg)

शून्य अद्यतन रजिस्टर (reg, मान)

इनमें से प्रत्येक के पास पुस्तकालय में कई व्युत्पन्न कमांड हैं, जो विशिष्ट कार्यों के लिए सॉफ्टवेयर को थोड़ा सरल बनाते हैं।

उदाहरण powerSaverPressureAndTemperature.ino विधि संख्या 3 का उपयोग करता है। बार-बार जाँच करने वाली कोड की पंक्ति है

जबकि (bmp0.readRegister(0xF3)>>3); // लूप तक F3bit 3 ==0

ध्यान दें कि यह स्केच ESP8266 माइक्रोकंट्रोलर के लिए है। मैंने एक WeMos D1 मिनी प्रो का इस्तेमाल किया। स्केच एटमेगा माइक्रोकंट्रोलर के साथ काम नहीं करेगा, जिसमें सोने के लिए अलग-अलग निर्देश हैं। यह स्केच कई अन्य आदेशों का प्रयोग करता है, इसलिए मैं उस स्केच का अधिक विस्तार से वर्णन करने से पहले उन सभी का परिचय दूंगा।

जब माइक्रोकंट्रोलर BMP280 सेंसर के समानांतर सो रहा होता है, तो आवश्यक माप के लिए सेंसर का कॉन्फ़िगरेशन 6 मापदंडों का उपयोग करके start() कमांड में किया जा सकता है। हालाँकि यदि माइक्रोकंट्रोलर सो नहीं रहा है, लेकिन सेंसर है, तो माप के समय सेंसर को जगाना होगा और इसके माप विन्यास को बताना होगा। इसके साथ सीधे किया जा सकता है

अद्यतन रजिस्टर (reg, मान)

लेकिन निम्नलिखित तीन आदेशों के साथ थोड़ा आसान है:

UpdateF2Control (osrs_h); // बीएमई२८० केवल

updateF4Control (osrs_t, osrs_p, मोड); UpdateF5Config (t_sb, फ़िल्टर, spi3W_en);

माप किए जाने के बाद, यदि उपयोग किया गया मोड सिंगल शॉट (फोर्स्ड मोड) है, तो डिवाइस स्वचालित रूप से वापस सो जाएगा। हालाँकि, यदि माप सेट में निरंतर (सामान्य) मोड का उपयोग करके कई माप शामिल हैं, तो BMP280 को वापस सोने की आवश्यकता होगी। यह निम्नलिखित दो आदेशों में से किसी एक के साथ किया जा सकता है:

UpdateF4Control16xSleep ();

UpdateF4ControlSleep (मान);

ये दोनों मोड बिट्स को 00 (यानी स्लीप मोड) पर सेट करते हैं। हालाँकि पहला osrs_t और osrs_p को 111 (यानी 16 माप) पर सेट करता है जबकि दूसरा "मान" से कम 6 बिट्स को 0xF4 रजिस्टर के बिट्स 7:2 में संग्रहीत करता है।

इसी प्रकार निम्न कथन "मान" के निम्न छह बिट्स को 0xF5 रजिस्टर के बिट्स 7:2 में संग्रहीत करता है।

UpdateF5ConfigSleep (मान);

इन बाद के आदेशों के उपयोग से BMP280 रजिस्टर F4 और F5 में 12 बिट्स की जानकारी का भंडारण सक्षम होता है। कम से कम ESP8266 के मामले में, जब माइक्रोकंट्रोलर नींद की अवधि के बाद जागता है, तो यह स्केच की शुरुआत में स्लीप कमांड से पहले अपनी स्थिति के ज्ञान के बिना शुरू होता है। स्लीप कमांड से पहले अपनी स्थिति के ज्ञान को संग्रहीत करने के लिए, डेटा को फ्लैश मेमोरी में संग्रहीत किया जा सकता है, या तो EEPROM फ़ंक्शन का उपयोग करके या SPIFFS का उपयोग करके एक फ़ाइल लिखकर। हालांकि फ्लैश मेमोरी में लिखने के चक्रों की संख्या 10,000 से 100, 000 तक सीमित है। इसका मतलब यह है कि अगर माइक्रोकंट्रोलर हर कुछ सेकंड में स्लीप-वेक चक्र से गुजर रहा है, तो यह स्वीकार्य मेमोरी राइट को पार कर सकता है। कुछ महीनों में सीमा। BMP280 में डेटा के कुछ बिट्स को स्टोर करने की ऐसी कोई सीमा नहीं है।

रजिस्टरों F4 और F5 में संग्रहीत डेटा को तब पुनर्प्राप्त किया जा सकता है जब माइक्रोकंट्रोलर कमांड का उपयोग करके जागता है

readF4Sleep ();

readF5Sleep ();

ये फ़ंक्शन संबंधित रजिस्टर को पढ़ते हैं, 2 एलएसबी को हटाने के लिए सामग्री को स्थानांतरित करते हैं और शेष 6 बिट्स को वापस करते हैं। इन कार्यों का उपयोग उदाहरण स्केच powerSaverPressureAndTemperatureESP.ino में निम्नानुसार किया जाता है:

// bmp0 से EventCounter का मान वापस पढ़ें

बाइट bmp0F4value = bmp0.readF4Sleep (); // 0 से 63 बाइट bmp0F5value = bmp0.readF5Sleep (); // 0 से 63 इवेंट काउंटर = bmp0F5value*64+bmp0F4value; // 0 से 4095

ये फ़ंक्शन संबंधित रजिस्टर को पढ़ते हैं, 2 एलएसबी को हटाने के लिए सामग्री को स्थानांतरित करते हैं और शेष 6 बिट्स को वापस करते हैं। इन कार्यों का उपयोग उदाहरण स्केच powerSaverPressureAndTemperature.ino में निम्नानुसार किया जाता है:

// bmp1 से EventCounter का मान वापस पढ़ें

बाइट bmp1F4value = bmp1.readF4Sleep (); // 0 से 63 बाइट bmp1F5value = bmp1.readF5Sleep (); // 0 से 63 इवेंट काउंटर = bmp1F5value*64+bmp1F4value; // 0 से 4095

कच्चा तापमान और दबाव कार्य

मूल पठन तापमान, पठन दबाव और पठन आर्द्रता कार्यों में दो घटक होते हैं। पहले कच्चे 20-बिट तापमान और दबाव मान BME/P280 से प्राप्त किए जाते हैं, या कच्चे 16-बिट आर्द्रता मान BME280 से प्राप्त किए जाते हैं। फिर मुआवजा एल्गोरिथ्म का उपयोग डिग्री सेल्सियस, एचपीए या% आरएच में आउटपुट मान उत्पन्न करने के लिए किया जाता है।

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

ये कार्य हैं:

readRawPressure (कच्चा तापमान); // BME/P280readRawHumidity (rawTemperature, rawPressure) से कच्चा दबाव और तापमान डेटा पढ़ता है; // BME280 कैल्कटेम्परेचर (rawTemperature, t_fine) से कच्ची आर्द्रता, तापमान और दबाव डेटा पढ़ता है; कैल्कप्रेशर (कच्चा दबाव, t_fine); कैल्कह्यूमिडिटी (कच्ची नमी, t_fine)

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

इन कार्यों के उपयोग का एक उदाहरण उदाहरण में पाया जा सकता है स्केच rawPressureAndTemperature.ino, और पुस्तकालय की.cpp फ़ाइल में readHumidity() फ़ंक्शन के कोड में भी।

ऊंचाई और समुद्र के स्तर का दबाव

वायुमंडलीय दबाव और ऊंचाई के बीच एक ज्ञात संबंध है। मौसम भी दबाव को प्रभावित करता है। जब मौसम संगठन वायुमंडलीय दबाव की जानकारी प्रकाशित करते हैं, तो वे आमतौर पर इसे ऊंचाई के लिए समायोजित करते हैं और इसलिए "सिनॉप्टिक चार्ट" आइसोबार (निरंतर दबाव की रेखाएं) को समुद्र के स्तर के लिए मानकीकृत दिखाता है। तो वास्तव में इस संबंध में 3 मूल्य हैं, और उनमें से दो को जानने से तीसरे की व्युत्पत्ति संभव हो जाती है। 3 मान हैं:

  • समुद्र तल से ऊंचाई
  • उस ऊंचाई पर वास्तविक वायुदाब
  • समुद्र के स्तर पर बराबर वायु दाब (अधिक सख्ती से, समुद्र के स्तर का मतलब है, क्योंकि तात्कालिक समुद्र का स्तर लगातार बदलता रहता है)

यह पुस्तकालय इस संबंध के लिए दो प्रकार्य प्रदान करता है, जो इस प्रकार है:

कैल्क एल्टीट्यूड (दबाव, समुद्र स्तर);

कैल्क सामान्यीकृत दबाव (दबाव, ऊंचाई);

एक सरलीकृत संस्करण भी है, जो १०१३.१५ hPa के मानक समुद्र स्तर के दबाव को मानता है।

कैल्क एल्टीट्यूड (दबाव); // मानक समुद्र स्तर का दबाव माना जाता है

चरण 3: BMP280 डिवाइस विवरण

BMP280 डिवाइस विवरण
BMP280 डिवाइस विवरण

हार्डवेयर क्षमताएं

BMP280 में कॉन्फ़िगरेशन डेटा के 2 बाइट्स हैं (रजिस्टर पते 0xF4 और 0xF5 पर) जिसका उपयोग कई माप और डेटा आउटपुट विकल्पों को नियंत्रित करने के लिए किया जाता है। यह स्थिति की जानकारी के 2 बिट और अंशांकन मापदंडों के 24 बाइट्स भी प्रदान करता है जिनका उपयोग कच्चे तापमान और दबाव मूल्यों को पारंपरिक तापमान और दबाव इकाइयों में परिवर्तित करने में किया जाता है। BME280 में अतिरिक्त डेटा इस प्रकार है:

  • एकाधिक आर्द्रता मापों को नियंत्रित करने के लिए उपयोग किए गए रजिस्टर पते 0xF2 पर कॉन्फ़िगरेशन डेटा का 1 अतिरिक्त बाइट;
  • कच्चे आर्द्रता मान को सापेक्ष आर्द्रता प्रतिशत में परिवर्तित करने में उपयोग किए जाने वाले अंशांकन मापदंडों के 8 अतिरिक्त बाइट्स।

BME280 के लिए तापमान, दबाव और स्थिति रजिस्टर BMP280 के समान हैं, जिनमें मामूली अपवाद हैं:

  • BME280 के "ID" बिट्स 0x60 पर सेट हैं, इसलिए इसे BMP280 से अलग किया जा सकता है जो 0x56, 0x57 या 0x58 हो सकता है
  • स्लीप टाइम कंट्रोल (t_sb) को बदल दिया जाता है ताकि BMP280 (2000 ms और 4000 ms) में दो लंबे समय को BME280 में 10 ms और 20 ms के छोटे समय के साथ बदल दिया जाए। BME280 में सोने का अधिकतम समय 1000 ms है।
  • फ़िल्टरिंग लागू होने पर BME280 में तापमान और दबाव कच्चे मान हमेशा 20 बिट होते हैं। 16 से 19 बिट मानों का उपयोग बिना फ़िल्टरिंग वाले मामलों तक सीमित है (अर्थात फ़िल्टर = 0)।

तापमान और दबाव प्रत्येक 20 बिट मान होते हैं, जिन्हें तापमान के लिए 3 16 बिट अंशांकन पैरामीटर और 9 16 बिट अंशांकन पैरामीटर और दबाव के लिए तापमान का उपयोग करके एक जटिल एल्गोरिदम के माध्यम से पारंपरिक तापमान और दबाव में परिवर्तित करने की आवश्यकता होती है। कम से कम महत्वपूर्ण बिट परिवर्तन (20 बिट रीडआउट) के लिए तापमान माप की ग्रेन्युलिटी 0.0003 डिग्री सेल्सियस है, यदि 16 बिट रीडआउट का उपयोग किया जाता है तो 0.0046 डिग्री सेल्सियस तक बढ़ जाता है।

आर्द्रता एक 16 बिट मान है जिसे 6 अंशांकन मापदंडों का उपयोग करके एक अन्य जटिल एल्गोरिदम के माध्यम से सापेक्ष आर्द्रता में परिवर्तित करने की आवश्यकता होती है जो 8, 12 और 16 बिट्स का मिश्रण होता है।

डेटा शीट तापमान रीडआउट की पूर्ण सटीकता को 25 C पर + -0.5 C और 0 से 65 C की सीमा में + -1 C के रूप में दिखाती है।

दबाव माप की ग्रैन्युलैरिटी 20 बिट रिज़ॉल्यूशन पर 0.15 पास्कल (यानी 0.0015 हेक्टोपास्कल) या 16 बिट रिज़ॉल्यूशन पर 2.5 पास्कल है। कच्चे दबाव का मान तापमान से प्रभावित होता है, जिससे लगभग 25C, 1 डिग्री C के तापमान में वृद्धि से मापा दबाव 24 पास्कल कम हो जाता है। अंशांकन एल्गोरिथ्म में तापमान संवेदनशीलता का हिसाब लगाया जाता है, इसलिए वितरित दबाव मान विभिन्न तापमानों पर सटीक होना चाहिए।

डेटा शीट 0 सी और 65 सी के बीच तापमान के लिए + -1 एचपीए के रूप में दबाव रीडआउट की पूर्ण सटीकता दिखाती है।

डेटा शीट में आर्द्रता की सटीकता + -3% आरएच, और + -1% हिस्टैरिसीस के रूप में दी गई है।

यह काम किस प्रकार करता है

तापमान और दबाव अंशांकन डेटा के 24 बाइट्स, और BME280 के मामले में भी 8 बाइट्स आर्द्रता अंशांकन डेटा को डिवाइस से पढ़ा जाना चाहिए और चर में संग्रहीत किया जाना चाहिए। ये डेटा व्यक्तिगत रूप से फ़ैक्टरी में डिवाइस में प्रोग्राम किए जाते हैं, इसलिए विभिन्न उपकरणों के अलग-अलग मान होते हैं - कम से कम कुछ मापदंडों के लिए। एक BME/P280 दो राज्यों में से एक में हो सकता है। एक राज्य में यह माप रहा है। दूसरे राज्य में यह प्रतीक्षा कर रहा है (सो रहा है)।

रजिस्टर 0xF3 के बिट 3 को देखकर यह पता लगाया जा सकता है कि यह किस राज्य में है।

सबसे हालिया माप के परिणाम किसी भी समय संबंधित डेटा मान को पढ़कर प्राप्त किए जा सकते हैं, भले ही डिवाइस सो रहा हो या माप रहा हो।

BME/P280 के संचालन के भी दो तरीके हैं। एक है कंटीन्यूअस मोड (डेटा शीट में नॉर्मल मोड कहा जाता है) जो बार-बार मापने और स्लीपिंग स्टेट्स के बीच साइकिल चलाता है। इस मोड में डिवाइस माप का एक सेट करता है, फिर सो जाता है, फिर माप के दूसरे सेट के लिए जाग जाता है, और इसी तरह। व्यक्तिगत माप की संख्या और चक्र के नींद भाग की अवधि सभी को विन्यास रजिस्टरों के माध्यम से नियंत्रित किया जा सकता है।

BME/P280 को संचालित करने का दूसरा तरीका सिंगल शॉट मोड है (डेटा शीट में फोर्स्ड मोड कहा जाता है)। इस मोड में डिवाइस को मापने के आदेश द्वारा नींद से जगाया जाता है, यह माप का एक सेट करता है, फिर वापस सो जाता है। सेट में अलग-अलग मापों की संख्या को कॉन्फ़िगरेशन कमांड में नियंत्रित किया जाता है जो डिवाइस को जगाता है।

बीएमपी २८० में, यदि एक एकल माप किया जाता है, तो मूल्य में १६ सबसे महत्वपूर्ण बिट्स पॉप्युलेट होते हैं, और मूल्य रीडआउट में चार कम से कम महत्वपूर्ण बिट्स सभी शून्य होते हैं। मापों की संख्या 1, 2, 4, 8 या 16 पर सेट की जा सकती है और जैसे-जैसे मापों की संख्या में वृद्धि होती है, डेटा के साथ आबादी वाले बिट्स की संख्या बढ़ जाती है, जिससे कि 16 मापों के साथ सभी 20 बिट्स माप डेटा से भर जाते हैं। डेटा शीट इस प्रक्रिया को ओवरसैंपलिंग के रूप में संदर्भित करती है।

BME280 में, यही व्यवस्था तब तक लागू होती है जब तक कि परिणाम फ़िल्टर नहीं किया जा रहा हो। यदि फ़िल्टरिंग का उपयोग किया जाता है, तो मान हमेशा 20 बिट्स होते हैं, भले ही प्रत्येक माप चक्र में कितने माप लिए गए हों।

प्रत्येक व्यक्तिगत माप में लगभग 2 मिलीसेकंड (सामान्य मान; अधिकतम मान 2.3 ms) लगता है। इसमें लगभग 2 एमएस (आमतौर पर थोड़ा कम) का एक निश्चित ओवरहेड जोड़ें, जिसका अर्थ है कि एक माप अनुक्रम, जिसमें 1 से 32 व्यक्तिगत माप शामिल हो सकते हैं, 4 एमएस से 66 एमएस तक ले सकते हैं।

डेटा शीट विभिन्न अनुप्रयोगों के लिए तापमान और दबाव ओवरसैंपलिंग के अनुशंसित संयोजनों का एक सेट प्रदान करती है।

विन्यास नियंत्रण रजिस्टर

BMP280 में दो कॉन्फ़िगरेशन नियंत्रण रजिस्टर 0xF4 और 0xF5 रजिस्टर पते पर हैं, और 6 व्यक्तिगत कॉन्फ़िगरेशन नियंत्रण मानों पर मैप किए गए हैं। 0xF4 में निम्न शामिल हैं:

  • 3 बिट्स osrs_t (तापमान 0, 1, 2, 4, 8 या 16 बार मापें);
  • 3 बिट्स osrs_p (दबाव 0, 1, 2, 4, 8 या 16 बार मापें); तथा
  • 2 बिट मोड (स्लीप, फोर्स्ड (यानी सिंगल शॉट), नॉर्मल (यानी निरंतर)।

0xF5 में निम्न शामिल हैं:

  • 3 बिट t_sb (अतिरिक्त समय, 0.5ms से 4000 ms);
  • 3 बिट फ़िल्टर (नीचे देखें); तथा
  • 1 बिट spiw_en जो SPI या I2C का चयन करता है।

फ़िल्टर पैरामीटर एक प्रकार के घातीय क्षय एल्गोरिथ्म, या अनंत आवेग प्रतिक्रिया (IIR) फ़िल्टर को नियंत्रित करता है, जो कच्चे दबाव और तापमान माप मूल्यों (लेकिन आर्द्रता मूल्यों के लिए नहीं) पर लागू होता है। समीकरण डेटा शीट में दिया गया है। एक और प्रस्तुति है:

मान (एन) = मान (एन -1) * (के -1) / के + माप (एन) / के

जहां (एन) सबसे हालिया माप और आउटपुट मूल्य इंगित करता है; और K फ़िल्टर पैरामीटर है। फ़िल्टर पैरामीटर K और को 1, 2, 4, 8 या 16 पर सेट किया जा सकता है। यदि K को 1 पर सेट किया जाए तो समीकरण केवल मान (n) = माप (n) बन जाता है। फ़िल्टर पैरामीटर की कोडिंग है:

  • फ़िल्टर = 000, के = 1
  • फ़िल्टर = 001, के = 2
  • फ़िल्टर = 010, के = 4
  • फ़िल्टर = 011, के = 8
  • फ़िल्टर = 1xx, K=16

बीएमई 280 एक 3-बिट पैरामीटर osrs_h (माप आर्द्रता 0, 1, 2, 4, 8 या 16 बार) के साथ 0xF2, "ctrl_hum" पते पर एक और कॉन्फ़िगरेशन नियंत्रण रजिस्टर जोड़ता है।

चरण 4: मापन और रीडआउट समय

मैं इसे बाद में जोड़ने की योजना बना रहा हूं, आदेशों और माप प्रतिक्रियाओं का समय दिखा रहा हूं।

Iddt - तापमान माप पर करंट। विशिष्ट मूल्य 325 यूए

Iddp - दबाव माप पर करंट। विशिष्ट मूल्य 720 यूए, अधिकतम 1120 यूए

Iddsb - स्टैंडबाय मोड में करंट। विशिष्ट मूल्य 0.2 यूए, अधिकतम 0.5 यूए

Iddsl - स्लीप मोड में करंट। विशिष्ट मान 0.1 यूए, अधिकतम 0.3 यूए

चरण 5: सॉफ्टवेयर दिशानिर्देश

सॉफ्टवेयर दिशानिर्देश
सॉफ्टवेयर दिशानिर्देश
सॉफ्टवेयर दिशानिर्देश
सॉफ्टवेयर दिशानिर्देश

I2C बर्स्ट मोड

BMP280 डेटा शीट डेटा रीडआउट (खंड 3.9) के बारे में मार्गदर्शन प्रदान करती है। यह कहता है, "बर्स्ट रीड का उपयोग करने की दृढ़ता से अनुशंसा की जाती है और प्रत्येक रजिस्टर को व्यक्तिगत रूप से संबोधित नहीं किया जाता है। यह विभिन्न मापों से संबंधित बाइट्स के संभावित मिश्रण को रोक देगा और इंटरफ़ेस ट्रैफ़िक को कम करेगा।" मुआवजा/अंशांकन मापदंडों को पढ़ने के संबंध में कोई मार्गदर्शन नहीं दिया गया है। संभवत: ये कोई मुद्दा नहीं हैं क्योंकि ये स्थिर हैं और बदलते नहीं हैं।

यह पुस्तकालय एक ही रीड ऑपरेशन में सभी सन्निहित मूल्यों को पढ़ता है - तापमान और दबाव मुआवजे के मापदंडों के मामले में 24 बाइट्स, तापमान और दबाव के लिए 6 बाइट्स, और आर्द्रता, तापमान और दबाव के लिए 8 बाइट्स संयुक्त। जब अकेले तापमान की जाँच की जाती है, तो केवल 3 बाइट्स पढ़े जाते हैं।

मैक्रोज़ का उपयोग (#define आदि)

इस पुस्तकालय में सामान्य पुस्तकालय "गार्ड शामिल करें" मैक्रो के अलावा कोई मैक्रोज़ नहीं है जो दोहराव को रोकता है।

सभी स्थिरांक को कॉन्स्टेबल कीवर्ड का उपयोग करके परिभाषित किया जाता है, और डिबग प्रिंटिंग को मानक सी फ़ंक्शन के साथ नियंत्रित किया जाता है।

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

#define के बजाय const के उपयोग का मामला बहुत स्पष्ट है - const समान संसाधनों का उपयोग #define (यानी nil) के रूप में करता है और परिणामी मान स्कोपिंग नियमों का पालन करते हैं, जिससे त्रुटियों की संभावना कम हो जाती है।

डिबग प्रिंटिंग कंट्रोल का मामला थोड़ा कम स्पष्ट है, क्योंकि जिस तरह से मैंने इसे किया है, उसका मतलब है कि अंतिम कोड में डिबग प्रिंटिंग स्टेटमेंट के लिए लॉजिक होता है, भले ही उनका कभी भी प्रयोग नहीं किया जाता है। यदि पुस्तकालय का उपयोग बहुत सीमित मेमोरी वाले माइक्रोकंट्रोलर पर किसी बड़े प्रोजेक्ट में किया जाना है, तो यह एक मुद्दा बन सकता है। चूंकि मेरा विकास एक बड़ी फ्लैश मेमोरी के साथ ईएसपी8266 पर था, यह मेरे लिए कोई मुद्दा नहीं प्रतीत होता था।

चरण 6: तापमान प्रदर्शन

मैं इसे बाद में जोड़ने की योजना बना रहा हूं।

चरण 7: दबाव प्रदर्शन

मैं इसे बाद में जोड़ने की योजना बना रहा हूं।

सिफारिश की: