smart-home/使用手册/手册指南/故障排除与维护指南.md
小羊肉肉. 0548c1555f 更新项目文档和传感器模块
主要更改:
1. 新增使用手册:
   - AI算法更新指南
   - HTPA60x40传感器升级指南
   - 环境配置教程

2. 传感器模块优化:
   - HTPA60x40dR1L0.9传感器集成
   - HTPAd32x32L1k7传感器更新
   - 传感器配置文档完善

3. 项目文档整理:
   - 删除过期的433MHz使用指南
   - 更新README文档结构
   - 完善配置教程链接

 目标:完善项目文档,优化传感器集成
2026-02-26 18:11:43 +08:00

18 KiB
Raw Blame History

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"

📞 技术支持和联系方式

紧急故障处理流程:

  1. 立即处理:系统完全无法工作
  2. 优先处理:核心功能异常(火灾报警失效)
  3. 正常处理:次要功能问题(红外控制异常)
  4. 计划处理:性能优化和功能增强

故障报告模板:

故障报告
========
报告时间: [YYYY-MM-DD HH:MM]
报告人: [姓名]
设备信息: [ESP32 MAC地址/Android设备型号]

故障描述:
[详细描述故障现象]

复现步骤:
1. [步骤1]
2. [步骤2]
3. [步骤3]

环境信息:
- ESP32固件版本: [版本号]
- Android应用版本: [版本号]
- 网络环境: [WiFi信息]
- 硬件配置: [传感器型号等]

已尝试的解决方案:
[列出已经尝试过的解决方法]

日志信息:
[粘贴相关日志]

附件:
[截图、日志文件等]

维护记录模板:

维护记录
========
维护时间: [YYYY-MM-DD HH:MM]
维护人员: [姓名]
维护类型: [预防性维护/故障维修/升级更新]

维护内容:
[详细记录维护操作]

发现问题:
[记录发现的问题]

解决方案:
[记录采取的解决措施]

测试结果:
[记录测试验证结果]

下次维护建议:
[提出下次维护的建议]

重要提醒

  1. 遇到问题时不要慌张,按步骤排查
  2. 详细记录故障现象和解决过程
  3. 定期进行预防性维护
  4. 保持系统和文档的及时更新
  5. 建立完善的备份和恢复机制

文档版本v1.0
最后更新2026年2月26日