बीएच1750. I2C बस के साथ परिवेश प्रकाश सेंसर।
BH1750 यथोचित उच्च रिज़ॉल्यूशन और संवेदनशीलता वाला एक परिवेश प्रकाश सेंसर है। यह दृश्य प्रकाश के सामने मानव आँख के समान ही व्यवहार करता है और यह अवरक्त विकिरण से प्रभावित नहीं होता है और न ही यह प्रकाश के प्रकार के रंग तापमान पर निर्भर करता है, अर्थात यह प्राकृतिक प्रकाश और साथ में अच्छा काम करता है। विभिन्न प्रकार की कृत्रिम प्रकाश व्यवस्था। यह माइक्रोकंट्रोलर के साथ डिजिटल रूप से संचार करता है I2C बस, इसलिए यदि इसे पढ़ने वाले सर्किट से एक निश्चित दूरी पर रखा जाए तो यह हस्तक्षेप के प्रति प्रतिरोधी है। इसका प्रतिक्रिया समय काफी कम है, सबसे प्रतिकूल परिस्थितियों में 200 एमएस से भी कम।
इलेक्ट्रॉनिक दृष्टिकोण से इसका कार्यान्वयन बहुत सरल है। बस पावर (2,4V और 3,6V के बीच) और कनेक्ट करें I2C बस. वैकल्पिक रूप से, दो डिवाइसों को जोड़ने के लिए बस का पता बदला जा सकता है (निचले स्तर पर ADDR के साथ यह 0B0100011 या 0x23 है और उच्च स्तर पर ADDR के साथ यह 0B1011100 या 0x5C है) और VDI लाइन का उपयोग रीसेट फ़ंक्शन के लिए किया जा सकता है माइक्रोकंट्रोलर.
BH1750 को कनेक्ट करने के लिए Arduino3,3 वी आउटपुट द्वारा संचालित होने के अलावा, लेवल कनवर्टर का उपयोग करना सबसे सही है पुल-अप प्रतिरोधक के लिए I2C बस. हालांकि यह घटक बस से सीधे कनेक्शन का समर्थन करेगा I2C बस स्तर को परिवर्तित करने पर विचार किए बिना सर्किट को आकार देना उचित नहीं है।
इसकी लोकप्रियता के कारण, जो इसकी परिशुद्धता के संबंध में बहुत सस्ता होने के कारण है, कई मॉड्यूल हैं, जैसे कि प्रसिद्ध GY-30, जिन्हें शुरुआत में तस्वीर में देखा जा सकता है। माइक्रोकंट्रोलर के साथ प्रोटोटाइप करते समय उन्हें अधिक आराम से कनेक्ट करने के लिए, उनमें आमतौर पर लेवल कन्वर्टर्स शामिल होते हैं I2C बस और वोल्टेज नियामक उन्हें 5V आउटपुट के बजाय उच्च वोल्टेज (3,3V तक) के साथ बिजली देने के लिए Arduino.
BH1750 में दो रीडिंग मोड हैं, निरंतर और व्यक्तिगत, जो दो स्थितियों, सक्रिय और कम शक्ति या नींद के अनुरूप हैं। जबकि यदि निरंतर रीडिंग मोड का उपयोग किया जाता है, तो BH1750 नमूना लेने के बाद सक्रिय रहता है, व्यक्तिगत माप करने के बाद यह स्वचालित रूप से स्लीप और लो पावर मोड में प्रवेश करता है। सतत मोड में पहली रीडिंग में अधिकतम 180 एमएस और बाद में 16 एमएस और 120 एमएस के बीच रिज़ॉल्यूशन के आधार पर समय लगता है।
सेंसर 4 लक्स, 1 लक्स और 0,5 लक्स के अंतराल (रिज़ॉल्यूशन) पर मापने में सक्षम है। BH1750 अपनी डेटा शीट में 1 लक्स के रिज़ॉल्यूशन का उपयोग करने की सिफारिश करता है, जो 10 लक्स से नीचे की रोशनी को अलग करने की अनुमति देता है (जो गोधूलि से मेल खाती है) और शोर के प्रति अधिक प्रतिरोधी है जो माप को प्रभावित कर सकता है।
1 लक्स और 4 लक्स के रिज़ॉल्यूशन पूर्णांक भाग का प्रतिनिधित्व करने के लिए 16 बिट डेटा का उपयोग करते हैं ताकि 65535 लक्स की अधिकतम माप प्राप्त की जा सके (सीधे प्रकाश के बिना धूप वाला दिन)। 0,5 लक्स मोड दशमलव भाग के लिए सबसे कम महत्वपूर्ण बिट का उपयोग करता है (0,5 लक्स से 0,5 लक्स तक माप) इसलिए शेष 15 बिट्स के साथ 32767 लक्स के अधिकतम मूल्य का प्रतिनिधित्व करना संभव है (प्रत्यक्ष प्रकाश के बिना बाहरी)
आम तौर पर, ऑप्टिकल विंडो जिसके अनुसार परिवेश प्रकाश को मापा जाता है, पूरे दृश्यमान स्पेक्ट्रम से मेल खाती है और इसका उद्देश्य मनुष्यों की तुलना में इसमें संवेदनशीलता वितरण प्राप्त करना है। यदि ऑप्टिकल विंडो कम हो जाती है (प्रकाश को छोटी तरंग दैर्ध्य सीमा में मापा जाता है) तो BH1750 की संवेदनशीलता को समय रीडिंग बढ़ाकर ऑप्टिकल विंडो के प्रभाव के समायोजन को रद्द करने के एक मोड के साथ (0,11 लक्स तक) बढ़ाया जा सकता है। ठीक अनुपात में। चूंकि इस विशेष (बड़े आकार के) मोड में अलग-अलग रीडिंग ली जाती हैं, इसलिए संदर्भ को माप की शर्तों में विशेष रूप से बदलाव किए बिना इसकी अनुमति देनी चाहिए (उदाहरण के लिए, सेंसर को बहुत स्थिर रहना चाहिए, इसे विभिन्न प्रकाश स्थितियों वाले क्षेत्र में नहीं जाना चाहिए)
BH1750 ऑपरेशन कोड
एस्टाडो
5>
-
0B00000000
(0x00
) कम शक्ति या निष्क्रिय मोड। -
0B00000001
(0x01
) ऑन किया। -
0B00000111
(0x07
) रीसेट। BH1750 डेटा लॉग साफ़ करता है।
संकल्प
5>
-
0B00010011
(0x13
) 4 लक्स रिज़ॉल्यूशन पर निरंतर माप (16 एमएस और पढ़ने के समय के बीच) -
0B00010000
(0x10
) 1 लक्स रिज़ॉल्यूशन पर निरंतर माप (120 एमएस पढ़ने का समय) -
0B00010001
(0x11
) 0,5 लक्स रिज़ॉल्यूशन पर निरंतर माप (120 एमएस पढ़ने का समय) -
0B00100011
(0x23
) 4 लक्स रिज़ॉल्यूशन पर एक माप (16 एमएस पढ़ने का समय) -
0B00100000
(0x20
) 1 लक्स रिज़ॉल्यूशन पर एक माप (120 एमएस पढ़ने का समय) -
0B00100001
(0x21
) 0,5 लक्स रिज़ॉल्यूशन पर एक माप (120 एमएस पढ़ने का समय)
ऑप्टिकल विंडो में परिवर्तन के लिए समायोजन
5>
-
0B011MT
[0,1,2,3,4] एमटीआरईजी (मेजरमेंट टाइम रजिस्टर) रजिस्टर का कम बिट। -
0B01000MT
[5,6,7] एमटीआरईजी उच्च बिट रजिस्टर करता है।
Arduino से BH1750 पढ़ें
BH1750 से परिवेशीय प्रकाश को मापने के लिए Arduino पुस्तकालय का उपयोग किया जाता है तार जो के साथ संचार का प्रबंधन करता है I2C बस. इस प्रकार के संचार में प्रक्रिया सामान्य है, पहले उन्हें सक्रिय किया जाता है (प्रोग्राम में एक बार)। Wire.begin()
, BH1750 के साथ संचार शुरू होता है Wire.beginTransmission()
और आपका पता I2C (0x5C या 0x23 इस पर निर्भर करता है कि ADDR क्रमशः उच्च या निम्न है), इसे संबंधित कोड भेजकर कॉन्फ़िगर किया गया है Wire.write()
और बस को छोड़ दिया गया है Wire.endTransmission()
15
|
Wire.begin();
|
17
18
19
|
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.write(MEDIDA_CONTINUA_UN_LUX_BH1750);
Wire.endTransmission();
|
यदि निरंतर रीडिंग मोड में से एक का उपयोग किया जाता है, तो पते के साथ डेटा प्राप्त करने के लिए Wire.beginTransmission() का उपयोग किया जाता है I2C BH1750 तक पहुंच के अनुरूप, आपको दो बाइट्स (रिज़ॉल्यूशन 16 बिट्स) के लिए संकेत दिया जाता है Wire.requestFrom()
जिन्हें पढ़ा जाता है, प्रयोग किया जाता है Wire.read()
, और एक अहस्ताक्षरित पूर्णांक में लोड किया जाता है, पहले बाइट को 8 बिट तक घुमाता है। बाद में बस को छोड़ दिया गया Wire.endTransmission()
. अंतिम परिणाम लौटाए गए मान को परिशुद्धता कारक द्वारा विभाजित करके प्राप्त किया जाता है (1,2 यदि ऑप्टिकल विंडो नहीं बदली गई है)
28
29
|
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.requestFrom(DIRECCION_BH1750_0,2);
|
37
38
|
lectura_BH1750=Wire.read()<<8; // Leer el primer byte y rotarlo 8 bits
lectura_BH1750|=Wire.read(); // Leer el segundo byte y «juntarlo» con el anterior on OR
|
40
|
iluminacion=long(100.0*(float)lectura_BH1750/DIVISOR_PRECISION)/100; // Resultado corregido y sin decimales
|
यदि व्यक्तिगत रीडिंग मोड का उपयोग किया जाता है, तो BH1750 स्लीप मोड में चला जाता है। सक्रिय मोड पर लौटने के लिए, एक कॉन्फ़िगरेशन (समान रीडिंग मोड या नया) या पावर-ऑन कोड (0x01) भेजा जा सकता है। शटडाउन कोड (1750x0) का उपयोग BH00 को स्लीप मोड में मजबूर करने के लिए किया जा सकता है।
सेंसर के पढ़ने के समय का सम्मान करना महत्वपूर्ण है, जो रिज़ॉल्यूशन पर निर्भर करता है। यदि प्रतीक्षा महत्वपूर्ण नहीं है, तो इसे सभी मामलों के लिए एक मूल्य में एकीकृत किया जा सकता है जो अपेक्षित अधिकतम से थोड़ा बड़ा हो सकता है ताकि यह सुनिश्चित हो सके कि पढ़ना पूरा हो गया है।
BH1750 के लिए लेखन कोड को और अधिक आरामदायक बनाने के लिए Arduino, सबसे प्रासंगिक ऑपरेशन कोड निम्नलिखित हेडर दस्तावेज़ में पाए जाते हैं।
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#define REPOSAR_BH1750 0x00 // Modo de reposo o bajo consumo
#define ENCENDER_BH1750 0x01
#define RESETEAR_BH1750 0x07
#define MEDIDA_CONTINUA_CUATRO_LUX_BH1750 0x13
#define MEDIDA_CONTINUA_UN_LUX_BH1750 0x10
#define MEDIDA_CONTINUA_MEDIO_LUX_BH1750 0x11
#define MEDIDA_SIMPLE_CUATRO_LUX_BH1750 0x23
#define MEDIDA_SIMPLE_UN_LUX_BH1750 0x20
#define MEDIDA_SIMPLE_MEDIO_LUX_BH1750 0x21
#define ESPERA_BH1750_0 250 // 250 milisegundos de espera de lectura del BH1750 (mayor que la máxima)
#define TIMEOUT_I2C 10 // 10 milisegundos de espera antes de renunciar a leer el bus I2C
#define DIVISOR_PRECISION 1.2 // valor por el que dividir la lectura para calcular la luminosidad 1.2 si no hay cambios en la ventana óptica
#define DIRECCION_BH1750_0 0x23
#define DIRECCION_BH1750_1 0x5C
|
निम्नलिखित उदाहरण कोड प्रकाश संवेदक में सबसे सामान्य रीडिंग मोड दिखाता है I2C बीएच1750. रिज़ॉल्यूशन 1 लक्स है और रीडिंग मोड निरंतर है। उदाहरण सीरियल कंसोल का उपयोग करके दिखाता है Arduino, मापा मूल्य से प्राप्त प्रत्येक परिणाम।
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#include “BH1750.h” // Cargar los códigos de operación del BH1750
#include <Wire.h>
unsigned int lectura_BH1750;
unsigned int iluminacion;
//float iluminacion; // Mostrar el valor con decimales
long cronometro_lecturas=0;
long tiempo_transcurrido;
long cronometro_timeout_i2c;
void setup()
{
Serial.begin(9600);
Wire.begin();
delay(ESPERA_BH1750_0); // Espera inicial para estabilizar el BH1750
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.write(MEDIDA_CONTINUA_UN_LUX_BH1750);
Wire.endTransmission();
}
void loop()
{
tiempo_transcurrido=millis()–cronometro_lecturas;
if(tiempo_transcurrido>ESPERA_BH1750_0)
{
cronometro_lecturas=millis();
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.requestFrom(DIRECCION_BH1750_0,2);
do
{
tiempo_transcurrido=millis()–cronometro_timeout_i2c;
}
while(Wire.available()<2&&tiempo_transcurrido<TIMEOUT_I2C);
if(Wire.available()>1)
{
lectura_BH1750=Wire.read()<<8; // Leer el primer byte y rotarlo 8 bits
lectura_BH1750|=Wire.read(); // Leer el segundo byte y «juntarlo» con el anterior on OR
//iluminacion=lectura_BH1750/DIVISOR_PRECISION; // Resultado corregido y con decimales (mínimamente más preciso pero menos legible)
iluminacion=long(100.0*(float)lectura_BH1750/DIVISOR_PRECISION)/100; // Resultado corregido y sin decimales
Serial.print(“La iluminación es de “);
Serial.print(iluminacion);
Serial.println(” lux”);
}
}
}
|
जैसा कि मैंने ऊपर कहा, 1 लक्स और 4 लक्स रिज़ॉल्यूशन दोनों मोड माप को पूर्णांक के रूप में व्यक्त करने के लिए 16 बिट डेटा का उपयोग करते हैं। दूसरी ओर, 0,5 लक्स मोड में, अंतिम बिट दशमलव भाग का प्रतिनिधित्व करता है, अर्थात, कुल माप में योगदान देने वाला मान दो की शक्ति से दाईं ओर स्थानांतरित हो जाता है। 1 लक्स या 4 लक्स मोड में अंतिम बिट (LSB) का मूल्य 2 है0, अंतिम 21, अगले 22...0,5 लक्स मोड में अंतिम बिट (LSB) का मूल्य 2 है-1, अंतिम 20, अगले 21...
इस डेटा संरचना के अनुसार, और यह मानते हुए कि दो रीडिंग की जानी चाहिए I2C एक बाइट का, 16-बिट मान प्राप्त करने के लिए आपको बाइट के सबसे महत्वपूर्ण बिट्स, पढ़ने वाले पहले बिट्स को लोड करना होगा, और उन्हें 8 लक्स रिज़ॉल्यूशन मोड में और 1 लक्स रिज़ॉल्यूशन मोड में बाईं ओर 4 बिट्स घुमाना होगा और 7 लक्स में केवल 0,5 बिट्स। 0,5 लक्स मोड में पढ़ने के तरीके को एकीकृत करने के लिए आप सबसे महत्वपूर्ण बाइट को एक अहस्ताक्षरित पूर्णांक में लोड कर सकते हैं, 8 बिट को बाईं ओर घुमा सकते हैं, सबसे कम महत्वपूर्ण बाइट को लोड कर सकते हैं और पूरे अहस्ताक्षरित पूर्णांक को 1 बिट को बाईं ओर घुमा सकते हैं। दाईं ओर, संरक्षित करते हुए दशमलव भाग का मान जो इंगित करता है एलएसबी (न्यूनतम महत्वपूर्ण बिट) इसे बाद में लागू करने के लिए.
तार्किक रूप से, 1 लक्स या 4 लक्स मोड के लिए अहस्ताक्षरित पूर्णांक का उपयोग करना आवश्यक है (unsigned int
) किस लिए Arduino आरक्षित न रखें MSB (सबसे महत्वपूर्ण बिट) चिह्न के लिए और माप के वास्तविक मूल्य के साथ सीधे काम करने में सक्षम हो, न कि ऋणात्मक संख्या के साथ। में Arduino ड्यू आवश्यक नहीं है क्योंकि पूर्णांक 32 बिट्स का उपयोग करते हैं, लेकिन यदि उपयोग किया जाए तो वही प्रोग्राम भी काम करेगा unsigned int
.
निम्नलिखित कोड दिखाता है कि 0,5 लक्स मोड का उपयोग कैसे किया जाएगा
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#include “BH1750.h” // Cargar los códigos de operación del BH1750
#include <Wire.h>
unsigned int lectura_BH1750;
//unsigned int iluminacion;
float iluminacion; // Mostrar el valor con decimales
long cronometro_lecturas=0;
long tiempo_transcurrido;
long cronometro_timeout_i2c;
bool parte_decimal;
void setup()
{
Serial.begin(9600);
Wire.begin();
delay(ESPERA_BH1750_0); // Espera inicial para estabilizar el BH1750
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.write(MEDIDA_CONTINUA_MEDIO_LUX_BH1750);
Wire.endTransmission();
}
void loop()
{
tiempo_transcurrido=millis()–cronometro_lecturas;
if(tiempo_transcurrido>ESPERA_BH1750_0)
{
cronometro_lecturas=millis();
Wire.beginTransmission(DIRECCION_BH1750_0);
Wire.requestFrom(DIRECCION_BH1750_0,2);
do
{
tiempo_transcurrido=millis()–cronometro_timeout_i2c;
}
while(Wire.available()<2&&tiempo_transcurrido<TIMEOUT_I2C);
if(Wire.available()>1)
{
lectura_BH1750=Wire.read()<<8; // Leer el primer byte y rotarlo 8 bits
lectura_BH1750|=Wire.read(); // Leer el segundo byte y «juntarlo» con el anterior on OR
parte_decimal=(lectura_BH1750<<15)>0;
lectura_BH1750>>=1;
iluminacion=((float)lectura_BH1750+(parte_decimal?0.5:0.0))/DIVISOR_PRECISION;
Serial.print(“La iluminación es de “);
Serial.print(iluminacion);
Serial.println(” lux”);
}
}
}
|
BH1750 सेंसर और Arduino के साथ परिवेश प्रकाश को मापने के उदाहरणों के लिए दस्तावेज़ डाउनलोड करें.
टिप्पणी पोस्ट