一.系统概述
系统使用STM32单片机进行主控,系统内使用HC-SR04超声波测距模块进行坐姿检测,使用滑动变阻器模拟光敏检测模块,当检测到坐姿不对(距离桌子太近)就会报警提醒,当检测到光强过低就会开灯,通过按键可以设置光强和距离的阈值。
二.仿真概述
1. 进入仿真显示屏上就会显示检测的距离和光强以及对应设置的阈值,此时检测到参数在阈值范围内,并不会报警和开灯。
2. 按下定时按键就会开始计时。
3. 当检测到距离低于设定阈值就会进行声光报警提醒。
4. 当检测到光强低于设定阈值就会开灯,使用按键可以对阈值进行设定。
三.程序设计
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
#include "Key.h"
#include "HCSR04.h"
#include "timer.h"
#include "LED.h"
#include "EXTERN-Key.h"
#include "AD.h"
uint16_t Num;
uint16_t T;
extern uint16_t distance ;
extern uint16_t light;
float Angle;
int main(void)
{
distance=50;
light=40;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
OLED_Init(); //OLED初始化
HCSR04_Init();
Externkey_Init();
Timer_Init();
LED_Init();
AD_Init();
OLED_ShowString(2, 1, "distance:");
OLED_ShowString(2, 13, "cm");
/*显示静态字符串*/
OLED_ShowString(3, 1, "light:");
OLED_ShowString(3, 10, "%");
OLED_ShowString(1, 1, "time:00.00.00");
OLED_ShowString(4, 1, "limit:");
OLED_ShowString(4, 9, "cm");
OLED_ShowString(4, 14, "%");
while (1)
{
Angle= ((float)AD_GetValue()/ 4095 *100);
OLED_ShowNum(3, 7, Angle, 3);
T = HCSR04_GetValue();
OLED_ShowNum(2, 10, T, 3);
OLED_ShowNum(1, 12, (Num % 3600) % 60, 2);
OLED_ShowNum(1, 9, (Num % 3600) / 60, 2);
OLED_ShowNum(1, 6, Num / 3600, 2);
OLED_ShowNum(4, 7, distance, 2);
OLED_ShowNum(4, 12, light, 2);
if(Angle<=light)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
if(T<=distance)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}
if(Num /3600==1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_3);
GPIO_ResetBits(GPIOA, GPIO_Pin_4);
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
}
if(Angle>light && T>distance&& Num /3600!=1)
GPIO_SetBits(GPIOA, GPIO_Pin_4);
}
}