光敏电阻传感器详解(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文件

#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文件

#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文件

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

四、实验效果 

五、资料获取

项目分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值