Earth Analyzer:面向精准农业的多模态物联网环境监测巡检车
项目定位
针对农田/温室环境监测与移动巡检需求,设计一款集成 土壤湿度、温度、光照、气体 多参数采集、差速驱动底盘、双模通信 (WiFi + nRF24L01)、太阳能供电 与 云端告警 (Telegram/Twilio/Mailgun) 于一体的自主巡检机器人。三大模块解耦设计,支持手动遥控/自主巡航/定点监测多模式。
系统架构三模块
模块 1:主控采集与执行单元 (Bolt WiFi + Arduino UNO)
- 传感器阵列:
- DFRobot 电容式土壤湿度(模拟,A0)
- LM35 温度传感器(模拟,A1)
- 光敏电阻/VEML7700 光照(模拟/I2C)
- MQ-135 气体传感器(模拟,A2)
- 执行机构:
- 2× 12V DC 减速电机 + L298N 双 H 桥驱动(差速转向)
- SG90 舵机云台(搭载摄像头/传感器)
- 通信:Bolt WiFi 模块(云端直连)+ nRF24L01(短程遥控)
- 电源:DFRobot 12V 铅酸电池太阳能充电管理模块(MPPT),12V/7Ah 胶体电池





模块 2:nRF24L01 短程遥控链路
用于视距内 (<100m) 手柄遥控,规避 WiFi 延迟/盲区。双 nRF24L01 (SPI, CE/CSN=7/8) 组成透传链路:
- 发射端(手柄):Arduino Nano + 2× 摇杆 (X/Y 各 10kΩ) → 打包 4 通道 ADC 值 → nRF 发射
- 接收端(车载):Arduino UNO + nRF → 解包 → 映射为电机 PWM + 舵机角度



模块 3:云端告警与语音交互 (Python + Integromat + IFTTT)
- Bolt Cloud API 定时拉取传感器数据
- Python 脚本 (Replit/云服务器) 判断阈值 → 调用 Telegram Bot API / Twilio SMS / Mailgun 发送告警
- Integromat (Make) 场景:Google Assistant 语音触发 → HTTP Webhook → Bolt Cloud 读取实时值 → 格式化 → Mailgun 邮件 / Twilio 短信回复
核心固件代码
1. nRF24L01 发射端 (手柄 Nano)
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte addr[6] = "00001";
int xKey = A1, yKey = A0, pKey = A3, qKey = A2; // 两摇杆 4 通道
int xVal, yVal, pVal, qVal;
int packet; // 编码后指令码
void setup() {
radio.begin();
radio.openWritingPipe(addr);
radio.setPALevel(RF24_PA_MIN);
radio.setChannel(87);
radio.setDataRate(RF24_250KBPS);
radio.stopListening();
Serial.begin(9600);
pinMode(xKey, INPUT); pinMode(yKey, INPUT);
pinMode(pKey, INPUT); pinMode(qKey, INPUT);
}
void loop() {
xVal = analogRead(xKey); yVal = analogRead(yKey);
pVal = analogRead(pKey); qVal = analogRead(qKey);
// 中位 ~512,死区 400-600
if (pVal>400 && pVal<600 && qVal>400 && qVal<600) { // 左摇杆中位,解析右摇杆=底盘运动
if (xVal>400 && xVal<600 && yVal>400 && yVal<600) packet = 100; // 停止
else if (xVal>400 && xVal<600 && yVal<400) packet = 200; // 前进
else if (xVal>400 && xVal<600 && yVal>600) packet = 300; // 后退
else if (yVal>400 && yVal<600 && xVal<400) packet = 400; // 左转
else if (yVal>400 && yVal<600 && xVal>600) packet = 500; // 右转
radio.write(&packet, sizeof(packet));
delay(100);
}
else if (pVal<400 || pVal>600) { // 左摇杆动作 = 云台控制
if (pVal<400) packet = 600; // 舵机归中
else packet = 700; // 舵机极限
radio.write(&packet, sizeof(packet));
delay(100);
}
}
2. nRF24L01 接收端 (车载 UNO)
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <Servo.h>
RF24 radio(7, 8); const byte addr[6] = "00001";
Servo servo; int servoPin = 9;
void setup() {
Serial.begin(9600);
radio.begin(); radio.openReadingPipe(0, addr);
radio.setPALevel(RF24_PA_MIN); radio.setChannel(87);
radio.setDataRate(RF24_250KBPS); radio.startListening();
servo.attach(servoPin);
pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(6,OUTPUT); // L298N IN1-IN4
}
void loop() {
if (radio.available()) {
int cmd; radio.read(&cmd, sizeof(cmd));
switch (cmd) {
case 100: stopMotors(); break;
case 200: forward(); break;
case 300: backward(); break;
case 400: turnLeft(); break;
case 500: turnRight(); break;
case 600: servo.write(90); break;
case 700: servo.write(180); break;
}
} else {
Serial.println("Link lost"); stopMotors(); // 失联保护
}
}
void forward() { digitalWrite(6,HIGH); digitalWrite(5,LOW); digitalWrite(4,HIGH); digitalWrite(3,LOW); }
void backward() { digitalWrite(6,LOW); digitalWrite(5,HIGH); digitalWrite(4,LOW); digitalWrite(3,HIGH); }
void turnLeft() { digitalWrite(6,LOW); digitalWrite(5,HIGH); digitalWrite(4,HIGH); digitalWrite(3,LOW); }
void turnRight() { digitalWrite(6,HIGH); digitalWrite(5,LOW); digitalWrite(4,LOW); digitalWrite(3,HIGH); }
void stopMotors() { digitalWrite(6,LOW); digitalWrite(5,LOW); digitalWrite(4,LOW); digitalWrite(3,LOW); }
3. 云端告警 Python 脚本 (main.py)
import requests, json, time
from boltiot import Bolt
import conf # 含 bolt_api_key, device_id, telegram_bot_id, telegram_chat_id, threshold
mybolt = Bolt(conf.bolt_api_key, conf.device_id)
def get_sensor(pin):
try:
resp = mybolt.digitalRead(pin)
data = json.loads(resp)
if data['success'] != 1: return -999
return int(data['value'])
except Exception as e:
print("Sensor read error:", e)
return -999
def send_telegram(msg):
url = f"https://api.telegram.org/{conf.telegram_bot_id}/sendMessage"
payload = {"chat_id": conf.telegram_chat_id, "text": msg}
try:
r = requests.get(url, params=payload)
return json.loads(r.text)['ok']
except Exception as e:
print("Telegram error:", e)
return False
while True:
val = get_sensor("4") # 土壤湿度数字引脚
print("Soil:", val)
if val == -999: time.sleep(10); continue
if val >= conf.threshold: # 阈值触发
send_telegram(f"⚠️ 土壤湿度超标: {val}%")
time.sleep(100)
# conf.py
bolt_api_key = "XXXX"
device_id = "BOLTXXXX"
telegram_chat_id = "@your_channel"
telegram_bot_id = "botXXXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAA"
threshold = 700 # 根据校准调整
Telegram Bot 与 Channel 搭建全流程
- 安装 Telegram,注册账号
- 搜索 @BotFather →
/newbot→ 设定名称/用户名 → 获得bot - 左滑菜单 → New Channel → 公开 → 设定永久链接 (如
soil_alert_farm1) → 保存链接名 - Channel 信息 → Administrators → Add Admin → 搜索 Bot 用户名 → 勾选 Post Messages 权限
- 获取
chat_id:转发 Channel 任意消息给 @userinfobot,回复含chat_id(如-1001234567890)















语音交互链路 (Google Assistant → IFTTT → Integromat → Bolt → 短信/邮件)
- Integromat 新建 Scenario:IFTTT Webhook (触发) → HTTP Request (GET Bolt API) → Router → Mailgun (邮件) / Twilio (短信)
- HTTP Request URL:
https://cloud.boltiot.com/remote/<API_KEY>/analogRead?pin=A0&deviceName=BOLTXXXX - Mailgun 内容模板:提取 JSON 中
value字段 →substring(11,14)取数值 → 除以 10.24 得 °C → 填入邮件正文 - 开启 Scheduling → Run immediately
- IFTTT 新 Applet:Google Assistant “Say a simple phrase” (如 “send temperature”) → Webhooks “Make a web request” (POST Integromat Webhook URL)









硬件接线实拍 (LM35 示例)



总结与展望
Earth Analyzer 实现了“感知-决策-执行-通信”全链路打通,模块化设计便于扩展:
- 短期:加装 GPS 定位、LoRa 远程中继、太阳能功率跟踪 (MPPT) 效率优化
- 中期:边缘推理 (TensorFlow Lite) 识别作物病虫害、自主规划巡检路径 (SLAM)
- 长期:标准化接口对接农业数字孪生平台,支撑精准灌溉/施肥/收获决策
所有代码、原理图、3D 模型开源,欢迎 Fork 贡献:GitHub 仓库
制造工艺
- DIY 蓝牙控制 Arduino 间谍小车
- FlickMote:基于手势的智能家居红外遥控器
- DIY Arduino TV-B-Gone:万能关机遥控器
- 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- Arduino 项目优化供电方案:从按键开关到电池监测与数据记录
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- 从零构建智能 Arduino 四足机器人:完整指南
- Bolt IoT + Arduino UNO 实现 6 路 LED 无级调光
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- 利用 Arduino Nano R3 自制全功能 CNC 雕刻机
- 基于 Arduino Mega 与物联网传感器的高级家庭监控系统