You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求ESP32搭配SIM800L实现自动接听来电的代码方案

ESP32 搭配 SIM800L 实现自动接听来电

原代码问题分析

你的代码存在几个可能导致失败的问题:

  1. 使用SoftwareSerial软串口,ESP32自带多个硬件串口,软串口稳定性远不如硬件串口,易出现通信丢包。
  2. 未验证AT指令执行结果,无法确认AT+ATS0=1是否被模块正确接收生效。
  3. 引脚选择可能存在冲突,ESP32部分引脚有特殊功能,随意使用会导致通信异常。
  4. 缺少SIM800L开机控制逻辑(部分模块需通过KEY引脚触发开机)及模块初始化等待时间。

修正后的工作代码

以下是基于ESP32硬件串口实现的稳定版本,包含指令验证、开机控制和来电监测:

#include <HardwareSerial.h>

// 使用ESP32硬件串口2通信,避免软串口稳定性问题
HardwareSerial sim800l(2);

// SIM800L开机控制引脚(可根据实际硬件连接调整)
#define SIM800L_KEY_PIN 4

void setup() {
  // 初始化USB调试串口,用于查看模块状态
  Serial.begin(115200);
  while (!Serial); // 等待串口连接完成

  // 初始化SIM800L对应硬件串口:RX接GPIO16,TX接GPIO17,波特率9600
  sim800l.begin(9600, SERIAL_8N1, 16, 17);

  // 控制SIM800L开机(部分模块需此步骤)
  pinMode(SIM800L_KEY_PIN, OUTPUT);
  digitalWrite(SIM800L_KEY_PIN, LOW);
  delay(1000);
  digitalWrite(SIM800L_KEY_PIN, HIGH);
  delay(5000); // 等待模块完成启动初始化

  // 发送AT指令验证模块通信状态
  sendATCmd("AT", "OK", 1000);
  // 设置1声铃后自动接听来电
  sendATCmd("AT+ATS0=1", "OK", 1000);
  // 开启来电显示,方便查看来电号码
  sendATCmd("AT+CLIP=1", "OK", 1000);
}

void loop() {
  // 读取SIM800L返回信息并打印到调试串口
  if (sim800l.available()) {
    String resp = sim800l.readStringUntil('\n');
    Serial.println(resp);
    // 监测来电提醒
    if (resp.indexOf("RING") != -1) {
      Serial.println("检测到来电,等待自动接听...");
    }
  }

  // 从调试串口发送指令到SIM800L(用于手动调试)
  if (Serial.available()) {
    String cmd = Serial.readStringUntil('\n');
    sim800l.println(cmd);
  }
}

// 封装AT指令发送与结果验证函数
void sendATCmd(String cmd, String expectedResp, unsigned long timeout) {
  Serial.print("[发送指令]: ");
  Serial.println(cmd);
  sim800l.println(cmd);

  unsigned long startMillis = millis();
  while (millis() - startMillis < timeout) {
    if (sim800l.available()) {
      String resp = sim800l.readStringUntil('\n');
      Serial.print("[模块返回]: ");
      Serial.println(resp);
      if (resp.indexOf(expectedResp) != -1) {
        Serial.println("[指令执行成功]");
        return;
      }
    }
  }
  Serial.println("[指令执行超时/失败]");
}

硬件连接指南

  • SIM800L RX → ESP32 GPIO17(串口2的TX引脚)
  • SIM800L TX → ESP32 GPIO16(串口2的RX引脚)
  • SIM800L VCC → 5V电源(必须保证供电电流≥2A,通话时峰值电流较大)
  • SIM800L GND → ESP32 GND(共地)
  • SIM800L KEY → ESP32 GPIO4(或其他闲置GPIO,用于控制开机)

关键注意事项

  • 供电是核心:SIM800L通话瞬间电流会飙升至2A左右,USB口供电可能因电流不足导致模块重启,建议使用独立5V/2A电源供电,并在模块VCC引脚旁并联1000μF电解电容滤波。
  • 引脚兼容性:避免使用ESP32的启动模式引脚(如GPIO0、GPIO2)连接SIM800L。
  • SIM卡验证:确保SIM卡已激活、无欠费,且支持语音通话功能,插入时注意方向。

内容的提问来源于stack exchange,提问作者Iteza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:00:32