0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于GY-30的简介与驱动及如何操作

9GxC_IoTMaker 来源:CSDN技术社区 作者:JYU_hsy 2021-05-02 14:07 次阅读

基于HAL库的BH1750驱动代码,通讯方式为模拟IIC,非常适合在使用hal库的stm开发版上移植

一、GY-30简介

GY-30是一款内置ROHM-BH1750FLV芯片的数字光照强度模块。芯片内置16bitAD转换器,可直接数字输出,测量光照强度范围为0-65535lx(精度可选)。除此之外,模块内置电平转换,支持3-5V供电,可与5V单片机IO直接连接;对外提供IIC接口,方便使用。

1.1GY-30原理图

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

1.2模块引脚

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

ps:ADDR默认接地,此时IIC地址为0x46

二、GY-30驱动

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

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); //拉高数据线 HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高时钟线 delay_us(5); //延时 HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_RESET); //产生下降沿 delay_us(5); //延时 HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_RESET); //拉低时钟线}

发送设备地址,寄存器地址

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

IIC结束(SCL高电平,SDA上升沿)

/*****停止信号******/void BH1750_Stop(){ HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_RESET); //拉低数据线 HAL_GPIO_WritePin(GPIOB, scl,GPIO_PIN_SET); //拉高时钟线 delay_us(5); //延时 HAL_GPIO_WritePin(GPIOB, sda,GPIO_PIN_SET); //产生上升沿 delay_us(5); //延时}

2.3设置精度

设置精度只需向BH1750发送指令,本人采用的是H- Resolution mode(0x10)

如需设置其他精度亲参考下表

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

2.4读取光强数据

读取BH1750内部数据

//连续读出BH1750内部数据void mread(void){ uchar i; BH1750_Start(); //起始信号 BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号

for (i=0; i《3; i++) //连续读取6个地址数据,存储中BUF { BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据 if (i == 3) { BH1750_SendACK(1); //最后一个数据需要回NOACK } else { BH1750_SendACK(0); //回应ACK } }

BH1750_Stop(); //停止信号 Delay_mms(5);}

合成数据

dis_data=BUF[0];dis_data=(dis_data《《8)+BUF[1]; //合成数据

Value_GY_30=(float)dis_data/1.2;

三、元操作

3.1延时

//系统主频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开始/结束信号

时序图如下代码见2.2初始化BH1750

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

3.4发送应答信号

/**************************************发送应答信号入口参数: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) //写应答信号 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接收应答信号

/**************************************接收应答信号**************************************/int BH1750_RecvACK(){ GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT; /*这里一定要设成输入上拉,否则不能读出数据*/ 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 )//读应答信号 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发送一个字节

/**************************************向IIC总线发送一个字节数据**************************************/void BH1750_SendByte(uchar dat){ uchar i;

for (i=0; i《8; i++) //8位计数器 { 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读取一个字节

/**************************************从IIC总线读取一个字节数据**************************************/uchar BH1750_RecvByte(){ uchar i; uchar dat = 0; uchar bit;

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT; /*这里一定要设成输入上拉,否则不能读出数据*/ 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); //使能内部上拉,准备读取数据, for (i=0; i《8; i++) //8位计数器 { 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; //读数据

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;}

四、测试结果与光照强度参考

测试结果

光照强度参考值

编辑:lyn

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 转换器
    +关注

    关注

    27

    文章

    8172

    浏览量

    141586
  • IIC接口
    +关注

    关注

    0

    文章

    23

    浏览量

    11575
  • GY-30
    +关注

    关注

    1

    文章

    8

    浏览量

    13141

原文标题:智能花盆2.0驱动:基于STM32_HAL库GY-30(BH1750FLV)驱动

文章出处:【微信号:IoTMaker,微信公众号:机智云开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于STM32CUBEMX驱动低压步进器电机驱动器STSPIN220(2)----驱动STSPIN220

    本文档的目标是提供关于使用STM32CubeMX驱动低压步进电机驱动器STSPIN220的详尽信息和操作指南。通过本文档,将深入了解如何利用STM32CubeMX来配置电机
    的头像 发表于 12-01 15:25 443次阅读
    基于STM32CUBEMX<b class='flag-5'>驱动</b>低压步进器电机<b class='flag-5'>驱动</b>器STSPIN220(2)----<b class='flag-5'>驱动</b>STSPIN220

    GY-30数字光模块中文说明

     特点 1)I2C 总线接口(f / s 模式支持)   2)光谱的范围是人眼相近   3)照度数字转换器   4)宽范围和高分解。 (1 - 65535 勒克斯)
    发表于 10-20 16:14 2次下载
    <b class='flag-5'>GY-30</b>数字光模块中文说明

    CJMCU-115或者GY-33传感器的效果如何,是否没有色差?

    CJMCU-115或者GY-33传感器的效果如何,是否没有色差?
    发表于 10-17 06:01

    led恒流驱动电源更换怎么操作

    led恒流驱动电源更换怎么操作? LED恒流驱动电源是一种特殊的电源设备,常用于LED灯的控制,确保LED灯的稳定工作和长寿命。然而,随着时间的推移,可能会出现电源故障,这时候需要更换LED恒流
    的头像 发表于 09-05 09:19 3645次阅读

    Fabric操作系统9.0简介

    电子发烧友网站提供《Fabric操作系统9.0简介.pdf》资料免费下载
    发表于 09-01 10:45 0次下载
    Fabric<b class='flag-5'>操作</b>系统9.0<b class='flag-5'>简介</b>

    RK3588能够驱动分辨率12K30hz的黑白屏吗?或者RK3399能够驱动分辨率8K30HZ的黑白屏吗?

    设置为8K,并将刷新率设置为30Hz。需要编辑配置文件、使用图形界面或通过命令行进行设置。 软件支持:需要使用的操作系统和驱动程序版本支持8K分辨率和30Hz刷新率 吗? 如何测试:假
    发表于 08-09 19:24

    Ubuntu VSCODE+GCC】CW32L031驱动sht30

    CW32L031在ubuntu下面,使用VSCODE+gcc实现对sht30温湿计的驱动
    的头像 发表于 06-28 17:12 2.3w次阅读
    Ubuntu VSCODE+GCC】CW32L031<b class='flag-5'>驱动</b>sht<b class='flag-5'>30</b>

    CW32L083实现SHT30驱动

    CW32L083驱动SHT30,并显示到LCD屏上。
    的头像 发表于 06-22 09:57 2377次阅读
    CW32L083实现SHT<b class='flag-5'>30</b><b class='flag-5'>驱动</b>

    使用GY-30光照传感器模块来控制OLED显示屏的背光亮度

    像手机、平板之类的电子设备,屏幕亮度都能随环境光强度自动调节,其内部使用的是小体积的数字光照传感器。
    发表于 06-14 11:31 1183次阅读
    使用<b class='flag-5'>GY-30</b>光照传感器模块来控制OLED显示屏的背光亮度

    介绍板载BH1750数字光传感器专用IC—GY-30模块的使用

    光敏电阻是常用的光感元件,但是其感应范围比较窄,响应速度慢,且受外界干扰较大。要接收强光时,需要更加精准的数字光照传感器。本篇介绍GY-30模块的使用,其板载BH1750数字光传感器专用IC。
    发表于 06-14 11:27 1320次阅读
    介绍板载BH1750数字光传感器专用IC—<b class='flag-5'>GY-30</b>模块的使用

    如何从GY-271读取的数据通过互联网发送到我的云服务器?

    我正在尝试让我的 ESP-01 板与基于 QMC5883L 的 GY-271 板“对话”。我正在尝试使用 I2C 通信,但一点运气都没有。我的想法是,我从 GY-271 读取的数据通过互联网发送到我的云服务器。 有没有人有过这种概念、设备或他/她愿意分享的任何东西的经验。
    发表于 06-07 06:01

    数明半导体新推双通道30V, 5A/5A的高速低边门极驱动

    上海数明半导体有限公司最新推出的双通道 30V, 5A/5A 的高速低边门极驱动器 SiLM27624 系列,支持高达 30V 的输入电源供电,满足更高的驱动电压输出。
    发表于 05-17 11:18 453次阅读
    数明半导体新推双通道<b class='flag-5'>30</b>V, 5A/5A的高速低边门极<b class='flag-5'>驱动</b>器

    关于无刷电机驱动器的布板建议(FOC)

      本文主要是总结“TI的驱动器布板最佳方法”,列举出一些重点并且提出自己的一些见解,废话不多说,下面开始。 1.散热问题   首先关于散热问题,推荐采用打散热过孔,一般在焊盘上打若干个阵列的过孔
    发表于 05-16 15:16 0次下载
    <b class='flag-5'>关于</b>无刷电机<b class='flag-5'>驱动</b>器的布板建议(FOC)

    电机和驱动简介

    电机和驱动简介一般性区别:有刷电机一般只需两根接线端子就可以驱动,而无刷电机需要三根接线端子进行驱动
    发表于 05-16 14:54 32次下载
    电机和<b class='flag-5'>驱动</b>器<b class='flag-5'>简介</b>

    CH32V103基础教程95-PWM驱动蜂鸣器

    本章教程主要在第九十三章的基础上运行,用以驱动蜂鸣器播放音乐。 1、TIM简介及相关函数介绍关于TIM,在前面章节已经进行过介绍,在此不再赘述。关于PWM
    发表于 05-11 16:15