STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo

2023-10-27

BH1750 简介
产品介绍

  BH1750FVI 是一种用于两线的数字型光照强度传感器集成电路。这种集成电路可以根据收集的光线的强度数据来调整液晶或数字键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。(1lx - 65535lx)

产品特点

  1 支持IIC BUS接口(f/f Mode Support)
  2 输出对应亮度的数字值
  3 通过降低功率功能,实现低电流化
  4 通过 50Hz/60Hz 除光噪音功能实现稳定的测定
  5 支持 1.8V 逻辑输入接口
  6 有两种可选的 IIC slave 地址。

测量程序步骤

在这里插入图片描述

指令集合结构

在这里插入图片描述

从“写指示”到“读出测量结果”的测量时序实例

在这里插入图片描述
在这里插入图片描述

STM32CubeMx工程配置

  配置HSE
在这里插入图片描述
  配置系统时钟
在这里插入图片描述
  配置 USRAT1 用于信息输出
在这里插入图片描述
  配置 I2C1

在这里插入图片描述
  GENERATE CODE生成代码
在这里插入图片描述
  由于自动生成代码在I2C时钟使能位置有误,需要做如图所示的I2C 时钟使能,位置移动。在GPIO初始化之前就需要使能I2C的时钟。
在这里插入图片描述

BH1750 基于硬件I2C的驱动程序

  BH1750.h

// BH1750.h
#ifndef _BH1750_H_
#define _BH1750_H_
#include "main.h"
#include <stdio.h>
#include "i2c.h"

#define BH1750_ADDRESS 0x46

void Init_BH1750(void);
uint32_t I2C_BH1750_Opecode_Write(uint8_t* pData, uint16_t size);
uint32_t I2C_BH1750_Data_Read(uint8_t* pData, uint16_t size);
#endif

  BH1750.3

// BH1750.3
#include "BH1750.h"

void Init_BH1750(void) {
	uint8_t opecode = 0x01;
	if( I2C_BH1750_Opecode_Write(&opecode, 1) == HAL_OK ){
		printf("Init_BH1750 Ok\n");
	}else {
		printf("Init_BH1750 Error\n");
	}
}
uint32_t I2C_BH1750_Opecode_Write(uint8_t* pData, uint16_t size) {
	HAL_StatusTypeDef status = HAL_OK;	
	status = HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDRESS,pData, size, 1);	
	return status;	
}
uint32_t I2C_BH1750_Data_Read(uint8_t* pData, uint16_t size){
	HAL_StatusTypeDef status = HAL_OK;	
	status = HAL_I2C_Master_Receive(&hi2c1, BH1750_ADDRESS+1,pData, size, 1);	
	return status;
}

   printf() 重定向

#include <stdio.h>

int fputc(int ch, FILE *f){
	uint8_t temp[1] = { ch };
	HAL_UART_Transmit(&huart1, temp, 1, 2);	
	return ch;
}

  demo.c

#include "main.h"
#include "i2c.h"
#include "usart.h"
#include "gpio.h"

#include <stdio.h>
#include "BH1750.h"
int dis_data = 0;
uint8_t DATA_BUF[8] = { 0 };
void SystemClock_Config(void);
int main(void)
{
	float temp = 0;
	uint8_t opecode;
	HAL_Init();
	SystemClock_Config();
	MX_GPIO_Init();
	MX_I2C1_Init();
	MX_USART1_UART_Init();
	HAL_Delay(200);
	Init_BH1750();
	while (1) {
	opecode = 0x01;
	if ( I2C_BH1750_Opecode_Write(&opecode, 1) != HAL_OK){
		printf("I2C_BH1750_Opecode_Write: %2x Error\n", opecode);
		continue;
	}
	opecode = 0x10;
	if ( I2C_BH1750_Opecode_Write(&opecode, 1) != HAL_OK){
		printf("I2C_BH1750_Opecode_Write: %2x Error\n", opecode);
		continue;
	}
	HAL_Delay(200);	
	if ( I2C_BH1750_Data_Read(DATA_BUF, 2) != HAL_OK){
		printf("I2C_BH1750_Data_Read:  Error\n");
		continue;
	}
	dis_data =(DATA_BUF[0]);
	  	dis_data=(dis_data<<8)+ (DATA_BUF[1]);//合成数据,即光照数据
	  	temp=(float)dis_data/1.2;
		printf("data: %f lx\r\n", temp);
	}
}
int fputc(int ch, FILE *f){
	uint8_t temp[1] = { ch };
	HAL_UART_Transmit(&huart1, temp, 1, 2);	
	return ch;
}
测试结果

在这里插入图片描述
在这里插入图片描述

完成工程下载下载地址
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo 的相关文章

随机推荐

  • 金山卫士开源软件之旅(十) KSafeMain工程的分析 1

    上一次看金山开源到现在已有一两个月了 期间看到QQ群里大家对它很是热情 最近有时间想看看金山的主界面工程KSafeMain 自己水平有限 总结的东西浅显 但还是愿意拿来与大家分享 希望对大家有帮助 转载请标明是引用于 http blog c
  • C#中的object类深入理解

    C 中所有的类都直接或间接继承自System Object类 这使得C 中的类得以单根继承 如果我们没有明确指定继承类 编译器缺省认为该类继承自System Object类 System Object类也可用小写的object关键字表示 两
  • 软工实习日记12

    今天的任务是新闻归档功能的实现 申请访问不存在的网站页面时使用准备的404界面隐藏错误信息 以及使用拦截器拦截管理员未登录时申请访问后台页面的请求 下面给出关键代码 service层 NewService java 接口文件 Map
  • LeetCode 2255. 统计是给定字符串前缀的字符串数目

    给你一个字符串数组 words 和一个字符串 s 其中 words i 和 s 只包含 小写英文字母 请你返回 words 中是字符串 s 前缀 的 字符串数目 一个字符串的 前缀 是出现在字符串开头的子字符串 子字符串 是一个字符串中的连
  • Android好用的轮播图控件

    于app开发 大部分都会涉及到轮播图 你也可以自己用viewpager自己写 这边介绍几种写好的库 1 ConvenientBanner 博客地址 2 infiniteindicatorlayout 点击打开链接 这是一个网上有人进行封装的
  • java form 上传文件_JAVA入门[16]-form表单,上传文件

    一 如何传递参数 RequestMapping detail public String detail RequestParam id int id Model model Category category new Category ca
  • nextcloud设置用户容量,设置用户配额

    先登录nextcloud管理员账号 然后找到用户 然后在左下角找到设置 然后在设置中设置对应的容量 设置完毕以后 所有用户 包括管理员 也会被设置为10g 自己手动改一改就好 嗯大概就是这样 然后如果你要设置某个用户的容量 点击一下笔 就能
  • threejs的dat.gui辅助工具的使用

    threejs的dat gui辅助工具的使用 安装 使用 安装 npm i dat gui S 使用 import dat from dat gui const controlData rotationSpeed 0 01 color 66
  • Tensorflow:介绍常见激活函数和池化,并用Tensorflow搭建前向神经网络

    Tensorflow 介绍常见激活函数和池化 并用Tensorflow搭建前向神经网络 一 常见激活函数和池化 1 激活函数 激活函数通常用于卷积层和全连接层的末端 为神经网络提供非线性变化 1 1 sigmoid S形曲线 早期用于卷积层
  • AN OVERVIEW OF LANGUAGE MODELS RECENT DEVELOPMENTS AND OUTLOOK

    LLM系列相关文章 针对 AN OVERVIEW OF LANGUAGE MODELS RECENT DEVELOPMENTS AND OUTLOOK 的翻译 语言模型综述 近年来的发展与展望 摘要 1 引言 2 语言模型的类型 2 1 结
  • 手动删除shmget创建的共享内存

    使用shmget创建或打开共享内存的时候 其中有一个参数是制定了权限的 这个权限类似于文件的权限 指定了什么身份可以打开已经存在的共享内存 在我的项目中出现了一个程序运行失败 经过调查发现在使用shmget打开一段共享内存的时候没有权限 造
  • win10家庭版计算机属性里没有远程桌面,win10家庭版不支持远程桌面怎么办_远程桌面无法连接的解决方法...

    众所周知 有些win系统的家庭版本是无法远程桌面连接的 而且在连接的时候会报错 如果重新安装系统十分麻烦 那么咱们要怎么解决这个部分Windows电脑无法远程桌面连接的问题呢 下面小编就来分享多种Win电脑系统无法远程桌面连接的正确解决方法
  • js页面初始化方法只调用一次_10个常见的JS语言错误总汇

    1 Uncaught TypeError Cannot Read Property这是 JavaScript 开发人员最常遇到的错误 当你读取一个属性或调用一个未定义对象的方法时 Chrome 中就会报出这样的错误 导致这个错误发生的原因有
  • 地图采集车的那些事

    一 背景 高精地图 高精采集车 是做地图和出行领域同学经常挂在嘴上的一些常用词儿 但是 圈外的同学可能会问 到底什么是高精 高精是指高精度定位 高精地图是指包含丰富地理信息数据 具有高精度坐标的地图 当然 高精采集车就是采集制作高精地图数据
  • Caffe源码中io文件分析

    Caffe源码 caffe version commit 09868ac date 2015 08 15 中有一些重要的头文件 这里介绍下include caffe util io hpp文件的内容 1 include文件 1
  • MySQL 的FLASHBACK 数据回滚

    数据库的里面的FLASHBACK 功能是一个让人刮目相看的功能 如果你做错了什么怎么能将那段时间的数据恢复 并且还让生产的应用不停止 这是一个数据库管理员都想拥有的功能 SQL SERVER 需要借助第三方软件的功能 可以完成数据的回滚和恢
  • Python selenium各个组件的操作

    一 操作文本输入框 常用方法 说明 sendkeys 设值 clear 清空文本框内容 get attribute 获取文本框中的值 is display 判断元素是否显示 案例演示 from time import sleep from
  • Spring 如何解决循环依赖的问题

    一 什么是循环依赖 是两个或两个以上对象互相引用 即A依赖B B依赖C C又依赖A 例如 service public class A private B b Autowired public void setB B b this b b
  • 图像识别之KNN算法的理解与应用

    KNN是最经典的机器学习算法之一 该算法既可以用于数据分类 也可以用于数据回归预测 其核心思路是在训练样本中寻找距离最接近待分类样本的K个样本 然后 如果目的是分类 则统计这K个样本中的各个类别数量 数量最多的类别即认为是待分类样本的类别
  • STM32基础---BH1750 硬件 IIC 驱动程序+ 测试demo

    STM32基础 BH1750 硬件 IIC 驱动程序 测试demo STM32CudeMx MDK ARM BH1750 简介 产品介绍 产品特点 测量程序步骤 指令集合结构 从 写指示 到 读出测量结果 的测量时序实例 STM32Cube