一.系统概述
1. 系统内通过STM32单片机进行系统主控,完成数据采集以及逻辑控制。
2.使用光敏电阻模块检测环境中的光强,根据采集到的光强数据来作为是否开灯的条件。
2. 使用声音传感器检测周围的声音,来判断是否有人,当检测到声音超过阈值且光强低于阈值则控制绿灯亮。
3.通过红外人体检测模块检测是否有人,检测到人且光强低于阈值则控制红灯亮。
4.通过蓝牙模块可以实现手机控制灯的亮灭。
二.电路设计
电路图采用Altium Designer进行设计:
1. 通过STM32F103C8T6单片机作为系统主控,最小系统电路是整个电路的核心;
2. 使用光敏电阻模块进行光强检测,传感器的模拟端与单片机的模拟输入端相接;
3. 使用KY-037声音传感器进行声音检测,模块的模拟输出脚与单片机的模拟输入脚进行连接;
4. 通过光电开关进行人体检测,模块的数据输出脚与单片机的GPIO口直接连接;
5. 使用JDY-31蓝牙模块进行无线通信,通过UART串口与单片机进行通信。
三.程序设计
#include <REGX52.H>
#include "delay.h"
#include "key.h"
#include "Timer0.h"
#include "LCD1602.h"
#include <INTRINS.H>
#include "illumination.h"
sbit LED_Light = P3^6;
sbit LED_Voice = P3^7;
sbit ADC_CS = P2^0;
sbit ADC_CLK = P2^1;
sbit ADC_DIO = P2^2;
sbit Trailing = P3^2;
unsigned char bdata Sdat;
sbit SD7 = Sdat^7;
sbit SD0 = Sdat^0;
unsigned char voltage[4]="0.00";
unsigned char rec_dat[6];
unsigned char uart_receive_buffer[30]; //从串口接收的数据
unsigned char uart_receive_number=0; //指示串口接收个数
unsigned char N_ADC,VCC,flag;
unsigned int time1;
unsigned int VMax;
float LMax;
void Com_Init(void);
void Delay_1ms(unsigned int i);
void ADC0832(bit Chx);
void Tran(unsigned char digit);
void VCCjisuan();
void main()
{
unsigned char i;
float ttemp;
delay_nms(100); //延时100ms
Init_BH1750();
VMax = 1000;
LMax = 10;
Com_Init();
while(1)
{
disdata();
ttemp = return1();
if(Trailing == 0)
{
flag = 1;
}
else
{
flag = 0;
}
ADC0832(1);
VCCjisuan();
time1=VCC*3.3*10;
if(flag == 1)
{
i = 0;
if(time1 < VMax)
{
LED_Voice = 1;
}
else
{
LED_Voice = 0;
}
if(ttemp < LMax)
{
LED_Light = 0;
}
else
{
LED_Light = 1;
}
}
else
{
i++;
if(i == 1)
{
LED_Voice = 1;
LED_Light = 1;
}
}
if(uart_receive_number == 1)
{
uart_receive_number = 0;
if(uart_receive_buffer[0] == 1)
{
LED_Voice = 1;
}
if(uart_receive_buffer[0] == 2)
{
LED_Voice = 0;
}
if(uart_receive_buffer[0] == 3)
{
LED_Light = 1;
}
if(uart_receive_buffer[0] == 4)
{
LED_Light = 0;
}
}
}
}