
1. 项目缘起与整体设计思路1.1 为什么选择STM32做污水检测船的主控做水质监测这个方向我前前后后折腾过好几套方案。最早用树莓派算力是够但功耗和成本摆在那里野外部署要配大容量电池整体下来一套轻松过千。后来试过Arduino简单是简单但多传感器并发采集的时候时序经常出问题ADC精度也不够看。最后落到STM32F103系列上算是找到了一个平衡点——性能够用、功耗可控、外设丰富、成本压得住。STM32F103C8T6这颗芯片72MHz主频内置12位ADC多达10个外部通道USART、I2C、SPI一应俱全。对于污水检测船这种需要同时接pH传感器、浊度传感器、温度传感器、GPS定位模块和无线传输模块的场景来说外设资源刚好够用不会捉襟见肘。更重要的是它的低功耗模式做得比较成熟Stop模式下电流能压到20微安级别这对靠电池驱动的小型船体来说非常关键。便携式这个定位决定了整个系统的设计基调。所谓便携不是说揣兜里就走而是指一个人能搬得动、放得下、收得快。船体不能太大传感器不能太重电池续航要撑得住至少半天的连续作业。这些约束条件反过来倒逼主控选型必须走低功耗、小体积、高集成度的路线STM32恰好卡在这个位置上。1.2 系统整体架构拆解整个污水检测船可以拆成五个功能模块来理解感知层、控制层、通信层、动力层和供电层。感知层负责采集水质参数控制层负责数据处理和逻辑调度通信层负责把数据传回来动力层负责让船动起来供电层负责给所有模块喂电。感知层这边我选了三种传感器pH传感器用模拟输出的工业级探头浊度传感器用红外对射式模块温度传感器用DS18B20数字探头。为什么这么搭配pH和浊度需要实时连续采集模拟输出响应快温度变化相对缓慢用数字接口的DS18B20可以省一个ADC通道而且精度比模拟方案更稳定。控制层就是STM32最小系统板加上必要的外围电路。这里有个细节值得展开说ADC参考电压的稳定性直接决定pH和浊度读数的可信度。我一开始直接用STM32的3.3V供电做参考结果电机一启动读数就飘。后来单独用了一颗REF3033给ADC做基准问题才解决。这个坑后面会详细讲。通信层我选的是ESP8266模块走WiFi通过UART和STM32通信。为什么不用4G因为便携式设备大概率在近岸或者小型水域作业WiFi覆盖基本够用而且ESP8266成本低、功耗小、AT指令集成熟开发周期短。如果后续要扩展到远距离作业再换4G模块也不迟接口是兼容的。动力层用两个直流减速电机加一个L298N驱动模块差速转向。船体用亚克力板做双层结构下层放电池和电机上层放电路板和传感器中间用铜柱撑开。这样重心低不容易翻。供电层用3节18650锂电池串联标称11.1V经过LM2596降压到5V给电机驱动和传感器供电再经过AMS1117-3.3降到3.3V给STM32和ESP8266供电。电池容量选的是3000mAh实测下来连续作业能撑4到5个小时基本满足半天的工作需求。1.3 方案选型中的几个关键取舍第一个取舍是传感器接口方案。pH传感器有模拟输出的也有RS485数字输出的。RS485抗干扰能力强但需要额外的转换芯片而且布线麻烦。模拟输出简单直接但对ADC参考电压和滤波要求高。我最终选了模拟方案原因是船体空间有限少一个模块少一份重量而且通过软件滤波和硬件基准精度也能做到±0.1pH够用了。第二个取舍是通信协议。ESP8266支持TCP和UDP两种方式。TCP可靠但有重传机制延迟不稳定UDP快但可能丢包。水质数据不是每一帧都关键丢一两帧不影响整体趋势判断所以我选了UDP配合应用层的简单序号校验兼顾了实时性和可靠性。第三个取舍是船体推进方式。单电机加舵机转向结构简单但转向半径大在小水域不好掉头。双电机差速转向灵活原地就能转圈但控制逻辑稍微复杂一点。考虑到污水检测经常需要在狭窄河道或者池塘里作业灵活性优先所以选了双电机方案。2. 核心硬件细节与实操要点2.1 STM32最小系统与外围电路设计STM32F103C8T6最小系统板市面上很多但质量参差不齐。我踩过的坑是有些板子的晶振负载电容焊错了导致起振不稳定跑着跑着就死机。所以拿到板子第一件事先用示波器看晶振波形确认8MHz晶振起振正常波形干净没有明显畸变。外围电路这边有几个地方需要特别注意。首先是BOOT0和BOOT1引脚一定要接下拉电阻到地否则上电时可能误入Bootloader模式程序不运行。其次是NRST复位引脚接一个0.1uF电容到地再加一个10K上拉电阻到3.3V保证复位可靠。最后是VDDA和VSSA也就是模拟电源引脚一定要加LC滤波否则ADC读数会有周期性纹波。ADC输入这边pH传感器输出阻抗比较高直接接STM32的ADC引脚会导致采样保持电容充电不足读数偏低。我加了一级电压跟随器用LM358运放做缓冲输出阻抗降到几十欧姆ADC读数就准了。浊度传感器输出阻抗低一些但也建议加一级RC低通滤波截止频率设在100Hz左右滤掉电机带来的高频干扰。2.2 传感器选型与校准方法pH传感器我用的是一款工业级玻璃电极输出0到3V对应pH 0到14。这里有个常见误区很多人以为pH电极是线性的直接拿两点校准就完事。实际上玻璃电极在强酸强碱区域会有非线性偏差如果检测场景pH波动范围大建议做三点甚至五点校准。校准步骤是这样的先用pH 4.00、6.86、9.18三种标准缓冲液分别记录ADC读数然后在STM32里用分段线性插值的方式拟合曲线。具体做法是存三个校准点运行时判断当前ADC值落在哪个区间用对应区间的斜率和截距计算pH值。这样比单段线性拟合精度高不少实测误差能控制在±0.05pH以内。浊度传感器我用的是红外对射式模块输出模拟电压。这个传感器的标定比较麻烦因为浊度单位NTU没有绝对标准。我的做法是用福尔马肼标准液配制不同浓度的样品从0NTU到1000NTU取十个点记录ADC读数然后在Excel里拟合曲线。拟合出来是一条指数衰减曲线在STM32里用查表加线性插值的方式实现。DS18B20温度传感器是数字输出的精度±0.5°C够用。接线的时候注意加一个4.7K上拉电阻到3.3V否则单总线通信会不稳定。另外DS18B20的转换时间比较长12位精度下需要750ms所以我在程序里用定时器触发转换不阻塞主循环。2.3 电源管理与低功耗设计便携式设备最怕的就是电不够用。我一开始用LM2596降压到5V再线性降压到3.3V结果发现AMS1117发热严重效率只有60%左右。后来改成两级开关降压第一级LM2596降到5V第二级用MP1584降到3.3V整体效率提到85%以上发热也小了很多。低功耗方面STM32本身支持Sleep、Stop和Standby三种模式。我的策略是传感器采集间隙让STM32进Stop模式RTC定时唤醒这样平均电流能从30mA降到5mA左右。ESP8266在不发送数据的时候也进Modem-sleep模式电流从70mA降到15mA。整体算下来3000mAh电池能撑6个小时以上。注意进Stop模式前一定要把不用的外设时钟关掉GPIO配置成模拟输入或者下拉否则漏电流会吃掉不少电量。我实测过一个悬空的GPIO在Stop模式下能多耗几百微安。2.4 通信模块配置与数据协议设计ESP8266用AT指令配置固件版本建议用AT 1.7以上稳定性好很多。配置流程是先AT测试通信然后ATCWMODE1设成Station模式ATCWJAP连接热点ATCIPSTART建立UDP连接最后ATCIPSEND发送数据。数据协议我设计了一个简单的帧结构帧头0xAA 0x55然后是一字节序号一字节数据长度接着是pH、浊度、温度、经纬度等数据最后是校验和。校验和用前面所有字节的异或值。接收端收到数据后先检查帧头和校验和都对了才解析。为什么不用JSON因为JSON解析在STM32上开销太大而且字符串传输容易出错。二进制协议紧凑、解析快、抗干扰能力强适合这种资源受限的场景。实测下来一帧数据大概40字节UDP发送延迟在50ms以内完全满足实时性要求。3. 软件架构与核心代码实现3.1 主程序框架与任务调度STM32这边的程序我没有用RTOS因为任务不算多用前后台架构加定时器调度就够了。主循环里轮询三个任务传感器采集、数据处理、通信发送。每个任务用一个软件定时器控制执行周期采集任务100ms一次处理任务200ms一次发送任务500ms一次。为什么这么分配pH和浊度需要快速响应100ms采集一次能捕捉到变化趋势数据处理包括滤波和校准计算200ms一次足够通信发送不需要太频繁500ms一次既能保证实时性又不会把网络带宽占满。定时器我用的是SysTick配置成1ms中断一次在中断里维护三个计数器分别对应三个任务的周期。主循环里检查计数器是否到期到期就执行对应任务然后清零计数器。这种方式的优点是简单可靠不需要复杂的任务调度器。3.2 ADC采集与数字滤波实现ADC采集这边我用了DMA加定时器触发的方式。TIM2配置成100Hz更新频率每次更新触发ADC转换转换结果通过DMA自动搬到内存数组里。这样CPU不用干预效率高而且采样间隔精确。采集到的原始数据不能直接用必须滤波。我用了两种滤波组合先做中值滤波取最近5个采样值的中位数去掉突发干扰再做滑动平均取最近10个中位数的平均值平滑随机噪声。实测下来这种组合滤波能把pH读数的波动从±0.3pH压到±0.05pH以内。代码实现上中值滤波用一个5元素数组每次新数据进来就移位然后排序取中间值。滑动平均用一个10元素环形缓冲区每次新数据进来就替换最老的数据然后求和取平均。这两个操作计算量都不大在72MHz的STM32上跑起来毫无压力。#define MEDIAN_SIZE 5 #define AVERAGE_SIZE 10 float median_filter(float new_val) { static float buf[MEDIAN_SIZE] {0}; static uint8_t idx 0; float temp[MEDIAN_SIZE]; buf[idx] new_val; idx (idx 1) % MEDIAN_SIZE; for (int i 0; i MEDIAN_SIZE; i) { temp[i] buf[i]; } // 冒泡排序 for (int i 0; i MEDIAN_SIZE - 1; i) { for (int j 0; j MEDIAN_SIZE - 1 - i; j) { if (temp[j] temp[j 1]) { float t temp[j]; temp[j] temp[j 1]; temp[j 1] t; } } } return temp[MEDIAN_SIZE / 2]; }3.3 数据校准与单位换算传感器原始数据到物理量的换算是整个系统精度的关键。pH这边我用的是分段线性插值。先存三个校准点(adc1, ph1)、(adc2, ph2)、(adc3, ph3)运行时判断当前ADC值落在哪个区间用对应区间的斜率和截距计算。浊度这边更复杂一些因为拟合出来是指数曲线。我的做法是在STM32里存一个查找表比如每50NTU存一个点从0到1000NTU共21个点。运行时先找到当前ADC值落在哪个区间然后用线性插值计算NTU值。这样既保证了精度又不会占用太多计算资源。温度这边DS18B20直接输出数字量不需要换算但要注意分辨率配置。默认是12位精度0.0625°C转换时间750ms。如果对实时性要求高可以降到9位转换时间93.75ms精度0.5°C。我选的是11位转换时间375ms精度0.125°C算是一个平衡。3.4 通信协议封装与发送逻辑通信这块ESP8266通过UART和STM32连接波特率115200。STM32这边用USART2配置成异步模式开启接收中断。发送的时候先把数据打包成帧然后通过ATCIPSEND指令发送。帧结构定义如下字段长度说明帧头2字节0xAA 0x55序号1字节0-255循环长度1字节数据段长度pH值4字节float类型浊度值4字节float类型温度值4字节float类型经度4字节float类型纬度4字节float类型校验和1字节前面所有字节异或发送逻辑是这样的先检查ESP8266是否在线发送AT测试收到OK后发送ATCIPSEND帧长度收到后发送帧数据等待SEND OK确认。如果任何一步超时就重试重试三次都失败就复位ESP8266。实操心得ESP8266在发送数据的时候如果电源不稳很容易重启。我一开始用AMS1117给它供电结果一发数据就重启。后来单独用一个MP1584给它供电问题就解决了。所以ESP8266的供电一定要独立而且要有足够的滤波电容。4. 船体结构与动力系统搭建4.1 船体材料选择与防水处理船体材料我试过三种泡沫板、亚克力和PVC管。泡沫板最轻但强度不够撞到石头就碎PVC管防水好但形状受限不好布置电路板亚克力强度够、加工方便、透明好看最终选了5mm厚的亚克力板。船体尺寸是40cm长、25cm宽、15cm高双层结构。下层高8cm放电池、电机和驱动板上层高7cm放STM32主板、传感器和通信模块。两层之间用M3铜柱撑开间距5cm方便走线。防水处理是重点。所有接缝处先用亚克力胶水粘合然后在内侧涂一层704硅胶。电路板用防水盒装起来出线孔用防水接头密封。传感器探头固定在船体底部接线从防水接头穿上来。电机轴伸出船体的地方用O型密封圈加黄油密封。实测下来这套防水方案在静水中泡两个小时没问题。但如果要在有波浪的水面作业建议再加一层防水罩把整个上层结构罩起来。4.2 双电机差速转向控制动力系统用两个直流减速电机额定电压12V减速比1:48空载转速200RPM。电机固定在船尾两侧螺旋桨朝后。L298N驱动模块负责控制电机正反转和调速。差速转向的原理很简单两个电机同速正转船直行左电机慢右电机快船右转左电机反转右电机正转船原地左转。PWM频率我设的是10kHz占空比0到100%对应电机速度0到最大。控制逻辑上我用了一个简单的PID控制器来维持航向。MPU6050陀螺仪提供偏航角速度目标航向由遥控指令或者预设航线决定。PID输出作为左右电机的速度差叠加到基础速度上。实测下来直线航行偏差能控制在±5度以内。// 差速转向控制 void motor_control(int16_t left_speed, int16_t right_speed) { // 限制速度范围 if (left_speed 100) left_speed 100; if (left_speed -100) left_speed -100; if (right_speed 100) right_speed 100; if (right_speed -100) right_speed -100; // 设置方向 if (left_speed 0) { GPIO_SetBits(GPIOA, GPIO_Pin_0); // 左电机正转 TIM_SetCompare1(TIM3, left_speed); } else { GPIO_ResetBits(GPIOA, GPIO_Pin_0); // 左电机反转 TIM_SetCompare1(TIM3, -left_speed); } if (right_speed 0) { GPIO_SetBits(GPIOA, GPIO_Pin_1); // 右电机正转 TIM_SetCompare2(TIM3, right_speed); } else { GPIO_ResetBits(GPIOA, GPIO_Pin_1); // 右电机反转 TIM_SetCompare2(TIM3, -right_speed); } }4.3 电池组配置与续航估算电池用3节18650串联标称11.1V容量3000mAh。为什么选18650因为能量密度高、放电倍率够、价格便宜、更换方便。三节串联后电压11.1V经过LM2596降到5V给电机驱动和传感器再经过MP1584降到3.3V给STM32和ESP8266。续航估算电机满载电流约1.5ASTM32加传感器约50mAESP8266平均约30mA总电流约1.58A。电池容量3000mAh理论续航1.9小时。但实际使用中电机不会一直满载平均电流大概1A左右所以实际续航能到3小时左右。如果想延长续航有两个办法一是加大电池容量换成4节并联再串联容量翻倍二是优化电机控制低速时用PWM降速减少电流消耗。我实测过把电机速度降到50%电流从1.5A降到0.6A续航能延长到5小时以上。注意18650电池一定要用带保护板的否则过放会损坏电池甚至起火。我一开始图便宜买了不带保护的电池结果有一次放到2.5V电池直接鼓包了。后来换了带保护板的过放到2.8V就自动切断安全多了。4.4 遥控与自主导航模式切换遥控这块我用的是NRF24L01模块2.4GHz频段空旷环境下传输距离能到100米。遥控器这边用STM32F103加摇杆和按键摇杆控制方向和速度按键切换模式。模式有两种手动模式和自动模式。手动模式下遥控器直接发送速度和转向指令船体执行。自动模式下船体按照预设航线自主航行遥控器只负责启动和停止。自动导航的实现是这样的先用GPS模块获取当前位置然后和目标航点比较计算航向偏差用PID控制器调整电机速度差使船体朝目标航点前进。到达目标航点后切换到下一个航点直到所有航点走完。GPS模块我用的是ATGM336H支持GPS和北斗双模定位精度2.5米。这个精度对于水质检测来说够用了因为水质参数在几米范围内变化不大。如果对定位精度要求更高可以上RTK但成本会高很多。5. 常见问题与排查技巧实录5.1 传感器读数漂移与噪声排查传感器读数漂移是最常见的问题我遇到过好几次。第一次是pH读数一直缓慢上升从7.0漂到8.5换了传感器也没用。后来用万用表量ADC参考电压发现从3.300V慢慢降到3.280V原来是AMS1117发热导致输出电压漂移。换了MP1584之后参考电压稳定在3.300V漂移问题解决。第二次是浊度读数跳变一会儿100NTU一会儿500NTU。用示波器看ADC输入引脚发现上面叠加了100Hz的纹波正好是电机PWM频率的谐波。解决办法是在ADC输入和地之间加一个10uF钽电容再串一个100欧姆电阻组成低通滤波器纹波就没了。第三次是温度读数偶尔跳到85°C这是DS18B20的典型故障值。原因是单总线通信时序不对可能是上拉电阻太大或者线太长。我把上拉电阻从10K换成4.7K线缩短到20cm问题就解决了。5.2 通信中断与数据丢包处理ESP8266通信中断也是高频问题。表现是数据发着发着就停了重启ESP8266又能恢复。排查下来有几个原因一是电源不稳ESP8266发送瞬间电流能到300mA如果电源响应慢电压会跌落导致重启二是AT指令超时设置太短ESP8266还没响应就判超时三是WiFi信号弱丢包严重。解决办法电源这边加一个大电容我用了470uF电解电容并联0.1uF陶瓷电容电压跌落问题解决。AT指令超时从1秒改成3秒给ESP8266足够的响应时间。WiFi信号弱的话加一个外置天线或者把船开到信号好的地方。数据丢包这边我在应用层加了序号校验。接收端发现序号不连续就知道中间丢包了可以请求重发或者标记数据缺失。实测下来UDP丢包率在5%左右加了序号校验后数据完整性提高到99%以上。5.3 电机干扰与电源纹波抑制电机干扰是嵌入式系统里的经典问题。电机启动瞬间电流突变会在电源线上产生尖峰轻则导致ADC读数跳变重则导致单片机复位。我一开始没注意这个问题结果电机一启动STM32就重启。解决办法分三层第一层是电源隔离电机驱动和单片机用不同的稳压芯片中间用磁珠或者电感隔离第二层是滤波电机两端并联0.1uF陶瓷电容电源线上加LC滤波第三层是软件滤波ADC采集的时候避开电机启动瞬间或者用中值滤波去掉突变值。实测下来这三层措施加上去之后电机启动时ADC读数波动从±50LSB降到±5LSB以内单片机也不再复位了。5.4 船体平衡与防水密封检查船体平衡问题我遇到过两次。第一次是电池放得太靠后船头翘起来螺旋桨半露出水面推力不足。后来把电池移到船体中间重心降低问题解决。第二次是传感器探头装得太靠一侧船体倾斜转弯的时候容易翻。后来把探头对称布置左右各一个平衡问题解决。防水密封检查是每次下水前必做的。我的流程是先目视检查所有接缝和密封圈看有没有裂纹或者老化然后用打气筒往防水盒里打气看有没有气泡漏出来最后空载运行十分钟看内部有没有水汽。这套流程走下来基本能排除大部分防水隐患。实操心得亚克力胶水粘接的时候一定要等24小时完全固化再下水。我有一次等了2小时就下水结果接缝处渗水电路板烧了一块。后来老老实实等24小时再也没出过问题。5.5 常见问题速查表问题现象可能原因排查方法解决方案pH读数漂移ADC参考电压不稳万用表测VDDA换低压差稳压芯片浊度读数跳变电机PWM干扰示波器看ADC输入加RC低通滤波温度读数85°C单总线时序错误检查上拉电阻换4.7K上拉通信中断电源跌落示波器看3.3V加大滤波电容数据丢包WiFi信号弱看RSSI值加外置天线电机启动复位电源尖峰示波器看5V加LC滤波船体倾斜重心偏移目视检查调整电池位置防水盒进水密封圈老化打气测试更换密封圈6. 实测数据与性能评估6.1 水质参数测量精度验证为了验证测量精度我拿这套系统和实验室台式水质分析仪做了对比。pH这边在pH 4.00、6.86、9.18三个点STM32系统读数分别是4.02、6.84、9.21误差在±0.03pH以内。浊度这边在0NTU、100NTU、500NTU、1000NTU四个点STM32系统读数分别是3NTU、98NTU、510NTU、1020NTU误差在±5%以内。温度这边和标准温度计对比误差在±0.2°C以内。这个精度对于污水检测来说完全够用了。环保部门对水质监测的精度要求一般是pH±0.1、浊度±10%、温度±0.5°C我们的系统都达标了。6.2 续航与通信距离实测续航测试是在静水中以50%速度连续航行电池从满电放到保护板切断总共跑了4小时20分钟。如果以100%速度跑续航是2小时50分钟。这个成绩对于便携式设备来说算不错了基本能满足半天的作业需求。通信距离测试是在空旷水域遥控器在岸边船往远处开。NRF24L01在100米内信号稳定超过100米开始丢包150米完全失联。WiFi这边ESP8266在50米内信号良好超过50米丢包率上升100米基本连不上。所以作业范围建议控制在50米以内保证通信可靠。6.3 不同水域环境适应性测试我在三种水域做了测试静水池塘、流动河道、有波浪的湖面。静水池塘表现最好船体稳定数据连续。流动河道有水流冲击船体会有横向漂移需要不断修正航向但数据采集不受影响。有波浪的湖面最麻烦船体上下颠簸传感器探头偶尔露出水面导致数据跳变。针对波浪环境我做了两个改进一是把传感器探头往下延伸5cm保证即使船体颠簸探头也浸在水里二是在软件里加了异常值剔除如果连续三个采样值偏差超过50%就判定为无效数据不记录。改进之后波浪环境下的数据可用率从70%提高到95%以上。6.4 系统功耗分析与优化空间功耗分析我用的是电流表加示波器分别测了各个模块的电流。STM32在72MHz全速运行时约30mAStop模式约20uA。ESP8266在发送时约170mA空闲时约15mA。电机在50%速度时约600mA100%速度时约1.5A。传感器总共约20mA。整体功耗在50%速度下约700mA100%速度下约1.6A。优化空间主要在电机这边如果换成无刷电机效率能从60%提到85%功耗能降30%左右。另外STM32可以进一步优化把不用的外设时钟全部关掉能再省几毫安。7. 后续扩展方向与个人体会7.1 功能扩展的几种可能路径这套系统目前只测pH、浊度和温度三个参数后续可以扩展溶解氧、电导率、氨氮等传感器。溶解氧传感器有荧光法和膜法两种荧光法免维护但贵膜法便宜但需要定期换膜。电导率传感器简单两个电极加交流激励就行。氨氮传感器比较贵离子选择电极法一套下来要上千看预算决定。通信这边可以升级到4G模块实现远程数据传输。4G模块用EC20或者Air724通过UART和STM32通信AT指令集和ESP8266类似迁移成本不高。上了4G之后可以在云端做数据存储和分析生成水质趋势图更直观。自主导航这边可以加视觉避障用OpenMV或者K210跑简单的障碍物检测遇到漂浮物自动绕开。还可以加自动采样功能到了预设点位自动采集水样带回实验室做更精确的分析。7.2 我在这个项目里踩过的坑第一个坑是ADC参考电压。一开始图省事直接用3.3V做参考结果电机一启动读数就飘。后来单独用REF3033做基准问题解决。这个坑让我明白模拟电路和数字电路一定要分开供电参考电压一定要独立。第二个坑是ESP8266供电。一开始和STM32共用AMS1117结果一发数据就重启。后来单独用MP1584供电问题解决。这个坑让我明白无线模块的瞬态电流很大电源一定要留足余量。第三个坑是防水密封。第一次下水没等胶水完全固化结果接缝渗水烧了一块板子。后来老老实实等24小时再也没出过问题。这个坑让我明白防水这件事急不得该等的时间一定要等。7.3 给后来者的几点实用建议如果你也想做类似的污水检测船我的建议是先从最小系统开始把STM32和传感器跑通再逐步加通信和动力。不要一上来就全部搭好出了问题不好定位。传感器校准一定要做而且要用标准液做不要凭感觉。校准数据存在STM32的Flash里掉电不丢。每次更换传感器或者长时间不用之后都要重新校准。电源设计要留余量电机和通信模块的瞬态电流都很大稳压芯片的额定电流至少要是实际电流的两倍。滤波电容要多加电解电容和陶瓷电容搭配使用效果更好。防水处理要细致所有接缝都要涂胶所有出线孔都要用防水接头。下水前一定要做打气测试确认没有漏气的地方。最后调试的时候要有耐心。嵌入式系统的问题往往不是单一原因而是多个因素叠加。遇到问题不要慌用示波器、万用表一步步排查总能找到原因。我调试这套系统花了将近一个月中间无数次想放弃但每次解决问题之后的成就感让我觉得一切都值得。