请求修改单片机SIM拨号代码:实现3分钟内同时拨打5个号码
修改后的代码(3分钟内自动拨打5个号码)
#include <SoftwareSerial.h> SoftwareSerial sim(10, 11); // 定义电话号码数组(直接存储号码,无需额外引号) String numbers[] = { "+639*********", // 替换为第一个目标号码 "+639*********", // 替换为第二个目标号码 "+639*********", // 替换为第三个目标号码 "+639*********", // 替换为第四个目标号码 "+639*********" // 替换为第五个目标号码 }; const int totalNumbers = 5; // 号码总数 const unsigned long callDuration = 30000; // 单号码通话时长(30秒,可按需调整) const unsigned long totalCycleTime = 180000; // 总时长限制(3分钟=180000毫秒) int ledPin = 9; // LED状态指示引脚 void setup() { Serial.begin(9600); Serial.println("系统启动..."); sim.begin(9600); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); delay(1000); // 启动自动批量拨打流程 startAutoCalling(); } void loop() { // 拨打完成后可添加循环逻辑,或保持空函数 } void startAutoCalling() { unsigned long startTime = millis(); for (int i = 0; i < totalNumbers; i++) { // 检查总耗时是否超过3分钟,超时则终止 if (millis() - startTime >= totalCycleTime) { Serial.println("总时长已达3分钟,停止拨打"); digitalWrite(ledPin, LOW); return; } Serial.print("正在拨打第"); Serial.print(i+1); Serial.print("个号码: "); Serial.println(numbers[i]); callNumber(numbers[i]); // 拨打当前号码 delay(callDuration); // 维持通话时长 hangUp(); // 挂断当前通话 delay(2000); // 拨打下一个号码前的间隔(可调整) } Serial.println("5个号码已全部拨打完成"); digitalWrite(ledPin, LOW); } void callNumber(String number) { // 发送标准AT拨号指令:ATD<号码>; sim.print("ATD"); sim.print(number); sim.println(";"); digitalWrite(ledPin, HIGH); // 通话时点亮LED delay(1000); // 等待模块响应拨号请求 } void hangUp() { sim.println("ATH"); // 发送AT挂断指令 digitalWrite(ledPin, LOW); // 挂断后熄灭LED delay(1000); // 等待模块响应挂断请求 }
关键修改说明
- 移除手动输入逻辑:删除原代码中串口选择号码的交互,改为启动后自动执行批量拨打。
- 修正AT命令格式:原代码中号码带多余引号导致拨号失败,现在使用
ATD<号码>;的标准格式,确保SIM模块正确识别指令。 - 时长精准控制:
- 总时长限制为3分钟,每次拨打前检查耗时,超时自动停止。
- 单号码通话时长设为30秒,加上拨号、挂断和间隔时间,总耗时约170秒,符合3分钟要求(可根据需求调整
callDuration)。
- 状态可视化:LED在通话时点亮、挂断后熄灭,直观显示当前状态。
- 完善通话管理:新增
hangUp()函数发送挂断指令,避免线路持续占用。
内容的提问来源于stack exchange,提问作者Iteza
相关产品推荐
相关产品推荐

