Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目
毕业设计 stm32智能语音垃圾分类系统(项目开源)
大家可用于 课程设计 或 毕业设计
项目分享:
https://gitee.com/sinonfin/sharing
学长设计的系统主要使用 stm32单片机为基础设计并开发一个智能垃圾桶系统。该系统实现智能开盖, 垃圾装满语音报警的功能。设计主要以单片机为控制中心,通过红外传感器检测探测范围内有人与否, 如果有, 经过单片机控制启动步进电机, 打开桶盖, 再经过延时设定时刻后, 自动关闭垃圾桶盖。 步进电机通过线的正反缠绕实现桶盖的开启与关闭。 通过红外对管模块, 检测垃圾桶内的垃圾高度超过限定高度与否, 如果装满, 单片机控制语音播放芯片, 喇叭播放语音提示人们处理垃圾。
这次学长设计的主要使用 stm32单片机为基础设计并开发一个智能垃圾桶系统。该系统实现智能开盖, 垃圾装满语音报警的功能。
设计主要以单片机为控制中心,通过红外传感器检测探测范围内有人与否, 如果有, 经过单片机控制启动步进电机, 打开桶盖, 再经过延时设定时刻后, 自动关闭垃圾桶盖。 步进电机通过线的正反缠绕实现桶盖的开启与关闭。 通过红外对管模块, 检测垃圾桶内的垃圾高度超过限定高度与否, 如果装满, 单片机控制语音播放芯片, 喇叭播放语音提示人们处理垃圾。
主要内容包括:
此次语音识别垃圾箱控制系统所要实现的功能包括:语音命令识别功能、垃圾箱自动开关盖功能、语音播报功能、状态指示功能等。实现以上这些功能可以使用户方便投放垃圾,将两者初步隔离,且防止垃圾箱内细菌滋生。设计使用STM32F103C8T6单片机为核心元件。下为系统整体框图。
常用的用于检测判断移动物体的传感器有热释电传感器、 红外对管传感器和超声波传感器。 热释电传感器广泛应用人体检测, 比如楼道感应灯, 但对人体的移动方向有要求, 平行于传感器方向移动灵敏度最高。和热释电红外传感器对比,红外对管传感器能够检测的最小距离相对小, 反应灵敏, 且不易受环境光干扰而产生误输出。 而超声波测距模块价格较高且感应角度不大于 15 度, 使用条件非常有限。
语音模块常用 ISD 系列产品, 比如 ISD1820 和 ISD4004。 ISD4004 模块需要扩展很多外围电路并需要使用额外单片机进行语音录制存储, 增加了电路的复杂度。 ISD1820 是美国 ISD 公司推出一种单片 8~20 秒语音录制兼播放芯片, 它的基本结构与 1110、 1420 系列完全相同, 只能录放一段语音。
由于该系统需要控制垃圾桶的开盖及开盖角度, 直流电机只能通过通电时间和电流极性来控制其工作, 不适合搭配单片机使用, 而步进电机可以很简单精确地控制其输出轴旋转角度以及方向。 步进电机可分反应式、 永磁式和混合式三种, 永磁式步进电机输出力矩足够本设计所需且动态性能较好。 所以本设计使用反应式来驱动垃圾桶开盖。
中单片机所工作电压为 5V, 其他模块也均可以在 5V 电压下运行,即需要将 7.5V 直流电源降压为 5V 输入电压。 由于本次设计供电电源为 7.5V,LM78 系列压差不能小于 3V, 而且经查资料发现, AMS1117-5.0 型号稳压芯片与LM7805 相比在发热量上相比有很好的降低, 所以本次设计选用 AMS1117-5.0 型号稳压模块。
程序工作流程如下: 红外传感器检测到有人时, 单片机控制步进电机打开桶盖, 传感器模块感应到人离开后, 经延时后垃圾箱盖将自动关闭。 当红外对管传感器检测到垃圾高度超过设定时单片机控制语音模块播放语音报警, 当垃圾被清理后停止报警, 也可手动关闭。
学长使用的是以单双八拍方式工作的五线四相步进电机, 自动翻盖的控制信号输入为检测人体距离的红外对管传感器, 输出信号至步进电机驱动板, 由驱动板直接控制步进电机。
若有人扔垃圾则 1 秒防检测后正转开盖, 人离开后延时3 秒, 反方向旋转相同角度关盖, 通过 delay() 子程序改变步进电机的旋转速度, 通过设置 for 循环的次数来设置步进电机旋转的角度, 从而使桶盖开合合适的角度。 自动翻盖程序流程图如上图所示, 红外 1 传感器指检测是否有人扔垃圾的红外对管传感器。
无人状态下
当周围有人出现后,自动打开垃圾桶
//功能: 测试电机驱动功能和电机连线是否正确, 左电机反转, 右电机正转, 电机转速
由小到大。
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 最大到 255
motosp(-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); //设置下载程序的串口的波特率为 9600
pinMode(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);
}
项目分享:
https://gitee.com/sinonfin/sharing