网站建设流程 文档,如何找外包网站来做,阳泉营销型网站建设,华夏建筑工程网之前用过51做过一个垃圾桶的小项目#xff0c;这里用32重新搞了一下。视频的效果和之前一样#xff0c;可参考这个垃圾桶效果 。
一、项目描述#xff08;同51#xff09;
项目主要是模拟不用手动打开垃圾桶盖#xff0c;而进行自动操作。自动打开的条件如下#xff1a…之前用过51做过一个垃圾桶的小项目这里用32重新搞了一下。视频的效果和之前一样可参考这个垃圾桶效果 。
一、项目描述同51
项目主要是模拟不用手动打开垃圾桶盖而进行自动操作。自动打开的条件如下
1、垃圾桶检测到有人靠时自动打开桶盖2、发生震动时会自动打开3、可以手动按下按钮打开
二、项目用到的模块同51
HC-SR04(超声波模块)SG90(舵机模块)MH-sensor-series(振动传感器)蜂鸣器一个指示灯
三模拟引脚配置说明
HC-SR04trig --- PB6(output), echo --- PB7(input),TIM2 用于定时SG90PWM(黄色线) --- PB9(TIM_CH4)MH-sensor-series: D0---PB5(外部中断)key: PA0(外部中断)led1: PB8
下面是大致的配置说明 四、代码
完整代码
main函数主要代码如下
int opened 0;//使用TIM2来做us级延时函数
void TIM2_Delay_us(uint16_t n_us)
{/* 使能定时器2计数 */__HAL_TIM_ENABLE(htim2);__HAL_TIM_SetCounter(htim2, 0);while(__HAL_TIM_GetCounter(htim2) ((1 * n_us)-1) );/* 关闭定时器2计数 */__HAL_TIM_DISABLE(htim2);
}double getDistance() {int count 0;HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);TIM2_Delay_us(20);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) GPIO_PIN_RESET);HAL_TIM_Base_Start(htim2);__HAL_TIM_SetCounter(htim2,0);while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) GPIO_PIN_SET);HAL_TIM_Base_Stop(htim2);count __HAL_TIM_GetCounter(htim2);return 340 * 0.000001 * count * 100 / 2;
}void beep() {HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);HAL_Delay(100);HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
}/* sg90 -----------------------------------------------*/void initSG90() {HAL_TIM_PWM_Start(htim4,TIM_CHANNEL_4);__HAL_TIM_SetCompare(htim4, TIM_CHANNEL_4, 5);
}void openDusbin() {__HAL_TIM_SetCompare(htim4, TIM_CHANNEL_4, 15);HAL_Delay(2000);
}void closeDusbin() {__HAL_TIM_SetCompare(htim4, TIM_CHANNEL_4, 5);opened 0;HAL_Delay(150);
}/* led -----------------------------------------------*/
void openStausLight() {HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
}void closeStausLight() {HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
}void tryToOpenDusbin() {if(opened) {HAL_Delay(2000);return;}opened 1;beep();openDusbin();
}void tryToCloseBusbin() {opened 0;closeDusbin();
}/* key exti -----------------------------------------------*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {if(GPIO_Pin GPIO_PIN_0 || GPIO_Pin GPIO_PIN_5) {if(HAL_GPIO_ReadPin(GPIOA, GPIO_Pin) GPIO_PIN_SET|| HAL_GPIO_ReadPin(GPIOB, GPIO_Pin) GPIO_PIN_RESET) {openStausLight();tryToOpenDusbin();}}
}int main(void)
{double distance;HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_TIM4_Init();MX_TIM2_Init();initSG90();HAL_NVIC_SetPriority(SysTick_IRQn,0,0);while (1){distance getDistance();if(distance 10) {openStausLight();tryToOpenDusbin();} else {closeStausLight();tryToCloseBusbin();}HAL_Delay(100);}
}
问题点记录
1、CubeMX生成的注释不要手贱随便删除否则如果配置更改了重新利用CubeMx生成代码可能会把之前的代码给删除了。
2、将stm32 滴答定时器的优先调高项目里调到最高默认15最低同时把外部中断的优先级降低项目里设置成2默认是0最高否则会造成卡死
3、一个函数的功能不做过于集中比如项目中的openDusbin拆成了tryToOpenDusbin(可以加些业务逻辑 openDusbin.
4、keil5 问题光标输入错乱F12进不了代码关闭重新打开工程O(∩_∩)O哈哈~