目录
前言
智能垃圾桶设计是物联网技术在环保领域的重要应用之一。随着我国城市化进程的加快,垃圾处理问题日益凸显。传统的垃圾桶存在分类不明确、满载率高、清理不及时等问题,给城市管理带来了诸多困扰。基于此,本文旨在探讨基于STM32F103C8T6的智能垃圾桶设计。
STM32F103C8T6是一款高性能、低成本的32位ARM Cortex-M3微控制器,具有丰富的外设资源和强大的处理能力。将其应用于智能垃圾桶设计,具有以下优势:
1. 实现垃圾分类:通过搭载各类传感器,智能垃圾桶能够自动识别垃圾种类,引导用户进行正确投放,提高垃圾分类效果。
2. 智能满载检测:利用传感器实时监测垃圾桶内垃圾的满载程度,当达到设定阈值时,自动发送清运请求,提高清理效率。
3. 网络化管理:通过无线通信技术,将智能垃圾桶与城市管理平台连接,实现垃圾桶状态的实时监控和远程调度。
4. 节能环保:采用太阳能供电方式,降低能源消耗,符合绿色环保理念。
5. 互动性强:可通过人机交互界面与用户进行互动,提高用户参与垃圾分类的积极性。
本文将详细介绍基于STM32F103C8T6的智能垃圾桶的设计原理、硬件选型、软件编程及实际应用,为我国垃圾分类和城市管理提供一种新型、高效、智能的解决方案。希望通过本文的研究,能为推动我国环保事业的发展贡献力量。
设计背景
1. 城市化进程加速:随着我国经济的快速发展,城市化进程不断加快,城市人口日益增多,生活垃圾产量也随之增加。据统计,我国城市生活垃圾年产量已超过2亿吨,且每年以约10%的速度增长。
2. 垃圾分类政策推广:为了减轻垃圾处理压力,提高资源回收利用率,我国政府大力推广垃圾分类政策。许多城市已经实施了垃圾分类制度,要求居民对生活垃圾进行分类投放。
3. 生态环境保护需求:垃圾处理不当会导致严重的环境污染问题,如土壤污染、水体污染、空气污染等。生态环境保护已成为全球共识,减少垃圾污染,保护生态环境成为迫切需求。
4. 传统垃圾桶的局限性:传统垃圾桶存在分类不明确、满载率高、清理不及时等问题,导致垃圾处理效率低下,严重影响城市环境卫生和居民生活质量。
5. 物联网技术的发展:随着物联网技术的不断成熟,其在各个领域的应用日益广泛。将物联网技术应用于垃圾桶设计,可以实现垃圾桶的智能化、网络化管理,提高垃圾处理效率。
6. 智能硬件普及:近年来,智能硬件市场迅速发展,各类传感器、微控制器等硬件成本不断降低,为智能垃圾桶的设计提供了良好的硬件基础。
基于以上背景,设计一款基于STM32F103C8T6的智能垃圾桶具有以下意义:
- 符合国家政策导向,推动垃圾分类工作的实施;
- 提高垃圾处理效率,减轻城市环境卫生压力;
- 促进资源回收利用,实现绿色可持续发展;
- 提升城市智能化管理水平,为居民提供便捷服务;
- 推动物联网技术在环保领域的应用,具有广泛的市场前景。
因此,基于STM32F103C8T6的智能垃圾桶设计具有重要的现实意义和应用价值。
所需材料
1.全部材料:
LED | LED红灯, LED红灯, LED红灯, LED绿灯, LED红灯 |
LED | LED红灯 |
DC_Socket | 电源插座 |
220uF | 直插电解电容 |
下载口 | 下载口 |
BUTTOM | 按键 |
1k | 电阻 |
KFT DIP-8X8 | 自锁按键 |
JS | 红外对射管--计数 |
SG90 | 舵机 |
STM32F103 | STM32F103 |
SNR8016 | 语音识别模块 |
JDY-31 | 蓝牙 |
2.舵机SG90:
舵机可以在微机电系统和航模中作为基本的输 出执行机构,其简单的控制和输出使得单片机系统非常容易与之接口。舵机是一种位置(角度)伺服的驱动器,适用于 那些需要角度不断变化并可以保持的控制系统。
控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽 度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机 驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
源程序
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
// 假设使用TIM2的通道2来控制舵机
#define SERVO_TIM TIM2
#define SERVO_TIM_CHANNEL TIM_Channel_2
#define SERVO_GPIO_PORT GPIOA
#define SERVO_GPIO_PIN GPIO_Pin_1
// 舵机的PWM频率通常为50Hz
#define SERVO_PWM_FREQ 50
// 定义PWM周期,对应于50Hz的频率(SystemCoreClock为系统时钟频率)
#define SERVO_PWM_PERIOD (SystemCoreClock / (SERVO_PWM_FREQ * 2))
void Servo_Init(void) {
// 使能GPIOA和TIM2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置GPIO为复用推挽输出
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = SERVO_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SERVO_GPIO_PORT, &GPIO_InitStructure);
// 配置TIM2
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = SERVO_PWM_PERIOD - 1; // 自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 0; // 不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInit(SERVO_TIM, &TIM_TimeBaseStructure);
// 配置TIM2的PWM模式
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比为0
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(SERVO_TIM, &TIM_OCInitStructure);
// 使能TIM2的预装载寄存器
TIM_OC2PreloadConfig(SERVO_TIM, TIM_OCPreload_Enable);
// 使能TIM2
TIM_Cmd(SERVO_TIM, ENABLE);
}
void Servo_SetAngle(float angle) {
// 将角度转换为PWM占空比
// 假设舵机的脉宽范围是1ms到2ms,对应0度到180度
int pulse_width = (int)((angle / 180.0) * (2000 - 1000) + 1000);
// 计算占空比
int duty_cycle = (int)((float)pulse_width / 20000.0 * SERVO_PWM_PERIOD);
// 更新TIM2的捕获比较寄存器
TIM_SetCompare2(SERVO_TIM, duty_cycle);
}
int main(void) {
// 系统初始化
SystemInit();
// 初始化舵机控制
Servo_Init();
// 设置舵机角度为90度
Servo_SetAngle(90.0);
while (1) {
// 这里可以添加代码来改变舵机的角度
// 例如,每1秒改变一次角度
for (float angle = 0.0; angle <= 180.0; angle += 10.0) {
Servo_SetAngle(angle);
for (int i = 0; i < 1000000; i++); // 简单的延时
}
}
}
3.蓝牙模块
JDY-31 蓝牙基于蓝牙 3.0 SPP 设计,这样可以支持 Windows、Linux、android 数据透传, 工作频段 2.4GHZ,调制方式 GFSK,最大发射功率 8db,最大发射距离 30 米,支持用户通过 AT 命令修改设备名、波特率等指令,方便快捷使用灵活。
4.红外对射管
描述
对射型光电开关:由发射器和接收器组成,结构上是两者相互分离的,在光束被中断的情况下会产生一个开关信号变化,典型的方式是位于同一轴线上的光电开关可以相互分开达50米。
特征:辨别不透明的反光物体;有效距离大,因为光束跨越感应距离的时间仅一次;不易受干扰,可以可靠合适的使用在野外或者有灰尘的环境中;装置的消耗高,两个单元都必须敷设电缆。
对射式光电开关工作原理
对射式光电开关由发射器和接收器组成,其工作原理是:通过发射器发出的光线直接进入接收器,当被检测物体经过发射器和接收器之间阻断光线时,光电开关就产生开关信号。
对射式光电开关包含在结构上相互分离且光轴相对放置的发射器和接收器,发射器发出的光线直接进入接收器。当被检测物体经过发射器和接收器之间且阻断光线时,光电开关就产生了开关信号。当检测物体是不透明时,对射式光电开关是最可靠的检测模式。
PCB及原理图
buf
部分代码(完整代码见文章末尾)
main.c
#include "sys.h"
#include "stdio.h"
#include "string.h"
#include "delay.h"
#include "gpio.h"
#include "key.h"
#include "usart.h"
#include "motor_duoji.h"
/**********************************
变量定义
**********************************/
uint8_t key_num = 0; //按键扫描标志位
uint32_t time_num = 0; //10ms计时
uint8_t flag_waste_1 = 0; //可回收垃圾桶标志位
uint8_t flag_waste_2 = 0; //厨余垃圾桶标志位
uint8_t flag_waste_3 = 0; //有害垃圾桶标志位
uint8_t flag_waste_4 = 0; //其他垃圾桶标志位
extern uint8_t usart2_buf[64]; //串口2接收数组
/**********************************
函数声明
**********************************/
void Key_function(void); //按键函数
void Monitor_function(void); //监测函数
void Manage_function(void); //处理函数
/****
******* 主函数
*****/
int main()
{
Delay_Init(); //延时初始化
Gpio_Init(); //IO初始化
Key_Init(); //按键初始化
Motor_Duoji_Init(); //舵机初始化
Motor_Duoji2_Init(); //舵机初始化
Usart1_Init(9600); //串口1初始化
Usart2_Init(9600); //串口2初始化
TIM_SetCompare1(TIM1,1850); //PWM输出
Delay_ms(100); //延时100ms
TIM_SetCompare4(TIM1,1850); //PWM输出
Delay_ms(100); //延时100ms
TIM_SetCompare1(TIM2,1850); //PWM输出
Delay_ms(100); //延时100ms
TIM_SetCompare2(TIM2,1850); //PWM输出
Delay_ms(100); //延时100ms
while(1)
{
Key_function(); //按键函数
Monitor_function(); //监测函数
Manage_function(); //处理函数
Delay_ms(10); //延时10ms
time_num++; //计时变量+1
if(time_num >= 5000)
{
time_num = 0;
}
}
}
/****
*******按键函数
*****/
void Key_function(void)
{
key_num = Chiclet_Keyboard_Scan(0); //按键扫描
if(key_num != 0) //有按键按下
{
switch(key_num)
{
case 1: //按键1:控制可回收垃圾桶打开
TIM_SetCompare1(TIM2,1900); //打开
Delay_ms(1000); //延时2s
Delay_ms(1000);
TIM_SetCompare1(TIM2,1850); //关闭
break;
case 2: //按键2:控制厨余垃圾桶打开
TIM_SetCompare2(TIM2,1900); //打开
Delay_ms(1000); //延时2s
Delay_ms(1000);
TIM_SetCompare2(TIM2,1850); //关闭
break;
case 3: //按键3:控制有害垃圾桶打开
TIM_SetCompare1(TIM1,1900); //打开
Delay_ms(1000); //延时2s
Delay_ms(1000);
TIM_SetCompare1(TIM1,1850); //关闭
break;
case 4: //按键4:控制其他垃圾桶打开
TIM_SetCompare4(TIM1,1900); //打开
Delay_ms(1000); //延时2s
Delay_ms(1000);
TIM_SetCompare4(TIM1,1850); //关闭
break;
default:
break;
}
}
}
/****
*******监测函数
*****/
void Monitor_function(void)
{
if(USART2_WaitRecive() == 0) //如果收到数据
{
if(usart2_buf[0] == 0x01) //收到语音指令是“废纸|塑料瓶|可回收垃圾”,控制可回收垃圾桶打开
{
TIM_SetCompare1(TIM2,1900); //打开
Delay_ms(1000); //延时2s
Delay_ms(1000);
TIM_SetCompare1(TIM2,1850); //关闭
USART2_Clear(); //清空缓存
}
else if(usart2_buf[0] == 0x02) //收到语音指令是“剩饭|骨头|厨余垃圾”,控制厨余垃圾桶打开
{
TIM_SetCompare2(TIM2,1900); //打开
Delay_ms(1000); //延时2s
Delay_ms(1000);
TIM_SetCompare2(TIM2,1850); //关闭
USART2_Clear(); //清空缓存
}
else if(usart2_buf[0] == 0x03) //收到语音指令是“灯泡|有害收垃圾”,控制有害收垃圾桶打开
{
TIM_SetCompare1(TIM1,1900); //打开
Delay_ms(1000); //延时2s
Delay_ms(1000);
TIM_SetCompare1(TIM1,1850); //关闭
USART2_Clear(); //清空缓存
}
else if(usart2_buf[0] == 0x04) //收到语音指令是“木头|其他垃圾”,控制其他垃圾桶打开
{
TIM_SetCompare4(TIM1,1900); //打开
Delay_ms(1000); //延时2s
Delay_ms(1000);
TIM_SetCompare4(TIM1,1850); //关闭
USART2_Clear(); //清空缓存
}
}
}
/****
*******处理函数
*****/
void Manage_function(void)
{
if(IR_1 == 1) //可回收垃圾桶装满,红灯亮,并通过蓝牙发送"可回收垃圾桶已满"
{
Delay_ms(1000);
if(IR_1 == 1)
{
LED1_G = 1;
LED1_R = 0;
if(flag_waste_1)
{
UsartPrintf(USART1,"可回收垃圾桶已满\r\n");
flag_waste_1 = 0;
}
}
}
else //未装满,绿灯亮
{
LED1_G = 0;
LED1_R = 1;
flag_waste_1 = 1;
}
if(IR_2 == 1) //厨余垃圾桶装满,红灯亮,并通过蓝牙发送"厨余垃圾桶已满"
{
Delay_ms(1000);
if(IR_2 == 1)
{
LED2_G = 1;
LED2_R = 0;
if(flag_waste_2)
{
UsartPrintf(USART1,"厨余垃圾桶已满\r\n");
flag_waste_2 = 0;
}
}
}
else //未装满,绿灯亮
{
LED2_G = 0;
LED2_R = 1;
flag_waste_2 = 1;
}
if(IR_3 == 1) //有害垃圾桶装满,红灯亮,并通过蓝牙发送"有害垃圾桶已满"
{
Delay_ms(1000);
if(IR_3 == 1)
{
LED3_G = 1;
LED3_R = 0;
if(flag_waste_3)
{
UsartPrintf(USART1,"有害垃圾桶已满\r\n");
flag_waste_3 = 0;
}
}
}
else //未装满,绿灯亮
{
LED3_G = 0;
LED3_R = 1;
flag_waste_3 = 1;
}
if(IR_4 == 1) //其他垃圾桶装满,红灯亮,并通过蓝牙发送"其他垃圾桶已满"
{
Delay_ms(1000);
if(IR_4 == 1)
{
LED4_G = 1;
LED4_R = 0;
if(flag_waste_4)
{
UsartPrintf(USART1,"其他垃圾桶已满\r\n");
flag_waste_4 = 0;
}
}
}
else //未装满,绿灯亮
{
LED4_G = 0;
LED4_R = 1;
flag_waste_4 = 1;
}
}
经验总结
基于STM32F103C8T6的智能垃圾桶设计是一个综合性的工程项目,涉及硬件设计、软件编程、系统集成和实际应用等多个方面。以下是一些设计经验总结,供参考:
硬件设计方面:
1. 传感器选择:
- 选择合适的传感器是关键。例如,对于重量检测,应选择高精度、高稳定性的重量传感器。
- 考虑传感器的功耗、尺寸和接口兼容性。
2. 电源管理:
- 由于智能垃圾桶可能部署在户外,电源管理非常重要。可以考虑使用太阳能电池板结合电池方案。
- 设计电源管理系统时,要确保电源转换效率高,有过充过放保护。
3. 防护措施:
- 垃圾桶的硬件部分需要有一定的防护措施,以适应各种恶劣环境,如防水、防尘、防腐蚀等。
4. 通信模块:
- 根据应用场景选择合适的通信模块,如Wi-Fi、蓝牙、NB-IoT等,确保数据传输的稳定性和可靠性。
软件编程方面:
1. 固件优化:
- 优化代码结构,减少资源占用,提高固件的执行效率。
- 考虑使用状态机或事件驱动的方式来管理程序流程。
2. 算法精确性:
- 对于垃圾分类和满载检测,算法的精确性至关重要。需要通过大量实验数据来训练和优化算法。
3. 错误处理:
- 在软件中实现健壮的错误处理机制,确保系统在出现异常时能够自动恢复或报告错误。
4. 用户交互:
- 设计直观易用的用户界面,提供清晰的指示和反馈。
系统集成方面:
1. 模块化设计:
- 采用模块化设计,便于后期维护和升级。
2. 兼容性和扩展性:
- 系统设计时考虑兼容性和扩展性,以便未来可以添加更多功能或与其他系统集成。
3. 测试验证:
- 在系统集成后进行充分的测试,包括功能测试、性能测试、稳定性测试等。
实际应用方面:
1. 用户习惯培养:
- 在实际部署时,需要考虑如何培养用户使用智能垃圾桶的习惯。
2. 维护和运营:
- 设计易于维护的系统,并制定合理的运营策略。
3. 环境适应性:
- 考虑智能垃圾桶在不同环境下的适应性,如温度、湿度、光照等。
4. 法规遵守:
- 确保设计符合当地的法律法规和环保要求。
通过上述经验总结,可以在设计基于STM32F103C8T6的智能垃圾桶时避免一些常见问题,提高项目的成功率。
注:完整代码通过网盘分享的文件:3-实物程序
链接: https://pan.baidu.com/s/1Md9I4eNs7-ysFvFoZyGVJA?pwd=vjvu 提取码: vjvu
------------------------------每天不定时分享,大佬们点点关注吧!!!!!------------------------