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

【年中粉丝节】+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"- B- @8 W) o2 t( B- G. b$ D

  2. ) r0 \6 B& t* [; _) J$ v3 a: h
  3. #include "delay.h"
    # o7 g1 K- [: I! Y/ e
  4. ' u* S2 _! {" o( {9 l$ h4 ]
  5. #include "bh1750.h"
    ' P! l! J1 A5 e3 O( p# h1 L# W( X

  6. 6 W* A" w  x" {+ R( H& c9 i

  7. 9 c$ U. B) O! U) t

  8. & ?* X0 @5 Q! x3 I% o$ w4 A

  9. - r7 R) K( G7 q3 U' ?8 a
  10. : E$ C6 b6 I0 D6 E8 A6 h' G
  11. #define   SlaveAddress   0x46 //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
    " x0 s; n" y0 f: C
  12. 7 o  P# D# X+ C$ j+ r7 i% F2 w: z
  13. uint8_t  BUF[4];                  //接收数据缓存区* N2 a+ I; G, k1 w5 f* K& _  x
  14.   V8 C/ w, l! ~* Y
  15. extern uint16_t Light_Value;
    1 G  Q; y4 b4 U- \, e  x* R

  16. . A- C* [$ w) t
  17. //uint16_t Light_Value;
    ; @+ i7 L9 o# h, p
  18. / [+ U* [; M9 F% t! {, _

  19. ) z; g. M9 L% M1 p0 F

  20.   j  B5 r5 t+ Z. x4 A0 D. K
  21. void BH1750_PortInit()' d8 O: F0 j6 p( l* v' ?! i. F
  22. ' i" ]: e2 _( E8 Q  H5 y* b1 b3 X
  23. {     3 u4 G4 j) r2 S- m" O/ R9 b4 K

  24. - i- V+ ?* R: I5 s# J8 A# w3 J
  25.        GPIO_InitTypeDef GPIO_InitStructure;, s8 z$ v, m8 L; [

  26. & `9 e, J: i( T! b3 D) r( O
  27. 0 E. h; |" m) g( g5 Q9 f6 H& S! j' E

  28. 1 Z. I9 ?; b7 a) f, I
  29.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);6 X8 T; H; x; ]. m
  30. 4 H9 {* q' e5 Z/ Q8 o# U1 Q
  31.       - P, Z) L: g$ g2 b

  32. 1 P% d, ^8 V1 a( P, Z& W- S
  33.        //PB6-SCL PB7-SDA PB12-ADDR% |" `5 M' t) G' _/ f

  34. . [5 t3 ?( ^* C
  35.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;- Q5 }: g9 Q. ^

  36. 1 k0 ?6 h- }9 j0 K8 r$ u
  37.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出
    ' T; u8 x+ L8 D% D2 ~" A% v# ?. Z& _
  38. ; c" t: L9 `; X8 Q
  39.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    / l5 O( i1 J& i7 i

  40. ! O+ p7 t  F- Q* n. ^
  41.        GPIO_Init(GPIOB, &GPIO_InitStructure);
    ; G" m; A, b$ j$ [
  42. ' v. p: R3 {, I, \! n( a( K2 [: E
  43.        GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高
    7 [; T) J; p& ?
  44. . `' v6 a4 q  I- W
  45.       - @! V  F2 F$ i( T! S8 g

  46. . T  K) J+ l) o7 T* y& t
  47.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PB.14 PB.12
    " n$ p' k( f0 J# h- f
  48. ; E, W9 W5 R! F7 Y) L8 S4 r
  49.        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    1 m& [& ]8 F- A
  50. 5 U( R7 L2 Y0 s5 g. |( f; y# u
  51.        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //复用推挽输出, c* x2 L  H2 \2 P

  52. # i9 @' `0 \) z. E3 V3 w* _
  53.        GPIO_Init(GPIOC, &GPIO_InitStructure);
    , S9 t# S( h1 W' C' R7 A; G' j

  54. ; N- ]8 r" S' t4 v6 r( h
  55.             
    " ^, B9 Z! U# N0 @3 `

  56. ! K7 h. F% H$ U" P8 m$ A2 }
  57. }
    / Q, h- f1 q# g4 U! C

  58. 9 v, P9 F; I. W* T' m. C

  59. : x- Q* K/ x9 I" ]

  60. # d  @& X7 F2 j. r+ r7 V
  61. : g4 N- h" J6 ^1 s; r
  62. , V0 M! k0 \6 N. }
  63. /***************************************************************
    8 l  S0 \2 Q: Y& U. R8 {
  64. 2 O8 @  \( g5 E  r. [
  65. ** 功能:     产生IIC起始信号* r) S& t  j/ s6 S& J1 i

  66. 0 c' r1 f; B5 f' o3 \( ~
  67. ** 参数:        无参数7 P8 N) a+ B. j# o2 s1 r
  68. . k3 O. ?) [3 _7 L
  69. ** 返回值:    无
    5 L: O5 [' @  E) e/ g
  70. * k: P+ `( H# M* B9 b2 k6 x8 Q
  71. ****************************************************************/2 M9 Y5 y% R4 _1 L5 O2 O

  72. 7 P; V6 o( C' G, q
  73. void BH1750_Start()
    4 K4 s& I8 m* |  X( m4 _8 U4 C6 Z
  74. & b5 R& L1 A. z- P5 ~" G& S  s
  75. {, z# S# w9 B1 b& p
  76. 5 k' |; O+ R/ r' I% L1 {# d
  77.     SDA_OUT();     //sda线输出1 D9 C6 w) @- Q
  78. + n; m1 s1 b4 v
  79.        IIC_SDA=1;            
    2 t! D1 E$ c; E5 w" z0 n

  80. ! r' [7 J& Z7 V' U
  81.        IIC_SCL=1;9 V% N+ Y9 W( Q) ~

  82. , R: Q7 ?% ^/ o+ T' Z/ J1 _& Z
  83.        delay_us(4);6 `" |' u- P7 F% d" \
  84. 7 o6 `% Q* w% u. V9 t
  85.       IIC_SDA=0;//START:when CLK is high,DATA change form high to low
    $ `) z2 [* @4 b5 N4 R

  86. $ ?4 a2 ~  y/ q7 F7 K% x
  87.        delay_us(4);
    * e; ~& }: P! L4 ]& x" ~

  88. ) Z  P0 m/ J0 m( \) y/ n) w, z5 _9 L
  89.        IIC_SCL=0;//钳住I2C总线,准备发送或接收数据5 y3 w1 ~& w" [8 T1 A
  90. : }& [0 ?6 E3 A! F. o
  91. }
    8 U8 B. g$ _0 ]5 b5 P: z) p
  92. , j) g0 R- f7 C5 U) W
  93. /***************************************************************
    3 F' F! e9 D/ P4 Z" W: T, F

  94. ) D. f' U+ J+ w8 E
  95. ** 功能:     产生IIC停止信号
    ! Z/ R; L3 ?6 a3 }8 N  }' E

  96. / q' ?  S; X7 Z( f" y* e+ {: @
  97. ** 参数:        无参数6 C# M. a* D. o7 I* q: j( [. D  Z
  98. ; w0 O8 l5 @! s4 j6 w, j& h3 A
  99. ** 返回值:    无
    8 Y; L; P: N" {" }; j4 z
  100. 7 G7 l  n2 b+ H" R( z, f& Y! m7 W
  101. ****************************************************************/
    . E/ X# S/ w/ k  n
  102. % k. u, J- k2 ?. [: d2 E
  103. void BH1750_Stop()7 R% Z' \. R* F* N" k+ k6 X$ x
  104. & q8 o: n! N; h  ~; T4 `
  105. {% d; d4 g8 R0 W

  106. - O1 L1 }: Z( K% r
  107.        SDA_OUT();//sda线输出
    7 m; P! b! @! U2 S( f9 m4 R
  108.   {$ r& S2 K2 U- S0 ?. H
  109.        IIC_SDA=0;//STOP:when CLK is high DATA change form low to high! a" u/ w6 w6 n( I% r' ^' Y

  110. . ~% H2 q5 b. Z5 l$ g7 o5 ?
  111.        IIC_SCL=1;
    1 i8 ~4 @( h, C2 J

  112. . R" R& w: _/ p3 d
  113.       delay_us(4);* C4 K$ C+ S6 m0 o' V

  114. ) g5 k' l0 n0 Y- s
  115.        IIC_SDA=1;//发送I2C总线结束信号' U* I$ X* }# K3 }, u

  116. * e. i4 T9 {: e
  117.        delay_us(4);
    : e) j' ^& b3 r- [5 Z

  118. " V" \- d" P& \. N  A! M8 i. R
  119. }) a9 h; v1 G3 q

  120. ; b7 S4 P8 K3 F
  121. /***************************************************************
    " `2 V! D1 w' ?- n

  122. ) n8 G% b9 h2 {- i' p) u* c
  123. ** 功能:     产生IIC应答信号
    & D: `0 Z7 J+ j1 J8 l) A2 z

  124. ! B7 c/ e! v8 K& u2 j. l% v
  125. ** 参数:        无参数9 D: n! g: ~+ l% E
  126. ' N, r; F7 w6 ]5 Z0 z( \
  127. ** 返回值:    无( t/ ]( x, Y  E, h

  128. $ X3 R4 a, H  o7 {+ F
  129. ****************************************************************/
    ( [& H5 u0 [. D9 Q
  130. $ E* T; K+ ~8 O. {9 t! X& `
  131. void BH1750_SendACK(u8 ack)0 U: q; C# B$ T/ N
  132. " o/ E- r2 i! j! R( `& \
  133. {
    ' I4 p* V& R8 v& r/ d

  134. 7 {2 U% k* q) B0 r; F7 K- p
  135.     SDA_OUT();          //sda线输出* Q- o' l) L3 Y

  136. ( X+ ?: K  e0 I7 f$ @
  137.        if(ack)IIC_SDA=1;   //写应答信号8 w! `& H0 M7 ~6 v  O

  138. . }; n5 H, L& a. |/ ^
  139.        else IIC_SDA=0;         
    7 W& E2 f6 p' Y" z$ O6 p7 f
  140. 4 A1 x" Z% H3 C* h/ n+ g
  141.     IIC_SCL=1;          //拉高时钟线5 y3 R7 W* ]( t5 j3 ]
  142. : w2 p- a4 O+ u3 B0 h5 i5 T, K! _; {
  143.     delay_us(2);        //延时
    7 l- x* ~( c3 e; r1 T  \+ F

  144. . w3 u: z8 C( x0 |" \
  145.     IIC_SCL=0;          //拉低时钟线
    / r! a9 S8 e2 j7 B8 K) N* {

  146. 5 r( b. d6 K4 l6 k/ u7 v. [
  147.     delay_us(2);        //延时9 K- O. T" w8 T  ]: v' p, `- ]1 Z( v

  148. 0 `8 \; F* [+ R: @
  149. }
    4 L  V- ^) m( }4 T  z2 F3 P) R2 s
  150. 1 {# \3 J. {( h* A* E  u6 m2 j" L

  151. 0 I( e! s- T4 R9 N7 Z
  152. 6 K) v% g. f; V  ~; d  K- P+ U
  153. /**************************************************************** n2 R% o$ ~% J( {/ S' v

  154. - G: {% v8 q2 }, p6 b3 c# _
  155. ** 功能:     产生IIC接收信号
    - b0 m$ Q* E3 N7 p- K4 h+ t: L

  156. 1 m' U1 V# B2 H- U3 g4 C' y
  157. ** 参数:        无参数+ k" K( |% j/ r
  158. 8 I1 E9 G+ W8 e7 `( m- Q3 F1 h
  159. ** 返回值:    无7 a9 e) q- E4 N6 d5 S- }

  160. 7 q! M5 G9 ?# L  m% G9 q
  161. ****************************************************************/! r; q; I1 a! w9 b9 B

  162. 2 r7 [1 C# r$ J5 Z, Y% Y. n
  163. u8 BH1750_RecvACK()/ T/ c5 v  R# i  J9 s: ]) ~, q, a
  164. 1 q" O$ K8 m* x* M! s! c
  165. {
      F* w( l: V8 z  y8 v
  166. 2 J) f' w9 C2 Z
  167.     u8 data;& W. F, |2 g, O% V$ N. W& K
  168. ! L, o3 v4 G9 V& s: P
  169.          SDA_IN();         //SDA设置为输入/ I1 W) a( P) h( J9 a( T# f$ r0 t
  170. " E2 a7 `& V6 o8 T5 f
  171.     IIC_SCL=1;        //拉高时钟线- L! c& I. ?+ l5 H8 E
  172. 4 W7 P. Z% Y5 E  x/ H' e
  173.     delay_us(2);      //延时) q6 g0 F  e7 Q4 G: ~) [6 F

  174. 1 A- T! G( J5 j5 f
  175.     data = READ_SDA;  //读应答信号* ?- n" e! R, L( G

  176. & ?. Y3 C) Z$ p! m( u
  177.     IIC_SCL=0;        //拉低时钟线
    % c" \+ c8 R8 j3 J4 O! Q
  178. & @1 I" s! A) U+ J
  179.     delay_us(2);      //延时# }/ c" ~' @( {9 I) D* i! a
  180. * S) G. Q, M/ P6 d0 m5 w& P3 l
  181.     return data;* R# H' \; i  h8 k! C! N
  182. - b8 ]/ h" o3 g3 N4 E/ K
  183. }
    " G* Y7 I9 r& j1 f; a& u

  184. 2 B, Z; W+ f% Q5 L
  185. /***************************************************************
    % c/ d# O/ h4 B0 w+ v$ w. S

  186. ; N$ W( Z; O* w/ u
  187. ** 功能:     向IIC总线发送一个字节数据
    ) z% |9 `8 d0 E, Y0 {7 C
  188. 2 I- W- d; L6 ?6 ~
  189. ** 参数:        dat:一字节数据, f( c- Q1 F. a% z* A6 {" \, z; }

  190. ' [. m' a9 j6 }) L' I5 g1 n
  191. ** 返回值:    无
    : S, q/ |. d: Q+ a1 Q

  192. 5 M% L& ~8 |$ m' g
  193. ****************************************************************/$ _. ]' V4 V$ f! K  k: K4 N
  194. " a0 C, K3 Z& q9 B, p- d
  195. void BH1750_SendByte(u8 dat)
    ( q) f3 B" o7 q: t: c
  196. , e8 S# s8 X( d8 n, ]0 L! @9 \2 I
  197. {- A4 x' B' Q" x  J2 k* @; r
  198. # C/ j) Z+ m# J) H( g: T
  199.     u8 i,bit;
    9 Y- B6 N; t7 A  Q) P7 j
  200. 9 E/ f1 ?; }  j
  201.        SDA_OUT();               //sda线输出0 f# Q. L+ S/ T6 b: o
  202. 6 g2 C/ \8 o( _) a5 h
  203.     for (i=0; i<8; i++)      //8位计数器" J) v, J9 [5 U  [+ k

  204. & D, n* i( @0 q$ j( N6 G
  205.     {8 r( y9 u. B( P  g
  206. ; s! p% W  ^$ p$ e* P( J) @. Q- n
  207.            bit=dat&0x80;
    & O$ d/ g$ q1 a" v+ L* j* l* p" }

  208. 9 i5 J3 t) e" J: z' \
  209.               if(bit) IIC_SDA=1;
    # o% h8 t2 d6 _! i
  210. - t( n. c7 H- Z8 m  [) {
  211.               else IIC_SDA=0;
    9 I- S* ?; w+ V) i1 @8 |. `

  212. * e% {6 a# i% O" c. ]
  213.         dat <<= 1;           //移出数据的最高位
    # T/ d+ K  F/ b+ k! I3 \

  214. 7 g8 r) c* R* O6 _' I8 a% V3 R7 T" `
  215.         IIC_SCL=1;           //拉高时钟线
    , F2 ]8 {! i2 k1 M' G0 w
  216. 6 `4 N8 D- V* P0 L  C5 a
  217.         delay_us(2);         //延时, i6 l+ T. A' ~; K) c3 R/ }
  218. / z( _+ E1 E  i% w0 [6 q! [: @
  219.         IIC_SCL=0;           //拉低时钟线
    % j* h* h0 `! Y$ v6 v# |- k$ t
  220. . {6 }1 V1 s7 d7 n6 c9 o4 f! K/ c
  221.         delay_us(2);         //延时, K5 _/ \' v: M( H: g

  222. ) @5 C& T9 ]% }1 Y# }
  223.     }
    * y4 G. m9 \8 d5 v

  224. 3 G7 D5 p' ?% ?  A# B9 V
  225.     BH1750_RecvACK();
    2 k+ [& ?  `3 c

  226. 3 l. `9 d( K' D+ B+ l* j3 e  z
  227. }+ {) V. v0 V1 V# `+ l1 _% _

  228. $ E2 s/ i4 D* W
  229. /***************************************************************) E7 \/ X' {" j/ r! z6 f- g
  230.   c1 }' j2 @- }5 Q; }4 ~: [& p: X
  231. ** 功能:     从IIC总线接收一个字节数据; {- q8 r3 u# ~' x2 i/ X4 o

  232. 3 A0 r6 ~) T+ H; z) Y/ b
  233. ** 参数:        无参数
    # a7 ~0 \; ^1 M7 J  A/ x
  234. * u; [2 T% a: t
  235. ** 返回值:   dat:接收一字节数据7 y5 Q* r( T1 s( ]' j* ~( Q$ z

  236. . V/ Y, i9 Y# B# }! `2 L/ H1 v
  237. ****************************************************************/6 V2 p+ z, @+ m5 p  m; ?. i1 X
  238. 0 G5 T5 \4 ?0 ]6 H2 v$ K
  239. u8 BH1750_RecvByte()- p- H! q4 [7 q: u4 h" @) b* G! x

  240. 5 S5 \8 @0 u$ T+ \) K* y) v
  241. {( o4 R1 x' z  B6 R8 q+ s7 [# |) I$ r
  242.   K: t% h% O2 i5 t3 w/ ?+ p( D
  243.     u8 i;4 @* W, `: H1 r6 @

  244. 1 V# f$ m+ x( L# V9 m8 \
  245.     u8 dat = 0;
    ) c/ G- z1 V. R2 |
  246. 0 p! ^( V; x  _( p+ M  W( J- E" Q* n" r
  247.        SDA_IN();               //SDA设置为输入( P/ _, X) B+ X0 c4 U+ k

  248. ) U1 Q0 v. ]/ }1 s9 S, B9 A3 V
  249.     IIC_SDA=1;              //使能内部上拉,准备读取数据,! W, ?% {" ]  w" u9 F8 m
  250. ! i7 a, p  d* o7 v/ D3 n3 _: H# m
  251.     for (i=0; i<8; i++)     //8位计数器- Z( R  ~- O3 x" i  c
  252. ' y/ V1 u( i3 h7 z$ F+ ^
  253.     {' P" H3 v( P# e$ G

  254. . a5 h1 W  _1 @) W+ _: ?. q
  255.         dat <<= 1;- d' q6 d* x4 a4 f8 f6 a

  256. 3 |; T+ t7 u5 b' s
  257.         IIC_SCL=1;          //拉高时钟线
    9 ^$ A  w' s# i0 m0 g  R

  258. ' f' _* A/ J* d: w4 y+ ^5 [
  259.         delay_us(2);        //延时
    : n0 W& r/ s) L$ B# c8 L9 Q6 c- \
  260. ( n* r* p, a7 Y, g  P* D) g
  261.               if(READ_SDA) dat+=1;              9 e/ B# O) I+ a

  262. - A1 i3 u; {4 T4 {( F
  263.         IIC_SCL=0;          //拉低时钟线, Q) X3 c2 i$ b5 T. W) n  K
  264. : \. c! J2 }& n0 P7 t
  265.         delay_us(2);        //延时1 N# M% b, ^! y  z. W2 B" L+ I

  266. 0 Q2 P" y- J* b
  267.     }
    ( v5 Q: a, u# ]1 l0 i

  268. , U! {$ h* m9 J" A9 c$ I- y  T
  269.     return dat;& L4 d0 Y  \! w- I0 f% f0 L

  270. ' b& _% p. w& a
  271. }
    5 p! K* f/ R& }- s

  272. $ X8 b# N# D% I( l- y

  273. , d( I& y. R0 }; P9 Y/ j: n

  274. . U' ]" m$ U' M2 A/ j# D* _
  275. /***************************************************************# A% a7 E& w' m* H% u. e
  276. ! `# `' L* u9 n) g' V" [
  277. ** 功能:     向bh1750写入命令
    : }+ l+ P4 P( E0 z0 J
  278. ' i, K  F6 c9 Q* d
  279. ** 参数:        无参数
    ! `2 R/ d, E. S: q3 ^  d
  280. 2 `& ]5 a- f; G# U# i+ e" X
  281. ** 返回值:   无) X. P( Q1 P, ~0 l# J7 S: j

  282. . w  b2 z" \( y' b1 C$ X, D
  283. ****************************************************************/! X2 [9 G9 K* Q1 N; V' t" G
  284. $ }* r$ ^( o/ Z
  285. void Single_Write_BH1750(u8 REG_Address)
    * f# x1 c9 Z2 U  q4 `
  286. $ F' E8 J6 U3 `. j
  287. {5 S/ t8 a6 V$ E

  288. 9 E3 {# Q- u- G( k( f! w( N
  289.     BH1750_Start();                  //起始信号8 I/ g0 R$ h3 Z) E2 ~5 ~3 N
  290. . H  k$ j. W4 ~* M( N. e6 M+ M
  291.     BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号$ G  t; ?- ?; N9 U1 k
  292. 1 Z. H, s! l6 ~' F; i3 a5 ^
  293.     BH1750_SendByte(REG_Address);    //内部寄存器地址,4 _9 s/ v0 s$ Q& V) B! N

  294. : V; j, [+ R" f* j
  295.     BH1750_Stop();                   //发送停止信号
    + z( ?2 A, m# v) N( V

  296. / C5 \- _1 \& }  D* ?
  297. }
    " ?$ Y  D& p, n8 o
  298. + j( A$ F: ~0 ^8 d: x# u  ]* H7 n
  299. 3 O* a, ~5 o% M1 L3 L3 d

  300. 4 }: E- \" Z- g+ A" i; ~, _$ ?% g6 b9 z
  301. /***************************************************************8 u' ?7 g3 V; k6 F5 l* f

  302. 9 g) U, S# i# z% N8 o
  303. ** 功能:     连续读出BH1750内部数据% T5 S; F! t, O! f. i) D) ?

  304. / D" O% |) f0 y; s5 i* k
  305. ** 参数:        无参数0 C9 g- Z1 `) s: Y) w5 A. u. W- v

  306. # _9 M5 K- ^8 Z9 C7 `5 ?2 s8 G
  307. ** 返回值:   无
    * n& P) F9 h7 Y  s0 H# r

  308. 3 l0 Z! Y1 g% ]- x6 e3 p
  309. ****************************************************************/) Y- l$ j, S1 t1 L6 A; `8 ~

  310. : x$ s9 V' d& B5 ^  z# V
  311. void Multiple_Read_BH1750(void)
    9 N& Z+ F& Y7 w2 \6 j
  312. " n! ]  ?* D# S) P: ]6 s0 _% _" W2 `
  313. {   u8 i; 5 ?5 |) U- D6 _0 P6 ^! N1 q$ c
  314. 2 I, G8 J# O0 ^. \# V* W
  315.     BH1750_Start();                          //起始信号9 {" z. X- K. G% X& |
  316. 2 ^2 t5 \8 j0 E& e
  317.     BH1750_SendByte(SlaveAddress+1);         //发送设备地址+读信号
    , e6 q& d) a! [/ z8 G
  318. 1 P, P! r: O0 A4 O/ ?, B( l
  319.       
    ; q+ t5 l7 ]& k( Q) c

  320. 5 F2 C% {0 h0 J- u9 B  V
  321.        for (i=0; i<3; i++)                      //连续读取2个地址数据,存储中BUF
    7 [% |, j" r* E

  322. . r' {6 f  i/ d/ V
  323.     {4 s1 Y4 q: I4 b0 b) G/ }  [

  324. , Z$ V) [* j2 _% Z* K- @
  325.         BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据& g: S) o* I0 m$ \1 _" ^
  326. ( U' b; j# v+ R* e3 v. Y
  327.         if (i == 3)8 Y0 ^# |4 j  A6 I- f6 q/ m( P

  328. & p- d2 [# F& n* f
  329.         {% n. \/ c2 e3 S5 y1 o. H

  330. $ s2 c$ \+ K; ]; O  F
  331.            BH1750_SendACK(1);                //最后一个数据需要回NOACK
    1 \! D# l6 q  p; c5 f& m! h% p) W

  332. ; `# t% p* \0 c5 G1 R$ j
  333.         }+ M7 J: G" ~" @9 v# `/ Q$ h
  334. / q- R' u7 G/ p8 w1 Z
  335.         else
    - I% E$ ?. x6 e9 y, i* }  W
  336. 7 Z6 |9 P9 _' ^2 O. ?3 s
  337.         {            
    - T+ L. w" z9 N0 F4 X5 W' T

  338.   d- e6 l  M# ~2 z+ d- e7 d
  339.           BH1750_SendACK(0);                //回应ACK/ i( `  N- l7 R9 q# t5 o
  340. 3 c( m. ?, {, w4 k% j( ^
  341.        }
    7 P1 S' z" p5 E1 q9 j: }2 ~, `
  342. 9 _% r8 g$ [3 C$ T7 U4 F: F; P2 D5 h
  343.    }( Y6 F- o- T& H5 D. I: c. C4 D. M

  344. & `+ _/ T* s6 q& t4 b& Y# q% F
  345.     BH1750_Stop();                          //停止信号
    # Y0 q* C) g; E7 n/ i% @

  346. 3 y& Y  I- N3 D: f6 J
  347. //   delay_ms(150);
    . A* v* K; L0 I7 O3 Y$ T
  348. 3 o4 U- n" a3 `. I
  349. }
    5 j& S1 P! E) N" q( k
  350. ' Y3 k+ y8 G3 d9 }6 a+ p

  351. ) u8 _; ~" d8 s* @  |
  352. . {: j+ T: X/ \5 }0 I( @
  353. /***************************************************************% f  T. L  L2 h3 x
  354. - s- n, }4 }9 C8 [+ W. }
  355. ** 功能:     初始化BH1750
    ) {; X' K. \/ c  z+ b

  356. . |) i$ d2 H8 u
  357. ** 参数:        无参数
    . \' O0 u# v; k+ n, U) O; }0 Q
  358. : g" ^8 i7 X- k1 r* E) S" x1 y
  359. ** 返回值:   无- m4 i2 P, K' G+ P

  360. - x4 a, ^: o/ @+ ]
  361. ****************************************************************/: A- h, O8 c2 V' F
  362. . [1 G! R: M0 m5 t# P6 W- }
  363. void BH1750_Configure(void)
    + z0 G& i( t: R! V. ]
  364. % O. e/ p& n) G0 y2 Y: J/ T: W
  365. {0 h' t. \/ B* b& Y
  366. 5 o. I0 Y& w1 ]: ]" Y
  367.    BH1750_PortInit();, `& A0 }1 _' F; y! k% {! E

  368. ; d$ U8 b7 E9 b
  369.    Single_Write_BH1750(0x01); 8 L' r. W5 e0 F  E4 j; u8 B

  370. % H! i- K0 |. h) M6 h2 g$ D
  371.    ADDR = 0;                                        //将ADDR位初始化拉低
    + k; [/ M; G" Z. q: |) v8 B

  372. $ P! Q+ s6 c$ S& }1 y
  373. }* i0 e; h7 Q: t" Y( R0 L
  374. 2 O9 K- M) d; z% _% e& ?9 T

  375. 1 U  U! n- |, n' D# U8 B0 Q

  376. # t2 z9 H& v: ]$ J& g3 ^! d( i& }4 i
  377. /***************************************************************
    ! g  A/ ~6 k, y4 n
  378.   t1 d  h: S5 }" z2 R3 c
  379. ** 功能:     读取光照度
    6 P9 t# D) |" z9 X5 w' U
  380. , ]2 [, L- J- i& Y7 N- `4 K  @
  381. ** 参数:        无参数
    : ]& I) i) P; A8 U2 f% s; z: S

  382. . u2 {5 y# Q, J& G, \5 U4 Z! e" V9 g
  383. ** 返回值:   data:返回光照度值  U8 ~* A, b$ s$ a

  384. 4 X6 `! D1 `8 ^4 r4 ]# G& v1 @( w! p
  385. ****************************************************************/2 q- Y$ }5 S: x2 |

  386. - p+ I) u# c# x. P2 Z
  387. uint16_t Get_Bh_Value(void)
    ! z8 s1 w* K8 J0 K$ @4 u
  388. 3 _" G3 U4 O$ ~" u- D+ ^# U
  389. { 7 i2 s: C  ?% }' w( S2 f/ ]
  390. 3 A, e' b: K% d0 O& J+ n
  391.        static float temp;/ n, h/ V$ c  o' q' S% a) ~4 W

  392. : X6 G9 [$ C9 z0 X( h3 b- P
  393. //     u16 data;) G) U% [% W" ]' D

  394. / W# m9 ?" b$ n" x2 s8 s% v5 [
  395.        int dis_data ;& o4 X& Y7 v- x5 N7 J

  396. * J' u  e0 P) P: N% o5 Y# w
  397.     Single_Write_BH1750(0x01);   // power on
    % v* Z% J- @" G  K: {2 M6 b

  398. 9 T# |$ Y' r5 r$ h# O0 w
  399.     Single_Write_BH1750(0x10);   // H- resolution mode
    1 c/ D  Y5 I* p

  400. ; R7 N6 s( a0 S5 G1 L- a$ m
  401. //    delay_ms(200);              //延时200ms5 E9 w6 k( u" R( j+ P  O
  402. - B, M& S; b. r7 H" L" i
  403.     Multiple_Read_BH1750();       //连续读出数据,存储在BUF中
    0 w8 j  F* y% O& J. [, p8 L
  404. / ^8 V# P1 c6 I3 g
  405.     dis_data=BUF[0];! P3 Z2 Q3 ?; H% h) `$ f  c

  406. % ]2 F0 l6 ^; C9 u' ^4 E; {
  407.     dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
    9 b( N- J: Y4 @# w7 G5 w7 |

  408. 1 K$ c( F. G3 U
  409.     temp=(float)dis_data/1.2;, X3 b$ l- i1 [, ~
  410. 9 t* J* H$ H0 X1 ~& U3 V4 s
  411.        Light_Value =(int)temp;* r( L( {. n3 E8 v! r: V5 A

  412. ' _. `  `, K& w/ H6 d  t: X
  413.     return Light_Value;       1 |: u- W* _- a- y# x' O

  414. ' I: \5 Q% D5 H
  415. }
复制代码

/ M0 N, F9 f/ v8 v" m1 ?
上面是所有代码,我们只需要在主函数终循环。Get_Bh_Value(void);就行。
6.png
我们这里就是使用的简单模式H-resolution mode,没有用其模式2,模式二可以更改采样时间,从而提高精度。感兴趣可以自己去看下,就是比较靠后的就是模式二的用法。
7.png
当手机手电筒放到其光窗上可以测到最大54612。还没有到65535。
8.jpg
同样使用的是昨天的板子。

4 c' Y, i) _" F+ o9 d
收藏 评论2 发布时间:2021-6-8 20:49

举报

2个回答
STMCU-管管 回答时间:2021-6-9 09:42:48
用的什么STM32的板子可以介绍一下- V7 ^) {3 q) @- t6 r
liuxingkeji 回答时间:2021-6-9 10:57:02
STMCU-管管 发表于 2021-6-9 09:42
9 D+ i3 [$ n, A. l2 d8 i( `1 N, @用的什么STM32的板子可以介绍一下
9 M6 m9 `  _( T
用的是自制的STM32F103VET6开发板$ {) r4 ]1 f; v, h$ I* _

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版