• stm32之智能垃圾桶实战


    之前用过51做过一个垃圾桶的小项目,这里用32重新搞了一下。视频的效果和之前一样,可参考这个垃圾桶效果 。

    一、项目描述(同51)

    项目主要是模拟不用手动打开垃圾桶盖,而进行自动操作。自动打开的条件如下:

    • 1、垃圾桶检测到有人靠时自动打开桶盖
    • 2、发生震动时会自动打开
    • 3、可以手动按下按钮打开

    二、项目用到的模块(同51)

    1. HC-SR04(超声波模块)
    2. SG90(舵机模块)
    3. MH-sensor-series(振动传感器)
    4. 蜂鸣器,一个指示灯

    三,模拟引脚配置说明

    • HC-SR04trig <---> PB6(output), echo <---> PB7(input),TIM2 用于定时
    • SG90:PWM(黄色线) <---> PB9(TIM_CH4)
    • MH-sensor-series: D0<--->PB5(外部中断)
    • key: PA0(外部中断)
    • led1: PB8

    下面是大致的配置说明

    四、代码

    完整代码

    main函数主要代码如下:

    1. int opened = 0;
    2. //使用TIM2来做us级延时函数
    3. void TIM2_Delay_us(uint16_t n_us)
    4. {
    5. /* 使能定时器2计数 */
    6. __HAL_TIM_ENABLE(&htim2);
    7. __HAL_TIM_SetCounter(&htim2, 0);
    8. while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );
    9. /* 关闭定时器2计数 */
    10. __HAL_TIM_DISABLE(&htim2);
    11. }
    12. double getDistance() {
    13. int count = 0;
    14. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
    15. TIM2_Delay_us(20);
    16. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
    17. while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) == GPIO_PIN_RESET);
    18. HAL_TIM_Base_Start(&htim2);
    19. __HAL_TIM_SetCounter(&htim2,0);
    20. while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) == GPIO_PIN_SET);
    21. HAL_TIM_Base_Stop(&htim2);
    22. count = __HAL_TIM_GetCounter(&htim2);
    23. return 340 * 0.000001 * count * 100 / 2;
    24. }
    25. void beep() {
    26. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
    27. HAL_Delay(100);
    28. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
    29. }
    30. /* sg90 -----------------------------------------------*/
    31. void initSG90() {
    32. HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4);
    33. __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 5);
    34. }
    35. void openDusbin() {
    36. __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 15);
    37. HAL_Delay(2000);
    38. }
    39. void closeDusbin() {
    40. __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 5);
    41. opened = 0;
    42. HAL_Delay(150);
    43. }
    44. /* led -----------------------------------------------*/
    45. void openStausLight() {
    46. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
    47. }
    48. void closeStausLight() {
    49. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
    50. }
    51. void tryToOpenDusbin() {
    52. if(opened) {
    53. HAL_Delay(2000);
    54. return;
    55. }
    56. opened = 1;
    57. beep();
    58. openDusbin();
    59. }
    60. void tryToCloseBusbin() {
    61. opened = 0;
    62. closeDusbin();
    63. }
    64. /* key exti -----------------------------------------------*/
    65. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
    66. if(GPIO_Pin == GPIO_PIN_0 || GPIO_Pin == GPIO_PIN_5) {
    67. if(HAL_GPIO_ReadPin(GPIOA, GPIO_Pin) == GPIO_PIN_SET
    68. || HAL_GPIO_ReadPin(GPIOB, GPIO_Pin) == GPIO_PIN_RESET
    69. ) {
    70. openStausLight();
    71. tryToOpenDusbin();
    72. }
    73. }
    74. }
    75. int main(void)
    76. {
    77. double distance;
    78. HAL_Init();
    79. SystemClock_Config();
    80. MX_GPIO_Init();
    81. MX_TIM4_Init();
    82. MX_TIM2_Init();
    83. initSG90();
    84. HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
    85. while (1)
    86. {
    87. distance = getDistance();
    88. if(distance < 10) {
    89. openStausLight();
    90. tryToOpenDusbin();
    91. } else {
    92. closeStausLight();
    93. tryToCloseBusbin();
    94. }
    95. HAL_Delay(100);
    96. }
    97. }
    问题点记录:

    1、CubeMX生成的注释不要手贱随便删除,否则如果配置更改了,重新利用CubeMx生成代码,可能会把之前的代码给删除了。

    2、将stm32 滴答定时器的优先调高(项目里调到最高,默认15最低),同时把外部中断的优先级降低(项目里设置成2,默认是0最高),否则会造成卡死

    3、一个函数的功能不做过于集中,比如项目中的openDusbin,拆成了tryToOpenDusbin(可以加些业务逻辑)+ openDusbin.

    4、keil5 问题,光标输入错乱,F12进不了代码,关闭重新打开工程(O(∩_∩)O哈哈~

  • 相关阅读:
    第三章:Spring常用注解解释
    分类预测 | MATLAB实现SSA-CNN-LSTM麻雀算法优化卷积长短期记忆神经网络数据分类预测
    高通平台常见缩写
    猴子也能学会的jQuery第十期——jQuery元素操作(下)
    【ai】李沐 动手深度学学v2 环境安装:anaconda3、pycharm、d2
    【C语法学习】25 - strncpy()函数
    【信号去噪】基于硬阈值、软阈值、半软阈值、Maxmin阈值、Garrote阈值小波变换实现心音去噪附matlab代码
    【多区域电力系统模型】三区域电力系统的LQR和模糊逻辑控制(Matlab代码实现)
    Python数据攻略-Mongodb数仓无法写入方法汇总
    垃圾图像识别易语言代码
  • 原文地址:https://blog.csdn.net/TSC1235/article/details/132946667