基于Arduino的智能垃圾分类系统:传感器融合与机电控制实践 1. 项目概述与核心价值每次看到小区里清洁工师傅在散发着异味的垃圾桶旁徒手分拣塑料瓶、废纸和厨余垃圾心里总不是滋味。这不仅是劳动强度的问题更关乎健康与尊严。作为一个常年泡在工作室里捣鼓嵌入式系统的爱好者我一直在想能不能用我们手边这些常见的电子模块做一个成本可控、原理清晰的小装置来分担这部分重复且环境不佳的工作这就是我动手制作这个“自动干湿金属垃圾分类系统”的初衷。简单来说这是一个基于Arduino Uno开发板的智能分类装置。它的核心任务是通过三个关键传感器——红外传感器、雨水传感器和接近传感器——自动识别经过的垃圾物品是金属、湿垃圾还是干垃圾然后通过舵机和步进电机控制的机械结构将垃圾引导至对应的收集箱。整个系统就像一个微型的自动化分拣流水线入口。它的价值不仅在于验证了传感器融合与简单机电控制的可行性更在于提供了一个可触摸、可复现的“智能环保”工程样本。无论你是电子爱好者、物联网初学者还是对自动化改造感兴趣的学生这个项目都能让你亲手搭建一个从感知、决策到执行完整的嵌入式系统深刻理解如何将代码逻辑转化为实实在在的物理动作。2. 系统整体设计与核心思路拆解2.1 核心需求与方案选型这个项目的核心需求非常明确准确区分三类垃圾并实现物理分拣。围绕这个需求我拆解出了几个关键决策点并解释了为什么这么选。第一传感方案的选择。这是分类准确性的基石。金属检测方案有很多比如电感式接近传感器、霍尔传感器甚至简单的电磁铁加干簧管。我最终选择了NPN型电感式接近传感器。原因在于它非接触、检测距离稳定几毫米到十几毫米对铁、铝等常见金属反应灵敏且输出是干净的数字开关信号检测到金属时输出低电平Arduino处理起来极其简单。相比霍尔传感器主要检测磁场它更适合检测大块的金属废弃物。干湿检测这里的“湿”主要指表面含水或本身是液体的垃圾。我采用了电阻式雨水传感器模块。它的原理是通过暴露的平行导线测量电阻表面有水时电阻急剧下降。这个方案成本极低模块化程度高直接输出模拟量或数字量模块上通常有可调电位器设置阈值。有人可能会想到电容式湿度传感器但那更适合测量空气湿度对于表面水渍电阻式方案更直接有效。物体存在检测我们需要知道“有东西过来了”才能触发后续的检测流程。这里我用了最经典的红外反射传感器。它发射红外光遇到物体反射回来被接收管接收输出信号变化。选择它是因为它简单、可靠、对颜色不敏感只要不是纯黑色吸光材质非常适合作为流程的触发开关。注意传感器选型直接决定了系统的鲁棒性。例如红外传感器要避免强光直射雨水传感器表面污染会影响精度接近传感器对非金属无效。在实际部署时需要根据垃圾的典型特性如金属罐的形状、湿垃圾的含水量进行针对性选择和校准。第二执行机构的选择。任务是把垃圾拨到正确的路径。分类门控制我选择了一个微型舵机。舵机的优势是控制简单一个PWM信号指定角度扭矩足够推动小片挡板且能自锁在指定角度。通过编程让它转动特定角度就能像铁路道岔一样引导垃圾掉入不同的滑槽。输送机制原设计是垃圾依靠重力滑落。但如果想做成一个连续进料的小型流水线可以加入传送带。我在这里预留了接口用了一个28BYJ-48步进电机配合ULN2003驱动板来演示如何控制旋转。步进电机可以精确控制旋转角度和速度未来升级为传送带驱动电机非常合适。第三控制核心的选择。Arduino Uno几乎是此类原型项目的标准答案。它拥有足够的数字和模拟IO口来连接所有传感器和执行器社区资源丰富编程环境友好。其5V/3.3V的电源系统也与大部分模块兼容。对于这个项目它的性能绰绰有余。整个系统的工作逻辑是一个清晰的决策树待分类物体放入进料口。第一关金属检测。物体首先经过接近传感器。如果被判定为金属舵机立即动作将其导向金属收集箱。流程结束。第二关干湿检测。如果非金属物体继续下滑至雨水传感器检测区。同时红外传感器检测到物体已就位。决策控制器同时读取雨水传感器和红外传感器的状态。如果雨水传感器触发电阻低则判定为湿垃圾舵机导向湿垃圾箱否则判定为干垃圾舵机或保持不动导向干垃圾箱。动作完成后舵机归位等待下一个物体。这个顺序很重要先检金属因为金属检测通常最快、最确定且金属物品也可能沾水先判断可以避免干扰。2.2 机械结构与物理布局设计电路是大脑机械结构则是骨骼和肌肉。一个好的布局能极大提升系统的可靠性和分类效率。我的设计遵循了“自上而下顺势而为”的原则进料与金属检测层最高层入口处安装NPN接近传感器。垃圾从这里投入首先经过它的检测范围。这一层的地板设计成可活动的“活门”由舵机控制。默认关闭导向干/湿通道当检测到金属时活门打开金属物体直接坠入下方的金属收集箱。干湿检测与分拣层中间层经过金属检测后的非金属物体会滑落到这一层的平台。平台上安装了雨水传感器物体就停留在这里接受检测。侧方或上方安装红外传感器确认物体已到位。这一层的末端是分岔口同样由舵机控制的挡板决定物体是滑向湿垃圾箱还是干垃圾箱。收集层最底层放置三个对应的收集箱。材料上我强烈建议使用亚克力板或轻质木板而不是纸板。纸板容易受潮变形强度也堪忧。用激光切割或简单手工切割这些材料用螺丝和角码固定结构会稳定得多。传感器的安装务必牢固避免因震动导致误检测。所有电线要用扎带或线槽规整防止被运动部件缠绕。一个关键的实操心得滑槽的角度至关重要。角度太小垃圾可能卡住角度太大垃圾下滑速度太快传感器可能来不及反应。经过测试30到45度的倾斜角是比较合适的范围。可以在滑槽表面粘贴光滑的胶带如特氟龙胶带来减少摩擦。3. 硬件电路搭建与核心细节解析3.1 元器件清单与功能说明工欲善其事必先利其器。以下是构建本项目所需的完整元器件清单我会逐一说明其关键参数和选购要点。元器件型号/规格数量功能说明选购/使用要点主控制器Arduino Uno R31系统大脑处理传感器数据控制执行器兼容板亦可确保有足够的IO口金属检测LJ12A3-4-Z/BX NPN常开接近传感器1非接触检测铁/铝等金属注意是NPN型检测距离4mm工作电压6-36V DC干湿检测电阻式雨水传感器模块1检测表面是否有水模块带比较器输出数字信号灵敏度可调物体检测红外反射传感器模块1检测物体是否存在常见型号为TCRT5000注意调节电位器改变检测距离分拣执行SG90 9g微型舵机1控制挡板改变垃圾下落路径扭矩约1.6kg·cm工作电压4.8-6V输送演示28BYJ-48 5V步进电机 ULN2003驱动板1套演示旋转控制可用于未来传送带步进角5.625°/64减速比1:64电源9V DC电源适配器或18650锂电池组1为整个系统供电Arduino Uno需7-12V输入舵机、步进电机耗电大需外接电源连接面包板、杜邦线公对公、公对母若干搭建原型电路建议用面包板先测试稳定后焊接结构亚克力板/木板、螺丝、胶水若干制作机身框架和滑槽结构强度是关键辅助LED、电阻、开关可选状态指示、电源控制增加系统可观察性关于电源的特别提醒这是新手最容易栽跟头的地方。Arduino Uno的USB口或Vin引脚无法为舵机和步进电机提供足够的电流。强行驱动会导致Arduino复位或损坏。正确的接法是使用一个外部电源如9V/2A的DC适配器或两节18650电池串联的正极同时接到Arduino的Vin引脚和一个独立的电源导轨上。这个独立导轨专门给舵机和步进电机驱动板供电并与Arduino共地。这样大电流负载由外部电源直接承担Arduino只负责提供控制信号。3.2 电路连接详解与原理图剖析让我们把电路图“翻译”成一步步的接线指南。请对照你的元器件确保每一步都连接正确。第一步建立公共电源和地。将面包板两侧的长条电源排孔分别作为正极Vcc和负极GND总线。将外部电源的正极如电池盒红线接入面包板的Vcc总线负极黑线接入GND总线。用一根杜邦线从面包板的GND总线连接到Arduino Uno的一个GND引脚。用另一根杜邦线从面包板的Vcc总线连接到Arduino Uno的Vin引脚注意不是5V引脚。这样外部电源既为电机供电也通过Arduino的稳压芯片为板载电路供电。第二步连接传感器输入设备。所有传感器的VCC和GND都分别连接到面包板的Vcc和GND总线上。NPN接近传感器棕色线V- 面包板Vcc。蓝色线GND- 面包板GND。黑色线OUT- ArduinoA0引脚。这是一个数字信号检测到金属时输出低电平0V。雨水传感器模块VCC- 面包板Vcc。GND- 面包板GND。DO数字输出- ArduinoD6引脚。模块上的电位器可以调节灵敏度湿度阈值。红外传感器模块VCC- 面包板Vcc。GND- 面包板GND。OUT- ArduinoD5引脚。当检测到物体时输出低电平。第三步连接执行器输出设备。SG90舵机棕色线GND- 面包板GND。红色线VCC- 面包板Vcc。务必接在外部电源总线上橙色线信号- ArduinoD7引脚。这是一个PWM引脚用于发送角度控制信号。28BYJ-48步进电机与ULN2003驱动板将步进电机的4相线插到驱动板对应的插座。驱动板的IN1, IN2, IN3, IN4分别连接到 Arduino 的D8, D9, D10, D11。驱动板的正极接面包板Vcc外部电源负极-接面包板GND。重要驱动板上可能有一个跳线帽连接着驱动板电源和逻辑电源。如果使用外部电源为电机供电务必拔掉这个跳线帽然后单独用一根线从面包板Vcc可为5V连接到驱动板的逻辑供电引脚通常标有5V或VCC以确保驱动板的控制逻辑部分有电。第四步上电前最后检查。检查所有电源线红色是否都接到了正确的正极。检查所有地线黑色/蓝色是否都连通。确保没有短路特别是电源正负极直接碰在一起。舵机和步进电机的电源是否来自外部电源总线。4. 软件程序设计逻辑、代码与调试4.1 程序逻辑流程图与核心算法在动手写代码之前理清逻辑流程图至关重要。这能帮你构建清晰的程序骨架避免逻辑混乱。开始 ├── 初始化 │ ├── 串口通信用于调试 │ ├── 设置传感器引脚为输入 │ ├── 设置舵机、步进电机引脚为输出 │ └── 舵机归位至“干垃圾”通道 ├── 进入主循环 │ ├── 读取接近传感器状态金属检测 │ │ └── 如果检测到金属 │ │ ├── 是控制舵机转向“金属”通道 │ │ ├── 延时等待物体落下 │ │ ├── 舵机归位 │ │ └── 返回循环开始等待下一个物体 │ │ └── 否继续下一步 │ ├── 读取红外传感器状态物体到位检测 │ │ └── 如果检测到物体 │ │ ├── 是继续下一步干湿检测 │ │ └── 否返回循环开始继续检测 │ ├── 读取雨水传感器状态干湿检测 │ │ └── 如果检测到湿 │ │ ├── 是控制舵机转向“湿垃圾”通道 │ │ └── 否控制舵机转向“干垃圾”通道或保持不动 │ ├── 延时等待物体落下 │ ├── 舵机归位 │ └── 返回循环开始核心算法解读状态机思想整个程序是一个简单的状态机。系统始终在“等待检测”状态。传感器的信号触发状态转移进而控制舵机动作动作完成后回到初始状态。去抖动处理机械开关和某些传感器在触发时会产生短暂的、不稳定的信号抖动。虽然本例中传感器模块通常已做硬件消抖但在代码中加入软件消抖是更稳健的做法。例如在判断红外传感器是否真的检测到物体时可以连续读取几次只有多次确认状态才改变避免误触发。非阻塞延时在loop()函数中使用delay()会阻塞整个程序期间无法检测其他传感器。对于更复杂的系统建议使用millis()函数来管理时间实现非阻塞延时。但鉴于本项目逻辑简单直接顺序执行使用delay()保证动作完成是可接受的。4.2 完整代码实现与逐行解析以下是整合了所有功能的Arduino Sketch代码并附有详细注释。// 自动干湿金属垃圾分类系统 - 完整代码 // 引脚定义 const int metalSensorPin A0; // 金属接近传感器数字信号接A0作数字输入 const int rainSensorPin 6; // 雨水传感器数字输出 const int irSensorPin 5; // 红外传感器输出 const int servoPin 7; // 舵机信号线 const int stepIN1 8; // 步进电机驱动引脚 const int stepIN2 9; const int stepIN3 10; const int stepIN4 11; // 状态定义可读性更好 #define METAL 0 #define WET 1 #define DRY 2 // 舵机角度定义需根据实际安装位置校准 const int angleMetal 60; // 转向金属箱的角度 const int angleWet 120; // 转向湿垃圾桶的角度 const int angleDry 90; // 默认位置指向干垃圾桶假设舵机中位是90度 const int angleHome 90; // 归位角度 // 引入舵机库 #include Servo.h Servo myServo; // 步进电机步序4相8拍更平滑 int stepSequence[8][4] { {1, 0, 0, 0}, {1, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 1}, {1, 0, 0, 1} }; void setup() { // 初始化串口用于调试输出信息 Serial.begin(9600); Serial.println(系统启动...); // 配置引脚模式 pinMode(metalSensorPin, INPUT_PULLUP); // 使用内部上拉电阻默认高电平检测到金属变低 pinMode(rainSensorPin, INPUT); pinMode(irSensorPin, INPUT); // 连接舵机并归位 myServo.attach(servoPin); myServo.write(angleHome); delay(500); // 等待舵机到位 // 配置步进电机引脚为输出 pinMode(stepIN1, OUTPUT); pinMode(stepIN2, OUTPUT); pinMode(stepIN3, OUTPUT); pinMode(stepIN4, OUTPUT); // 初始步进电机状态全部拉低 digitalWrite(stepIN1, LOW); digitalWrite(stepIN2, LOW); digitalWrite(stepIN3, LOW); digitalWrite(stepIN4, LOW); Serial.println(初始化完成等待检测...); } void loop() { // 第一步金属检测优先级最高 int metalState digitalRead(metalSensorPin); // 注意我使用的NPN传感器检测到金属时输出低电平LOW if (metalState LOW) { Serial.println(检测到金属); classifyTrash(METAL); return; // 分类完成直接返回loop()开始跳过后续检测 } // 第二步物体存在检测红外 int irState digitalRead(irSensorPin); // 常见红外模块检测到物体时输出低电平 if (irState LOW) { Serial.println(检测到物体开始干湿判断...); // 第三步干湿检测 int rainState digitalRead(rainSensorPin); // 雨水传感器表面湿时输出低电平模块可能不同需测试 if (rainState LOW) { Serial.println(检测为湿垃圾。); classifyTrash(WET); } else { Serial.println(检测为干垃圾。); classifyTrash(DRY); } // 添加一个小延时防止物体未完全离开时重复检测 delay(1000); } // 如果没有检测到任何物体则短暂延时后继续循环降低CPU占用 delay(100); } // 分类执行函数 void classifyTrash(int type) { int targetAngle angleHome; // 默认归位角 switch (type) { case METAL: targetAngle angleMetal; Serial.println(执行动作导向金属箱); break; case WET: targetAngle angleWet; Serial.println(执行动作导向湿垃圾桶); break; case DRY: targetAngle angleDry; // 可能和angleHome相同 Serial.println(执行动作导向干垃圾桶或保持); break; } // 控制舵机转向目标角度 myServo.write(targetAngle); delay(800); // 等待舵机转动到位时间根据舵机速度调整 // 此处可以加入步进电机转动代码模拟传送带前进一小段距离 // driveStepper(50); // 例如前进50步 // 短暂停顿确保垃圾已落下 delay(500); // 舵机归位 myServo.write(angleHome); delay(800); Serial.println(分类动作完成准备下一次检测。); } // 步进电机驱动函数示例当前未在主循环调用 void driveStepper(int steps) { for (int i 0; i steps; i) { for (int j 0; j 8; j) { digitalWrite(stepIN1, stepSequence[j][0]); digitalWrite(stepIN2, stepSequence[j][1]); digitalWrite(stepIN3, stepSequence[j][2]); digitalWrite(stepIN4, stepSequence[j][3]); delay(3); // 控制转速数值越小越快 } } // 停止时关闭所有相位以省电和防止过热 digitalWrite(stepIN1, LOW); digitalWrite(stepIN2, LOW); digitalWrite(stepIN3, LOW); digitalWrite(stepIN4, LOW); }代码关键点解析INPUT_PULLUP模式对于金属传感器我们使用了INPUT_PULLUP。这意味着Arduino内部将引脚通过一个电阻上拉到高电平5V。当传感器输出低电平0V时引脚被拉低读取到LOW。这省去了外接上拉电阻的麻烦并使信号更稳定。return语句的妙用在loop()中一旦检测到金属并完成分类我们使用return;立即跳出本次循环直接开始下一次loop()。这确保了金属检测的最高优先级避免了不必要的干湿检测流程。函数封装将分类动作封装成classifyTrash()函数使主循环loop()逻辑非常清晰。未来若要增加新的垃圾类别或改变动作只需修改这个函数和switch语句即可。调试信息通过Serial.println()输出状态信息是调试过程中不可或缺的手段。你可以通过Arduino IDE的串口监视器实时查看系统判断逻辑快速定位是传感器问题还是逻辑问题。4.3 系统校准与参数调试实战代码烧录进去只是第一步让系统稳定可靠地工作校准和调试是关键环节。这往往比写代码花的时间更多。1. 传感器阈值校准雨水传感器模块上通常有一个蓝色电位器。用螺丝刀旋转它。准备一块干布和一块湿布。将干布紧贴传感器表面调节电位器直到模块上的指示灯刚好熄灭或串口读取到HIGH。然后换上湿布指示灯应亮起输出LOW。这个临界点就是干湿阈值。不同水质自来水、油汤导电率不同可能需要折中设置。红外传感器同样有电位器。调节它使得在预设的检测距离比如2cm内有物体时指示灯亮输出LOW无物体时熄灭输出HIGH。注意环境光干扰避免阳光直射传感器头。接近传感器一般是固定的检测距离如4mm。确保金属物体在有效距离内通过。可以通过串口监视器观察metalState的值变化来确认。2. 舵机角度校准这是机械与电子的结合点。上传一个简单的测试程序让舵机在0到180度间摆动观察挡板实际运动范围。#include Servo.h Servo myservo; void setup() { myservo.attach(9); } void loop() { for(int pos0; pos180; pos1) { myservo.write(pos); delay(15); } for(int pos180; pos0; pos-1) { myservo.write(pos); delay(15); } }用这个程序确定三个关键位置angleHome归位通常对应干垃圾通道、angleMetal、angleWet。将这些角度值填入主程序的常量定义中。务必断电后手动调整挡板初始位置使其与舵机角度匹配。3. 时序调试代码中的delay()时间需要根据实际物理结构调整。myServo.write(targetAngle); delay(800);这里的800ms要确保舵机能完全转到指定角度。动作完成后的delay(500);要确保垃圾有足够时间滑落避免下一个动作干扰。如果发现分类错误可能是物体还没完全到达检测位置程序就已经读完传感器状态并做出了判断。可以适当在红外传感器检测到物体后增加一个短暂的delay(200)等待物体稳定停在雨水传感器上再进行干湿判断。5. 常见问题排查与系统优化实录即使按照教程一步步做也难免会遇到各种“坑”。下面是我在制作和调试过程中遇到的一些典型问题及解决方案希望能帮你快速排雷。5.1 硬件连接与电源问题排查表现象可能原因排查步骤与解决方案Arduino上电后无反应或USB连接电脑不识别1. 电源接错如Vin接反。2. 外部电源电压过高或短路。3. USB线仅供电无数据。1. 立即断电检查所有电源连线确保正负极正确。2. 用万用表测量外部电源电压是否在7-12V之间。3. 换一根已知良好的USB数据线尝试给Arduino单独USB供电。舵机不转动或发出“吱吱”声但不动作1. 电源功率不足最常见。2. 信号线接触不良或接错。3. 舵机卡死机械阻力过大。1.确保舵机VCC接在外部电源上而非Arduino的5V引脚。使用电流输出能力大于1A的电源。2. 检查信号线是否接在正确的PWM引脚如D7。3. 断开舵机臂空载测试是否能转动。检查机械结构是否干涉。步进电机不转或振动不前进1. 驱动板供电不足或未接。2. 相序接错。3. 驱动板与Arduino共地问题。4. 代码步序错误或延时太短。1. 确认驱动板电机电源端已接外部电源且电压匹配5V或12V看电机型号。2. 检查电机四根线是否牢固插入驱动板可尝试交换相邻两相线序。3. 确保驱动板的GND和Arduino的GND用导线连接。4. 检查driveStepper函数中的stepSequence数组和delay值延时太短如delay(1)以下可能导致扭矩不足。传感器读数不稳定时有时无1. 接触不良。2. 电源干扰。3. 传感器本身故障或需要校准。4. 未使用上拉/下拉电阻。1. 按压所有杜邦线接头或改用焊接。2. 在传感器电源引脚附近并联一个10uF-100uF的电解电容滤波。3. 用万用表测量传感器输出信号或通过串口打印原始值观察。4. 对于数字传感器如接近开关在Arduino代码中启用内部上拉INPUT_PULLUP。系统一接上电机就复位电机启动瞬间电流过大导致Arduino电源电压被拉低而复位。这是典型的电源问题。强化电源使用更大容量的电池如18650电池组或稳压电源。在Arduino的Vin和GND之间并联一个大电容如470uF或1000uF可以缓冲瞬间电流需求。5.2 软件逻辑与传感器误判处理问题金属物品有时被误判为干垃圾。原因分析物体通过金属传感器的速度太快Arduino可能没来得及在loop()的一次循环中捕捉到低电平信号。解决方案实施“采样判决”而非“瞬时判决”。修改金属检测部分的代码bool isMetalDetected() { int count 0; for (int i 0; i 10; i) { // 连续采样10次 if (digitalRead(metalSensorPin) LOW) { count; } delay(1); // 短暂间隔 } if (count 7) { // 如果10次中有超过7次检测到金属则判定为真 return true; } return false; } // 在loop()中调用if (isMetalDetected()) { ... }问题湿纸巾略湿无法触发雨水传感器。原因分析电阻式雨水传感器对表面游离水敏感湿纸巾含水量可能不足以形成连续的导电通路。解决方案这是传感器原理限制。可以尝试1. 调节模块上的电位器到最灵敏状态。2. 更换检测方式例如使用电容式湿度传感器测量物体周围的空气湿度变化但成本和控制复杂度会增加。对于原型接受其局限性明确系统适用于“表面明显湿润”的垃圾。问题黑色塑料袋干垃圾红外传感器检测不到。原因分析黑色物体对红外光吸收强反射弱导致传感器无法有效触发。解决方案1. 调整红外传感器灵敏度电位器到最大。2. 减小检测距离。3. 考虑使用其他检测方案如对射式光电传感器一侧发射一侧接收物体通过时遮挡光束它几乎不受物体颜色影响。5.3 系统优化与扩展思路当基础功能实现后你可以考虑以下优化让项目更上一层楼增加人机交互状态指示用三个不同颜色的LED红、蓝、绿分别代表金属、湿、干分类时对应LED亮起直观显示状态。计数功能在分类成功的代码段里增加计数器用int变量记录各类垃圾的数量并通过一个LCD1602显示屏实时显示。这能让系统更具“数据感”。声音提示增加一个无源蜂鸣器分类完成时发出不同音调提示。提升机械可靠性防卡料设计在滑槽入口处增加振动器小型振动电机当红外传感器检测到物体停留时间过长时触发振动帮助垃圾滑落。多级分拣用两个舵机控制两级挡板可以实现更精细的分类如金属-塑料-干垃圾/湿垃圾。引入物联网IoT功能数据上报增加一个ESP8266或ESP32模块让Arduino通过Wi-Fi将分类计数数据发送到云平台如Blynk、ThingsBoard或本地服务器实现远程监控。满溢报警在每个垃圾桶顶部安装超声波测距模块实时监测垃圾高度当快满时通过物联网模块发送报警信息到手机。使用更专业的控制器如果逻辑变得复杂可以考虑升级到ESP32它集成了Wi-Fi和蓝牙性能更强IO口更多可以直接作为主控省去额外的通信模块。这个项目最大的乐趣在于它是一个完美的起点。你可以根据自己的想法不断添加新功能从简单的自动分类演进成一个具备数据统计、远程管理甚至图像识别结合OpenMV或树莓派的智能垃圾站原型。每一次调试成功每一次功能增加都是对“用技术解决实际问题”这一理念的一次生动实践。