需求:做一个感应垃圾桶,10cm以内开盖、按下键一开盖、震动开盖,并在开盖时发出声音。
需求一:10cm以内开盖
做到10cm以内开盖,我们这里使用超声波测距传感器(超声波测距传感器认知_dxdlnu的博客-CSDN博客),不清楚超声波原理的可以看上面链接。首先我们需要让Trig发送一个10us的高电平唤醒超声波测距传感器,我们给它封装一个函数。
唤醒只是第一步,然后我们要实现测距功能,距离=时间*速度(340m/s)。时间怎么算,根据Echo口发送波到接收波的时间(也就是高电平持续时间),因为需要算时间,我们设置一个定时器1。
然后根据Echo高电平时间实现如下代码。
get_distance函数写完,我们测距的功能就已经实现了,接下来,我们要分情况在main函数中判断距离,如果距离<10,开盖。开盖、关盖的代码如下:
我们是通过舵机实现物理上的开盖的,所以舵机的代码实现一并发出:
舵机相关知识:初识PWM_dxdlnu的博客-CSDN博客
这里我们使用到了中断寄存器,为了保证时刻我们靠近超声波测距传感器时垃圾桶都会立马开盖,我们用它统计爆表次数,来控制舵机的角度。
使用舵机前要设置定时器,0.5ms爆表一次,并打开中断。
目前阶段的主函数如下:
别忘了初始化舵机角度为0度:
需求二:按下键一开盖
简单的两个操作。
需求三:震动开盖
这里用到我们之前说过的震动传感器(震动传感器使用_dxdlnu的博客-CSDN博客),根据单片机原理图:
由于震动是一瞬间的事,可能与其他程序发生冲突,我们这时候就需要,震动的时候中断其他操作,所以我们加上外部中断
并稍微修改主函数内容
需求四:添加滴滴声
无论使用哪种方式开盖,我们都需要得到一个反馈,这个反馈就是通过蜂鸣器发出滴滴声。