咕果网给企业做网站的,南京网站排名外包,网站开发与编程,网站脚本错误GY-30光照传感器的具体资料可以去淘宝搜索然后问卖家要#xff0c;网上也有#xff0c;所以这里我就不多嘴了。
VCC连接3到5伏电压#xff0c;根据文件开头的描述在STM32CubeMX中配置好外设。
STM32Cube开发方式就是4个字“简单直接”#xff0c;直接上代码。
gy30.h
#…GY-30光照传感器的具体资料可以去淘宝搜索然后问卖家要网上也有所以这里我就不多嘴了。
VCC连接3到5伏电压根据文件开头的描述在STM32CubeMX中配置好外设。
STM32Cube开发方式就是4个字“简单直接”直接上代码。
gy30.h
#ifndef __GY30_H__
#define __GY30_H__#include main.h//main函数里需要使用的就这一个输入亮度变量的地址返回读取状态
uint8_t getGY30_Lux(uint16_t *nowLum);void Z_I2C_Start(void);
void Z_I2C_End(void);
void Z_I2C_SendByte(uint8_t byte);
uint8_t Z_I2C_ReveiceByte();
void Z_I2C_SendACK(uint8_t ack);
uint8_t Z_I2C_ReveiceACK();#endif
gy30.c
/********************************************************************************* 作 者:洛宇航SiriusIoT* 名 称:* 备 注:* CubeMX配置方法* 1.软件I2C* 选择两个GPIO引脚作为软件I2C引脚。* 建议命名为softI2C1_SCLsoftI2C1_SDA* 默认输出高电平、开漏输出、上拉、速度设置为Hign* 2.毫秒级延时* 选择定时器配置为每毫秒技术一次无需开中断默认为TIM6********************************************************************************/#include gy30.h
#include tim.h//外设配置宏定义start
#define DHT_HTIM htim6//微秒级延时,使用了定时器6//定义I2C总线连接的GPIO端口, 只需要修改下面5段行代码即可任意改变SCL和SDA的引脚
#define GPIO_PORT_GY30 GPIOE //GY30 GPIO端口//软件I2C外设配置
#define GY30_SCL_PORT softI2C1_SCL_GPIO_Port
#define GY30_SCL_PIN softI2C1_SCL_Pin#define GY30_SDA_PORT softI2C1_SDA_GPIO_Port
#define GY30_SDA_PIN softI2C1_SDA_Pin
//外设配置宏定义end//定义读写SCL和SDA的宏
//SCL 1
#define GY30_SCL_1 HAL_GPIO_WritePin(GY30_SCL_PORT, GY30_SCL_PIN, GPIO_PIN_SET)
//SCL 0
#define GY30_SCL_0 HAL_GPIO_WritePin(GY30_SCL_PORT, GY30_SCL_PIN, GPIO_PIN_RESET)
//读SCL口线状态
#define GY30_SCL_READ HAL_GPIO_ReadPin(GY30_SCL_PORT, GY30_SCL_PIN)//SDA 1
#define GY30_SDA_1 HAL_GPIO_WritePin(GY30_SDA_PORT, GY30_SDA_PIN, GPIO_PIN_SET)
//SDA 0
#define GY30_SDA_0 HAL_GPIO_WritePin(GY30_SDA_PORT, GY30_SDA_PIN, GPIO_PIN_RESET)
//读SDA口线状态
#define GY30_SDA_READ HAL_GPIO_ReadPin(GY30_SDA_PORT, GY30_SDA_PIN)#define SCL_Pin GPIO_Pin_0
#define SDA_Pin GPIO_Pin_1//利用定时器微秒级延时
void GY30_Delay_us(uint16_t us)
{uint16_t differ 0xffff-us-5;__HAL_TIM_SET_COUNTER(DHT_HTIM,differ);HAL_TIM_Base_Start(DHT_HTIM);while(differ 0xffff-5){differ __HAL_TIM_GET_COUNTER(DHT_HTIM);}HAL_TIM_Base_Stop(DHT_HTIM);
}void I2C_SetSCL(uint8_t signal){if(signal1) GY30_SCL_1;else GY30_SCL_0;GY30_Delay_us(5); //防止电平翻转过快,因此加上延时
}void I2C_SetSDA(uint8_t signal){if(signal1) GY30_SDA_1;else GY30_SDA_0;GY30_Delay_us(5);
}void I2C_Start(void){I2C_SetSDA(1);I2C_SetSCL(1);I2C_SetSDA(0);I2C_SetSCL(0);
}void I2C_End(){I2C_SetSDA(0);I2C_SetSCL(1);I2C_SetSDA(1);
}void I2C_SendByte(uint8_t byte){I2C_SetSCL(0);for(int i0;i8;i){if((byte0x80)0)I2C_SetSDA(0);elseI2C_SetSDA(1);byte1;I2C_SetSCL(1);I2C_SetSCL(0);}
}uint8_t I2C_ReveiceByte()
{uint8_t data0x00;I2C_SetSDA(1);for(int i0;i8;i){I2C_SetSCL(1);if(GY30_SDA_READ1)data|(0x80i);I2C_SetSCL(0);}return data;
}void I2C_SendACK(uint8_t ack)
{if(ack0)I2C_SetSDA(0);elseI2C_SetSDA(1);I2C_SetSCL(1);I2C_SetSCL(0);
}uint8_t I2C_ReveiceACK()
{I2C_SetSDA(1);I2C_SetSCL(1);uint8_t ackGY30_SDA_READ;I2C_SetSCL(0);return ack;
}uint8_t getGY30_Lux(uint16_t* nowLum)
{I2C_Start();I2C_SendByte(0x46);if(I2C_ReveiceACK()!0) return 0;I2C_SendByte(0x01);if(I2C_ReveiceACK()!0) return 0;I2C_End();I2C_Start();I2C_SendByte(0x46);if(I2C_ReveiceACK()!0)return 0;I2C_SendByte(0x10);if(I2C_ReveiceACK()!0)return 0;I2C_End();HAL_Delay(200);uint16_t Light0;I2C_Start();I2C_SendByte(0x47);if(I2C_ReveiceACK()!0) return 0;Light|I2C_ReveiceByte();Light8;I2C_SendACK(0);Light|I2C_ReveiceByte();I2C_SendACK(1);I2C_End();*nowLum Light;return 1;
}