1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 单片机毕设 基于单片机的智能感应垃圾桶设计与实现 - 嵌入式 - 物联网

单片机毕设 基于单片机的智能感应垃圾桶设计与实现 - 嵌入式 - 物联网

时间:2022-09-15 08:42:12

相关推荐

单片机毕设 基于单片机的智能感应垃圾桶设计与实现 - 嵌入式 - 物联网

文章目录

1 简介2 绪论2.1 课题背景与目的 3 系统设计3.1 系统架构3.2 硬件部分3.2.1 传感器模块3.2.2 语音模块3.2.3 电机及其驱动模块3.2.4 稳压模块 3.3 软件部分3.3.1 自动翻盖子程序设计 3.4 实现效果3.5 部分相关代码 4 最后

1 简介

Hi,大家好,学长今天向大家介绍一个 单片机项目

基于单片机的智能感应垃圾桶设计与实现

大家可用于 课程设计 或 毕业设计

2 绪论

2.1 课题背景与目的

学长设计的系统主要使用 STC89C52 单片机为基础设计并开发一个智能垃圾桶系统。该系统实现智能开盖, 垃圾装满语音报警的功能。设计主要以单片机为控制中心,通过红外传感器检测探测范围内有人与否, 如果有, 经过单片机控制启动步进电机, 打开桶盖, 再经过延时设定时刻后, 自动关闭垃圾桶盖。 步进电机通过线的正反缠绕实现桶盖的开启与关闭。 通过红外对管模块, 检测垃圾桶内的垃圾高度超过限定高度与否, 如果装满, 单片机控制语音播放芯片, 喇叭播放语音提示人们处理垃圾。

3 系统设计

这次学长设计的主要使用 STC89C52 单片机为基础设计并开发一个智能垃圾桶系统。该系统实现智能开盖, 垃圾装满语音报警的功能。

设计主要以单片机为控制中心,通过红外传感器检测探测范围内有人与否, 如果有, 经过单片机控制启动步进电机, 打开桶盖, 再经过延时设定时刻后, 自动关闭垃圾桶盖。 步进电机通过线的正反缠绕实现桶盖的开启与关闭。 通过红外对管模块, 检测垃圾桶内的垃圾高度超过限定高度与否, 如果装满, 单片机控制语音播放芯片, 喇叭播放语音提示人们处理垃圾。

主要内容包括:

人体检测功能 步进电机驱动电路的设计 垃圾高度检测功能 语音播放报警功能

3.1 系统架构

整个由单片机系统、红外对管传感器模块、电机驱动模块、语音报警模块、稳压模块组成。 两个红外对管传感器模块作为单片机主要的信号输入源, 单片机处理输入信号后, 将控制信号输出到电机驱动模块和语音模块, 完成本系统的设计功能。

稳压模块则是在使用非 USB 供电时, 使系统的输入电压保持在 5V, 是保证工作时系统的稳定性所必须的模块。

通过人体检测模块中的红外对管传感器检测出有人, 把此信号传输给单片机,单片机收到该信号处理后控制电机驱动模块进行开盖, 人离开后经延时一段时间后自动关盖。 当垃圾高度达到设定高度时, 垃圾检测模块中的红外对管传感器发送信号至单片机, 单片机接收处理后控制语音模块播放语音报警。 结构框图如图所示。

3.2 硬件部分

3.2.1 传感器模块

常用的用于检测判断移动物体的传感器有热释电传感器、 红外对管传感器和超声波传感器。 热释电传感器广泛应用人体检测, 比如楼道感应灯, 但对人体的移动方向有要求, 平行于传感器方向移动灵敏度最高。和热释电红外传感器对比,红外对管传感器能够检测的最小距离相对小, 反应灵敏, 且不易受环境光干扰而产生误输出。 而超声波测距模块价格较高且感应角度不大于 15 度, 使用条件非常有限。

3.2.2 语音模块

语音模块常用 ISD 系列产品, 比如 ISD1820 和 ISD4004。 ISD4004 模块需要扩展很多外围电路并需要使用额外单片机进行语音录制存储, 增加了电路的复杂度。 ISD1820 是美国 ISD 公司推出一种单片 8~20 秒语音录制兼播放芯片, 它的基本结构与 1110、 1420 系列完全相同, 只能录放一段语音。

3.2.3 电机及其驱动模块

由于该系统需要控制垃圾桶的开盖及开盖角度, 直流电机只能通过通电时间和电流极性来控制其工作, 不适合搭配单片机使用, 而步进电机可以很简单精确地控制其输出轴旋转角度以及方向。 步进电机可分反应式、 永磁式和混合式三种, 永磁式步进电机输出力矩足够本设计所需且动态性能较好。 所以本设计使用反应式来驱动垃圾桶开盖。

3.2.4 稳压模块

中单片机所工作电压为 5V, 其他模块也均可以在 5V 电压下运行,即需要将 7.5V 直流电源降压为 5V 输入电压。 由于本次设计供电电源为 7.5V,LM78 系列压差不能小于 3V, 而且经查资料发现, AMS1117-5.0 型号稳压芯片与LM7805 相比在发热量上相比有很好的降低, 所以本次设计选用 AMS1117-5.0 型号稳压模块。

3.3 软件部分

程序工作流程如下: 红外传感器检测到有人时, 单片机控制步进电机打开桶盖, 传感器模块感应到人离开后, 经延时后垃圾箱盖将自动关闭。 当红外对管传感器检测到垃圾高度超过设定时单片机控制语音模块播放语音报警, 当垃圾被清理后停止报警, 也可手动关闭。

3.3.1 自动翻盖子程序设计

学长使用的是以单双八拍方式工作的五线四相步进电机, 自动翻盖的控制信号输入为检测人体距离的红外对管传感器, 输出信号至步进电机驱动板, 由驱动板直接控制步进电机。

若有人扔垃圾则 1 秒防检测后正转开盖, 人离开后延时3 秒, 反方向旋转相同角度关盖, 通过 delay() 子程序改变步进电机的旋转速度, 通过设置 for 循环的次数来设置步进电机旋转的角度, 从而使桶盖开合合适的角度。 自动翻盖程序流程图如上图所示, 红外 1 传感器指检测是否有人扔垃圾的红外对管传感器。

3.4 实现效果

无人状态下

当周围有人出现后,自动打开垃圾桶

3.5 部分相关代码

//功能: 测试电机驱动功能和电机连线是否正确, 左电机反转, 右电机正转, 电机转速由小到大。int INA = 4; //电机 A 正反转控制端int PWMA = 5; //电机 A 调速端int INB = 7; //电机 B 正反转控制端int PWMB = 6; //电机 B 调速端void setup(){pinMode(INA,OUTPUT);pinMode(INB,OUTPUT); //配置电机输出 IO 口为输出}void loop(){int value;for(value = 20 ; value <= 255;value+=2){//循环每次速度增加 2 最大到 255motosp(-value,value);//电机速度赋值, 左电机负值为反转, 右电机正转。delay(50);}}void motosp(int sp1,int sp2)//声明电机速度控制函数。 括号内定义的变量分别为左右电机速{if(sp1>0) {digitalWrite(INA, HIGH);}else{digitalWrite(INA, LOW);}if(sp2>0){digitalWrite(INB, HIGH);}else{digitalWrite(INB, LOW);}analogWrite(PWMA,abs (sp1));analogWrite(PWMB,abs (sp2));}//红外感应模块:int Sensor = 2;int ina = 13;void setup() {pinMode(ina, OUTPUT); //13 引脚定义为输出Serial.begin(9600); //设置下载程序的串口的波特率为 9600pinMode(Sensor, INPUT); //2 引脚定义为输入}void loop() {int SensorState = digitalRead(Sensor);//读取 2 引脚的电平while(SensorState == 1){SensorState = digitalRead(Sensor); //2 引脚为高电平时, 设置 13 引脚为高digitalWrite(ina,HIGH);delay(1000); //延时 1000ms}while(SensorState == 0){//当 2 引脚为低电平时, 设置 13 引脚为低SensorState = digitalRead(Sensor);digitalWrite(ina,LOW);}delay(100); //延时 100ms}// 避障模块:int Sensor1 = 2;int Sensor2 = 4 ;int ina = 13;int inb = 12;void setup() {pinMode(ina, OUTPUT); //定义输入、 输出引脚pinMode(inb, OUTPUT);Serial.begin(9600);pinMode(Sensor1, INPUT);pinMode(Sensor2, INPUT);}void loop() {int SensorState1 = digitalRead(Sensor1);//读取数据int SensorState2 = digitalRead(Sensor2);boolean Write = true; //定义布尔变量boolean Black = true;if(SensorState1 == 1){Write = false;}if(SensorState2 == 1){Black = false;}if(Write && Black){//当量输入引脚同时为高时, 两输出引脚为高digitalWrite(ina,HIGH);digitalWrite(inb,HIGH);delay(1000);}digitalWrite(ina,LOW); //复位digitalWrite(inb,LOW);delay(100);}

4 最后

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。