主要更改: 1. 新增使用手册: - AI算法更新指南 - HTPA60x40传感器升级指南 - 环境配置教程 2. 传感器模块优化: - HTPA60x40dR1L0.9传感器集成 - HTPAd32x32L1k7传感器更新 - 传感器配置文档完善 3. 项目文档整理: - 删除过期的433MHz使用指南 - 更新README文档结构 - 完善配置教程链接 目标:完善项目文档,优化传感器集成
18 KiB
18 KiB
ESP32智能火灾报警系统 - 故障排除与维护指南
🚨 常见故障诊断
1. 硬件故障
🔋 电源问题
故障现象:ESP32无法启动或频繁重启
症状:
- 上电后无任何反应
- LED不亮或闪烁异常
- 串口无输出信息
- 设备频繁重启
诊断步骤:
1. 检查电源适配器输出电压
万用表测量:应为5V ±0.25V
2. 检查ESP32供电电压
测量VIN引脚:应为5V
测量3.3V引脚:应为3.3V ±0.1V
3. 检查电流消耗
正常工作电流:300-800mA
异常高电流:>1.5A(可能短路)
4. 检查电源线连接
确保VIN和GND连接牢固
检查是否有虚焊或断线
解决方案:
□ 更换电源适配器(推荐5V/2A)
□ 检查并重新焊接电源连接
□ 添加电源滤波电容(100μF)
□ 检查是否有短路点
□ 使用万用表逐一排查连接
🌡️ 传感器故障
故障现象:传感器读数异常或无读数
温度传感器故障:
- 读数始终为0或-127°C
- 读数跳变异常
- 无法检测到传感器
烟雾传感器故障:
- ADC读数始终为0或4095
- 对烟雾无反应
- 读数漂移严重
PIR传感器故障:
- 无法检测人体移动
- 持续输出高电平
- 检测距离异常短
诊断步骤:
# 温度传感器诊断
1. 检查供电电压(应为3.3V)
2. 检查数据线连接(GPIO18)
3. 检查上拉电阻(4.7kΩ)
4. 用万用表测试传感器输出
# 烟雾传感器诊断
1. 检查供电电压(应为3.3V)
2. 检查模拟输出连接(GPIO19)
3. 测试传感器预热时间(需要20-30秒)
4. 检查传感器清洁度
# PIR传感器诊断
1. 检查供电电压(应为3.3V)
2. 检查数字输出连接(GPIO21)
3. 测试传感器灵敏度调节
4. 检查检测范围和角度
解决方案:
□ 重新连接传感器引脚
□ 更换损坏的传感器
□ 清洁传感器表面
□ 调整传感器位置和角度
□ 检查代码中的GPIO配置
□ 添加软件滤波算法
📡 红外发射器故障
故障现象:空调不响应红外控制
症状:
- 空调完全无反应
- 只有部分按键有效
- 控制距离异常短
- 红外信号不稳定
诊断步骤:
1. 检查红外发射器供电
测量VCC:应为3.3V
2. 检查信号连接
确认DATA连接到GPIO4
3. 测试红外信号发射
用手机摄像头观察红外LED
应该看到紫色闪光
4. 检查发射距离和角度
最佳距离:1-3米
发射角度:对准空调接收窗口
5. 验证红外编码
检查日志中的红外数据
确认pattern数据正确
解决方案:
□ 重新连接红外发射器
□ 调整发射器位置和角度
□ 更换红外发射器模块
□ 检查GPIO4配置
□ 重新配对空调遥控器
□ 增加发射功率(如果支持)
2. 软件故障
🌐 WiFi连接问题
故障现象:无法连接WiFi或连接不稳定
症状:
- 无法扫描到WiFi网络
- 连接后频繁断开
- 获取不到IP地址
- 网络速度异常慢
诊断步骤:
1. 检查WiFi配置
SSID和密码是否正确
WiFi频段是否为2.4GHz
2. 检查信号强度
RSSI应该 > -70dBm
距离路由器不超过10米(测试时)
3. 检查路由器设置
是否启用MAC地址过滤
是否限制设备数量
DHCP是否正常工作
4. 检查ESP32日志
查看WiFi连接错误信息
检查IP地址分配情况
解决方案:
□ 重置WiFi配置(长按GPIO0按钮)
□ 手动设置静态IP地址
□ 更换WiFi网络或路由器
□ 调整ESP32位置改善信号
□ 更新WiFi驱动程序
□ 检查路由器固件版本
📱 Android应用问题
故障现象:应用崩溃或功能异常
症状:
- 应用启动崩溃
- 无法发现ESP32设备
- 控制指令无响应
- 界面显示异常
诊断步骤:
1. 检查应用日志
adb logcat | grep "com.archesens.android"
2. 检查网络连接
手机和ESP32是否在同一网络
3. 检查权限设置
网络权限是否已授予
4. 检查SDK版本兼容性
Android版本是否支持
5. 测试网络通信
使用浏览器访问ESP32 IP地址
解决方案:
□ 清除应用数据和缓存
□ 重新安装APK
□ 检查Android版本兼容性
□ 手动输入ESP32 IP地址
□ 重启手机和ESP32设备
□ 更新应用到最新版本
🔧 编译和烧录问题
故障现象:代码编译失败或烧录失败
编译错误:
- 找不到头文件
- 链接错误
- 内存不足错误
烧录错误:
- 无法识别设备
- 烧录中断
- 校验失败
诊断步骤:
1. 检查开发环境
ESP-IDF版本:5.5.2
Python版本:3.12
2. 检查项目配置
sdkconfig是否正确
CMakeLists.txt是否完整
3. 检查串口连接
COM端口是否正确
波特率设置:460800
4. 检查USB驱动
设备管理器中是否识别ESP32
解决方案:
□ 重新安装ESP-IDF环境
□ 清理并重新编译项目
□ 更换USB数据线
□ 安装或更新USB驱动
□ 降低烧录波特率到115200
□ 手动进入下载模式
3. 网络通信故障
🌍 云端通信问题
故障现象:无法上传报警数据到云端
症状:
- HTTP请求超时
- 服务器返回错误
- 数据格式错误
- 认证失败
诊断步骤:
1. 检查网络连接
ping 云端服务器IP
2. 检查防火墙设置
端口30088是否开放
3. 检查数据格式
JSON格式是否正确
4. 检查服务器状态
使用curl测试API接口
5. 检查认证信息
设备ID是否正确
解决方案:
□ 检查网络防火墙设置
□ 验证云端服务器状态
□ 修正数据格式错误
□ 更新API接口地址
□ 重新生成设备认证信息
□ 增加重试机制
🔍 高级诊断工具
1. 硬件测试工具
万用表测试清单:
电压测试:
□ 电源输入:5V ±0.25V
□ ESP32 3.3V输出:3.3V ±0.1V
□ 传感器供电:3.3V ±0.1V
□ GPIO输出电压:0V/3.3V
电阻测试:
□ 温度传感器上拉电阻:4.7kΩ ±5%
□ LED限流电阻:220Ω ±5%
□ 各连接点通断测试
电流测试:
□ 系统总电流:300-800mA
□ 各模块单独电流测试
示波器测试(如果可用):
信号测试:
□ GPIO4红外信号波形
□ I2C通信信号(SDA/SCL)
□ UART通信信号
□ PWM信号波形
2. 软件调试工具
ESP32调试命令:
# 内存信息
esp_get_free_heap_size()
esp_get_minimum_free_heap_size()
# 任务信息
vTaskList()
vTaskGetRunTimeStats()
# WiFi信息
esp_wifi_get_config()
esp_wifi_sta_get_ap_info()
# 系统信息
esp_get_idf_version()
esp_restart_get_reason()
日志分析脚本:
# log_analyzer.py
import re
import sys
from datetime import datetime
def analyze_esp32_log(log_file):
"""分析ESP32日志文件"""
errors = []
warnings = []
memory_usage = []
with open(log_file, 'r', encoding='utf-8') as f:
for line in f:
# 提取错误信息
if 'ERROR' in line or '❌' in line:
errors.append(line.strip())
# 提取警告信息
elif 'WARN' in line or '⚠️' in line:
warnings.append(line.strip())
# 提取内存使用信息
elif 'Free heap' in line:
match = re.search(r'Free heap: (\d+)', line)
if match:
memory_usage.append(int(match.group(1)))
# 生成报告
print(f"日志分析报告 - {datetime.now()}")
print(f"错误数量: {len(errors)}")
print(f"警告数量: {len(warnings)}")
if memory_usage:
print(f"内存使用: 最小 {min(memory_usage)} bytes, "
f"最大 {max(memory_usage)} bytes, "
f"平均 {sum(memory_usage)//len(memory_usage)} bytes")
# 显示最近的错误
if errors:
print("\n最近的错误:")
for error in errors[-5:]:
print(f" {error}")
if __name__ == "__main__":
if len(sys.argv) > 1:
analyze_esp32_log(sys.argv[1])
else:
print("用法: python log_analyzer.py <log_file>")
3. 网络诊断工具
网络连接测试脚本:
# network_test.py
import requests
import socket
import time
import json
def test_esp32_connection(ip_address):
"""测试ESP32网络连接"""
base_url = f"http://{ip_address}"
print(f"测试ESP32连接: {ip_address}")
# 1. Ping测试
try:
socket.create_connection((ip_address, 80), timeout=5)
print("✅ TCP连接成功")
except Exception as e:
print(f"❌ TCP连接失败: {e}")
return False
# 2. HTTP状态测试
try:
response = requests.get(f"{base_url}/api/status", timeout=10)
print(f"✅ HTTP状态: {response.status_code}")
print(f" 响应时间: {response.elapsed.total_seconds():.2f}s")
except Exception as e:
print(f"❌ HTTP请求失败: {e}")
# 3. 功能接口测试
test_endpoints = [
"/api/sensors",
"/api/alarm/status",
"/api/system/info"
]
for endpoint in test_endpoints:
try:
response = requests.get(f"{base_url}{endpoint}", timeout=5)
print(f"✅ {endpoint}: {response.status_code}")
except Exception as e:
print(f"❌ {endpoint}: {e}")
# 4. 空调控制测试
try:
data = {"keyType": "POWER"}
response = requests.post(
f"{base_url}/api/ac/control",
headers={"Content-Type": "application/json"},
data=json.dumps(data),
timeout=10
)
print(f"✅ 空调控制测试: {response.status_code}")
except Exception as e:
print(f"❌ 空调控制测试失败: {e}")
if __name__ == "__main__":
# 自动发现ESP32设备
import subprocess
# 扫描局域网中的ESP32设备
for i in range(1, 255):
ip = f"192.168.1.{i}"
try:
result = subprocess.run(['ping', '-n', '1', '-w', '1000', ip],
capture_output=True, text=True)
if result.returncode == 0:
# 尝试连接HTTP服务
try:
response = requests.get(f"http://{ip}/api/status", timeout=2)
if response.status_code == 200:
print(f"发现ESP32设备: {ip}")
test_esp32_connection(ip)
break
except:
continue
except:
continue
else:
print("未发现ESP32设备,请手动指定IP地址")
🛠️ 预防性维护
1. 定期检查清单
每周检查(5分钟):
□ 检查设备运行状态LED
□ 测试报警功能(用打火机测试烟雾传感器)
□ 检查WiFi连接状态
□ 查看Android应用连接状态
□ 检查电源适配器温度
每月检查(30分钟):
□ 清洁传感器表面灰尘
□ 检查所有连接线是否松动
□ 测试所有空调控制功能
□ 检查系统日志是否有异常
□ 备份重要配置数据
□ 检查固件版本是否需要更新
每季度检查(2小时):
□ 全面功能测试
□ 性能数据分析
□ 硬件连接重新检查
□ 软件版本更新
□ 安全漏洞检查
□ 文档更新
2. 维护工具和脚本
自动健康检查脚本:
# health_check.py
import requests
import json
import smtplib
from email.mime.text import MIMEText
from datetime import datetime
class ESP32HealthChecker:
def __init__(self, esp32_ip, email_config=None):
self.esp32_ip = esp32_ip
self.base_url = f"http://{esp32_ip}"
self.email_config = email_config
self.issues = []
def check_connectivity(self):
"""检查网络连接"""
try:
response = requests.get(f"{self.base_url}/api/status", timeout=10)
if response.status_code != 200:
self.issues.append(f"HTTP状态异常: {response.status_code}")
except Exception as e:
self.issues.append(f"网络连接失败: {e}")
def check_sensors(self):
"""检查传感器状态"""
try:
response = requests.get(f"{self.base_url}/api/sensors", timeout=5)
if response.status_code == 200:
data = response.json()
# 检查温度传感器
if data.get('temperature', 0) < -50 or data.get('temperature', 0) > 100:
self.issues.append("温度传感器读数异常")
# 检查烟雾传感器
if data.get('smoke', 0) < 0 or data.get('smoke', 0) > 4095:
self.issues.append("烟雾传感器读数异常")
except Exception as e:
self.issues.append(f"传感器检查失败: {e}")
def check_memory(self):
"""检查内存使用"""
try:
response = requests.get(f"{self.base_url}/api/system/info", timeout=5)
if response.status_code == 200:
data = response.json()
free_heap = data.get('free_heap', 0)
if free_heap < 50000: # 小于50KB
self.issues.append(f"内存不足: {free_heap} bytes")
except Exception as e:
self.issues.append(f"内存检查失败: {e}")
def send_alert(self):
"""发送告警邮件"""
if not self.issues or not self.email_config:
return
subject = f"ESP32健康检查告警 - {datetime.now().strftime('%Y-%m-%d %H:%M')}"
body = f"发现以下问题:\n\n" + "\n".join(f"- {issue}" for issue in self.issues)
msg = MIMEText(body, 'plain', 'utf-8')
msg['Subject'] = subject
msg['From'] = self.email_config['from']
msg['To'] = self.email_config['to']
try:
with smtplib.SMTP(self.email_config['smtp_server'], 587) as server:
server.starttls()
server.login(self.email_config['username'], self.email_config['password'])
server.send_message(msg)
print("告警邮件发送成功")
except Exception as e:
print(f"邮件发送失败: {e}")
def run_check(self):
"""运行完整健康检查"""
print(f"开始健康检查 - {datetime.now()}")
self.check_connectivity()
self.check_sensors()
self.check_memory()
if self.issues:
print("发现问题:")
for issue in self.issues:
print(f" ❌ {issue}")
self.send_alert()
else:
print("✅ 系统状态正常")
# 使用示例
if __name__ == "__main__":
# 邮件配置(可选)
email_config = {
'smtp_server': 'smtp.gmail.com',
'username': 'your_email@gmail.com',
'password': 'your_password',
'from': 'your_email@gmail.com',
'to': 'admin@company.com'
}
checker = ESP32HealthChecker("192.168.1.100", email_config)
checker.run_check()
3. 备份和恢复
配置备份脚本:
#!/bin/bash
# backup_config.sh
BACKUP_DIR="./backups/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
echo "开始备份配置..."
# 备份ESP32配置
cp firefly_esp32/sdkconfig "$BACKUP_DIR/"
cp firefly_esp32/partitions.csv "$BACKUP_DIR/"
# 备份Android配置
cp -r Smarthome_android/app/src/main/assets "$BACKUP_DIR/"
# 备份重要脚本
cp -r python_test "$BACKUP_DIR/"
# 创建备份说明
cat > "$BACKUP_DIR/README.txt" << EOF
备份时间: $(date)
ESP32固件版本: $(git describe --tags)
Android应用版本: $(grep versionName Smarthome_android/app/build.gradle.kts)
备份内容:
- ESP32配置文件
- Android应用配置
- Python测试脚本
EOF
echo "备份完成: $BACKUP_DIR"
📞 技术支持和联系方式
紧急故障处理流程:
- 立即处理:系统完全无法工作
- 优先处理:核心功能异常(火灾报警失效)
- 正常处理:次要功能问题(红外控制异常)
- 计划处理:性能优化和功能增强
故障报告模板:
故障报告
========
报告时间: [YYYY-MM-DD HH:MM]
报告人: [姓名]
设备信息: [ESP32 MAC地址/Android设备型号]
故障描述:
[详细描述故障现象]
复现步骤:
1. [步骤1]
2. [步骤2]
3. [步骤3]
环境信息:
- ESP32固件版本: [版本号]
- Android应用版本: [版本号]
- 网络环境: [WiFi信息]
- 硬件配置: [传感器型号等]
已尝试的解决方案:
[列出已经尝试过的解决方法]
日志信息:
[粘贴相关日志]
附件:
[截图、日志文件等]
维护记录模板:
维护记录
========
维护时间: [YYYY-MM-DD HH:MM]
维护人员: [姓名]
维护类型: [预防性维护/故障维修/升级更新]
维护内容:
[详细记录维护操作]
发现问题:
[记录发现的问题]
解决方案:
[记录采取的解决措施]
测试结果:
[记录测试验证结果]
下次维护建议:
[提出下次维护的建议]
重要提醒:
- 遇到问题时不要慌张,按步骤排查
- 详细记录故障现象和解决过程
- 定期进行预防性维护
- 保持系统和文档的及时更新
- 建立完善的备份和恢复机制
文档版本:v1.0
最后更新:2026年2月26日