欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > STM32-笔记24-智能开关垃圾桶盖

STM32-笔记24-智能开关垃圾桶盖

2025/2/6 2:05:17 来源:https://blog.csdn.net/L_1068/article/details/144847953  浏览:    关键词:STM32-笔记24-智能开关垃圾桶盖

一、模块及接线

 二,项目目的

        以下几个事件触发时,自动开盖,并伴随蜂鸣器短响一声,同时 LED 灯闪烁一下,2秒后自动关盖:

  • 检测到有人靠近
  • 检测到有震动
  • 按下按键 KEY1

实验框图如下:

三、项目前期准备

复制项目文件夹19-串口打印功能,重命名为26-智能感应开关垃圾桶盖项目

打开项目文件

加载文件

main.c

#include "sys.h"
#include "delay.h"
#include "led.h"
#include "uart1.h"
#include "beep.h"
#include "sg90.h"
#include "exti.h"
#include "hcsr04.h"
#include "key.h"
#define OPEN 1
#define CLOSE 0uint8_t dustbin_status = CLOSE;void open_dustbin(void)//开盖{if(dustbin_status == CLOSE)//当垃圾桶盖的状态为关盖的时候,执行下面的代码{sg90_angle_set(180);//开盖度数beep_ON();led1_ON();delay_ms(100);beep_OFF();led1_OFF();dustbin_status = OPEN;//将垃圾痛盖的状态改为开盖}}
void close_dustbin(void)//关盖{sg90_angle_set(0);beep_OFF();led1_OFF();dustbin_status = CLOSE;//垃圾桶盖的状态为关盖}int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */led_init();//初始化led灯uart1_init(115200);beep_init();key_init();exti_init();sg90_init();hcsr04_init();uint8_t key_num = 0;while(1){ key_num = key_scan();if(key_num == 1 || vibrate_flag_get() == TRUE || hcsr04_get_lenght() < 10){open_dustbin();delay_ms(2000);vibrate_flag_set(FALSE);}else{close_dustbin();}delay_ms(10);}
}

在代码中出现的bug

1、问题:当手一直放在超声波前面的时候,每隔2秒蜂鸣器会响一下

原因:因为在有物品挡在超声波前面的时候,垃圾桶盖就会开盖,开盖两秒,蜂鸣器响一声,然后就会继续进入if语句判断,由于物品孩还在超声波前面,所以垃圾桶盖依旧会开盖两面,蜂鸣器再次响一声,如此循环

解决办法:

定义一个垃圾桶盖开关状态位

初始化状态位为关盖状态,当有物品挡在超声波前面的时候,调用开盖函数,在开盖函数中判断状态位是否是CLOSE状态,如果是,则执行开盖函数,否则不执行,此时这里状态位是CLOSE所以,执行开盖函数,并且把状态位置为OPEN,在下次执行if语句的时候,如果满足if里的条件,则会调用开盖函数,但是由于状态位为OPEN,所以此时不会执行开盖函数中的代码。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com