[HAL]STM32F1光照度测量BH1750 串口输出
-
硬件连接: 使用到的硬件有:STM32F103C8T6最小系统板,USB转TTL模块(串口通信),光照度小球(主芯片BH1750) 连接图: 使用到的引脚: 除了RCC和下载方式SYS外只需要配置IIC和USART -
STM32CubeMX配置: 具体配置都默认 时钟框图: -
生成工程后先搞一下printf函数重定义: 把以下代码粘贴在usart.c最后
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
在usart.c和main.c里添加头文件:stdio.h 4. 添加BH1750.c和BH1750.h文件 BH1750.c
#include "BH1750.h"
uint8_t mcy=0;
uint8_t BUF[3];
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);
}
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);
}
void Init_BH1750()
{
BH1750_Start();
BH1750_SendByte(SlaveAddress);
BH1750_SendByte(0x01);
BH1750_Stop();
}
uint16_t mread(void)
{
uint8_t i;
BH1750_Start();
BH1750_SendByte(SlaveAddress+1);
for (i=0; i<3; i++)
{
BUF[i] = BH1750_RecvByte();
if (i == 3)
{
BH1750_SendACK(1);
}
else
{
BH1750_SendACK(0);
}
}
BH1750_Stop();
Delay_mms(5);
}
uint32_t Value_GY30(void)
{
uint16_t dis_data;
uint16_t Value_GY_30;
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
HAL_Delay(180);
mread();
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];
Value_GY_30=(float)dis_data/1.2;
return Value_GY_30;
}
void 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--);
}
}
void BH1750_SendACK(int ack)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = scl|sda;
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);
}
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;
}
void BH1750_SendByte(uint8_t dat)
{
uint8_t i;
for (i=0; i<8; i++)
{
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();
}
void Single_Write_BH1750(uint8_t REG_Address)
{
BH1750_Start();
BH1750_SendByte(SlaveAddress);
BH1750_SendByte(REG_Address);
BH1750_Stop();
}
uint8_t BH1750_RecvByte()
{
uint8_t i;
uint8_t dat = 0;
uint8_t 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++)
{
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;
}
BH1750.h
#ifndef __BH1750_H
#define __BH1750_H
#include "main.h"
#define scl GPIO_PIN_6
#define sda GPIO_PIN_7
#define SlaveAddress 0x46
#define BH1750_PWR_DOWN 0x00
#define BH1750_PWR_ON 0x01
#define BH1750_RST 0x07
#define BH1750_CON_H 0x10
#define BH1750_CON_H2 0x11
#define BH1750_CON_L 0x13
#define BH1750_ONE_H 0x20
#define BH1750_ONE_H2 0x21
#define BH1750_ONE_L 0x23
void BH1750_Start();
void BH1750_Stop();
void Init_BH1750();
uint16_t mread(void);
uint32_t Value_GY30(void);
void delay_us(uint16_t us);
void Delay_mms(uint16_t tmp);
void BH1750_SendACK(int ack);
int BH1750_RecvACK();
void BH1750_SendByte(uint8_t dat);
uint8_t BH1750_RecvByte();
int I2C_ReadData(uint8_t slaveAddr, uint8_t regAddr, uint8_t *pData, uint16_t dataLen);
void Single_Write_BH1750(uint8_t REG_Address);
#endif
- main.c
添加如下代码:
#include "stdio.h"
#include "BH1750.h"
Init_BH1750();
printf("\n\r UART already\n\r");
while (1)
{
printf("\n\r 光照强度:%d lx\n\r",Value_GY30());
HAL_Delay(1000);
}
- 效果展示:
晚上开着灯的室内: 用手在小球前方6厘米左右挡着光:
整个工程已上传到我的资源,需要的朋友可以康康
|