完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
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(); } } } } |
|
|
|
只有小组成员才能发言,加入小组>>
3320 浏览 9 评论
3000 浏览 16 评论
3497 浏览 1 评论
9069 浏览 16 评论
4090 浏览 18 评论
1190浏览 3评论
612浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
603浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2339浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1899浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 23:28 , Processed in 1.496766 second(s), Total 78, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号