智能物联网罐:ESP8266 + Arduino + 超声波传感器实时监测罐内物位
项目概述
本项目打造一款“智能罐”,利用 HC-SR04 超声波测距模块实时监测罐内物品高度 (如米、豆、零食等),Arduino UNO 采集数据并通过 ESP8266-01 WiFi 模块上传至本地服务器 (XAMPP + MySQL + PHP),网页端实时显示剩余量百分比与历史曲线。适合厨房储物罐、宠物粮桶、工业料斗等场景的远程监控与缺料报警。
所需组件与物料
- Arduino UNO R3 × 1
- ESP8266-01 WiFi 模块 × 1 (需 3.3V 供电,峰值电流 300mA+)
- HC-SR04 超声波测距模块 × 1
- 面包板 × 1
- 1kΩ 电阻 × 4 (ESP8266 电平转换分压)
- 杜邦线 ~15 根
- 透明塑料罐 (便于观察与安装传感器)
- Micro-USB 线 (Arduino 供电/烧录)
硬件接线详解
ESP8266-01 电平转换 (关键!)
ESP8266 为 3.3V 逻辑,Arduino UNO 为 5V 逻辑,**直连会烧毁 ESP8266**。必须用分压电阻降级 Arduino TX→ESP RX:
- Arduino D2 (SoftwareSerial TX) → 1kΩ → ESP RX → 2kΩ → GND (分压得 3.3V)
- Arduino D3 (SoftwareSerial RX) ← ESP TX (3.3V 高电平兼容 5V 判定,可直连)
- ESP VCC → 3.3V 稳压源 (Arduino 3.3V 引脚电流不足,**必须外接 AMS1117-3.3 或 LD1117-3.3 模块**,加 10μF+100nF 滤波)
- ESP CH_PD/EN → 3.3V (使能)
- ESP GND → 系统共地
HC-SR04 接线
| 引脚 | Arduino |
|---|---|
| VCC | 5V |
| Trig | D9 |
| Echo | D10 |
| GND | GND |
软件架构
Arduino 端 (数据采集 + AT 指令透传)
- 库:`SoftwareSerial.h` (D2/D3 模拟串口与 ESP 通信)
- 主循环:触发 HC-SR04 测距 → 计算距离 `cm` → 拼接 HTTP GET 请求字符串 → 发送 `AT+CIPSTART="TCP","IP",80` → `AT+CIPSEND=len` → 发送 GET 数据 → 等待响应 → 延时 2 秒下一周期。
- 响应处理:`response()` 函数轮询 SoftwareSerial 打印 ESP 回显至硬件串口调试。
服务器端 (XAMPP + MySQL + PHP)
数据库设计
CREATE DATABASE smartjar;
USE smartjar;
CREATE TABLE `data` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`distance_cm` FLOAT NOT NULL,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
插入脚本 `insert.php`
<?php
$conn = new mysqli("localhost", "root", "", "smartjar");
if ($conn->connect_error) die("Connection failed: " . $conn->connect_error);
$dist = isset($_GET['dist']) ? floatval($_GET['dist']) : 0;
$sql = "INSERT INTO data (distance_cm) VALUES ($dist)";
$conn->query($sql);
$conn->close();
?>
显示脚本 `display.php`
<?php
$conn = new mysqli("localhost", "root", "", "smartjar");
$result = $conn->query("SELECT * FROM data ORDER BY id DESC LIMIT 50");
// 输出 HTML 表格或 JSON 供前端图表库 (Chart.js/ECharts) 调用
?>
关键配置参数
- 罐子总高度 `TANK_HEIGHT_CM` (如 30cm),代码中换算剩余百分比:`percent = 100 * (TANK_HEIGHT - distance) / TANK_HEIGHT`。
- WiFi 凭证:`AT+CWJAP="SSID","PASS"`
- 服务器 IP:`AT+CIPSTART="TCP","192.168.x.x",80` (局域网静态 IP)
- GET 路径:`GET /insert.php?dist=XX.XX\r\nabcd1234` (末尾自定义标识符)
常见问题与调试
- ESP8266 无响应/乱码:波特率不匹配。出厂常为 115200,代码用 9600。需发送 `AT+UART_DEF=9600,8,1,0,0` 固化波特率,或 Arduino 改 115200 (SoftwareSerial 不稳定)。建议用 USB-TTL 单独配置 ESP 后再接 Arduino。
- 供电不足复位:ESP 发射峰值 300mA+,Arduino 3.3V 引脚仅 50mA,**必须外接稳压模块**,并加大容量电解电容。
- 超声波读数波动:罐内壁光滑导致多次反射,可在传感器前加泡沫喇叭口聚焦,或软件中值滤波 (取 5 次中位值)。
- 局域网穿透:外网访问需路由器端口映射或用 ngrok/frp 内网穿透。
扩展方向
- 替换 ESP8266-01 为 ESP-12F/NodeMCU,集成更稳定、GPIO 更多。
- 迁移至 MQTT + Home Assistant / ThingsBoard,实现仪表盘、报警推送 (Telegram/Email)。
- 加入太阳能 + 18650 + TP4056 实现户外离网运行。
- 多罐监测:单 Arduino + 多路超声波 (复用 Trig,Echo 接不同 GPIO) + 多路复用器。
- APP 端:MIT App Inventor / Flutter 开发原生手机应用,推送缺料通知。
项目文件
- Arduino 代码:`SmartJar.ino` (文末片段,完整版见 GitHub)
- GitHub 仓库:https://github.com/santynaren/iotsmartjar (含 README、PHP 脚本、数据库 SQL、原理图)
- 联系邮箱:santhoshnarendra@gmail.com / ajaykarthikkasinaathan14@gmail.com
制造工艺
- 树莓派与 Python 构建远程温度传感器:分步实战指南
- Windows 10 IoT Core 上基于 SHT15 的精准温湿度监测
- DHT11 温湿度传感器项目:LED 指示与压电蜂鸣器报警
- 用 Arduino 制作超声波悬浮装置:分步指南
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- 基于 Arduino 与 MAX30100 的实时物联网心率监测系统
- DFRobot 电容指纹传感器 (ID809) 接入 Arduino/ESP8266 完整教程
- 基于 1Sheeld 的智能家居安防系统:语音/短信控制与入侵报警
- Arduino 声纳实时测距与 Processing 可视化
- DIY 智能 Arduino 机械臂:主从控制与动作记忆教程
- Arduino 高速转速计 - 单次检测算法实测 6.5MHz 级响应,红外 + 红激光方案
- 基于 Arduino 与 ESP8266 的 WiFi 智能门锁:手机扫码解锁