目录
一、介绍
光敏电阻器是利用半导体的光电导效应制成的一种电阻值随入射光的强弱而改变的电阻器,又称为光电导探测器。 入射光强,电阻减小,入射光弱,电阻增大。常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。这些制作材料具有在特定波长的光照射下,其阻值迅速减小的特性。一般用于光的测量、光的控制和光电转换(将光的变化转换为电的变化)
以下是光敏电阻传感器的参数:
|------|----------|
| 型号 | 5516 |
| 最大电压 | 150VDC |
| 最大功耗 | 90MW |
| 环境温度 | -30~70℃ |
| 光谱峰值 | 540nm |
| 亮电阻 | 5~10kΩ |
| 暗电阻 | 0.5MΩ |
哔哩哔哩视频链接:
(资料分享见文末)
二、传感器原理
1.光敏电阻传感器介绍
使用光敏电阻构成光线亮度传感器模块,有3针和4针两种选择。比较器输出,信号干净,波形好,驱动能力强,超过15mA。配可调电位器可调节检测光线亮度
传感器参数:
|--------|-----------------------|
| 工作电压 | 3.3V~5V |
| 输出形式 | D0开关量(0/1)或 A0模拟量(电压) |
| PCB尺寸 | 3.2cm×1.4cm |
| 比较器型号 | LM393 |
| 光敏电阻型号 | 5516 |
2.原理图
以下是引脚描述:
|------|-----------|
| 引脚名称 | 描述 |
| VCC | 供给电压3~5V |
| GND | 地线 |
| D0 | 开关信号 |
| A0 | 模拟信号 |
三、程序设计
1.使用STM32F103C8T6读取光敏电阻传感器采集的数据,通过串口发送至电脑
2.将读取得到的光照数据同时在OLED上显示
|----------|------|
| 光敏 | PA0 |
| OLED_SCL | PB11 |
| OLED_SDA | PB10 |
| 串口 | 串口1 |
main.c文件
cpp
#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "LDR.h"
#include "adcx.h"
/*****************辰哥单片机设计******************
STM32
* 项目 : 光敏传感器实验
* 版本 : V1.0
* 日期 : 2024.8.9
* MCU : STM32F103C8T6
* 接口 : 参看LDR.h
* BILIBILI : 辰哥单片机设计
* CSDN : 辰哥单片机设计
* 作者 : 辰哥
**********************BEGIN***********************/
u16 light;
int main(void)
{
SystemInit();//配置系统时钟为72M
delay_init(72);
LED_Init();
LED_On();
LDR_Init();
USART1_Config();//串口初始化
OLED_Init();
printf("Start \n");
delay_ms(1000);
//显示"光照强度:"
OLED_ShowChinese(0,0,0,16,1);
OLED_ShowChinese(16,0,1,16,1);
OLED_ShowChinese(32,0,2,16,1);
OLED_ShowChinese(48,0,3,16,1);
OLED_ShowChar(64,0,':',16,1);
while (1)
{
LED_Toggle();
light = LDR_LuxData();
printf("光照强度: %d\r\n",light);
OLED_ShowNum(80,0,light,3,16,1);
delay_ms(500);
}
}
ldr.h文件
cpp
#ifndef __LDR_H
#define __LDR_H
#include "stm32f10x.h"
#include "adcx.h"
#include "delay.h"
#include "math.h"
/*****************辰哥单片机设计******************
STM32
* 文件 : 光敏传感器h文件
* 版本 : V1.0
* 日期 : 2024.8.9
* MCU : STM32F103C8T6
* 接口 : 见代码
* BILIBILI : 辰哥单片机设计
* CSDN : 辰哥单片机设计
* 作者 : 辰哥
**********************BEGIN***********************/
#define LDR_READ_TIMES 10 //光照传感器ADC循环读取次数
/***************根据自己需求更改****************/
// LDR GPIO宏定义
#define LDR_GPIO_CLK RCC_APB2Periph_GPIOA
#define LDR_GPIO_PORT GPIOA
#define LDR_GPIO_PIN GPIO_Pin_0
/*********************END**********************/
// ADC 通道宏定义
#define ADC_CHANNEL ADC_Channel_0
//#define ADC_IRQ ADC3_IRQn
//#define ADC_IRQHandler ADC3_IRQHandler
void LDR_Init(void);
uint16_t LDR_Average_Data(void);
uint16_t LDR_LuxData();
#endif /* __ADC_H */
ldr.c文件
cpp
#include "LDR.h"
/*****************辰哥单片机设计******************
STM32
* 文件 : 光敏传感器c文件
* 版本 : V1.0
* 日期 : 2024.8.9
* MCU : STM32F103C8T6
* 接口 : 见代码
* BILIBILI : 辰哥单片机设计
* CSDN : 辰哥单片机设计
* 作者 : 辰哥
**********************BEGIN***********************/
void LDR_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd (LDR_GPIO_CLK, ENABLE ); // 打开 ADC IO端口时钟
GPIO_InitStructure.GPIO_Pin = LDR_GPIO_PIN; // 配置 ADC IO 引脚模式
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 设置为模拟输入
GPIO_Init(LDR_GPIO_PORT, &GPIO_InitStructure); // 初始化 ADC IO
ADCx_Init();
}
uint16_t LDR_ADC_Read(void)
{
//设置指定ADC的规则组通道,采样时间
return ADC_GetValue(ADC_CHANNEL, ADC_SampleTime_55Cycles5);
}
uint16_t LDR_Average_Data(void)
{
uint32_t tempData = 0;
for (uint8_t i = 0; i < LDR_READ_TIMES; i++)
{
tempData += LDR_ADC_Read();
delay_ms(5);
}
tempData /= LDR_READ_TIMES;
return (uint16_t)tempData;
}
uint16_t LDR_LuxData()
{
float voltage = 0;
float R = 0;
uint16_t Lux = 0;
voltage = LDR_Average_Data();
voltage = voltage / 4096 * 3.3f;
R = voltage / (3.3f - voltage) * 10000;
Lux = 40000 * pow(R, -0.6021);
if (Lux > 999)
{
Lux = 999;
}
return Lux;
}
//void LDR_LuxData(uint16_t *Lux)
//{
// float voltage = 0;
// float R = 0;
// voltage = LDR_Average_Data();
// voltage = voltage / 4096 * 3.3f;
//
// R = voltage / (3.3f - voltage) * 10000;
//
// *Lux = 40000 * pow(R, -0.6021);
//
// if (*Lux > 999)
// {
// *Lux = 999;
// }
//}