0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于GY-30的簡(jiǎn)介與驅(qū)動(dòng)及如何操作

9GxC_IoTMaker ? 來源:CSDN技術(shù)社區(qū) ? 作者:JYU_hsy ? 2021-05-02 14:07 ? 次閱讀

基于HAL庫的BH1750驅(qū)動(dòng)代碼,通訊方式為模擬IIC,非常適合在使用hal庫的stm開發(fā)版上移植

一、GY-30簡(jiǎn)介

GY-30是一款內(nèi)置ROHM-BH1750FLV芯片的數(shù)字光照強(qiáng)度模塊。芯片內(nèi)置16bitAD轉(zhuǎn)換器,可直接數(shù)字輸出,測(cè)量光照強(qiáng)度范圍為0-65535lx(精度可選)。除此之外,模塊內(nèi)置電平轉(zhuǎn)換,支持3-5V供電,可與5V單片機(jī)IO直接連接;對(duì)外提供IIC接口,方便使用。

1.1GY-30原理圖

947b0c4c-9bb4-11eb-8b86-12bb97331649.png

1.2模塊引腳

95069d84-9bb4-11eb-8b86-12bb97331649.png

ps:ADDR默認(rèn)接地,此時(shí)IIC地址為0x46

二、GY-30驅(qū)動(dòng)

95247ec6-9bb4-11eb-8b86-12bb97331649.png

2.1GPIO配置

由于本人使用的是hal庫,使能時(shí)鐘

__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高電平時(shí),SDA下降沿)

/***開始信號(hào)***/void BH1750_Start(){ HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET); //拉高數(shù)據(jù)線 HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高時(shí)鐘線 delay_us(5); //延時(shí) HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_RESET); //產(chǎn)生下降沿 delay_us(5); //延時(shí) HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低時(shí)鐘線}

發(fā)送設(shè)備地址,寄存器地址

95672be0-9bb4-11eb-8b86-12bb97331649.png

IIC結(jié)束(SCL高電平,SDA上升沿)

/*****停止信號(hào)******/void BH1750_Stop(){ HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_RESET); //拉低數(shù)據(jù)線 HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高時(shí)鐘線 delay_us(5); //延時(shí) HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET); //產(chǎn)生上升沿 delay_us(5); //延時(shí)}

2.3設(shè)置精度

設(shè)置精度只需向BH1750發(fā)送指令,本人采用的是H- Resolution mode(0x10)

如需設(shè)置其他精度親參考下表

95894856-9bb4-11eb-8b86-12bb97331649.png

2.4讀取光強(qiáng)數(shù)據(jù)

讀取BH1750內(nèi)部數(shù)據(jù)

//連續(xù)讀出BH1750內(nèi)部數(shù)據(jù)void mread(void){ uchar i; BH1750_Start(); //起始信號(hào) BH1750_SendByte(SlaveAddress+1); //發(fā)送設(shè)備地址+讀信號(hào)

for (i=0; i《3; i++) //連續(xù)讀取6個(gè)地址數(shù)據(jù),存儲(chǔ)中BUF { BUF[i] = BH1750_RecvByte(); //BUF[0]存儲(chǔ)0x32地址中的數(shù)據(jù) if (i == 3) { BH1750_SendACK(1); //最后一個(gè)數(shù)據(jù)需要回NOACK } else { BH1750_SendACK(0); //回應(yīng)ACK } }

BH1750_Stop(); //停止信號(hào) 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延時(shí)

//系統(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é)束信號(hào)

時(shí)序圖如下代碼見2.2初始化BH1750

95bf293a-9bb4-11eb-8b86-12bb97331649.png

3.4發(fā)送應(yīng)答信號(hào)

/**************************************發(fā)送應(yīng)答信號(hào)入口參數(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)答信號(hào) 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); //拉高時(shí)鐘線 delay_us(5); //延時(shí) HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低時(shí)鐘線 delay_us(5); //延時(shí)}

3.5接收應(yīng)答信號(hào)

/**************************************接收應(yīng)答信號(hào)**************************************/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); //拉高時(shí)鐘線 delay_us(5); //延時(shí)

if(HAL_GPIO_ReadPin( GPIOB, sda ) == 1 )//讀應(yīng)答信號(hào) mcy = 1 ; else mcy = 0 ;

HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低時(shí)鐘線 delay_us(5); //延時(shí)

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init( GPIOB, &GPIO_InitStruct );

return mcy;}

3.6 IIC發(fā)送一個(gè)字節(jié)

/**************************************向IIC總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)**************************************/void BH1750_SendByte(uchar dat){ uchar i;

for (i=0; i《8; i++) //8位計(jì)數(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); //拉高時(shí)鐘線 delay_us(5); //延時(shí) HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低時(shí)鐘線 delay_us(5); //延時(shí) } BH1750_RecvACK();}

3.7 IIC讀取一個(gè)字節(jié)

/**************************************從IIC總線讀取一個(gè)字節(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)部上拉,準(zhǔn)備讀取數(shù)據(jù), for (i=0; i《8; i++) //8位計(jì)數(shù)器 { dat 《《= 1; HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高時(shí)鐘線 delay_us(5); //延時(shí)

if( SET == HAL_GPIO_ReadPin( GPIOB, sda ) ) bit = 0X01; else bit = 0x00;

dat |= bit; //讀數(shù)據(jù)

HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低時(shí)鐘線 delay_us(5); //延時(shí) }

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init( GPIOB, &GPIO_InitStruct ); return dat;}

四、測(cè)試結(jié)果與光照強(qiáng)度參考

測(cè)試結(jié)果

光照強(qiáng)度參考值

編輯:lyn

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 轉(zhuǎn)換器
    +關(guān)注

    關(guān)注

    27

    文章

    8578

    瀏覽量

    146558
  • IIC接口
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    11649
  • GY-30
    +關(guān)注

    關(guān)注

    1

    文章

    8

    瀏覽量

    13184

原文標(biāo)題:智能花盆2.0驅(qū)動(dòng):基于STM32_HAL庫GY-30(BH1750FLV)驅(qū)動(dòng)

文章出處:【微信號(hào):IoTMaker,微信公眾號(hào):機(jī)智云開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    采用智能柵極驅(qū)動(dòng)器的低壓電機(jī)驅(qū)動(dòng)操作

    電子發(fā)燒友網(wǎng)站提供《采用智能柵極驅(qū)動(dòng)器的低壓電機(jī)驅(qū)動(dòng)操作.pdf》資料免費(fèi)下載
    發(fā)表于 09-25 10:13 ?0次下載
    采用智能柵極<b class='flag-5'>驅(qū)動(dòng)</b>器的低壓電機(jī)<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>操作</b>

    關(guān)于臺(tái)式電腦國產(chǎn)操作系統(tǒng)鴻蒙、統(tǒng)信、麒麟等操作系統(tǒng)光驅(qū)驅(qū)動(dòng)程序一些問題!

    現(xiàn)在國產(chǎn)化替代越來越深入,很多電腦都用了的是國產(chǎn)操作系統(tǒng) 對(duì)于:DVD刻錄機(jī)光驅(qū),移動(dòng)USB刻錄機(jī)光驅(qū),在WIN系統(tǒng)可以正常實(shí)現(xiàn)功能,或者聯(lián)網(wǎng)驅(qū)動(dòng),在國產(chǎn)系統(tǒng)就無法正常使用功能 請(qǐng)問有沒有專家和老師
    發(fā)表于 09-23 11:07

    linuxlcd驅(qū)動(dòng)在哪個(gè)位置

    簡(jiǎn)介 LinuxLCD驅(qū)動(dòng)是Linux操作系統(tǒng)中用于控制液晶顯示器(LCD)的驅(qū)動(dòng)程序。它負(fù)責(zé)與硬件進(jìn)行通信,實(shí)現(xiàn)對(duì)LCD的控制和管理。LinuxLCD
    的頭像 發(fā)表于 08-30 15:28 ?188次閱讀

    multisim蜂鳴器驅(qū)動(dòng)程序詳解

    以下是關(guān)于Multisim蜂鳴器驅(qū)動(dòng)程序的詳解: 蜂鳴器簡(jiǎn)介 蜂鳴器是一種電子設(shè)備,用于發(fā)出聲音信號(hào)。它廣泛應(yīng)用于各種電子設(shè)備中,如電話、鬧鐘、汽車?yán)鹊?。蜂鳴器的工作原理是通過電磁線圈產(chǎn)生磁場(chǎng),使
    的頭像 發(fā)表于 08-09 10:18 ?344次閱讀

    THS4511-SP能否在100Gy/h的核輻射環(huán)境下工作?

    THS4511-SP: 該器件能否在100Gy/h的核輻射環(huán)境下工作
    發(fā)表于 08-05 06:20

    RA6T2的16位模數(shù)轉(zhuǎn)換器操作 [12] 應(yīng)用項(xiàng)目簡(jiǎn)介

    RA6T2的16位模數(shù)轉(zhuǎn)換器操作 [12] 應(yīng)用項(xiàng)目簡(jiǎn)介
    的頭像 發(fā)表于 06-10 08:06 ?284次閱讀
    RA6T2的16位模數(shù)轉(zhuǎn)換器<b class='flag-5'>操作</b> [12] 應(yīng)用項(xiàng)目<b class='flag-5'>簡(jiǎn)介</b>

    實(shí)現(xiàn)機(jī)器人操作系統(tǒng)——ADI Trinamic電機(jī)控制器ROS1驅(qū)動(dòng)程序簡(jiǎn)介

    摘要 機(jī)器人操作系統(tǒng)(ROS)驅(qū)動(dòng)程序基于ADI產(chǎn)品而開發(fā),因此可直接在ROS生態(tài)系統(tǒng)中使用這些產(chǎn)品。本文將概述如何在應(yīng)用、產(chǎn)品和系統(tǒng)(例如,自主導(dǎo)航、安全氣泡地圖和數(shù)據(jù)收 集機(jī)器人)中使用和集成
    的頭像 發(fā)表于 04-24 15:43 ?2077次閱讀
    實(shí)現(xiàn)機(jī)器人<b class='flag-5'>操作</b>系統(tǒng)——ADI Trinamic電機(jī)控制器ROS1<b class='flag-5'>驅(qū)動(dòng)</b>程序<b class='flag-5'>簡(jiǎn)介</b>

    30V 7 通道低側(cè)驅(qū)動(dòng)器TPL7407LA數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《30V 7 通道低側(cè)驅(qū)動(dòng)器TPL7407LA數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 03-19 09:26 ?0次下載
    <b class='flag-5'>30</b>V 7 通道低側(cè)<b class='flag-5'>驅(qū)動(dòng)</b>器TPL7407LA數(shù)據(jù)表

    高壓放大器HA-30K 新品上市!

    HA-30K 是一臺(tái)非常實(shí)用的高電壓訊號(hào)放大器,它具有最小的體積、最輕的重量及最簡(jiǎn)易的操作,非常高的電壓輸出(30kVp-p)等優(yōu)點(diǎn)。 本機(jī)連續(xù)輸出電壓量最大值達(dá)到 30kVp-p,還
    的頭像 發(fā)表于 03-18 14:37 ?287次閱讀
    高壓放大器HA-<b class='flag-5'>30</b>K 新品上市!

    RA6T2的16位模數(shù)轉(zhuǎn)換器操作 [1] 簡(jiǎn)介,A/D轉(zhuǎn)換器概述

    RA6T2的16位模數(shù)轉(zhuǎn)換器操作 [1] 簡(jiǎn)介,A/D轉(zhuǎn)換器概述
    的頭像 發(fā)表于 03-13 08:05 ?255次閱讀
    RA6T2的16位模數(shù)轉(zhuǎn)換器<b class='flag-5'>操作</b> [1] <b class='flag-5'>簡(jiǎn)介</b>,A/D轉(zhuǎn)換器概述

    關(guān)于MOSFET的DG極驅(qū)動(dòng)

    目前想設(shè)計(jì)一個(gè)關(guān)于MOSFET的DG極驅(qū)動(dòng)方案,存在問題為MOSFET可以正常開通,但無法關(guān)斷,帶負(fù)載時(shí)GS極始終存在4V電壓無法關(guān)斷MOSFET 。 電路圖如下: 空載時(shí),GS極兩端電壓: 是可以
    發(fā)表于 12-17 11:22

    求助,關(guān)于AD5933起始頻率碼和頻率增量碼的問題

    我看了一下AD5933的數(shù)據(jù)手冊(cè),下面關(guān)于30KHz的起始頻率碼的解釋是這樣的 然而我查了一下驅(qū)動(dòng)代碼,發(fā)現(xiàn)對(duì)應(yīng)的30KHz起始頻率碼和數(shù)據(jù)手冊(cè)里的不一樣。
    發(fā)表于 12-13 06:25

    基于STM32CUBEMX驅(qū)動(dòng)低壓步進(jìn)器電機(jī)驅(qū)動(dòng)器STSPIN220(2)----驅(qū)動(dòng)STSPIN220

    本文檔的目標(biāo)是提供關(guān)于使用STM32CubeMX驅(qū)動(dòng)低壓步進(jìn)電機(jī)驅(qū)動(dòng)器STSPIN220的詳盡信息和操作指南。通過本文檔,將深入了解如何利用STM32CubeMX來配置電機(jī)
    的頭像 發(fā)表于 12-01 15:25 ?861次閱讀
    基于STM32CUBEMX<b class='flag-5'>驅(qū)動(dòng)</b>低壓步進(jìn)器電機(jī)<b class='flag-5'>驅(qū)動(dòng)</b>器STSPIN220(2)----<b class='flag-5'>驅(qū)動(dòng)</b>STSPIN220

    體驗(yàn)紫光PCIE之使用官方驅(qū)動(dòng)在Windows下進(jìn)行DMA讀寫操作/PIO讀寫操作

    紫光官方其實(shí)主推的是在linux系統(tǒng)下開發(fā)驅(qū)動(dòng)和上層軟件,相應(yīng)官方提供了在linux一個(gè)基于GTK+2.0的PCIE測(cè)試平臺(tái),該平臺(tái)能夠很好去操作官方生成的例程。需要特別注意的是,該linux系統(tǒng)
    發(fā)表于 11-17 14:55

    有無操作系統(tǒng)的嵌入式Linux驅(qū)動(dòng)設(shè)備有何區(qū)別?

    有無操作系統(tǒng)的嵌入式Linux驅(qū)動(dòng)設(shè)備有何區(qū)別? 嵌入式系統(tǒng)是指集成電子設(shè)備上的計(jì)算機(jī)系統(tǒng),通常用于控制、監(jiān)測(cè)、操作或處理某些物理或機(jī)械過程。在嵌入式系統(tǒng)中,涉及到設(shè)備驅(qū)動(dòng)程序的開發(fā),
    的頭像 發(fā)表于 10-29 17:29 ?656次閱讀