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

    文章

    8703

    浏览量

    147184
  • IIC接口
    +关注

    关注

    0

    文章

    23

    浏览量

    11686
  • GY-30
    +关注

    关注

    1

    文章

    8

    浏览量

    13206

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

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

收藏 人收藏

    评论

    相关推荐

    驱动器的安全使用规范 驱动器的故障诊断方法

    驱动器的安全使用规范 1. 安全操作 培训与资质 :确保所有操作人员都经过专业培训,并持有相应的操作资质。 穿戴防护装备 :在操作
    的头像 发表于 12-19 17:42 323次阅读

    30V/2A同步降压 高精度 PWM调光LED驱动

    概述: PC1803是1MHz的高效率,30V同步降压LED驱动器最大输入电压。PC1803集成主RDS极低的开关和同步开关(ON)以最小化传导损耗。最高可达2A具有出色的负载和连续输出电流线路调节
    的头像 发表于 11-29 17:39 211次阅读
    <b class='flag-5'>30</b>V/2A同步降压 高精度 PWM调光LED<b class='flag-5'>驱动</b>器

    TPS92200EVM 30V、1.5A降压LED驱动器评估模块

    电子发烧友网站提供《TPS92200EVM 30V、1.5A降压LED驱动器评估模块.pdf》资料免费下载
    发表于 11-22 14:22 0次下载
    TPS92200EVM <b class='flag-5'>30</b>V、1.5A降压LED<b class='flag-5'>驱动</b>器评估模块

    采用智能栅极驱动器的低压电机驱动操作

    电子发烧友网站提供《采用智能栅极驱动器的低压电机驱动操作.pdf》资料免费下载
    发表于 09-25 10:13 1次下载
    采用智能栅极<b class='flag-5'>驱动</b>器的低压电机<b class='flag-5'>驱动</b><b class='flag-5'>操作</b>

    关于台式电脑国产操作系统鸿蒙、统信、麒麟等操作系统光驱驱动程序一些问题!

    现在国产化替代越来越深入,很多电脑都用了的是国产操作系统 对于:DVD刻录机光驱,移动USB刻录机光驱,在WIN系统可以正常实现功能,或者联网驱动,在国产系统就无法正常使用功能 请问有没有专家和老师
    发表于 09-23 11:07

    linuxlcd驱动在哪个位置

    简介 LinuxLCD驱动是Linux操作系统中用于控制液晶显示器(LCD)的驱动程序。它负责与硬件进行通信,实现对LCD的控制和管理。LinuxLCD
    的头像 发表于 08-30 15:28 327次阅读

    multisim蜂鸣器驱动程序详解

    以下是关于Multisim蜂鸣器驱动程序的详解: 蜂鸣器简介 蜂鸣器是一种电子设备,用于发出声音信号。它广泛应用于各种电子设备中,如电话、闹钟、汽车喇叭等。蜂鸣器的工作原理是通过电磁线圈产生磁场,使
    的头像 发表于 08-09 10:18 898次阅读

    THS4511-SP能否在100Gy/h的核辐射环境下工作?

    THS4511-SP: 该器件能否在100Gy/h的核辐射环境下工作
    发表于 08-05 06:20

    什么是驱动

    什么是驱动驱动器,又称为驱动程序或驱动软件,是计算机系统中用于控制和管理硬件设备的软件。它作为操作系统与硬件设备之间的桥梁,负责将
    的头像 发表于 06-10 16:07 6667次阅读

    RA6T2的16位模数转换器操作 [12] 应用项目简介

    RA6T2的16位模数转换器操作 [12] 应用项目简介
    的头像 发表于 06-10 08:06 352次阅读
    RA6T2的16位模数转换器<b class='flag-5'>操作</b> [12] 应用项目<b class='flag-5'>简介</b>

    实现机器人操作系统——ADI Trinamic电机控制器ROS1驱动程序简介

    摘要 机器人操作系统(ROS)驱动程序基于ADI产品而开发,因此可直接在ROS生态系统中使用这些产品。本文将概述如何在应用、产品和系统(例如,自主导航、安全气泡地图和数据收 集机器人)中使用和集成
    的头像 发表于 04-24 15:43 2209次阅读
    实现机器人<b class='flag-5'>操作</b>系统——ADI Trinamic电机控制器ROS1<b class='flag-5'>驱动</b>程序<b class='flag-5'>简介</b>

    30V 7 通道低侧驱动器TPL7407LA数据表

    电子发烧友网站提供《30V 7 通道低侧驱动器TPL7407LA数据表.pdf》资料免费下载
    发表于 03-19 09:26 0次下载
    <b class='flag-5'>30</b>V 7 通道低侧<b class='flag-5'>驱动</b>器TPL7407LA数据表

    30V 7 通道低侧驱动器TPL7407LA-Q1数据表

    电子发烧友网站提供《30V 7 通道低侧驱动器TPL7407LA-Q1数据表.pdf》资料免费下载
    发表于 03-19 09:09 0次下载
    <b class='flag-5'>30</b>V 7 通道低侧<b class='flag-5'>驱动</b>器TPL7407LA-Q1数据表

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

    HA-30K 是一台非常实用的高电压讯号放大器,它具有最小的体积、最轻的重量及最简易的操作,非常高的电压输出(30kVp-p)等优点。 本机连续输出电压量最大值达到 30kVp-p,还
    的头像 发表于 03-18 14:37 354次阅读
    高压放大器HA-<b class='flag-5'>30</b>K 新品上市!

    RA6T2的16位模数转换器操作 [1] 简介,A/D转换器概述

    RA6T2的16位模数转换器操作 [1] 简介,A/D转换器概述
    的头像 发表于 03-13 08:05 352次阅读
    RA6T2的16位模数转换器<b class='flag-5'>操作</b> [1] <b class='flag-5'>简介</b>,A/D转换器概述