1、项目背景
项目环境背景
随着科技的发展,许多智能产品如雨后春笋般出现,如智能电视、扫地机器人、智能冰箱等等,但鲜有人关注与日常生活接触较少的领域,更别说将智能技术应用于此。根据我们小组的调研,我们了解到在仓库设备方面的技术还相对原始,例如手动开关铁闸门、手动开关灯等等。同时,通过往年的新闻,我们还发现由于相对落后的开关门技术,往往会有员工疏忽大意,导致利益的损失。
项目运作的可行性
我们的项目实现了智能开关仓库门、仓库灯的功能,同时保证了员工的生命安全以及最大可能降低了仓库利益的损失,该项目技术不需要过多的资源便可实现,可以大范围地运用到每一个仓库当中。
项目的优势分析
低成本、实用性高、技术难度较低,可兼容各种型号的门与灯等等。
2、总体设计
利用了红外障碍感应器、人体感应器、led灯、蜂鸣器、电机。当人经过门前被红外障碍感应器探知,此时电机启动,门开;led灯亮,蜂鸣器响声一次。人体感应器检测到人在仓库时,led灯常亮。当人离开仓库时,人体感应器感应不到人体,蜂鸣器响声一次, led灯关闭,电机启动,门关。
3、外设选取和引脚连接
外设选取
1)普中STM32F1ZET6开发板
2)步进电机
3)光敏感应器
4)红外人体感应器
5)水位感应器
引脚连接
人体传感器连接PD0口
红外传感器连接PD1口
发光二极管连接PD2口
水位传感器连接PD3口
步进电机四根线分别连接F0、F1、F2、F3
4、系统架构
1、总体架构
2、智能开门
3、智能开灯
4、智能熄灯与关门
5、智能检测水位
5、驱协开发
LED驱动
推挽输出模式
// void ledInit();使用cube自动生成的
__HAL_RCC_GPIOC_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOC, Led1_Pin|Led2_Pin|Led3_Pin|Led4_Pin
|Led5_Pin|Led6_Pin|Led7_Pin|Led8_Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pin = Led1_Pin|Led2_Pin|Led3_Pin|Led4_Pin
|Led5_Pin|Led6_Pin|Led7_Pin|Led8_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// Led.c
#include "Led.h"
void drv_led_on(int no){//打开led
switch(no){
case 1:
GPIOC->BRR = (1uL << 0);
break;
case 2:
GPIOC->BRR = (1uL << 1);
break;
case 3:
GPIOC->BRR = (1uL << 2);
break;
default:
break;
}
}
void drv_led_off(int no){//关闭led
switch(no){
case 1:
GPIOC->BSRR = (1uL << 0);
break;
case 2:
GPIOC->BSRR = (1uL << 1);
break;
case 3:
GPIOC->BSRR = (1uL << 2);
break;
default:
break;
}
}
蜂鸣器驱动
推挽输出模式
// Beep.c
#include "Beep.h"
// 寄存器操作初始化
void Beep_Init_Reg(void)
{
RCC->APB2ENR |= (1uL << 3) ; // 启动PE口的时钟源 设置位高电平
//配置GPIOE的第五号引脚
GPIOB->CRL |= (1uL << 20) | (1uL << 21); // MODE0[1:0] = 11b 输出模式 最大速率50 MHz
GPIOB->CRL &= ~(1uL << 22) | (1uL << 23 ) ; // CNF5[1:0] = 00b 带数字推挽输出
GPIOC->ODR |= 1 << 5; // 将第五号引脚置为一
}
//蜂鸣器响
void Beep_Ring_Reg(void)
{
int a=100;
while(a--)
{
GPIOB->ODR |= 1 << 5;
LOS_TaskDelay(5);
GPIOB->ODR = ~(1 << 5);
LOS_TaskDelay(5);
}
}
步进电机驱动
推挽输出模式
采用了四相八拍,数组zz[]为正转,fz[]为反转
// motor.c
#include "motor.h"
int zz[8]={1,3,2,6,4,12,8,9};//A AB B BC C CD D DA
int fz[8]={8,12,4,6,2,3,1,9};//D DC C CB B BA A AD
void Step_Motor_GPIO_Init(void)
{
RCC->APB2ENR |= (1uL << 7);
GPIOF->CRL |= (1uL << 0) | (1uL << 1);//F0
GPIOF->CRL &= ~(1uL << 2) | (1uL << 3);
GPIOF->CRL |= (1uL << 4) | (1uL << 5);//F1
GPIOF->CRL &= ~(1uL << 6) | (1uL << 7);
GPIOF->CRL |= (1uL << 8) | (1uL << 9);//F2
GPIOF->CRL &= ~(1uL << 10) | (1uL << 11);
GPIOF->CRL |= (1uL << 12) | (1uL << 12);//F3
GPIOF->CRL &= ~(1uL << 14) | (1uL << 15);
}
void delay(){//延时
int i;
for(i=250;i>=0;i--){
for(int j=100;j>=0;j--);
}
}
void motor_front_step(void){//正转
int a=100;
while(a--){
for(int i=0;i<8;i++){
GPIOF->ODR = zz
;
delay();
}
}
}
void motor_rear_step(void){//反转
int a=100;
while(a--){
for(int i=0;i<8;i++){
GPIOF->ODR = fz;
delay();
}
}
}
void motor_overturn_step(void){//正反转
int a=1000;
while(a--){
for(int i=0;i<8;i++){
GPIOF->ODR = zz;
delay();
}
for(int i=0;i<8;i++){
GPIOF->ODR = fz;
delay();
}
}
}
水位感应驱动
// water.c
#include "water.h"
void Water_Init(void){
RCC->APB2ENR |= (1uL << 5);
GPIOD->CRL &= ~(1uL << 12) | (1uL << 13) | (1uL << 15);//PD3口 悬空输入
GPIOD->CRL |= (1uL << 14);
}
int Water_state(void){
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3) == 1){
return 1;
}
return 0;
}
红外人体传感器驱动
#include "sensor.h"
void Sensor_GPIO_Init(){
RCC->APB2ENR |= (1uL << 5);
GPIOD->CRL &= ~(1uL << 0) | (1uL << 1) | (1uL << 3);//PD0口 悬空输入
GPIOD->CRL |= (1uL << 2);
GPIOD->BRR = (1uL << 0);
}
int Sensor_state(){
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_0) == 1){
return 1;
}
return 0;
}
红外光敏感应器驱动
#include "infrared.h"
void Infrared_GPIO_Init(){
RCC->APB2ENR |= (1uL << 5);
GPIOD->CRL &= ~(1uL << 4) | (1uL << 5) | (1uL << 7);//PD1口 悬空输入
GPIOD->CRL |= (1uL << 6);
GPIOD->BRR = (1uL << 0);
}
int Infrared_state(){
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_1) == 1){
return 1;
}
return 0;
}
6、业务层开发
中断
#include "Exti.h"
void EXTIKeyInit(void){
RCC->APB2ENR |= (1uL << 0);
AFIO->EXTICR[0] &= ~(0xF << 12);//选择EXTI3
AFIO->EXTICR[0] |= (4 << 12);
AFIO->EXTICR[1] &= ~(0xF << 0);//选择EXTI4
AFIO->EXTICR[1] |= (4 << 0);
EXTI->IMR |= (3uL << 3);//打开外部中断
EXTI->FTSR |= (3uL << 3);//设置为下降沿触发
HAL_NVIC_SetPriority(EXTI3_IRQn, 7, 0); //设置优先级
HAL_NVIC_SetPriority(EXTI4_IRQn, 8, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn); //使能
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}
void EXTI3_IRQHandler(void){
LOS_TaskDelay(100);
HAL_GPIO_EXTI_IRQHandler(K_DOWN_Pin);
}
void EXTI4_IRQHandler(void){
LOS_TaskDelay(100);
HAL_GPIO_EXTI_IRQHandler(K_RIGHT_Pin);
}
//写在main.c中的
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
LOS_TaskDelay(20);
switch(GPIO_Pin){
case K_LEFT_Pin :
{
motor_front_step();
drv_led_on(1);
Diode_on();
break;
}
case K_DOWN_Pin :
{
motor_rear_step();
drv_led_off(1);
Diode_off();
break;
}
case K_RIGHT_Pin :
{
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_0) == 0){
drv_led_off(1);
Diode_off();
}else{
drv_led_on(1);
Diode_on();
}
break;
}
}
}
轮询
void Key_Flash(void){
Step_Motor_GPIO_Init();
Infrared_GPIO_Init();
Beep_Init_Reg();
Diode_Init();
Water_Init();
int door_state = 0;//门的状态 0为关 1为开
while(1){
if(Infrared_state() == 0 && Sensor_state() == 0 && door_state == 0){
drv_led_on(1);
Diode_on();
motor_front_step();
door_state = 1;
Beep_Ring_Reg();
LOS_TaskDelay(1000);
}else if(Sensor_state() == 1 && door_state == 1){
drv_led_on(1);
Diode_on();
}else if(Sensor_state() == 0 && door_state == 1){
Beep_Ring_Reg();
LOS_TaskDelay(1000);
drv_led_off(1);
Diode_off();
motor_rear_step();
door_state = 0;
}
if(Water_state() == 1){
int a=100;
while(a--){
Diode_on();
Beep_Ring_Reg2();
Diode_off();
Beep_Ring_Reg2();
}
}
}
}
1、项目背景
项目环境背景
随着科技的发展,许多智能产品如雨后春笋般出现,如智能电视、扫地机器人、智能冰箱等等,但鲜有人关注与日常生活接触较少的领域,更别说将智能技术应用于此。根据我们小组的调研,我们了解到在仓库设备方面的技术还相对原始,例如手动开关铁闸门、手动开关灯等等。同时,通过往年的新闻,我们还发现由于相对落后的开关门技术,往往会有员工疏忽大意,导致利益的损失。
项目运作的可行性
我们的项目实现了智能开关仓库门、仓库灯的功能,同时保证了员工的生命安全以及最大可能降低了仓库利益的损失,该项目技术不需要过多的资源便可实现,可以大范围地运用到每一个仓库当中。
项目的优势分析
低成本、实用性高、技术难度较低,可兼容各种型号的门与灯等等。
2、总体设计
利用了红外障碍感应器、人体感应器、led灯、蜂鸣器、电机。当人经过门前被红外障碍感应器探知,此时电机启动,门开;led灯亮,蜂鸣器响声一次。人体感应器检测到人在仓库时,led灯常亮。当人离开仓库时,人体感应器感应不到人体,蜂鸣器响声一次, led灯关闭,电机启动,门关。
3、外设选取和引脚连接
外设选取
1)普中STM32F1ZET6开发板
2)步进电机
3)光敏感应器
4)红外人体感应器
5)水位感应器
引脚连接
人体传感器连接PD0口
红外传感器连接PD1口
发光二极管连接PD2口
水位传感器连接PD3口
步进电机四根线分别连接F0、F1、F2、F3
4、系统架构
1、总体架构
2、智能开门
3、智能开灯
4、智能熄灯与关门
5、智能检测水位
5、驱协开发
LED驱动
推挽输出模式
// void ledInit();使用cube自动生成的
__HAL_RCC_GPIOC_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOC, Led1_Pin|Led2_Pin|Led3_Pin|Led4_Pin
|Led5_Pin|Led6_Pin|Led7_Pin|Led8_Pin, GPIO_PIN_SET);
GPIO_InitStruct.Pin = Led1_Pin|Led2_Pin|Led3_Pin|Led4_Pin
|Led5_Pin|Led6_Pin|Led7_Pin|Led8_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// Led.c
#include "Led.h"
void drv_led_on(int no){//打开led
switch(no){
case 1:
GPIOC->BRR = (1uL << 0);
break;
case 2:
GPIOC->BRR = (1uL << 1);
break;
case 3:
GPIOC->BRR = (1uL << 2);
break;
default:
break;
}
}
void drv_led_off(int no){//关闭led
switch(no){
case 1:
GPIOC->BSRR = (1uL << 0);
break;
case 2:
GPIOC->BSRR = (1uL << 1);
break;
case 3:
GPIOC->BSRR = (1uL << 2);
break;
default:
break;
}
}
蜂鸣器驱动
推挽输出模式
// Beep.c
#include "Beep.h"
// 寄存器操作初始化
void Beep_Init_Reg(void)
{
RCC->APB2ENR |= (1uL << 3) ; // 启动PE口的时钟源 设置位高电平
//配置GPIOE的第五号引脚
GPIOB->CRL |= (1uL << 20) | (1uL << 21); // MODE0[1:0] = 11b 输出模式 最大速率50 MHz
GPIOB->CRL &= ~(1uL << 22) | (1uL << 23 ) ; // CNF5[1:0] = 00b 带数字推挽输出
GPIOC->ODR |= 1 << 5; // 将第五号引脚置为一
}
//蜂鸣器响
void Beep_Ring_Reg(void)
{
int a=100;
while(a--)
{
GPIOB->ODR |= 1 << 5;
LOS_TaskDelay(5);
GPIOB->ODR = ~(1 << 5);
LOS_TaskDelay(5);
}
}
步进电机驱动
推挽输出模式
采用了四相八拍,数组zz[]为正转,fz[]为反转
// motor.c
#include "motor.h"
int zz[8]={1,3,2,6,4,12,8,9};//A AB B BC C CD D DA
int fz[8]={8,12,4,6,2,3,1,9};//D DC C CB B BA A AD
void Step_Motor_GPIO_Init(void)
{
RCC->APB2ENR |= (1uL << 7);
GPIOF->CRL |= (1uL << 0) | (1uL << 1);//F0
GPIOF->CRL &= ~(1uL << 2) | (1uL << 3);
GPIOF->CRL |= (1uL << 4) | (1uL << 5);//F1
GPIOF->CRL &= ~(1uL << 6) | (1uL << 7);
GPIOF->CRL |= (1uL << 8) | (1uL << 9);//F2
GPIOF->CRL &= ~(1uL << 10) | (1uL << 11);
GPIOF->CRL |= (1uL << 12) | (1uL << 12);//F3
GPIOF->CRL &= ~(1uL << 14) | (1uL << 15);
}
void delay(){//延时
int i;
for(i=250;i>=0;i--){
for(int j=100;j>=0;j--);
}
}
void motor_front_step(void){//正转
int a=100;
while(a--){
for(int i=0;i<8;i++){
GPIOF->ODR = zz
;
delay();
}
}
}
void motor_rear_step(void){//反转
int a=100;
while(a--){
for(int i=0;i<8;i++){
GPIOF->ODR = fz;
delay();
}
}
}
void motor_overturn_step(void){//正反转
int a=1000;
while(a--){
for(int i=0;i<8;i++){
GPIOF->ODR = zz;
delay();
}
for(int i=0;i<8;i++){
GPIOF->ODR = fz;
delay();
}
}
}
水位感应驱动
// water.c
#include "water.h"
void Water_Init(void){
RCC->APB2ENR |= (1uL << 5);
GPIOD->CRL &= ~(1uL << 12) | (1uL << 13) | (1uL << 15);//PD3口 悬空输入
GPIOD->CRL |= (1uL << 14);
}
int Water_state(void){
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3) == 1){
return 1;
}
return 0;
}
红外人体传感器驱动
#include "sensor.h"
void Sensor_GPIO_Init(){
RCC->APB2ENR |= (1uL << 5);
GPIOD->CRL &= ~(1uL << 0) | (1uL << 1) | (1uL << 3);//PD0口 悬空输入
GPIOD->CRL |= (1uL << 2);
GPIOD->BRR = (1uL << 0);
}
int Sensor_state(){
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_0) == 1){
return 1;
}
return 0;
}
红外光敏感应器驱动
#include "infrared.h"
void Infrared_GPIO_Init(){
RCC->APB2ENR |= (1uL << 5);
GPIOD->CRL &= ~(1uL << 4) | (1uL << 5) | (1uL << 7);//PD1口 悬空输入
GPIOD->CRL |= (1uL << 6);
GPIOD->BRR = (1uL << 0);
}
int Infrared_state(){
if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_1) == 1){
return 1;
}
return 0;
}
6、业务层开发
中断
#include "Exti.h"
void EXTIKeyInit(void){
RCC->APB2ENR |= (1uL << 0);
AFIO->EXTICR[0] &= ~(0xF << 12);//选择EXTI3
AFIO->EXTICR[0] |= (4 << 12);
AFIO->EXTICR[1] &= ~(0xF << 0);//选择EXTI4
AFIO->EXTICR[1] |= (4 << 0);
EXTI->IMR |= (3uL << 3);//打开外部中断
EXTI->FTSR |= (3uL << 3);//设置为下降沿触发
HAL_NVIC_SetPriority(EXTI3_IRQn, 7, 0); //设置优先级
HAL_NVIC_SetPriority(EXTI4_IRQn, 8, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn); //使能
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
}
void EXTI3_IRQHandler(void){
LOS_TaskDelay(100);
HAL_GPIO_EXTI_IRQHandler(K_DOWN_Pin);
}
void EXTI4_IRQHandler(void){
LOS_TaskDelay(100);
HAL_GPIO_EXTI_IRQHandler(K_RIGHT_Pin);
}
//写在main.c中的
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
LOS_TaskDelay(20);
switch(GPIO_Pin){
case K_LEFT_Pin :
{
motor_front_step();
drv_led_on(1);
Diode_on();
break;
}
case K_DOWN_Pin :
{
motor_rear_step();
drv_led_off(1);
Diode_off();
break;
}
case K_RIGHT_Pin :
{
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_0) == 0){
drv_led_off(1);
Diode_off();
}else{
drv_led_on(1);
Diode_on();
}
break;
}
}
}
轮询
void Key_Flash(void){
Step_Motor_GPIO_Init();
Infrared_GPIO_Init();
Beep_Init_Reg();
Diode_Init();
Water_Init();
int door_state = 0;//门的状态 0为关 1为开
while(1){
if(Infrared_state() == 0 && Sensor_state() == 0 && door_state == 0){
drv_led_on(1);
Diode_on();
motor_front_step();
door_state = 1;
Beep_Ring_Reg();
LOS_TaskDelay(1000);
}else if(Sensor_state() == 1 && door_state == 1){
drv_led_on(1);
Diode_on();
}else if(Sensor_state() == 0 && door_state == 1){
Beep_Ring_Reg();
LOS_TaskDelay(1000);
drv_led_off(1);
Diode_off();
motor_rear_step();
door_state = 0;
}
if(Water_state() == 1){
int a=100;
while(a--){
Diode_on();
Beep_Ring_Reg2();
Diode_off();
Beep_Ring_Reg2();
}
}
}
}
举报