基于HAL庫的BH1750驅(qū)動代碼,通訊方式為模擬IIC,非常適合在使用hal庫的stm開發(fā)版上移植
一、GY-30簡介
GY-30是一款內(nèi)置ROHM-BH1750FLV芯片的數(shù)字光照強度模塊。芯片內(nèi)置16bitAD轉(zhuǎn)換器,可直接數(shù)字輸出,測量光照強度范圍為0-65535lx(精度可選)。除此之外,模塊內(nèi)置電平轉(zhuǎn)換,支持3-5V供電,可與5V單片機IO直接連接;對外提供IIC接口,方便使用。
1.1GY-30原理圖
1.2模塊引腳
ps:ADDR默認接地,此時IIC地址為0x46
二、GY-30驅(qū)動
2.1GPIO配置
由于本人使用的是hal庫,使能時鐘
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO配置
/*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET);
/*Configure GPIO pins : PB0 PB1 */ GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
PB0 -- 模擬SDA
PB1 -- 模擬SCL
2.2初始化BH1750
IIC起始(SCL高電平時,SDA下降沿)
/***開始信號***/void BH1750_Start(){ HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET); //拉高數(shù)據(jù)線 HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高時鐘線 delay_us(5); //延時 HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_RESET); //產(chǎn)生下降沿 delay_us(5); //延時 HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低時鐘線}
發(fā)送設(shè)備地址,寄存器地址
IIC結(jié)束(SCL高電平,SDA上升沿)
/*****停止信號******/void BH1750_Stop(){ HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_RESET); //拉低數(shù)據(jù)線 HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高時鐘線 delay_us(5); //延時 HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET); //產(chǎn)生上升沿 delay_us(5); //延時}
2.3設(shè)置精度
設(shè)置精度只需向BH1750發(fā)送指令,本人采用的是H- Resolution mode(0x10)
如需設(shè)置其他精度親參考下表
2.4讀取光強數(shù)據(jù)
讀取BH1750內(nèi)部數(shù)據(jù)
//連續(xù)讀出BH1750內(nèi)部數(shù)據(jù)void mread(void){ uchar i; BH1750_Start(); //起始信號 BH1750_SendByte(SlaveAddress+1); //發(fā)送設(shè)備地址+讀信號
for (i=0; i《3; i++) //連續(xù)讀取6個地址數(shù)據(jù),存儲中BUF { BUF[i] = BH1750_RecvByte(); //BUF[0]存儲0x32地址中的數(shù)據(jù) if (i == 3) { BH1750_SendACK(1); //最后一個數(shù)據(jù)需要回NOACK } else { BH1750_SendACK(0); //回應(yīng)ACK } }
BH1750_Stop(); //停止信號 Delay_mms(5);}
合成數(shù)據(jù)
dis_data=BUF[0];dis_data=(dis_data《《8)+BUF[1]; //合成數(shù)據(jù)
Value_GY_30=(float)dis_data/1.2;
三、元操作
3.1延時
//系統(tǒng)主頻72MHZvoid delay_us(uint16_t us){ while(us--) { __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop(); __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop(); __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop(); __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop(); __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop(); __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop(); __nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop(); __nop();__nop(); }}
void Delay_mms(uint16_t tmp){ uint16_t i=0; while(tmp--) { i=12000; while(i--); }}
3.2IIC開始/結(jié)束信號
時序圖如下代碼見2.2初始化BH1750
3.4發(fā)送應(yīng)答信號
/**************************************發(fā)送應(yīng)答信號入口參數(shù):ack (0:ACK 1:NAK)**************************************/void BH1750_SendACK(int ack){ GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
if(ack == 1) //寫應(yīng)答信號 HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET); else if(ack == 0) HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_RESET); else return;
HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高時鐘線 delay_us(5); //延時 HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低時鐘線 delay_us(5); //延時}
3.5接收應(yīng)答信號
/**************************************接收應(yīng)答信號**************************************/int BH1750_RecvACK(){ GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; /*這里一定要設(shè)成輸入上拉,否則不能讀出數(shù)據(jù)*/ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Pin = sda; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高時鐘線 delay_us(5); //延時
if(HAL_GPIO_ReadPin( GPIOB, sda ) == 1 )//讀應(yīng)答信號 mcy = 1 ; else mcy = 0 ;
HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低時鐘線 delay_us(5); //延時
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init( GPIOB, &GPIO_InitStruct );
return mcy;}
3.6 IIC發(fā)送一個字節(jié)
/**************************************向IIC總線發(fā)送一個字節(jié)數(shù)據(jù)**************************************/void BH1750_SendByte(uchar dat){ uchar i;
for (i=0; i《8; i++) //8位計數(shù)器 { if( 0X80 & dat ) HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET); else HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_RESET);
dat 《《= 1; HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高時鐘線 delay_us(5); //延時 HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低時鐘線 delay_us(5); //延時 } BH1750_RecvACK();}
3.7 IIC讀取一個字節(jié)
/**************************************從IIC總線讀取一個字節(jié)數(shù)據(jù)**************************************/uchar BH1750_RecvByte(){ uchar i; uchar dat = 0; uchar bit;
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; /*這里一定要設(shè)成輸入上拉,否則不能讀出數(shù)據(jù)*/ GPIO_InitStruct.Pin = sda; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init( GPIOB, &GPIO_InitStruct );
HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET); //使能內(nèi)部上拉,準備讀取數(shù)據(jù), for (i=0; i《8; i++) //8位計數(shù)器 { dat 《《= 1; HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高時鐘線 delay_us(5); //延時
if( SET == HAL_GPIO_ReadPin( GPIOB, sda ) ) bit = 0X01; else bit = 0x00;
dat |= bit; //讀數(shù)據(jù)
HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低時鐘線 delay_us(5); //延時 }
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init( GPIOB, &GPIO_InitStruct ); return dat;}
四、測試結(jié)果與光照強度參考
測試結(jié)果
光照強度參考值
編輯:lyn
-
轉(zhuǎn)換器
+關(guān)注
關(guān)注
27文章
8745瀏覽量
148055 -
IIC接口
+關(guān)注
關(guān)注
0文章
23瀏覽量
11735 -
GY-30
+關(guān)注
關(guān)注
1文章
8瀏覽量
13223
原文標題:智能花盆2.0驅(qū)動:基于STM32_HAL庫GY-30(BH1750FLV)驅(qū)動
文章出處:【微信號:IoTMaker,微信公眾號:機智云開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
GY/T 318-2018 地面數(shù)字電視廣播單頻網(wǎng)系統(tǒng)實施指南
30V/2A同步降壓 高精度 PWM調(diào)光LED驅(qū)動器
![<b class='flag-5'>30</b>V/2A同步降壓 高精度 PWM調(diào)光LED<b class='flag-5'>驅(qū)動</b>器](https://file1.elecfans.com/web3/M00/00/7D/wKgZO2dJi1WASLb2AAFINU0OPdc053.png)
TPS92200EVM 30V、1.5A降壓LED驅(qū)動器評估模塊
![TPS92200EVM <b class='flag-5'>30</b>V、1.5A降壓LED<b class='flag-5'>驅(qū)動</b>器評估模塊](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
采用智能柵極驅(qū)動器的低壓電機驅(qū)動操作
![采用智能柵極<b class='flag-5'>驅(qū)動</b>器的低壓電機<b class='flag-5'>驅(qū)動</b><b class='flag-5'>操作</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
關(guān)于臺式電腦國產(chǎn)操作系統(tǒng)鴻蒙、統(tǒng)信、麒麟等操作系統(tǒng)光驅(qū)驅(qū)動程序一些問題!
linuxlcd驅(qū)動在哪個位置
multisim蜂鳴器驅(qū)動程序詳解
實現(xiàn)機器人操作系統(tǒng)——ADI Trinamic電機控制器ROS1驅(qū)動程序簡介
30V 7 通道低側(cè)驅(qū)動器TPL7407LA數(shù)據(jù)表
![<b class='flag-5'>30</b>V 7 通道低側(cè)<b class='flag-5'>驅(qū)動</b>器TPL7407LA數(shù)據(jù)表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
30V 7 通道低側(cè)驅(qū)動器TPL7407LA-Q1數(shù)據(jù)表
![<b class='flag-5'>30</b>V 7 通道低側(cè)<b class='flag-5'>驅(qū)動</b>器TPL7407LA-Q1數(shù)據(jù)表](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
高壓放大器HA-30K 新品上市!
![高壓放大器HA-<b class='flag-5'>30</b>K 新品上市!](https://file1.elecfans.com/web2/M00/C5/AE/wKgaomX34QCAAALEAAHVfuy98nM598.png)
RA6T2的16位模數(shù)轉(zhuǎn)換器操作 [1] 簡介,A/D轉(zhuǎn)換器概述
![RA6T2的16位模數(shù)轉(zhuǎn)換器<b class='flag-5'>操作</b> [1] <b class='flag-5'>簡介</b>,A/D轉(zhuǎn)換器概述](https://file1.elecfans.com/web2/M00/BB/1B/wKgZomWXtb6ACk_NAAARMuEl9ZA261.png)
評論