本帖最后由 红墙白雪 于 2023-3-2 23:28 编辑
#技术资源# #申请原创# 基于CH32V307的智能垃圾桶及其信息系统
一、项目简介
本设计是一个智能垃圾桶及其信息管理系统,主要解决了一些卫生和管理的问题。第一个问题是人与垃圾桶接触和垃圾分类的问题,利用语音识别来自动开启对应的垃圾桶盖;第二个问题是远离市电地方投放垃圾桶问题,我们采用太阳能电池板供电;第三个问题是垃圾及时清运和垃圾桶合理配置问题,我们采用光电传感器检测每个单体垃圾桶是否满,一旦满了就通过板载的以太网模块或WiFi模块给物联网平台发送数据,利用手机APP通知清运者,提升垃圾桶清运更换时间,并且记录垃圾桶开盖次数,利用此数据分析同一区域范围人丢垃圾的活动规律,优化垃圾桶的投放配置。
二、硬件设计
模块选择及应用
CH32V305/7系列是基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度。加入单精度浮点指令集,扩充堆栈区,具有更高的运算性能。扩展串口UART数量到8组,电机定时器到4组。提供USB2.0高速接口(480Mbps)并内置了PHY收发器,以太网MAC升级到千兆并集成了10M-PHY模块。
使用红外热释电传感器是为了出于对减少语音模块受到来自外界的干扰以及减少功耗,即只有检测到人时语音模块才会被正常唤醒,其余时刻处于休眠状态。语音识别模块监测外界的语音输入并进行语音识别,并将识别结果通过串口传到MCU中,MCU将根据接收到的指令进行后续的操作。
舵机采用MG995模块,它位于垃圾桶的翻盖处,当MCU发送动作指令后,舵机将会旋转从而打开桶盖,并在垃圾投递结束后复位舵机关闭桶盖。作为智能垃圾桶的动作执行模块,在智能垃圾桶中它的主要作用是接收MCU发送的动作指令,并根据相应的指令打开对应的垃圾桶做到垃圾的精准分类。
本次设计所采用的供电电源为锂电池,在充电模块中通过安置在桶盖的太阳能板将太阳能转换为电能并利用充电升压电源板保护锂电池充电,以此达到减少能源消耗和低碳的效果。
WiFi模块采用ESP8266芯片,将智能垃圾桶连接到WiFi无线网络之中,是实现阿里云平台和APP上数据显示的关键步骤。在本次设计中,ESP8266采用MQTT协议将MCU中的实时数据上传至阿里云平台,再通过阿里云平台将数据流转至智能垃圾检测终端APP中,实现智能垃圾桶数据的远距离传输。传输的数据主要为各个垃圾桶的状态和截至当前时刻的人流量。
智能垃圾桶的容量感知采用E18-D80NK光电传感器模块,智能垃圾桶将检测距离调整至3cm并在检测到容量已满时进行多次检测以提高智能垃圾桶的精准性和准确性。
扩展板电路介绍
为了方便各模块与开发板连接,我们制作了一块扩展板,可以扣在开发板上面,然后插上各模块。
实物图如下图所示:
PCB如下图所示:
原理图如下图所示:
扩展排母是与开发板的各个信号线,电源线的排针连接;升压电路是将锂电池的电压升至12V给舵机供电;垃圾桶接口是和各个垃圾桶接线,进行供电以及进行信号传输;热释电传感器接口是接热释电传感器;ESP8266接口接ESP8266模块;语音模块接口接语音识别模块;充电电路是除了太阳能锂电池充电板以外加的外接供电锂电池充电电路;复位电路对单片机信号进行复位。
作品完整图片:
三、软件说明
集成开发环境(IDE)为“MounRiver Studio”,详情可见其官网:http://www.mounriver.com/
本系统流程为,先初始化,检测是否有人,如果有人则进一步检测是否有语音指令,否则去检测垃圾是否已满。如果有语音指令,则打开对应的垃圾桶盖子,否则去检测垃圾是否已满。接着把人数统计上传到阿里云平台,并且更新收集APP显示。继续检测垃圾是否已满,如果已满,把人数统计上传到阿里云平台,并且更新收集APP显示,否则检测是否有人,形成一个循环。
数据传输模块
数据传输模块是对垃圾桶容量的状态和人流量数据进行打包整合,在这里为了进一步提高智能垃圾桶的应用场景,我们设置了两种传输方式,上传到上位机。
ESP8266传输部分代码
ESP8266使用AT+MQTTPUB的方式传输,这里我们要用到一个sprintf函数,对数据进行整合。
bool ESP8266_aliyun_PUB(void)
{
char param[512];
char jsonBuf[1024];
sprintf(param,"{\\\"Device1\\\":\\\"%d\\\" \\,\\\"Device2\\\":%d \\,\\\"Device3\\\":%d \\,\\\"Device4\\\":%d \\,\\\"pedestrian_volume\\\":%d }",device_1,device_2,device_3,device_4,rll);
sprintf(jsonBuf, "%s", param);
return ESP8266_MQTTPUB(User_ESP8266_MQTTServer_Topic,jsonBuf);
}
以太网传输部分代码
为了适应没有WIFI的环境,我们也设计了可以选择使用板载的以太网接口,进行数据传输。
void MQTT_Publish(char *topic, int qos, char *payload)
{
MQTTString topicString = MQTTString_initializer;
u32 payloadlen;
u32 len;
u8 buf[1024];
topicString.cstring = topic;
payloadlen = strlen(payload);
len = MQTTSerialize_publish(buf,sizeof(buf),0,qos,0,packetid++,topicString,payload,payloadlen);
Transport_SendPacket(buf,len);
}
垃圾桶容量检测模块垃圾桶容量检测的核心程序如下所示,采用外部中断的方式,通过对GPIOB0引脚的变化来判断垃圾桶是否已满,并传输垃圾桶当前状态至上位机,此处测试传输采用ESP8266传输。 void INF0_IRQHandler(void)
{
if(EXTI_GetITStatus(INF0_INT_EXTI_LINE) != RESET)
{
Delay_Ms(1000);
if(GPIO_ReadInputDataBit(INF0_INT_GPIO_PORT,INF0_INT_GPIO_PIN) == 0 )
{
Delay_Ms(5000);
if (GPIO_ReadInputDataBit(INF0_INT_GPIO_PORT,INF0_INT_GPIO_PIN) == 0)
{
device_1 = 1;
ESP8266_aliyun_PUB();
}
}
EXTI_ClearITPendingBit(INF0_INT_EXTI_LINE);
Delay_Ms(5000);
device_1 = 0;
ESP8266_aliyun_PUB();
}
}
语音识别模块语音识别模块核心代码如下所示,CH32V307会根据串口通讯接收到的信息进行判断,控制舵机打开对应的垃圾桶,并传输信息到上位机,此处测试采用ESP8266进行测试传输。 void Language_recognition(uint8_t temp)
{
if(junk_type[1]==0)
{
if(junk_type[0] != 161)
junk_type[0]=temp;
else
junk_type[1]=temp;
}
else
{
junk_type[0] = 0;
junk_type[1] = 0;
if(junk_type[0] != 161)
junk_type[0]=temp;
else
junk_type[1]=temp;
}
Delay_Ms(5);
if (junk_type[0]==161 && junk_type[1]!=0)
{
if (junk_type[0] == 161 && junk_type[1] == 5)
{
rll++;
ESP8266_aliyun_PUB();
TIM_SetCompare1(TIM5,5);
Delay_Ms(5000);
TIM_SetCompare1(TIM5,15);
Delay_Ms(5000);
TIM_SetCompare1(TIM5,5);
}
}
四、物联网平台数据展示 我们可以在阿里云物联网平台创建多个垃圾桶设备,去模拟一个社区的多个垃圾桶放置点或者一个城市的各个垃圾桶放置点。
每个垃圾点可以看到当前垃圾桶的状态是否已满,也可以看到垃圾桶的人流量,如果当前站点垃圾桶人流量高,我们就可以在附近多设置一些垃圾桶点进行优化。
我们也设计了一款手机APP可以看到垃圾桶的数据,如果垃圾桶已满,可以使环卫者及时清运。
五、实物功能演示
bilibili视频链接: https://b23.tv/VYNNBb6
|
厉害