
1. 项目概述用物联网技术“看见”母猪的每一次饮水在规模化养猪场里母猪的饮水情况是评估其健康状况和生产性能的一个关键但极易被忽视的指标。饮水不足会直接影响采食量、泌乳量和整体福利但传统上我们只能依靠人工不定时观察或凭经验判断数据既不连续也不精准。几年前我在参与一个智慧牧场项目时就遇到了这个痛点如何低成本、无侵入地实现24小时饮水行为自动监测当时市面上专业的畜牧监测设备动辄上万且安装复杂。于是我决定自己动手利用手头常见的开源硬件搭建一套系统。核心思路很简单在饮水器上方安装一个超声波测距传感器当母猪靠近饮水时传感器到水面的距离会发生变化通过捕捉这个距离的骤减就能判断一次饮水事件的发生。数据通过Wi-Fi实时上传到手机管理者无论身在何处都能对猪舍内的饮水动态了如指掌。这套系统的核心三件套是ESP32负责数据采集与无线传输、HC-SR04超声波传感器负责非接触式距离探测以及Blynk物联网平台负责数据的云端接收与移动端可视化。它最大的优势在于成本极低百元以内、部署灵活并且完全开源可定制。接下来我将从设计思路、硬件连接、软件配置到现场部署的完整流程以及我踩过的那些“坑”为你详细拆解这个“母猪饮水监测系统”的实现过程。2. 系统整体设计与核心思路拆解2.1 为什么选择“超声波测距”方案监测饮水行为有多种传感器可选比如流量计、压力传感器、红外对管等。我最终选择超声波方案主要基于以下几点考量非接触式测量零干扰超声波传感器通过发射和接收声波来工作无需与猪只或饮水器发生物理接触。这避免了传感器被啃咬、污染或影响动物正常饮水的风险非常适合畜牧场这种复杂、潮湿的环境。成本低廉且可靠HC-SR04模块价格仅需十元左右技术成熟精度对于本项目厘米级变化监测完全足够。相比专业的激光测距或微波雷达模块成本优势巨大。原理直观易于判断传感器垂直安装于饮水器正上方。当无猪饮水时测量的是传感器到静止水面的固定距离例如100厘米。当母猪头部伸入饮水器下方时传感器到其背部的距离会显著缩短例如变为60厘米。通过程序设定一个阈值比如低于80厘米即可判定为一次有效的饮水事件。这种“距离骤减”的信号特征非常明显抗干扰能力强。2.2 物联网架构选型ESP32 Blynk 组合的优势整个系统的数据流可以概括为“感知 - 处理 - 传输 - 展示”。感知与处理层边缘端ESP32是当之无愧的核心。它集成了Wi-Fi和蓝牙功能性能远超传统的Arduino Uno且价格相仿。其双核处理器可以轻松胜任实时读取传感器数据、进行初步滤波计算并维持稳定的网络连接的任务。我们用它来驱动HC-SR04并执行核心的逻辑判断。传输与云平台层我选择了Blynk而非自己搭建MQTT服务器。对于快速原型开发和中小规模应用Blynk的优势非常突出极速开发省去了服务器搭建、数据库设计、API编写等复杂后端工作。强大的移动端通过拖拽“Widgets”组件就能快速构建出专业的手机App界面如曲线图、仪表盘、历史数据表等。稳定可靠Blynk云端负责数据的接收、存储和转发稳定性比自己维护的服务器要好得多。应用展示层最终的数据通过Blynk App实时呈现在管理者的智能手机上。可以查看实时距离曲线也可以观察一天内的饮水次数统计实现真正的远程、可视化监控。这个架构的扩展性也很强。例如可以很容易地增加温湿度传感器DHT22来同步监测环境或者在Blynk中设置报警规则当超过设定时间未检测到饮水时自动发送推送通知。3. 硬件准备与连接详解3.1 物料清单与选型要点你需要准备以下硬件其中大部分都能在常见的电子商城或网购平台找到组件型号/规格数量备注与选型原因主控制器ESP32开发板如ESP32-DevKitC-V41块核心处理与通信单元确保引脚兼容且带有USB转串口芯片如CP2102或CH340。测距传感器HC-SR04超声波模块1个最常用的超声波模块注意区分3.3V和5V逻辑电平版本。ESP32的IO口为3.3V建议选择支持3.3V的型号或通过电平转换模块连接。连接线杜邦线母对母若干用于连接ESP32和传感器建议使用不同颜色以便区分。供电系统5V/2A USB电源适配器 Micro-USB数据线1套关键必须使用能稳定输出5V/2A的电源。猪舍环境可能存在电压波动劣质电源会导致ESP32重启或Wi-Fi断连。防护外壳防水接线盒或定制亚克力盒1个用于保护电路防止灰尘、潮气和猪只破坏。需为传感器探头和USB线开孔。辅助工具万用表、电烙铁、热熔胶枪、扎带用于调试、固定和密封。注意电源是稳定性的生命线。我在初期测试时使用了一个旧的手机充电器在猪舍内经常出现莫名重启。后来用万用表测量发现当Wi-Fi全力工作时瞬时电流可能超过1A劣质充电器电压会被拉低导致ESP32复位。更换为品牌5V/2A适配器后系统连续运行数月未出问题。3.2 电路连接图与接线原理HC-SR04有四个引脚VCC、Trig触发、Echo回响、GND。ESP32我们选择其GPIO引脚进行连接。具体的接线方式如下HC-SR04引脚 -- ESP32 GPIO引脚 -- 功能说明 VCC -- 5V引脚 -- 供电注意电平兼容性 Trig -- GPIO 0 -- 控制引脚发送触发脉冲 Echo -- GPIO 2 -- 输入引脚读取高电平持续时间 GND -- GND -- 共地接线实操与注意事项电平匹配检查首先确认你的HC-SR04模块是否支持3.3V逻辑电平。如果模块只支持5V旧版常见则Echo脚输出的5V高电平可能会损坏ESP32的GPIO2其耐受电压通常为3.3V。最安全的做法是在Echo脚和ESP32的GPIO2之间串联一个1kΩ的电阻进行分压或者使用一个双向电平转换模块。VCC接5V是为了保证传感器有足够的发射功率测量更远距离。引脚选择考量我选择GPIO0和GPIO2是因为它们在ESP32-DevKitC上易于连接且不是关键的启动配置引脚。务必避免使用GPIO6至GPIO11这些引脚通常连接内部Flash用作普通IO可能导致程序无法运行。连接稳定性猪舍内可能有振动。连接好后建议用热熔胶或接线端子对杜邦线接头进行加固防止松动。最后用扎带整理好线束。4. 软件开发环境搭建与Blynk项目配置4.1 Arduino IDE配置与ESP32支持安装我们使用Arduino IDE来编写和上传代码到ESP32。安装Arduino IDE从Arduino官网下载并安装最新版本。添加ESP32开发板支持打开IDE进入文件 - 首选项。在“附加开发板管理器网址”中填入以下地址https://espressif.github.io/arduino-esp32/package_esp32_index.json如果已有其他URL用逗号隔开。点击“确定”后进入工具 - 开发板 - 开发板管理器。搜索“esp32”找到由“Espressif Systems”提供的包点击安装。安装USB驱动必要时如果电脑无法识别插入的ESP32在端口菜单中不显示可能需要安装CP210x或CH340的USB转串口驱动。根据你的ESP32版本去芯片厂商官网下载对应驱动。安装Blynk库在IDE中点击项目 - 加载库 - 管理库...搜索“Blynk”找到由“Volodymyr Shymanskyy”维护的库点击安装。4.2 Blynk App项目创建与仪表盘设计Blynk的工作流程是“手机App创建项目 - 获取授权码 - 代码中填入授权码和Wi-Fi信息 - 设备联网上报数据”。创建新项目打开Blynk App旧版或Blynk IoT App新版界面更现代推荐使用。点击“New Project”。Project Name填写一个易识别的名字如“Sow_Water_Monitor”。Choose Device选择“ESP32 Dev Board”。Connection Type选择“Wi-Fi”。点击“Create”系统会生成一个Auth Token授权码。这个Token会通过邮件发送给你务必复制保存好它是设备连接Blynk云的唯一凭证。设计数据仪表盘在项目空白画布上点击“”添加组件。为了直观显示距离变化我们添加一个“SuperChart”超级图表组件。进入SuperChart的设置点击“ADD STREAM”选择“Virtual Pin”虚拟引脚。设置虚拟引脚号为V5与后续代码中Blynk.virtualWrite(V5, distanz);对应。配置数据流名称如“Distance (cm)”并设置Y轴范围。根据你的安装高度可以设置为0-150 cm。你还可以添加一个“Value Display”数值显示组件同样绑定到Virtual Pin V5用于实时显示当前距离数值。设计完成后点击画布右上角的“Play”按钮▶️项目进入运行模式开始等待设备连接。实操心得Blynk新旧版本的选择。Blynk 2.0旧版简单易用但部分功能受限。Blynk IoT新版功能更强大支持自定义仪表盘和更复杂的数据操作但学习曲线稍陡。对于本项目两者皆可。我建议新手从Blynk IoT开始它的文档和社区支持更活跃。关键点在于代码中引用的Blynk库函数是通用的但App端创建项目时选择的设备类型和获取Auth Token的方式必须匹配。5. 核心代码解析与烧录5.1 代码逐段解读与定制化修改以下是完整的Arduino代码我已添加了详细的中文注释// 定义Blynk调试信息输出到串口监视器便于排查问题 #define BLYNK_PRINT Serial // 引入必要的库文件 #include WiFi.h #include WiFiClient.h #include BlynkSimpleEsp32.h // 需要你修改的部分 char auth[] Your_Auth_Token; // 粘贴从Blynk App获取的授权码 char ssid[] Your_WiFi_SSID; // 你的Wi-Fi网络名称 char pass[] Your_WiFi_Password; // 你的Wi-Fi密码 // 修改结束 // 定义超声波传感器连接的引脚 const int trigPin 0; // 触发引脚接 GPIO0 const int echoPin 2; // 回响引脚接 GPIO2 // 定义变量 long duration; // 存储高电平脉冲时间微秒 int distance; // 计算出的距离厘米 // 创建一个Blynk定时器对象 BlynkTimer timer; // 定时器触发的函数读取传感器数据并发送 void sendSensorData() { // 确保触发引脚为低电平然后发送一个10微秒的高脉冲 digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // 读取回响引脚高电平的持续时间 duration pulseIn(echoPin, HIGH); // 计算距离。声速约340米/秒即0.034厘米/微秒。 // 距离 (时间 * 声速) / 2 因为声音是往返 distance duration * 0.034 / 2; // 将距离数据通过虚拟引脚V5发送到Blynk云端 Blynk.virtualWrite(V5, distance); // 可选在串口监视器中也打印出来用于本地调试 Serial.print(Distance: ); Serial.print(distance); Serial.println( cm); } // 初始化设置函数只运行一次 void setup() { // 启动串口通信波特率115200 Serial.begin(115200); // 设置传感器引脚模式 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // 连接Blynk云端和Wi-Fi网络 // 这里会阻塞直到连接成功或超时 Blynk.begin(auth, ssid, pass); // 设置一个定时器每1000毫秒1秒执行一次sendSensorData函数 timer.setInterval(1000L, sendSensorData); } // 主循环函数反复运行 void loop() { // 运行Blynk后台任务维持连接和处理指令 Blynk.run(); // 运行定时器检查是否到时间执行定时任务 timer.run(); }关键参数与逻辑说明pulseIn(echoPin, HIGH)这个函数会等待echoPin变为高电平并开始计时直到其变回低电平。它返回的时间就是超声波从发射到返回的总时间单位微秒。这是测距的核心。距离计算公式duration * 0.034 / 20.034是声速在常温下的近似值340 m/s 0.034 cm/μs。除以2是因为duration是超声波从传感器到物体再返回的往返时间。定时发送timer.setInterval(1000L, ...)这里设置为每秒发送一次数据。对于饮水监测这个频率足够捕捉到行为变化同时又不会给Blynk云端和设备带来过大负担。你可以根据实际需要调整比如改为500毫秒0.5秒以提高实时性但要注意Wi-Fi连接和数据流量的消耗。5.2 代码烧录与连接测试填入你的信息将代码中的auth、ssid、pass替换成你自己的Blynk授权码和Wi-Fi信息。选择开发板和端口在Arduino IDE的工具菜单下开发板选择“ESP32 Dev Module”。端口选择你的ESP32所连接的COM口如COM3, COM4等可在设备管理器中查看。编译与上传点击“上传”按钮。在编译完成后IDE下方会显示“Connecting…”。此时你需要快速按下ESP32开发板上的“BOOT”按钮有些板子是“EN”和“BOOT”一起按一下再松开直到开始上传程序。这是ESP32进入下载模式的常见操作。打开串口监视器上传成功后打开串口监视器右上角放大镜图标设置波特率为115200。你应该能看到ESP32尝试连接Wi-Fi和Blynk的日志连接成功后会每秒打印一次距离数据。查看Blynk App回到Blynk App如果一切正常你的SuperChart和数值显示组件应该已经开始接收并显示来自ESP32的实时距离数据了。6. 现场部署、安装与校准6.1 防护外壳制作与安装要点电路板不能裸露在猪舍环境中。你需要一个防水、防尘、坚固的外壳。外壳选择一个尺寸合适的防水接线盒IP65等级是理想选择。在盒子上开三个孔两个小圆孔对应HC-SR04的超声波发射和接收探头孔径要精确避免遮挡声波。一个较大的孔用于穿过USB电源线并在穿过后用防水胶泥或密封圈封好。内部固定使用尼龙柱或热熔胶将ESP32和传感器模块固定在外壳底板上防止晃动。传感器探头应对准开孔。安装位置与角度高度建议安装在饮水器水盘上方约80-120厘米处。这个高度可以避免猪只直接碰撞又能清晰探测到猪背。角度务必保证传感器底面与水平面平行。如果传感器倾斜测量的将是斜距而非垂直距离会导致数据严重失真。可以使用一个小的水平仪进行校准。水平偏移超声波波束有一定发散角约15度。安装时要确保在这个锥形波束范围内没有栏杆、墙壁等固定障碍物否则会干扰测量。传感器应与前方障碍物保持一定距离。6.2 系统校准与阈值设定安装好后系统需要一次简单的校准。基准距离测量在无猪饮水时观察Blynk App上显示的稳定距离值。这个值就是你的“空载基准值”记为D_base。例如D_base 105 cm。模拟触发测试用手或一个平板模拟猪背在饮水器下方移动观察距离值是否会骤降到某个范围例如60-75 cm。这个范围就是“饮水触发值”。设定逻辑判断阈值在代码中我们可以增加简单的逻辑来判断是否发生饮水。注意以下为逻辑示例需要你修改代码实现// 在全局变量区定义阈值 int drinkingThreshold 80; // 当距离小于80cm时认为在饮水 bool isDrinking false; int drinkCount 0; // 在sendSensorData函数中距离计算后添加逻辑 void sendSensorData() { // ... 原有的距离计算代码 ... Blynk.virtualWrite(V5, distance); // 简单的状态判断 if (distance drinkingThreshold !isDrinking) { isDrinking true; drinkCount; Serial.println(Drinking Event Detected! Count: String(drinkCount)); // 可以将饮水次数通过另一个虚拟引脚如V6发送到Blynk Blynk.virtualWrite(V6, drinkCount); } else if (distance drinkingThreshold) { isDrinking false; } }这样你不仅能看到实时距离还能在Blynk上看到一个累计的饮水次数。阈值drinkingThreshold需要你根据实际的D_base和模拟测试值来调整通常设为(D_base 模拟触发值) / 2再略低一点。7. 常见问题排查与优化经验在实际部署中你肯定会遇到各种问题。下面是我总结的“排坑指南”。7.1 硬件与连接问题问题现象可能原因排查步骤与解决方案ESP32无法通过USB连接电脑1. USB线仅供电无数据传输功能。2. 未安装正确的USB转串口驱动CP210x/CH340。3. 电脑端口被其他软件占用。1. 换一根确认可以传输数据的Micro-USB线。2. 打开设备管理器插拔ESP32查看端口变化根据出现的未知设备安装对应驱动。3. 关闭所有可能占用串口的软件如串口助手、另一个Arduino IDE。上传代码时一直“Connecting…”ESP32未进入下载模式。确保在出现“Connecting…”提示时迅速按下并松开板子上的“BOOT”键。有些板子需要先按住“BOOT”再点一下“EN”复位键然后松开“EN”再松开“BOOT”。Wi-Fi连接不稳定经常掉线1. 猪舍内Wi-Fi信号弱。2. 电源供电不足。3. ESP32 Wi-Fi天线位置不佳。1. 使用手机在安装点测试信号强度考虑增加Wi-Fi中继器。2.强烈建议使用5V/2A以上的优质电源适配器避免因电压跌落导致重启。3. 确保ESP32的板载天线通常是一根曲折的铜线未被金属外壳完全包裹外壳最好使用塑料材质。超声波测距数据跳动大或显示01. 传感器探头前方有障碍物或灰尘。2. 测量距离超出传感器范围HC-SR04有效测距约2-400cm。3. 回声信号受到干扰。1. 清洁传感器探头表面。2. 确保待测距离在有效范围内。太近2cm会测不到。3. 在代码中增加软件滤波。例如连续读取5次去掉最大最小值后取平均。7.2 软件与数据问题问题现象可能原因排查步骤与解决方案Blynk App显示设备离线1. Auth Token填写错误。2. ESP32未成功连接Wi-Fi。3. 网络防火墙或路由器设置阻止了Blynk连接。1. 核对代码中的auth[]与Blynk App邮件发送的是否完全一致。2. 打开串口监视器查看启动日志确认Wi-Fi的SSID和密码正确且已获取到IP地址。3. 尝试将手机热点作为Wi-Fi排除路由器限制问题。Blynk通常使用端口8080硬件设备或9443WebSocket确保网络开放这些端口。数据上传延迟或丢失1. 网络延迟。2. Blynk免费版有数据速率限制。3. 代码逻辑阻塞。1. 优化网络环境。2. Blynk免费版每个设备每秒的数据点有限制。确保你的发送间隔如1秒不超过限制。可以在sendSensorData函数中只在有显著变化时才发送数据减少流量。3. 检查loop()中是否有delay()等长延时函数它们会阻塞Blynk通信。务必使用BlynkTimer进行非阻塞延时。误触发非饮水行为导致距离变化1. 水面波动如猪玩水。2. 有其他物体短暂经过传感器下方。3. 传感器自身偶尔误读。1.软件去抖判定为饮水事件时要求距离低于阈值的状态持续一定时间如2秒而不是瞬间变化。这能过滤掉大部分短暂干扰。2.设置合理阈值阈值不要设得过于接近基准值留出安全余量。3.硬件滤波在传感器的VCC和GND之间并联一个10uF以上的电解电容可以稳定其电源减少噪声。7.3 长期运行与维护建议电源管理如果猪舍不便拉电线可以考虑使用大容量充电宝供电但需注意防潮和定期更换。更专业的方案是使用太阳能板电池的组合。数据备份与导出Blynk免费版的历史数据存储时间有限。如果需要长期分析可以编写代码在检测到饮水事件时同时向本地SD卡或另一个物联网平台如ThingsBoard、自建MySQL数据库记录一条带时间戳的数据。定期检查每月检查一次传感器探头是否被蜘蛛网、灰尘覆盖外壳密封是否完好。同时随着季节变化猪只体型和饮水器位置可能微调必要时重新校准基准距离。功能扩展本系统是一个完美的起点。你可以很容易地扩展增加第二个传感器同时监测多个饮水位。集成温湿度传感器研究环境与饮水行为的关系。在Blynk中设置报警通知当某头母猪长时间未饮水时向微信或Telegram发送警报。这个项目最让我有成就感的一点是用非常有限的预算和常见的开源组件解决了一个实际的农业生产管理问题。它可能没有商业系统那么精致但胜在完全透明、可控并且可以根据猪场的具体需求进行任意定制。从一串串跳动的数据中你真的能“看见”猪只的行为规律这种将抽象技术转化为具体生产力的过程正是物联网的魅力所在。