目录
一、传感器器件选型
硬件平台选择STM32F103C8T6最小系统开发板。
STM32代码配置工具使用STM32Cortex-M3的标准库库进行开发。
光敏模块选择4线光敏电阻传感器模块,(光敏电阻型号5516)。
注1:数据下载使用ST-LINK下载。
注2:串口数据接收使用USB转TTL传输,USB转TTL的TXD接STM32的PB10引脚RXD,RXD接STM32的PB11引脚TXD。
二、4线光敏传感器介绍
光敏模块原理图
三、光敏模块实物
光敏传感器是利用光敏元件将光信号转换为电信号的传感器。在光敏电阻模块中载入了一个光敏电阻。光敏电阻是用硫化镉或硒化镉等半导体材料制成的特殊电阻器。光敏电阻对环境光线十分敏感。光照越强阻值就越低,随着光照强度的升高,电阻值迅速降低。
四、光敏模块引脚说明
VCC:电源引脚,接单片机+5V或者3.3V。
GND:地线,接单片机GND。
DO:开关量输出(0或1),模块在无光条件下或光强达不到设定阈值时,DO口输出高电平;当外界环境光强超过设定阈值时,DO输出低电平。
AO:模拟量输出(电压),与单片机AD模块相连,通过AD转换,获得准确数值。(后续中使用PA1引脚作为ADC转换,因此此处接单片机的PA1引脚)
五、程序代码
光敏电阻采集驱动文件代码,点C文件
#include "MQ2.h"
#include "OLED.h"
#include "FMQ.h"
#include <stdio.h>
#include "Serial.h"
u8 times;
void Adc_Init()
{
GPIO_InitTypeDef GPIO_Initstructre;
ADC_InitTypeDef ADC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_Initstructre.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Initstructre.GPIO_Pin=GPIO_Pin_1;
GPIO_Initstructre.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_Initstructre);
GPIO_SetBits(GPIOA,GPIO_Pin_1);//½ÓÏß¿ÚA1
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
ADC_DeInit(ADC1);
ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;
ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right;
ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADC_InitStruct.ADC_Mode=ADC_Mode_Independent;
ADC_InitStruct.ADC_NbrOfChannel = 1;
ADC_InitStruct.ADC_ScanConvMode = DISABLE;
ADC_Init(ADC1,&ADC_InitStruct);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
u16 Get_Adc(u8 ch)
{
ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5);
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
return ADC_GetConversionValue(ADC1);
}
u16 Get_Adc_Average(u8 ch,u8 times)
{
u32 temp_val=0;
u8 t;
for(t=0;t<times;t++)
{
temp_val+=Get_Adc(ch);
Delay_ms(5);
}
return temp_val/times;
}
光敏电阻采集驱动文件代码,点H文件
#ifndef __MQ2_H
#define __MQ2_H
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Adc_Init(void);
u16 Get_Adc(u8 ch);
u16 Get_Adc_Average(u8 ch,u8 times);
void MQ2_Check(void);
#endif
光敏电阻采集驱动文件代码,main函数文件
#include "stm32f10x.h" // Device header
#include "delay.h"
#include "OLED.h"
#include "OELD_Data.h"
#include "FMQ.h"
#include "Serial.h"
#include "MQ2.h"
u16 GMDZ_Value;//adc值
float temp_one;//电压值
int main(void)
{
Adc_Init();
OLED_Init();
mfq_Init();
Serial_Init();
OLED_ShowChinese(0, 47, "光敏电阻:");
//OLED_ShowString(100,47,"%",OLED_8X16);
OLED_ShowChinese(110, 47, "欧");
OLED_Update();
while(1)
{
GMDZ_Value=Get_Adc_Average(ADC_Channel_1,10)*100/4095;//模拟光敏电阻的值 0-100
//temp_one =(float) MQ2_Value/4096*3.3;
//OLED_ShowNum(47,0,temp_one,5,OLED_8X16);
OLED_ShowNum(74,47,GMDZ_Value,3,OLED_8X16);
OLED_Update();
fmq(GMDZ_Value);
printf("光敏电阻= %d ",GMDZ_Value);
Serial_SendString("Ω\r\n");
}
}
六、串口打印数据
七、程序源码
《STM32单片机+光敏电阻传感器+OLED屏幕+蜂鸣器报警+光敏电阻数据发送到串口调试助手》源代码资源-CSDN文库