BH1750. Aplinkos šviesos jutiklis su I2C magistrale.

BH1750. Aplinkos šviesos jutiklis su I2C magistrale.

BH1750. Aplinkos šviesos jutiklis su I2C magistrale.

BH1750 yra pakankamai didelės skiriamosios gebos ir jautrumo aplinkos apšvietimo jutiklis. Matomoje šviesoje jis elgiasi panašiai kaip žmogaus akies ir nėra veikiamas infraraudonosios spinduliuotės bei nepriklauso nuo apšvietimo tipo spalvos temperatūros, ty gerai veikia esant natūraliai šviesai ir įvairių tipų dirbtinis apšvietimas. Jis skaitmeniniu būdu bendrauja su mikrovaldikliu, su I2C magistralė, todėl jis yra atsparus trukdžiams, jei yra tam tikru atstumu nuo jį nuskaitančios grandinės. Jo atsako laikas yra gana mažas, mažiau nei 200 ms nepalankiausiomis aplinkybėmis.

Turinys

    BH1750 Aplinkos šviesos jutiklis

    Elektroniniu požiūriu jo įgyvendinimas yra labai paprastas. Tiesiog prijunkite maitinimą (nuo 2,4 V iki 3,6 V) ir I2C magistralė. Pasirinktinai galima pakeisti magistralės adresą, kad būtų galima prijungti du įrenginius (su žemu ADDR lygiu jis yra 0B0100011 arba 0x23, o esant aukštam ADDR lygiui - 0B1011100 arba 0x5C), o VDI linija gali būti naudojama atstatymo funkcijai su mikrovaldiklis.

    Norėdami prijungti BH1750 prie Arduino, be maitinimo iš 3,3 V išvesties, be to, teisingiausia yra naudoti lygio keitiklį traukimo rezistoriaiI2C magistralė. Nors komponentas palaikys tiesioginį ryšį su magistrale I2C magistralė Nepatartina nustatyti grandinės dydžio, neatsižvelgiant į lygio konvertavimą.

    BH1750 aplinkos apšvietimo jutiklis. Taikymo grandinė

    Dėl savo populiarumo, kuris yra labai pigus, palyginti su tikslumu, yra keletas modulių, tokių kaip gerai žinomas GY-30, kurį galite pamatyti nuotraukoje pradžioje. Kad būtų patogiau juos sujungti kuriant prototipą su mikrovaldikliu, jie paprastai apima lygio keitiklius I2C magistralė ir įtampos reguliatoriai, kad juos maitintų aukštesne įtampa (iki 5 V), o ne 3,3 V Arduino.

    BH1750 turi du skaitymo režimus – nuolatinį ir individualų, kurie atitinka dvi būsenas – aktyvią ir mažos galios arba miego būseną. Jei naudojamas nepertraukiamo skaitymo režimas, BH1750 išlieka aktyvus ir po mėginių paėmimo, o atlikus individualų matavimą automatiškai persijungia į miego ir mažos galios režimą. Pirmasis nuskaitymas nepertraukiamu režimu trunka daugiausia 180 ms, o vėlesni – nuo ​​16 ms iki 120 ms, priklausomai nuo skiriamosios gebos.

    Jutiklis gali matuoti 4 liukso, 1 liukso ir 0,5 liukso intervalais (raiška). BH1750 savo duomenų lape rekomenduoja naudoti 1 liukso skiriamąją gebą, kuri leidžia atskirti mažesnius nei 10 liuksų apšvietimus (tai atitinka prieblandą) ir yra labiau atsparus triukšmui, kuris gali turėti įtakos matavimui.

    1 liukso ir 4 liuksų skiriamoji geba naudoja 16 bitų duomenų, kad būtų rodoma sveikoji dalis, todėl galima pasiekti maksimalų 65535 0,5 liuksų matavimą (saulėtą dieną be tiesioginės šviesos). 0,5 liukso režimu dešimtainei daliai naudojamas mažiausiai reikšmingas bitas (matmenys nuo 0,5 liukso iki 15 liukso), todėl su likusiais 32767 bitų galima pateikti maksimalią XNUMX XNUMX liuksų reikšmę (išorėje be tiesioginės šviesos).

    Teorinis saulės apšvietimas, palyginti su vidutine BH1750 talpa
    Teorinis straipsnio rašymo vietos ir dienos saulės apšvietimas (legalinis laikas, o ne saulės energija), palyginti su vidutine BH1750 talpa esant 1 liuksui

    Paprastai optinis langas, pagal kurį matuojama aplinkos šviesa, atitinka visą matomą spektrą ir jame siekiama pasiekti tokį jautrumo pasiskirstymą, kuris būtų panašus į žmogaus. Jei optinis langas sumažinamas (šviesa matuojama žemesnio bangos ilgio diapazone), BH1750 jautrumas gali būti padidintas (iki 0,11 liukso) naudojant optinio lango įtakos reguliavimo atšaukimo režimą, padidinant laiko rodmenis. proporcingai. Kadangi šiuo specialiu (negabaritinių) režimu imami atskiri rodmenys, kontekstas turi leisti tai leisti ypatingai nekeičiant matavimo sąlygų (pavyzdžiui, jutiklis turi išlikti labai stabilus, jis neturi judėti į vietą, kurioje yra skirtingos apšvietimo sąlygos).

    BH1750 operacijų kodai

    Valstybės
    5>

    • 0B00000000 (0x00) Mažos galios arba tuščiosios eigos režimas.

    • 0B00000001 (0x01) Įjungtas.

    • 0B00000111 (0x07) Atstatyti. Išvalo BH1750 duomenų žurnalus.

    Nutarimas
    5>

    • 0B00010011 (0x13) Nuolatinis matavimas esant 4 liuksų raiškai (nuo 16 ms iki skaitymo laiko)

    • 0B00010000 (0x10) Nuolatinis matavimas 1 liukso raiška (120 ms skaitymo laikas)

    • 0B00010001 (0x11) Nuolatinis matavimas 0,5 liukso raiška (120 ms skaitymo laikas)

    • 0B00100011 (0x23) Matavimas esant 4 liuksų skyrai (16 ms skaitymo laikas)

    • 0B00100000 (0x20) Matavimas esant 1 liuksų skyrai (120 ms skaitymo laikas)

    • 0B00100001 (0x21) Matavimas esant 0,5 liuksų skyrai (120 ms skaitymo laikas)

    Optinio lango keitimo reguliavimas
    5>

    • 0B011MT [0,1,2,3,4] Žemas MTREG (matavimo laiko registro) registro bitas.

    • 0B01000MT [5,6,7] MTREG registro aukštas bitas.

    Skaitykite BH1750 iš Arduino

    Aplinkos apšvietimui matuoti naudojant BH1750 nuo Arduino biblioteka naudojama Laidas kuri valdo ryšius su I2C magistralė. Procesas yra įprastas tokio tipo komunikacijose, pirmiausia jie suaktyvinami (kartą programoje) su Wire.begin(), ryšys su BH1750 prasideda nuo Wire.beginTransmission() ir jūsų adresas I2C (0x5C arba 0x23, priklausomai nuo to, ar ADDR yra atitinkamai aukštas ar žemas), jis sukonfigūruojamas siunčiant atitinkamą kodą su Wire.write() ir autobusas išleidžiamas su Wire.endTransmission()

    Jei naudojamas vienas iš nuolatinio skaitymo režimų, duomenims su adresu gauti naudojamas Wire.beginTransmission() I2C atitinkantį prieigą prie BH1750, būsite paraginti du baitai (raiška yra 16 bitų) su Wire.requestFrom() kurie yra skaitomi, naudojami Wire.read(), ir yra įkeliami į beženklį sveikąjį skaičių, pasukant pirmąjį baitą 8 bitais. Vėliau autobusas išleidžiamas su Wire.endTransmission(). Galutinis rezultatas gaunamas padalijus grąžintą vertę iš tikslumo koeficiento (1,2, jei optinis langas nekeičiamas)

    Jei naudojamas atskirų rodmenų režimas, BH1750 persijungia į miego režimą Norėdami grįžti į aktyvųjį režimą, galite išsiųsti konfigūraciją (tą patį skaitymo režimą arba naują) arba įjungimo kodą (0x01). Išjungimo kodas (1750x0) gali būti naudojamas norint priversti BH00 įjungti miego režimą.

    Svarbu atsižvelgti į jutiklio skaitymo laiką, kuris priklauso nuo skiriamosios gebos. Jei laukimas nėra labai svarbus, jis gali būti suvienodintas į visų atvejų reikšmę, kuri gali būti šiek tiek didesnė už numatomą maksimumą, kad būtų užtikrinta, jog skaitymas bus baigtas.

    Kad būtų patogiau rašyti BH1750 kodą Arduino, svarbiausius operacijų kodus rasite kitame antraštės dokumente.

    Šis pavyzdinis kodas rodo dažniausiai naudojamą šviesos jutiklio skaitymo režimą I2C BH1750. Raiška yra 1 liuksas, o skaitymo režimas yra nuolatinis. Pavyzdyje parodyta naudojant serijinę konsolę Arduino, kiekvienas rezultatas, gautas iš išmatuotos vertės.

    Kaip minėjau aukščiau, tiek 1 liukso, tiek 4 liuksų skyros režimai naudoja 16 bitų duomenų, kad išreikštų matavimą kaip sveikąjį skaičių. Kita vertus, 0,5 liukso režimu paskutinis bitas reiškia dešimtainę dalį, tai yra, vertė, kuri prisideda prie bendro matavimo, perkeliama dviem laipsniais į dešinę. 1 liukso arba 4 liuksų režimu paskutinis bitas (LSB) yra vertas 20, priešpaskutinė 21, kitas 22…0,5 liukso režimu paskutinis bitas (LSB) yra vertas 2-1, priešpaskutinė 20, kitas 21...

    Pagal šią duomenų struktūrą ir atsižvelgiant į tai, kad reikia atlikti du rodmenis I2C baito, norėdami gauti 16 bitų reikšmę, turite įkelti svarbiausius baito bitus, pirmuosius, kuriuos reikia nuskaityti, ir pasukti juos 8 bitais į kairę 1 liukso raiškos režimu ir 4 liuksų raiškos režimu ir tik 7 bitai 0,5 liukso. Norėdami suvienodinti skaitymo būdą 0,5 liukso režimu, galite įkelti reikšmingiausią baitą į beženklį sveikąjį skaičių, pasukti 8 bitus į kairę, įkelti mažiausiai reikšmingą baitą ir pasukti visą beženklį sveikąjį skaičių 1 bitu į kairę. dešinėn, išsaugant dešimtainės dalies reikšmė, nurodanti LSB (mažiausiai reikšmingas bitas) pritaikyti vėliau.

    Logiškai mąstant, 1 liukso arba 4 liuksų režimams būtina naudoti beženklius sveikuosius skaičius (unsigned int) kam Arduino nerezervuokite MSB (svarbiausias bitas) ženklui ir gali veikti tiesiogiai su tikrąja matavimo verte, o ne su neigiamu skaičiumi. Į „Arduino Due“ nebūtina, nes sveikieji skaičiai naudoja 32 bitus, tačiau ta pati programa taip pat veiks, jei bus naudojama unsigned int.

    Šis kodas rodo, kaip būtų naudojamas 0,5 liukso režimas

    Atsisiųskite aplinkos šviesos matavimo su BH1750 jutikliu ir Arduino pavyzdžių dokumentus.

    Rašyti komentarą

    Galbūt praleidote