当前位置: 首页 > news >正文

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函数主要代码如下:

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哈哈~

http://www.lryc.cn/news/173242.html

相关文章:

  • 【C++面向对象侯捷下】2.转换函数 | 3.non-explicit-one-argument ctor
  • UOS Deepin Ubuntu Linux 开启 ssh 远程登录
  • Postman应用——接口请求和响应(Get和Post请求)
  • Linux查看哪些进程占用的系统 buffer/cache 较高 (hcache,lsof)命令
  • (Vue2)自定义创建项目、ESLint、Vuex
  • LLaMa
  • API(九)基于协程的并发编程SDK
  • JavaWeb 学习笔记 7:Filter
  • 【AI视野·今日Robot 机器人论文速览 第三十五期】Mon, 18 Sep 2023
  • Elasticsearch 在bool查询中使用分词器
  • 在Python中创建相关系数矩阵的6种方法
  • 物联网、工业大数据平台 TDengine 与苍穹地理信息平台完成兼容互认证
  • this.$nextTick()的使用场景
  • idea(第一次)启动项目,端口变成了8080
  • brpc 学习(一)M1 MacOS构建方法
  • Python 与 Qt c++ 程序共享内存,传递图片
  • 【2023年中国研究生数学建模竞赛华为杯】E题 出血性脑卒中临床智能诊疗建模 问题分析、数学模型及代码实现
  • 2024字节跳动校招面试真题汇总及其解答(五)
  • 如何撤销某个已经git add的文件以及如何撤销所有git add提交的文件?
  • JVM高级性能调试
  • APK的反编译,签名,对齐
  • Django(20):信号机制
  • 31.链表练习题(2)(王道2023数据结构2.3.7节16-25题)
  • 排序算法之归并排序
  • macOS 下 Termius 中文显示为乱码
  • Apifox接口测试工具详细解析
  • Python 实现 PDF 文件转换为图片 / PaddleOCR
  • 【Java基础夯实】变量声明选择包装类还是基本类型有哪些讲究?
  • 获取唯一的短邀请码
  • 大词表语言模型在续写任务上的一个问题及对策