【STM32-库函数】光照强度传感器BH1750 GY-30
下载地址:BH1750光照强度库文件下载
BH1750光照强度传感器(GY-30)
谢谢观看,有问题需要请教的,请加入STM32学习交流群(QQ群号:470804974),本人QQ号2974278195有问题可添加看到必回,免费领取更多STM32库函数代码,迅速排除疑难杂症
头文件
#ifndef _BH1750_H_
#define _BH1750_H_/************************************
* 连接 VCC-->3.3V GND-->GND
* ADDR----->GND
* SCL ----->pb6
* sda ----->pb5
*************************************///IO方向设置
#include "bsp_SysTick.h"
#include "timer.h"
#include "./usart/bsp_usart.h"
#define BH1750_SDA_IN() {GPIOB->CRL&=0XFF0FFFFF;GPIOB->CRL|=(u32)8<<20;}
#define BH1750_SDA_OUT() {GPIOB->CRL&=0XFF0FFFFF;GPIOB->CRL|=(u32)3<<20;}//IO操作函数
#define BH1750_IIC_SCL PBout(6) //SCL
#define BH1750_IIC_SDA PBout(5) //SDA
#define BH1750_READ_SDA PBin(5) //输入SDA #define BH1750_SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改//ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8extern float lux;void bh1750_iic_init(void);
void bh1750_iic_start(void);
void bh1750_iic_stop(void);
void bh1750_send_ack(char ack);
char bh1750_recv_ack(void);
void bh1750_send_byte(char dat);
char bh1750_recv_byte(unsigned char ack);void bh1750_iic_init(void);
void Single_Write_bh1750(unsigned char Reg_Address);
void bh1750_Init(void);
void bh1750_ReadOneTime(void);
void bh1750_ReadContinuous1(void);
u8 getValue(void);#endif
源文件
#include "bh1750.h"u8 BUF[8];
u16 temp2=0;
float lux=0;void bh1750_iic_init(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_5|GPIO_Pin_6); //PB6,PB7 输出高}/****向BH1750单次写命令****/
void Single_Write_bh1750(unsigned char Reg_Address)
{bh1750_iic_start();bh1750_send_byte(0x46); //发送器件地址0100 0110 最后一位0,表示写//IIC_Wait_Ack();bh1750_send_byte(Reg_Address); //IIC_Wait_Ack();bh1750_iic_stop();
}/****BH1750初始化****/
void bh1750_Init(void)
{TIM3_PWM_Init(899,0);bh1750_iic_init();TIM_SetCompare3(TIM3,0);
}//光照强度数据接收和处理
u8 getValue(void)
{unsigned char value=0;Single_Write_bh1750(0x01);Single_Write_bh1750(0x10);Delay_ms(200);bh1750_ReadContinuous1();temp2=BUF[0];temp2=(temp2<<8)+BUF[1];lux=(float)temp2/1.2; //lux是float型 if((lux>0)&&(lux<50))value=10;else if(lux<75)value=20;else if(lux<100)value=40;else if(lux<125)value=50;else if(lux<150)value=60;else if(lux<175)value=70;else if(lux<200)value=80;else if(lux<250)value=90;else if(lux<280)value=110;else if(lux<300)value=120;else if(lux<320)value=130;else if(lux<340)value=140;else if(lux<360)value=150;else if(lux<380)value=160;else if(lux<400)value=170;else if(lux<410)value=180;else if(lux<450)value=190; else if(lux<800)value=240;//printf("光照强度:%f value:%d\r\n",lux,value);TIM_SetCompare3(TIM3,value);return value;//Delay_ms(1000);
}
/****从BH1750单次读Lux****/
/****
模式选择:H-Resolution Mode,分辨率1lux
单次读Opecode:0010 0000 ,即0x20
器件地址:0100011,ADDR接GND
****/
void bh1750_ReadOneTime(void)
{bh1750_iic_start();bh1750_send_byte(0x46); //发送器件地址0100 0110 最后一位0,表示写bh1750_recv_ack();bh1750_send_byte(0x20); //发送One time H-Resolution Mode的Opecode 0010 0000,分辨率为1luxbh1750_recv_ack();bh1750_iic_stop();Delay_ms(200);bh1750_iic_start();bh1750_send_byte(0x47); //bh1750_recv_ack();BUF[0]=bh1750_recv_byte(1);//IIC_Ack(); //主机应答//temp1=temp<<8;BUF[1]=bh1750_recv_byte(0);//IIC_NAck(); //主机不应答 bh1750_iic_stop();// temp2=BUF[0];
// temp2=(temp2<<8)+BUF[1];
// lux=(float)temp2/1.2; //lux是float型//return lux;//Delay_ms(200);
}/****从BH1750连续读Lux****/
/****
模式选择:H-Resolution Mode,分辨率1lux
连续读Opecode:0001 0000
器件地址:0100011,ADDR接GND
****/
void bh1750_ReadContinuous1(void)
{
// u16 temp=0,temp1=0;bh1750_iic_start();bh1750_send_byte(0x46); //发送器件地址0100 0110 最后一位0,表示写bh1750_recv_ack();bh1750_send_byte(0x10); //发送Continuous H-Resolution Mode的Opecode 0001 0000,分辨率为1luxbh1750_recv_ack();bh1750_iic_stop();Delay_ms(200);bh1750_iic_start();bh1750_send_byte(0x47); bh1750_recv_ack();BUF[0]=bh1750_recv_byte(1);BUF[1]=bh1750_recv_byte(0); //temp=bh1750_recv_byte(1);//temp1=bh1750_recv_byte(0);bh1750_iic_stop();//temp2=temp1+(temp<<8);//lux=(float)temp2/1.2; //lux是float型}void Conversion(void)
{temp2=BUF[0];temp2=(temp2<<8)+BUF[1];lux=(float)temp2/1.2; //lux是float型}/**************************************
起始信号
**************************************/
void bh1750_iic_start(void)
{BH1750_SDA_OUT() //设置SDA线为输出//在开始数据传输前,先让SDA和SCL都拉高BH1750_IIC_SDA=1; //发送起始条件的数据信号,释放总线Delay_us(2);BH1750_IIC_SCL=1; Delay_us(5); //Tsu;STA:起始条件的建立时间大于4.7us。BH1750_IIC_SDA=0; //SDA由高变为低表示开始信号Delay_us(4); //起始条件的保持时间大于4usBH1750_IIC_SCL=0; //钳住IIC总线,准备发送或者接收数据Delay_us(2);
}/**************************************
停止信号
**************************************/
void bh1750_iic_stop(void)
{BH1750_SDA_OUT() //设置SDA线为输出//IIC_SCL=0; //此句是调试BH1750时加,2018.03.03BH1750_IIC_SDA=0; //发送停止信号的数据信号Delay_us(2);BH1750_IIC_SCL=1; //发送停止信号的时钟信号Delay_us(5); //停止信号的建立时间大于4usBH1750_IIC_SDA=1; //发送停止信号Delay_us(4); //;
}/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void bh1750_send_ack(char ack)
{BH1750_IIC_SCL=0;BH1750_SDA_OUT();BH1750_IIC_SDA=ack; //主器件应答Delay_us(2);BH1750_IIC_SCL=1;Delay_us(4); //SCL高电平周期大于4usBH1750_IIC_SCL=0; //清时钟线,钳住IIC总线以便继续接收Delay_us(2);}/**************************************
接收应答信号
**************************************/
char bh1750_recv_ack(void)
{u8 ucErrorTime=0;BH1750_SDA_IN(); //SDA设置成输入BH1750_IIC_SDA=1;Delay_us(2);BH1750_IIC_SCL=1;Delay_us(2);while(BH1750_READ_SDA){ucErrorTime++;if(ucErrorTime>=250){bh1750_iic_stop();return 1; }}BH1750_IIC_SCL=0;return 0;
}/**************************************
向IIC总线发送一个字节数据
**************************************/
void bh1750_send_byte(char dat)
{u8 i;BH1750_SDA_OUT(); for(i=0;i<8;i++){if((dat<<i)&0x80) BH1750_IIC_SDA=1; //判断发送位else BH1750_IIC_SDA=0;Delay_us(2);BH1750_IIC_SCL=1; //拉高SCL,通知被控器开始接收数据位Delay_us(4); //保证SCL高电平周期大于4usBH1750_IIC_SCL=0; //拉低SCL,允许SDA传输下一位数据。因为只有在SCL=0时才允许SDA的状态发生变化Delay_us(2);}//以下四句是调试BH1750时添加的,2018.03.03//特别注意;用方法三时,以下四句不可去掉,去掉后得到的数有问题//用方法二时,以下四句需注释掉,否则也会有问题,至于原因暂时还不清楚。
// IIC_SDA=0;
// Delay_us(2);
// IIC_SCL=1;
// Delay_us(2);BH1750_IIC_SCL=0; //拉低SCL,为下次数据传输做好准备Delay_us(2);
}/**************************************
从IIC总线接收一个字节数据
用来接收从器件传来的数据,ack为1时,发送Ack(产生应答);ack为0时,发送NAck(不产生应答)
**************************************/
char bh1750_recv_byte(unsigned char ack)
{unsigned char i,receive=0;BH1750_SDA_IN(); for(i=0;i<8;i++){BH1750_IIC_SCL=0; //置SCL为低,准备接收数据位Delay_us(5); //时钟低电平周期大于4.7usBH1750_IIC_SCL=1; //置SCL为高,使SDA上数据有效Delay_us(2);receive=receive<<1;if(BH1750_READ_SDA) receive=receive+1; //读取SDA,把接收的数据位放入receve中,若此处写成IIC_SDA==1,会失败,思考原因? Delay_us(2);}if(!ack) bh1750_send_ack(1); //发送NAckelse bh1750_send_ack(0); //发送Ack//IIC_SCL=0; //在此处有何用处???(猜测:为下次数据传输做好准备, //钳住IIC总线,准备发送或者接收数据)//Delay_us(2);return receive;
}
下载地址:BH1750光照强度库文件下载
【STM32-库函数】光照强度传感器BH1750 GY-30相关推荐
- STM32实现光照强度传感器(BH1750)(标准库与HAL库实现)
目录 元器件类型选择 接线表设计 实现过程 标准库实现 HAL库实现 代码下载 元器件类型选择 单片机选择:STM32F103 光照度模块:维特智能出品的 BH1750 模块被企业封装过,将采集的光照 ...
- STM32之光照强度(BH1750)
STM32之光照强度BH1750 光照强度BH1750 API BH1750函数使用API IIC函数API 原文件 bh1750.c 头文件 bh1750.h 光照强度BH1750 API BH17 ...
- 光照强度传感器BH1750
一.芯片介绍 BH1750FVI是一款数字型光强度传感器集成芯片.BH1750的内部由光敏二极管.运算放大器.ADC采集.晶振等组成. 结构图 PD二极管通过光生伏特效应将输入光信号转换成电信号,经运 ...
- 基于STM32的光敏传感器数据采集系统-嵌入式系统与设计课程设计
目录 1 项目概述 1.1 项目介绍 1.2 项目开发环境 1.3 小组人员及分工 2 需求分析 2.1 系统需求分析 2.2 可行性分析 2.3 项目实施安排 3 系统硬件设计 3.1 系统整体硬件 ...
- 小白从零开始:小程序阿里云平台控制stm32温湿度光照强度(软件篇)
小白从零开始:小程序阿里云平台控制stm32温湿度光照强度(软件篇) 文章目录 前言 一.Keil5+FLYMCU(软件烧录) 二.DHT11温湿度模块驱动代码 三.BH1750光照强度驱动代码 四. ...
- ESP32-GY_30光照强度传感器
ESP32-GY_30光照强度传感器的使用 GY_30光照强度传感器介绍 一.连接引脚 二.使用步骤 1.建仓代码 2.保存运行 总结 GY_30光照强度传感器介绍 GY-30光强传感器特点及使用介绍 ...
- stm32+HTU21D温湿度传感器通过usart1发送温湿度数据在串口助手显示
stm32+HTU21D温湿度传感器 这里就不拍实物图了,我用的是下面这款HTU21D ic是stm32f103vet6 工程代码是io口模拟i2c和传感器通讯 PB6-SCL,PB7-SDA usa ...
- STM32的光敏传感器
STM32的光敏传感器 简介 硬件连接 计算公式 程序 简介 1.照射光敏二极管的光强不同,通过光敏二极管的电流大小就不同,所以可以通过检测电流大小,达到检测光强的目的.利用这个电流变化,我们串接一个 ...
- ESP32-C3学习笔记(3):ESP32 C3 IIC总线驱动光照强度传感器(基于ESP-IDF Eclipse)
一.硬件简介 光照强度传感器使用的是物联网俱乐部的智慧路灯案例扩展板E53_SC1,购买连接 https://item.taobao.com/item.htm?spm=2013.1.w4004-222 ...
最新文章
- linux学习笔记-rpm
- jquery中$(document).ready(function(){//todo});window.onload时间线关系
- [机器学习]总结特征工程干货
- 符合c语言常量12abc,《C语言》试题abc合2006上.doc
- word取消空格显示为点
- 计算机通过逻辑电路实现运算,计算机组成与体系结构数据表示与运算算法和逻辑电路实现.ppt...
- AOJ0008 Sum of 4 Integers【暴力】
- 计算机三级 信息安全技术 题纲
- JavaStudyNotes
- 计算机打印机无法打印,电脑打印机无法打印怎么办 打印机不能打印解决办法...
- 一份超详细的Spring4常用知识清单!
- WebRTC 教程二:WebRTC API 和 Leak
- java int16_、uint16_、int32_、uint32_ 数据
- scum服务器 指定资源,SCUM服务器配置详解 参数设置推荐
- Python学习——Python海龟制图中的文字
- 大学综评自招面试 计算机专业,【荔枝高校大会】自招综评面试6月16日扎堆举行,这些准备工作要做好!...
- C++ 中的指针参数传递和引⽤参数传递
- 【移动安全技术】_第四站_登陆框UI设计
- 7、刷牛客网SQL题(一)
- 工作流调度工具--Oozie
热门文章
- 旅游推荐系统- python- Django
- 如何给建筑模型空间添加标签?
- ALPHABET翻译软件测试,话说单词alphabet-英语文章阅读-大耳朵英语 - 免费在线英语学习 口语练习 四级听力资料 在线翻译 网络课堂 英语社区...
- 湖北沙洋中学2021年6月高考成绩查询,荆门2021年中考时间定于6月19日至22日!全市设7个考区、18个考点…...
- 除了上市,小米背后竟然还有这么多开源项目
- 百度惊现区块链项目“莱茨狗”,俄罗斯财长称不会允许自由地交易数字货币 | 区块链日报
- 2021-12-3 ds18x20包装库 9元钱的 ds18B20 esp8266 micropython 记录
- 【AI芯片】2019年AI芯片产业深度研究报告
- 全球与中国真空熔断器市场现状及未来发展趋势
- 环保监测中的无线传感器网络技术