文章目录
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);
}
🧿 项目分享:
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:
我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow
我已经使用Apartment设置了一个Rails5应用程序(1.2.0)和Devise(4.2.0)。由于某些DDNS问题,应用只能在app.myapp.com下访问(请注意子域app)。myapp.com重定向到app.myapp.com。我的用例是每个注册该应用的用户(租户)都应该通过他们的子域(例如tenant.myapp.com)访问他们的特定数据。用户不应限定在其子域内。基本上应该可以从任何子域登录。重定向到租户的正确子域由ApplicationController处理。根据Devise标准,登录页面位于app.myapp.com/users/sign_in。这就是问题开始的
我在关注RyanbatesRailsCast的devise和omniauth(第235集-devise-and-omniauth-revised)。当我尝试使用Twitter登录时,标题中不断出现错误。defself.new_with_session(params,session)ifsession["devise.user_attributes"]new(session["devise.user_attributes"],without_protection:true)do|user|user.attributes=paramsuser.valid?end完整跟踪:C:/Ruby20
前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型