光敏电阻传感器详解(STM32)

目录

一、介绍

二、传感器原理

1.光敏电阻传感器介绍

2.原理图

三、程序设计

main.c文件

ldr.h文件

ldr.c文件

四、实验效果

五、资料获取

项目分享


一、介绍

光敏电阻器是利用半导体的光电导效应制成的一种电阻值随入射光的强弱而改变的电阻器,又称为光电导探测器。 入射光强,电阻减小,入射光弱,电阻增大。常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。这些制作材料具有在特定波长的光照射下,其阻值迅速减小的特性。一般用于光的测量、光的控制和光电转换(将光的变化转换为电的变化)

以下是光敏电阻传感器的参数:

|------|----------|
| 型号 | 5516 |
| 最大电压 | 150VDC |
| 最大功耗 | 90MW |
| 环境温度 | -30~70℃ |
| 光谱峰值 | 540nm |
| 亮电阻 | 5~10kΩ |
| 暗电阻 | 0.5MΩ |

哔哩哔哩视频链接:

https://www.bilibili.com/video/BV1zT421k7Dh/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2

(资料分享见文末)

二、传感器原理

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;
//	}
//}

四、实验效果

五、资料获取

项目分享

相关推荐
蓝黑墨水37 分钟前
F1C100S/F1C200S的资料来源说明
单片机
千千道3 小时前
STM32 的 CAN 通讯全攻略
stm32·单片机·物联网
百里与司空4 小时前
STM32——看门狗通俗解析
stm32·单片机·嵌入式硬件·门控循环单元
OH五星上将5 小时前
鸿蒙轻内核A核源码分析系列七 进程管理 (2)
嵌入式硬件·移动开发·openharmony·鸿蒙开发·鸿蒙内核·鸿蒙源码·liteos_a
数科星球5 小时前
可解耦的多模态机器人来了,第一个场景是酒店
嵌入式硬件·fpga开发·车载系统·硬件工程·基带工程
小郭爱学习@7 小时前
反激电路中TL431光耦反馈参数的计算,环路设计思路
嵌入式硬件·硬件架构·硬件工程
python_use9 小时前
充电管理芯片
单片机·嵌入式硬件
Industio_触觉智能10 小时前
瑞芯微RK3568鸿蒙开发板OpenHarmony系统修改cfg文件权限方法
嵌入式硬件·openharmony·开源鸿蒙·瑞芯微rk3568
小朱在敲代码11 小时前
IIC 协议
单片机·嵌入式硬件