你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【年中粉丝节】+BH1750光照度传感器

[复制链接]
liuxingkeji 发布时间:2021-6-8 20:49
【年中粉丝节】+BH1750光照度传感器
今天就再分享下一个光照度传感器。也是比较简单,和之前的温湿度传感器一样的是使用IIC接口,所以两个器件是可以挂载在同一个总线上的,因为他们有不同的地址。
1.png
可以测1-65535lx的光度值。可以用在LCD调光方面。
2.png
下面是芯片内部架构,其实使用的是16位的ADC,输出是12位的,所以可见波动是很小的。
3.png
上面的图是描述的芯片读取数据的一个流程。
4.png
上面是芯片内部寄存器的一个表,同时下面很重要的是器模式配置,可以配置1分度的,也可以配置更高的分辨率0.5和低的4。
5.png
下面直接跳到重点,首先是确定其器件地址,我们这里把ADDR 脚拉低了所以器件地址就是上面是七位同样需要左移一位。变成0100 0110。也就是0x46。
  1. #include "sys.h"
    & ]0 B' d9 G; t$ m/ q8 O
  2. . }% T1 m' Z- O6 A% a* E- @
  3. #include "delay.h"5 H3 A3 p1 _3 @5 Q& }

  4. 4 [1 K8 n8 M1 h, |- @' q* L* t0 `% s
  5. #include "bh1750.h"
    6 P1 @, b2 I3 ?9 V* ]
  6. 9 ]7 q& r: M, I7 K$ f. u5 @) i
  7. # O( q% c5 c4 t% i: R
  8. % E( T5 D! U! p3 \( X

  9. ! N( v0 D( ~2 P& U

  10. # t. D% L, ^/ h0 p' z( d! S1 ]
  11. #define   SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
    ) w3 m3 L0 y, r1 @
  12. , H7 E% j  X# `5 C  D: P
  13. uint8_t  BUF[4];                  //接收数据缓存区
    * N4 U( H( w5 x
  14. 4 a% D2 y  a( z' r- B
  15. extern uint16_t Light_Value;  u$ m, n6 d' W  D1 c/ \  n
  16.   `$ c& C- ^  s( I  F
  17. //uint16_t Light_Value;
    / @; J/ d" x# w5 O6 t5 ]$ T0 W
  18. 6 x+ K8 P9 p% m0 `7 p

  19. ' d8 H1 G7 v# t, F. d4 j

  20. & T" z3 z) R2 E2 q3 A2 i" L
  21. void BH1750_PortInit()
    % ^' k; B' f7 O% a# M

  22. 4 ~+ i4 j4 ?2 W3 j& Q- S3 [
  23. {     ( z4 u; Y% g" R, e4 n& p4 X

  24. % N$ S/ e4 w; T4 |3 s
  25.        GPIO_InitTypeDef GPIO_InitStructure;
    ! ?( }: m$ ]+ B( b% L: O1 ^5 q4 [
  26. ) x6 m2 M' Z( _% b2 g3 E- b

  27. % s  u. D( Y' O& x

  28. 4 p( E6 o$ |/ I' p% x
  29.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
    , W7 @: w) d4 g& ?$ ~( c

  30. 4 S: u" L1 v3 S3 G
  31.         d3 o) d* i: b: i
  32. 6 K7 W; J/ v4 \; j! q" r' X
  33.        //PB6-SCL PB7-SDA PB12-ADDR0 y+ ]) U* c+ m. M. l# V* k

  34. 6 X* |7 t4 u6 M
  35.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;1 l; m* S- v8 ]3 e9 W2 j7 ^
  36. # J7 I1 O: t4 i; R5 F6 E, N' a
  37.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
    % n+ C' |- O& Y& n+ S9 G2 H

  38. + t8 W9 m% K- S
  39.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;" ^8 N* J, F, n6 p

  40. 0 A; s, Q5 f+ p6 |% I( c1 T0 m' X4 P
  41.        GPIO_Init(GPIOB, &GPIO_InitStructure);+ r. o% ^1 U; K8 w: J
  42. 4 q" r6 w& K8 S- v5 x2 [+ N( c1 f( _
  43.        GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高
    : t9 ~! k8 D( l4 S

  44. ; n- y: @1 H! u; N3 ?# Z
  45.       1 b5 r. V2 Y3 Q7 T4 n3 C
  46. 2 m% ]" v" W+ P% W# u
  47.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PB.14 PB.121 i+ R- P+ w9 x
  48. 7 a% ^. M- j9 F6 g2 {
  49.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;: |! c) |! ^2 H) m8 S5 p* ?2 q; i8 _3 v

  50. . k) i. y% P4 U5 x7 A
  51.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //复用推挽输出! f& \3 l1 _6 d7 C/ X
  52. ) C8 B  a( z% k" T+ m# q+ D
  53.        GPIO_Init(GPIOC, &GPIO_InitStructure);
    : o6 f7 R; b, b
  54. 4 @, T$ N  Q. W1 D) V$ F* D
  55.              2 Y: b# g( z+ n5 R4 N" {
  56. : M. o' s$ H. b0 N9 s7 J' T* D
  57. }
    . d6 W+ x/ Y! ~& T

  58.   t. d- o# v9 P; v3 O$ d% ?+ o
  59. * B/ |- M  b7 H2 N1 k% @  h- s! g* M
  60. 1 V! j3 W3 C" R3 z

  61. " d* U7 R& j* k4 G0 H

  62. 1 v' H6 R8 X/ v4 d4 ~* {
  63. /***************************************************************$ H7 c7 a$ O& G! E% U

  64. ' v: c* z+ A1 ~+ l' q. p
  65. ** 功能:     产生IIC起始信号  B# {  r% ~. b; W# Q0 r

  66. + \$ p) O0 P: m% A1 k% F, t
  67. ** 参数:        无参数
    / E+ f7 M. |# |6 {+ s* |
  68.   \5 b5 F5 R7 ?& Q4 M- Z
  69. ** 返回值:    无
    0 E6 q4 U- {0 B4 N1 X8 i
  70. , Z; j* y3 Z/ l+ d2 J: ~$ d% @( ^
  71. ****************************************************************/. T1 ~% ~& \3 M

  72. 5 m5 t  U7 M& _: D: Z1 G
  73. void BH1750_Start()
    1 f1 a) G- j( L' Q

  74. # X7 Y9 J3 j+ W7 D
  75. {$ P9 a6 B  D9 l1 C  e) f

  76. % O0 f9 e0 R! A9 H  s; r7 v1 v
  77.     SDA_OUT();     //sda线输出+ n2 m2 y  o9 r7 b

  78. ! t9 ~& r; G" r; _# @
  79.        IIC_SDA=1;             5 f: w& k2 U# O& Y( c" U" Q9 U1 V
  80. . I) W( [  ]* }! y: l
  81.        IIC_SCL=1;
    4 p3 X6 z, J1 n$ Q0 n
  82. $ e# A- ~- G& ~1 ^" Y8 i6 c0 j8 g
  83.        delay_us(4);: k+ C) T0 P5 H

  84. / j4 C& J- Z1 w. j% R: ?5 b* r, s6 A
  85.       IIC_SDA=0;//START:when CLK is high,DATA change form high to low
    $ m9 X8 L& P( l" l/ A

  86. , I; X7 K/ N3 M! M
  87.        delay_us(4);/ t! O: D2 o' g4 e0 A/ [
  88. 5 b4 d+ p" r1 [8 O
  89.        IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
    * D7 }1 a2 c5 z: M2 S+ a

  90. $ U6 q) g) y2 r$ N3 G1 q
  91. }
    + S, G* ]# v# @/ e  ^
  92. 2 l% ?9 B( p5 p! P* O& z! H
  93. /***************************************************************8 W5 j3 t' G: v, s; B) ^
  94. 8 A% q; V2 [0 G% {( ~5 T9 A
  95. ** 功能:     产生IIC停止信号! u, {/ }+ |* Y6 v4 P7 c

  96. , r' I" g6 O$ k, m, F6 d- U
  97. ** 参数:        无参数
    1 |% e* Y4 W4 }+ w! |. o, {
  98. , }( t/ J1 o4 M( O/ j
  99. ** 返回值:    无
    7 B+ l! B- [/ U6 e0 I

  100. 3 z2 n5 L4 n6 l2 Q! Y7 A) t
  101. ****************************************************************/
    5 x5 I" T. I) b% M

  102. 2 g" p; d  Q- _" H5 h6 T7 ]
  103. void BH1750_Stop()! M7 p2 ^. G  }0 r/ k4 c4 A

  104. 5 p& |5 h2 Y. O$ k/ ~( B& |
  105. {9 _4 D7 w# H: U" I$ y6 s$ M

  106. - I4 J+ \0 X1 j7 o/ Z  r1 ^& }
  107.        SDA_OUT();//sda线输出* S, N: D6 @2 b2 \! ^4 L# m
  108. * A- t) c  N6 _( r4 t
  109.        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
    ; M) ~4 j' B: _* G
  110. ( O! }. _. x* O" D- s
  111.        IIC_SCL=1;/ d$ K/ g0 a, m6 Q/ ^& |
  112. ) s6 ], V# V$ t- x; [
  113.       delay_us(4);
    ; x" z/ l+ {% f7 e

  114. ! [, {1 ^0 u3 U
  115.        IIC_SDA=1;//发送I2C总线结束信号
    * \6 B: S4 h" h, w& M
  116. ' H$ A0 D' T# ^" L! G. M
  117.        delay_us(4);
    5 x" W7 m& P+ z* ^( y8 H5 g

  118. - T) E# y  w/ k4 N5 d! A0 C- a0 C
  119. }
    $ w: I5 V3 n5 e2 ^: a% S4 D5 j
  120. . T" C# l, F" B- w
  121. /***************************************************************
    , j/ J+ P5 X6 ?6 J
  122. 3 M! v6 L6 n3 I& \/ Q& H. M& Q
  123. ** 功能:     产生IIC应答信号( X$ v/ H$ f& s; W2 L" k7 m2 r
  124. : B, ?/ @1 d9 \3 T+ c
  125. ** 参数:        无参数: E, ]8 H) v4 k# @! R% c4 }0 Z

  126. 2 {+ M, h) ^8 k# G% D7 r1 d( A5 |
  127. ** 返回值:    无1 L2 c7 V; I6 |
  128.   `8 U' u7 r* i1 ]# P0 Q  J  M
  129. ****************************************************************/$ I; \( W$ |1 Y7 B3 Z& T4 s4 N  c" K% T

  130. 8 `& ~. f0 C; W- P
  131. void BH1750_SendACK(u8 ack)
    1 [9 g2 }2 v8 e

  132. % f3 w( t6 U3 e0 o$ u7 s
  133. {- @9 O9 R6 [6 z# h; y

  134. # h% q! Q8 g7 d+ C" v
  135.     SDA_OUT();          //sda线输出
    % i. h7 R: j0 F7 t; l5 E
  136. 6 M. S8 L# s+ m( ^/ Z, O
  137.        if(ack)IIC_SDA=1;   //写应答信号
    & D# l6 D9 S' y
  138. * y; Z. k) e/ H$ ?9 ]; F$ s
  139.        else IIC_SDA=0;         
    ' ^- [4 f+ s" c$ H4 V) k+ d

  140. ; N9 K  n1 V" G" r3 k# h1 f
  141.     IIC_SCL=1;          //拉高时钟线2 ^& I+ F/ `- _" `5 b* ~" k+ k6 g
  142. * d4 J, w" K* H9 Y0 Y
  143.     delay_us(2);        //延时
    ( O" E! ?: |' i0 I

  144. 7 \' d' ^# D/ y& @& h
  145.     IIC_SCL=0;          //拉低时钟线* @- l5 |% T% L( H9 S+ h
  146. 6 w2 r* R- n' n8 L
  147.     delay_us(2);        //延时
    ; S# W+ a% z0 Q0 \* U' }
  148. 8 v! W+ r) R: k! S. k7 S
  149. }0 _; z$ P8 z# ]

  150. 5 q# d* y$ ^* y3 s) A$ E
  151. / V* d1 ^: \7 U, Z$ I# G9 V
  152. + K! a: z" Y0 G3 z5 |4 C6 `- C2 P. D
  153. /***************************************************************
    9 G0 y$ ]$ ~/ I! W! E8 _
  154. + ~, _# v7 K8 P, ?6 C) I
  155. ** 功能:     产生IIC接收信号
    3 D" G/ Q8 G9 g9 Z8 _1 ?! q

  156. # {' B2 W% f2 g, C1 e8 a
  157. ** 参数:        无参数
    ; B4 m, p& F; r  _
  158. ; Q: F& z9 g* B
  159. ** 返回值:    无
    / T' j, L7 c1 t' u4 F

  160. 6 R3 R4 j. P! e3 _6 p
  161. ****************************************************************/, }8 h! y; ~5 A7 l

  162. " V6 j: d$ p; l" c; x+ v+ \
  163. u8 BH1750_RecvACK()
    ! U" h' x' o: a0 W4 ^! ]8 S( {
  164. ' J5 l+ ]% Q3 a( z& k& @* F
  165. {5 l" y+ @. \! f4 `( ?; l& ?) |# m

  166. ) L% P! E5 N; E. a
  167.     u8 data;
    4 y2 @! X: E) K* m* x0 d' G4 f3 a

  168. / s& X, W9 j( p- }" f9 y# \
  169.          SDA_IN();         //SDA设置为输入7 o- h$ ~$ j1 L( n) E8 w( _2 p

  170. 4 m  a5 P* a7 S0 x
  171.     IIC_SCL=1;        //拉高时钟线
    + Z" C/ V3 v. l+ `
  172. ; q, l" @6 o. i% x: t1 k
  173.     delay_us(2);      //延时# p- j6 M  m- I

  174. 5 B$ u! f# b& h' A5 A  b; d2 `  J3 m
  175.     data = READ_SDA;  //读应答信号: J( U+ d5 `. z- y+ E/ a

  176. 4 _- X% Z7 [4 R+ c7 G
  177.     IIC_SCL=0;        //拉低时钟线  I7 Z/ e. p  _5 G6 ~, U. U- N+ F; g

  178. ! K9 Z5 {* M" k/ G- [0 F3 P- Q9 O4 l
  179.     delay_us(2);      //延时) a: J2 M4 g. Z

  180. , M7 M4 p8 u: }$ v, t
  181.     return data;4 i: @. n: J4 p+ w8 p
  182. 5 |/ H/ l2 w& w3 T" U  \- _# O
  183. }
    # r; [5 o9 z+ s/ y6 i# f& b, p

  184. 7 b' D! x- R4 l/ a7 O) `
  185. /***************************************************************
    " M5 d/ I' R6 R( K# ^) s+ e
  186. ) q4 D7 g# ~8 b
  187. ** 功能:     向IIC总线发送一个字节数据/ K6 |' I/ L: V3 }- p

  188. * s8 p" V; `- ]+ F7 e/ A
  189. ** 参数:        dat:一字节数据
    2 @& g2 F+ Z. Y# |4 H' B; @
  190. 3 }' z# v* A0 X: {0 i/ J# k
  191. ** 返回值:    无0 C" r- N% \: p. z7 A0 o

  192. 2 w7 P. z3 H/ ?) u
  193. ****************************************************************/& J7 K4 [6 O4 Y8 T7 g1 i# f. [

  194. " x" N( L1 }! P% v  F9 ]$ ?
  195. void BH1750_SendByte(u8 dat)
    , r  A0 j6 R* I6 ]

  196. ; F6 t. m- L4 i5 `& ~
  197. {: N( f+ B, m- c+ [  q% a6 i/ Y

  198. 5 ]: \& h$ K0 Z$ O% D) q+ B
  199.     u8 i,bit;
    1 n4 x2 p0 o0 T& x# ~# a5 n
  200. 7 }/ [3 n& C! v9 ]
  201.        SDA_OUT();               //sda线输出! b4 ?' T) l: V
  202. ' o; w! B1 R4 u% m4 |8 r
  203.     for (i=0; i<8; i++)      //8位计数器' \5 M6 l$ `* L8 N2 a+ f: N; l

  204. " \! a! s' I5 H% e7 z3 A( k
  205.     {% O6 ~  q7 R& I2 W

  206. ' K$ H9 r. t0 h9 f
  207.            bit=dat&0x80;
    7 t$ A6 r& j' c, e0 [
  208. & }5 L0 Q) }& ?" X- o1 B* L
  209.               if(bit) IIC_SDA=1;
    ' z4 ]: e/ I5 @: p! ^
  210. 9 X. X- w( O8 l) G
  211.               else IIC_SDA=0;" g  t/ K' O4 s$ e/ z

  212. 6 r1 R  D# C1 A" a( g
  213.         dat <<= 1;           //移出数据的最高位# F9 i- ^4 O( ^4 m( e: ^4 o
  214. 0 D/ \, ?) w: v/ r4 }; H1 M
  215.         IIC_SCL=1;           //拉高时钟线
    - U, t4 Y. T* r( x9 o: ?
  216. & c3 L  ^% J5 T, _
  217.         delay_us(2);         //延时1 a; Y  |, ~& D. \1 ^

  218. 6 |3 M2 h. j  Z2 Q' u
  219.         IIC_SCL=0;           //拉低时钟线
    * ]1 a' _6 P. }" I
  220. . @9 R+ U3 M5 |, Z
  221.         delay_us(2);         //延时
    ) u+ B& l: F- x$ o

  222. 4 i% I# Y& k: t
  223.     }
      [7 s5 `! y( e4 X; L! _1 t

  224. * W1 b( ~& w! q* f2 d6 d
  225.     BH1750_RecvACK();
    - g0 F/ F9 U) D, ]2 Q7 X

  226. # C4 k' E! k9 m' `3 z$ r5 T' [
  227. }
    & Z4 r& `3 v7 d4 H1 w9 A1 c- N
  228. 1 A: z8 |( _7 ~7 }5 L& q
  229. /***************************************************************
    # I5 o' P- ~$ l4 f- g3 A

  230. " A8 Q, V4 B! \4 O8 J. v5 X
  231. ** 功能:     从IIC总线接收一个字节数据
    , C1 E1 _+ u; |$ U7 O4 \3 [

  232. ; j# ?5 l1 e- P0 B* a& s
  233. ** 参数:        无参数& G% T) j: |8 s% J

  234. * N9 l* X$ f2 g, f
  235. ** 返回值:   dat:接收一字节数据0 B( z) k" P+ g8 q
  236. 9 s$ K& d9 X" J$ F+ K3 ?' I- |+ P2 ?
  237. ****************************************************************/, J; ~% F3 f1 c) y% ?- X, z

  238. + _$ D) {' I5 A" E6 H8 V
  239. u8 BH1750_RecvByte()
    * [! y3 M& `  |5 Z: O! M) M

  240. . e% X/ |( G/ r' Y) C; F3 }  N
  241. {
    # @  F  O2 |0 _" a5 A# D

  242. 2 U# [; ]0 Z. D: e: C# m, I
  243.     u8 i;, Y: `( U! I& k2 [

  244. 2 X- _- w4 [. M0 d7 w% D  L
  245.     u8 dat = 0;
      R: A* g9 h! {0 C* O7 M( G

  246. + F* U9 g4 u6 h: y
  247.        SDA_IN();               //SDA设置为输入! z% k( ^: v; ?9 F% q! @

  248. - x- p- `7 @1 O& @
  249.     IIC_SDA=1;              //使能内部上拉,准备读取数据,2 U+ ^# O$ b4 h6 D, F
  250. / x# l7 [7 A9 t" W9 g! r- d
  251.     for (i=0; i<8; i++)     //8位计数器; Q9 u: c  @0 e  S9 Q6 S2 N/ M; C6 A
  252. 7 G, D5 z! V) j
  253.     {9 p- {! G. A8 }$ t$ w9 m

  254. " K( ?! M+ d7 l8 k
  255.         dat <<= 1;3 x, @# H* l. ?
  256. 5 B, c, Y* o+ N1 ~4 C4 M
  257.         IIC_SCL=1;          //拉高时钟线7 A, o6 q! q) p2 H3 m
  258. 5 d/ D4 T8 j$ r' V1 `
  259.         delay_us(2);        //延时
    6 E7 A9 n9 X! ]/ c' K
  260. 0 C; G" v1 a4 @4 u) f) C9 y
  261.               if(READ_SDA) dat+=1;                o- @6 s! y' C. V6 C+ }

  262. - p3 x0 v$ \3 n. Y( ]- B$ B% h; V
  263.         IIC_SCL=0;          //拉低时钟线0 I6 v" z2 s+ E/ H- I  n) e2 D
  264. 8 D/ r5 r  C3 k8 i
  265.         delay_us(2);        //延时* k1 z4 _, I+ q( b/ F& O2 l- x
  266. ) z5 ?2 {( R' J! Q1 F+ W/ x: G
  267.     }+ `9 g7 H4 `% n' J3 S

  268. : L$ G& K5 z* |$ ^" o; A
  269.     return dat;
    9 E( W/ g) T& R: m
  270. 3 f& p6 J" u% r) H0 d9 }
  271. }
    / M8 r: n  _" q# |: m
  272. ; S0 t8 U& V, k) `
  273. ' d1 c2 w' W' v1 g: ]

  274. # u( a# q4 r( Y5 O. z4 T2 b
  275. /***************************************************************
    . |' f' |0 O& d7 o

  276. ! Q) t$ p% o+ F9 _5 g; ^+ v8 p
  277. ** 功能:     向bh1750写入命令0 n' s/ S+ \3 q$ F1 ?0 n- y

  278. . ~  k- v- @0 O0 k
  279. ** 参数:        无参数; ?! F( f2 Q, ^3 u- I0 P

  280. ( F/ Z# h' `4 V2 g7 @  G7 ?8 G$ ]
  281. ** 返回值:   无
    1 Y! M) F- c$ r2 |
  282. # L/ t! c* ^8 ], o
  283. ****************************************************************/0 U& R6 d  g7 X5 y' U7 R6 q' ]# W
  284. ( ?8 `# ?2 Q- r3 \0 h. a
  285. void Single_Write_BH1750(u8 REG_Address)
    ( j, E# N- j5 A
  286. 6 i8 ]+ O: l5 F; ]9 W7 [
  287. {
    : E3 R3 G9 _' Z: O* x
  288. $ L  |7 T/ _4 ?
  289.     BH1750_Start();                  //起始信号6 ~" C( I7 a  \, _
  290. 0 L' B% @1 X) G# M' M5 L2 j1 R
  291.     BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
    # N8 m. Z! d  F+ Y
  292. , {3 v( ^0 x/ q
  293.     BH1750_SendByte(REG_Address);    //内部寄存器地址,4 T4 K9 d1 y4 c  C; p' ~/ `
  294. 9 Y  K% N* a2 C
  295.     BH1750_Stop();                   //发送停止信号
    9 s- \3 s) a" q) s
  296. 9 p3 w4 s6 F% Y0 n# t
  297. }
    ) r- m2 z% F$ i# @( M
  298. * M4 o& f7 n, o* u1 z# j4 A
  299. 0 T; J2 X3 T: s* R! ?2 b+ ?' t
  300. ) v% N  l+ p/ O# Z9 R2 s
  301. /***************************************************************1 T5 L, x, P" V4 ?( N% p

  302. * F5 t" ]- C" `# V
  303. ** 功能:     连续读出BH1750内部数据" [/ ~3 x% ^6 j

  304. 9 t" b; `5 Z- c
  305. ** 参数:        无参数/ \0 C+ K) s3 ]+ }) Q$ u7 s
  306. ' Q" ^& I% `0 q* U7 I
  307. ** 返回值:   无
    6 U' T. y. T1 a& X, s

  308. 6 \( K# Z. ?0 L5 j7 o
  309. ****************************************************************/, t5 Y0 m; Q$ V. ^2 k
  310. . `# C! P3 y  [6 z* b
  311. void Multiple_Read_BH1750(void)
    1 F0 T  c( N3 B6 p( s, ~
  312. $ m8 t( ?" s0 D3 Y1 C) h
  313. {   u8 i;
    , N5 N# F2 T- M9 G# @
  314. " X9 I) b0 U  L& I- J8 c& s; W
  315.     BH1750_Start();                          //起始信号, U2 h5 O6 N8 ^& S* g
  316. % R/ ]" ], i  l" R& Y$ C
  317.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
    ! J; K; w8 ~- A6 v/ t

  318. 0 ^( q% c/ b5 `) D- j
  319.         x) B2 V! x( C9 O" C6 D

  320. ) v, I$ _2 e2 z; \- j5 |) p
  321.        for (i=0; i<3; i++)                      //连续读取2个地址数据,存储中BUF$ o( Q; d5 o- {4 x& _& J
  322. 8 I/ _' P6 @: S3 Q* _
  323.     {
    7 ?: g+ g; t8 D- f
  324. 2 F5 H) u- b  `3 Y1 H
  325.         BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
    5 H+ L7 P) g" w  {# j

  326. ! Z- X; O/ M1 j/ J2 ]6 w# Y
  327.         if (i == 3)
    4 P" Z! |- |3 A/ ~. y* g' |

  328. 9 g/ d( S4 r5 o( a& w
  329.         {$ I& a6 G( \% }# R; Z2 t/ ~1 m
  330. 2 r0 A9 }; W& w5 g9 M
  331.            BH1750_SendACK(1);                //最后一个数据需要回NOACK
    4 Y; R6 q- T, y) N+ t0 \6 z' ]
  332. % W5 [( K0 }: f- S
  333.         }( p/ P! M3 @8 ~; z4 o/ Z
  334. 3 r1 N/ O* F. L& d* T: B
  335.         else
    - H; n5 `0 g) n/ E
  336. & n! {% X7 D0 l/ p: }, r7 O
  337.         {            2 B1 J. _: d/ P0 J+ p

  338. % r/ T* ~. ~' w$ v6 ?$ z9 q+ w: |2 _+ }
  339.           BH1750_SendACK(0);                //回应ACK
    ! e4 z; t) k# e( d$ r) a& e

  340. 5 b; L' H" A! `& l1 n
  341.        }
    . ]" G3 _( i8 K* D  q9 D4 |4 [

  342. " U$ y" W1 M% }
  343.    }- w( O2 [$ x) K9 k" ^8 E1 P* o

  344. 7 O* `9 h& F2 {
  345.     BH1750_Stop();                          //停止信号0 J! c4 I! O! P* l% Y0 M

  346. 2 ]  k" G3 q. `- g4 L/ O: w
  347. //   delay_ms(150);
    2 Z9 q: T  I" ?( m

  348. % @9 a! ^+ V  i+ u5 i$ K, Z
  349. }
    1 J! l: x1 ^7 c" _% p& O+ s5 t' C
  350. : M, F# K, u) U

  351. 3 I4 f/ i" g7 D8 z" r" e, d

  352. $ m7 c, j: S6 l1 c5 A
  353. /***************************************************************% H  P, g* v9 A4 m5 X  L

  354. ) C, W; w4 J1 j# q3 e7 G; D
  355. ** 功能:     初始化BH1750
    9 O: B) F0 j0 v& |* e% a

  356. 6 L* w; G, t, D& |# Q5 w, Y) F
  357. ** 参数:        无参数
    ( P& K  W- R  v4 K' {1 A& h6 A9 W

  358. / @  r( i  n6 f; [. ^0 c
  359. ** 返回值:   无
    5 y4 z: o! [( G

  360. 4 J+ G) q+ P. H: x
  361. ****************************************************************/
    # c; F; M9 J7 y5 D1 r1 A3 M! P
  362. * i, Y! y2 h) T4 i4 u" R
  363. void BH1750_Configure(void)
    $ A" J2 @/ `! x4 e+ u3 P9 S
  364. ! F- ^8 [. n  J: @5 r* `3 T$ x
  365. {' D+ e1 V( }; `* B' s1 f' W( j

  366. + i3 \+ {+ K0 Z6 ]: r  s
  367.    BH1750_PortInit();# V4 X3 [. r1 i. _) v( @- F
  368. / ]+ g: Q$ `0 p* n7 Y6 i; S
  369.    Single_Write_BH1750(0x01); / E% j4 }1 N# @5 v# ~8 W' J

  370.   Y" x, g! x; I% ~
  371.    ADDR = 0;                                        //将ADDR位初始化拉低% h" i: c6 ?3 ?

  372. ( c7 ?( @. D0 o) L; `1 E6 A7 O
  373. }
    * |, H. T* [, W  y2 y

  374. 0 z% i$ ?& y2 U/ o( {' {' g

  375. ) o3 o  V, i0 z9 ]3 ~, `# b
  376. 6 _; K  |5 W" j
  377. /***************************************************************
    * a' ?$ C) X# Q
  378. 9 a1 G6 F  q+ T5 J9 q; v; G
  379. ** 功能:     读取光照度
    * y3 K3 ~$ g1 ?: T3 Q# M9 [
  380. - b2 ?7 N( K8 Z6 \! j* r$ }
  381. ** 参数:        无参数* p- M9 g/ N( N5 A5 s- L
  382. * e, S* l& E+ I" A- i% n; ]( W
  383. ** 返回值:   data:返回光照度值
    ! G: h$ A# y9 [; t- }4 k% [8 W2 R$ B
  384. ; X9 n! I8 a1 p+ w
  385. ****************************************************************/
    9 w, M; x1 T* @' l9 L

  386. % q% _9 t1 s* P( i4 A6 V
  387. uint16_t Get_Bh_Value(void)0 F" ~1 O* {* }6 K: V4 J6 n3 n
  388. , h7 B& c' \2 `
  389. { * T2 [# i! q$ I5 u% c& W4 r

  390. - L. u$ X4 n; c- q% Y$ N
  391.        static float temp;- Q3 r, X5 v/ o2 F

  392. $ h- E1 O% N( N: `
  393. //     u16 data;& |" c5 Y) ]) H: p: [
  394. . K3 w4 X2 u% d
  395.        int dis_data ;
    ( d: b% x, g  ~  v* ~. L( L% Z9 ]
  396. ( B4 Z* t6 ^9 x7 q* X
  397.     Single_Write_BH1750(0x01);   // power on* u1 C# z) K- f6 X$ n+ h. l

  398. ) i3 K" x. n$ o" D# T( x- m
  399.     Single_Write_BH1750(0x10);   // H- resolution mode
    ; _* W+ z. [* N5 r. x
  400. $ p! b; d# }) b: S: K: Z! n
  401. //    delay_ms(200);              //延时200ms
    4 A6 D# ~+ Z; b
  402. 1 l2 m& S; h- j
  403.     Multiple_Read_BH1750();       //连续读出数据,存储在BUF中' \) r! U6 z2 A1 U6 \

  404. : w& S3 B5 s9 c( `
  405.     dis_data=BUF[0];
    ! m* i0 c' r  Q' f. P3 z& ]/ {% Q
  406. $ i; `7 ^4 U7 I: n5 w' e
  407.     dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
    ! n" i/ P, w, f/ _# T3 d. j" \( Q& ?
  408. 9 j7 R& [$ |" f' |0 a4 O
  409.     temp=(float)dis_data/1.2;
    % w  H# f; C% I4 @/ j

  410. 6 h3 P, `9 j1 k  W; `+ T9 r
  411.        Light_Value =(int)temp;
    ; q4 t! u. b5 W
  412. " `* P- A, T- G1 T
  413.     return Light_Value;      
    0 o* U; V6 F1 Q5 U2 }) l& V
  414. % ^' g7 c) s" i$ E8 c
  415. }
复制代码
, H* L9 t1 j; }& p3 Q$ c
上面是所有代码,我们只需要在主函数终循环。Get_Bh_Value(void);就行。
6.png
我们这里就是使用的简单模式H-resolution mode,没有用其模式2,模式二可以更改采样时间,从而提高精度。感兴趣可以自己去看下,就是比较靠后的就是模式二的用法。
7.png
当手机手电筒放到其光窗上可以测到最大54612。还没有到65535。
8.jpg
同样使用的是昨天的板子。
7 m  w( G, Y3 w! @5 t( v  @
收藏 评论2 发布时间:2021-6-8 20:49

举报

2个回答
STMCU-管管 回答时间:2021-6-9 09:42:48
用的什么STM32的板子可以介绍一下7 x. x6 W/ d7 t' i; B+ D+ [
liuxingkeji 回答时间:2021-6-9 10:57:02
STMCU-管管 发表于 2021-6-9 09:42
9 ]% \+ _1 l- W& H0 D用的什么STM32的板子可以介绍一下
% h. w8 F& r! C) X+ b
用的是自制的STM32F103VET6开发板
: X) R0 }9 y6 ^+ P: J
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版