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

    文章

    9452

    浏览量

    157042
  • IIC接口
    +关注

    关注

    0

    文章

    23

    浏览量

    12088
  • GY-30
    +关注

    关注

    1

    文章

    8

    浏览量

    13527

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    探索MM74C908:双CMOS 30伏继电器驱动器的特性与应用

    探索MM74C908:双CMOS 30伏继电器驱动器的特性与应用 在电子设计领域,选择合适的驱动器对于电路的性能和稳定性至关重要。今天,我们来深入了解一下Fairchild公司的MM74C908双
    的头像 发表于 04-11 11:40 273次阅读

    云台驱动板拆卸与元器件防护操作规范

    艾毕胜云台马达驱动板作为姿态控制核心部件,集成了精密传感器、功率器件、高速芯片等敏感元器件,其拆卸过程需兼顾结构完整性与元器件安全性。不规范操作易导致静电击穿、焊盘脱落、器件损坏、排线撕裂等不可
    的头像 发表于 03-16 15:53 265次阅读

    关于NCP81155 MOSFET驱动器的设计解读

    关于NCP81155 MOSFET驱动器的设计解读 在电子工程领域,MOSFET驱动器是电源管理电路中的关键组件,它对于高效、稳定地驱动MOSFET起着至关重要的作用。今天我们来深入了
    的头像 发表于 02-09 16:20 348次阅读

    SiLM5350HBBCA-DG 30V, 10A单通道隔离栅极驱动

    SiLM5350HBBCA-DG是具体有10A峰值输出电流能力,单通道隔离式栅极驱动器。驱动电源电压为4V至30V。3V至18V的宽输入VDDI范围使驱动器适合与模拟和数字控制器接口。
    发表于 02-03 09:00

    【瑞萨RA6E2地奇星开发板试用】SHT30传感器串口调试学习和验证

    驱动 SHT30传感器 的项目,采集环境温湿度信息,同时会介绍串口调试内容。 1. SHT30温湿度传感器简介 1.1 SHT30实物展示
    发表于 12-11 14:49

    SiLM27531HAC-AQ 30V, 5A/5A单通道高欠压保护阈值的高速低边门极驱动

    在开关电源系统中,门极驱动器是高效驱动功率器件、实现快速开关操作的关键组件,它能有效降低开关功率损耗,从而显著提高系统效率。对于GaN等先进的宽带隙功率器件技术而言,系统对驱动器的性能
    发表于 11-04 08:48

    STMicroelectronics CAM-66GY相机模块技术解析与应用指南

    STMicroelectronics CAM-66GY RGB专业模块是用于无缝评估和集成VD66GY 150万像素彩色图像传感器的样本摄像头模块。该款即用型视觉扩展器件采用低至6.5mm2的微型
    的头像 发表于 10-20 09:51 1541次阅读
    STMicroelectronics CAM-66<b class='flag-5'>GY</b>相机模块技术解析与应用指南

    SiLM8260ABCS-AQ双通道隔离驱动30V/10A 带米勒钳位的双输入半桥驱动

    功率管在桥式拓扑中因米勒电容效应导致的误导通,提升系统可靠性,尤其在半桥应用中至关重要。 宽电压与保护: 输出侧驱动器电源电压 (VDDA/B) 范围宽达 最高30V,适应多种功率器件需求。 输入侧
    发表于 08-11 08:46

    数字光模块 GY-30说明书

    电子发烧友网站提供《数字光模块 GY-30说明书.pdf》资料免费下载
    发表于 08-09 16:07 5次下载

    在Psoc4100S Datasheet中关于flash操作有几个问题求解

    你好! 在Psoc4100S Datasheet 中 关于flash操作有几个问题:1. Tbulkerase时间是全片擦除的时间么?2.Tdevprog 的7秒,是如何计算的? 3. 64KB产品,最快的烧写速度是否有限制?手册上只写出了最大时间。
    发表于 07-29 12:22

    基于意法半导体STM32N6和VD66GY的机器视觉方案

    基于STM32N6主控平台和ST VD66GY图像传感器的创新方案,提供高效人体姿态监控解决方案。STM32N6搭载强大的Arm Cortex-M55处理器和嵌入式神经单元,结合VD66GY传感器的高灵敏度图像采集能力,可实现复杂的图像识别与处理任务,如姿态估计、行为分析
    的头像 发表于 07-03 11:01 5065次阅读
    基于意法半导体STM32N6和VD66<b class='flag-5'>GY</b>的机器视觉方案

    迅为RK3568驱动指南GPIO子系统 GPIO操作函数实验

    迅为电子RK3568开发板驱动指南GPIO子系统 GPIO操作函数实验
    的头像 发表于 05-28 15:24 1565次阅读
    迅为RK3568<b class='flag-5'>驱动</b>指南GPIO子系统 GPIO<b class='flag-5'>操作</b>函数实验

    【直播预告】《实时操作系统应用技术—基于RT-Thread与ARM的编程实践》教学脉络及资源简介

    直播预告直播主题:《实时操作系统应用技术—基于RT-Thread与ARM的编程实践》教学脉络及资源简介开放时间:2025年5月29日(周四)20:00主讲老师:王宜怀课程类型:视频直播观看平台
    的头像 发表于 05-26 17:50 1427次阅读
    【直播预告】《实时<b class='flag-5'>操作</b>系统应用技术—基于RT-Thread与ARM的编程实践》教学脉络及资源<b class='flag-5'>简介</b>

    迅为RK3568开发板驱动指南GPIO子系统三级节点操作函数实验

    迅为RK3568开发板驱动指南GPIO子系统三级节点操作函数实验
    的头像 发表于 05-26 15:39 1706次阅读
    迅为RK3568开发板<b class='flag-5'>驱动</b>指南GPIO子系统三级节点<b class='flag-5'>操作</b>函数实验

    使用 dsPIC30F 实现 BLDC 电机的正弦电压驱动

    简介 在 BLDC 电机应用中,由于存在噪音和转矩脉动问题,使用三相正弦波电压代替六拍电压是一种理想的控制方法。本文档介绍的应用软件利用 dsPIC30F 数字信号控制器高效且可靠地实现了 BLDC
    发表于 05-14 15:56