去年夏天在朋友的水产养殖场第一次见到自动化养虾系统时,就被这个结合了IoT技术和传统养殖的解决方案深深吸引。经过半年筹备,我的OpenClaw养虾系统终于进入实施阶段。这个开源项目通过传感器网络+自动化控制+数据分析的组合,实现水质监测、精准投喂和环境调控的闭环管理。
首期工程聚焦系统基础配置,就像盖房子要先打地基。需要完成三大核心准备:硬件环境搭建(树莓派+传感器阵列)、工具链配置(Python+Docker+MQTT)以及开发环境调试。过程中遇到不少"坑",比如传感器校准偏差、GPIO引脚冲突、容器网络隔离等问题,这些经验都会在后续详细展开。
养虾系统的硬件架构遵循"边缘计算+云端协同"原则。主控采用树莓派4B(4GB内存版本),这个选择基于三点考量:GPIO接口丰富(连接各类传感器)、功耗适中(需7x24小时运行)以及社区支持完善。实测在运行Docker容器的情况下,CPU负载长期保持在30%以下。
传感器阵列包含:
特别注意:所有水下传感器必须使用食品级环氧树脂做防水处理,我曾在初期测试时因密封不严导致PH传感器短路。
操作系统选用Raspberry Pi OS Lite版本(无桌面环境),通过以下命令完成基础配置:
bash复制# 启用必要接口
sudo raspi-config nonint do_i2c 0
sudo raspi-config nonint do_spi 0
sudo raspi-config nonint do_serial 0
# 安装docker
curl -sSL https://get.docker.com | sh
sudo usermod -aG docker pi
# 设置容器自动重启策略
docker update --restart unless-stopped $(docker ps -q)
GPIO引脚分配需要特别注意避免冲突。这是我的引脚映射表:
| 设备 | 引脚类型 | 物理引脚 | 备注 |
|---|---|---|---|
| DS18B20 | 1-Wire | GPIO4 | 需启用dtoverlay |
| DHT22 | GPIO | GPIO17 | 需上拉电阻 |
| PH-4502C | ADC | - | 通过ADS1115扩展 |
| 继电器模块 | GPIO | GPIO27 | 低电平触发 |
项目主要使用Python 3.9(与最新版RPi OS兼容性最佳)。建议使用venv创建隔离环境:
bash复制python3 -m venv ~/venv/openclaw
source ~/venv/openclaw/bin/activate
pip install --upgrade pip setuptools wheel
核心依赖库包括:
遇到的一个典型问题是ADS1115库的安装冲突,解决方法是指定版本:
bash复制pip install adafruit-circuitpython-ads1x15==1.0.2 --force-reinstall
将各功能模块容器化可以提高系统可靠性。以下是docker-compose.yml的关键配置:
yaml复制version: '3'
services:
mqtt_broker:
image: eclipse-mosquitto:2.0
ports:
- "1883:1883"
volumes:
- ./mosquitto.conf:/mosquitto/config/mosquitto.conf
restart: always
data_collector:
build: ./collector
devices:
- "/dev/i2c-1:/dev/i2c-1"
- "/dev/gpiomem:/dev/gpiomem"
cap_add:
- SYS_RAWIO
environment:
- MQTT_HOST=mqtt_broker
depends_on:
- mqtt_broker
容器访问硬件设备的关键是正确挂载设备文件并赋予权限。曾因漏配SYS_RAWIO导致GPIO操作失败。
初期运行发现温度传感器读数周期性波动,排查过程:
当网络波动时出现数据点丢失,通过以下改进增强可靠性:
python复制# 增加消息重试机制
client = mqtt.Client()
client.reconnect_delay_set(min_delay=1, max_delay=60)
client.enable_logger()
# 启用QoS1级别
client.publish("sensors/temp", payload=temp, qos=1, retain=True)
同时添加本地缓存机制,使用SQLite临时存储未发送成功的数据:
python复制def backup_data(topic, data):
with sqlite3.connect('/var/openclaw/cache.db') as conn:
conn.execute("INSERT INTO mqtt_cache VALUES (?, ?, ?)",
(datetime.now(), topic, data))
当同时操作多个GPIO设备时出现随机故障,通过以下方法解决:
python复制from threading import Lock
gpio_lock = Lock()
def read_sensor():
with gpio_lock:
# GPIO操作代码
pass
使用内置的vcgencmd结合Prometheus实现监控:
bash复制# 安装prometheus客户端
pip install prometheus_client
# 示例监控代码
from prometheus_client import Gauge
cpu_temp = Gauge('rpi_cpu_temp', 'CPU temperature')
def update_metrics():
temp = os.popen('vcgencmd measure_temp').read()
cpu_temp.set(float(temp.split('=')[1][:-3]))
Grafana仪表板配置关键指标:
为提升系统稳定性,采取以下措施:
c复制// 内核模块配置
sudo modprobe bcm2835_wdt
sudo sh -c 'echo "bcm2835_wdt" >> /etc/modules'
为避免频繁操作真实硬件,开发阶段可以使用虚拟设备:
python复制class MockSensor:
def __init__(self, variance=0.5):
self.base = 25.0 # 基础温度
self.variance = variance
def read_temp(self):
return self.base + random.uniform(-self.variance, self.variance)
采用多级日志管理(DEBUG到CRITICAL),关键配置:
python复制import logging
handler = logging.handlers.RotatingFileHandler(
'/var/log/openclaw.log',
maxBytes=10*1024*1024,
backupCount=5
)
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[handler]
)
针对硬件交互代码的特殊测试方法:
python复制import unittest
from unittest.mock import patch
class TestGPIO(unittest.TestCase):
@patch('RPi.GPIO.input')
def test_read_sensor(self, mock_input):
mock_input.return_value = 1
result = read_button()
self.assertEqual(result, True)
经过三周的持续调试,系统已能稳定采集所有传感器数据并通过MQTT传输到云端。下个阶段将重点实现水质异常检测算法和自动投喂控制逻辑。在部署过程中最大的体会是:硬件项目必须留足调试余量,比如GPIO引脚最好预留20%的备用接口,容器配置要保留调试用的交互式终端。