Sim800L не отправляет СМС подряд
Я создал проект с sim800l, который приходит и сохраняет 5 телефонных номеров в памяти eeprom, а затем, когда датчик срабатывает, он отправляет смс на все номера, а затем звонит на первый. Но модуль не всем отправляет смс а только отправляет смс на первый номер и дальше ничего и потом звонит. Проблема не в том, что цифры не правильно читаются, потому что при отправке смс я сказал, покажи номер в серии монитора и он покажет правильно. Это не проблема не отправить запрос текстового сообщения, потому что я также подключил модуль usb to ttl к модулю tx rx и увидел, что он приходит для всех номеров и at отправляет команду at правильно.
#include <EEPROM.h>
#include <SoftwareSerial.h>
#define SIM800RX 7 //D7 - SIM800L RX PIN
#define SIM800TX 8 //D8 - SIM800L TX PIN
#define SENSOR1SMSTEXT "Fire error" //Sensor 1 SMS Text
#define SENSOR2SMSTEXT "Theft error" //Sensor 2 SMS Text
SoftwareSerial SIM800(SIM800RX, SIM800TX);
String readSerial(String txt) {
SIM800.flush();
if (SIM800.readString() != "") {
while (SIM800.readString() != "") {}
}
String text = "";
if (txt != "") {
SIM800.println(txt);
int timeout = 0;
while (!SIM800.available() && timeout < 12000) {
delay(1);
timeout++;
}
if (SIM800.available()) {
text = SIM800.readString();
}
}
return text;
}
void readSerialOK(String txt) {
while (readSerial(txt).indexOf("OK") == -1) {
delay(700);
}
}
void configSim800L() {
readSerialOK("AT");
delay(200);
readSerialOK("AT+CMGF=1");
delay(200);
readSerialOK("AT+CNMI=1,2,0,0,0");
delay(200);
readSerialOK("AT+CMGDA=\"DEL ALL\"");
delay(200);
readSerialOK("AT+CSMP=17,167,0,0");
delay(200);
}
void SendTextSMS(String num, String sms) {
SIM800.print("AT+CMGS=\"");
SIM800.print(num);
SIM800.println("\"");
delay(150);
SIM800.print(sms);
SIM800.write(26);
delay(700);
Serial.println("");
Serial.print("Send SMS to:");
Serial.print(num);
Serial.print(":");
Serial.println(sms);
}
bool checkPhone(String phone) {
if (phone.substring(0, 2) == "09" && phone.length() == 11) {
return true;
} else {
return false;
}
}
void WriteEEPROM(byte part, String val) {
int start_addw = part * 16;
int w_len = val.length();
EEPROM.write(start_addw, w_len + 1);
int end_w = start_addw + w_len;
byte len = 0;
for (int i = start_addw + 1; i < end_w + 1; i++) {
EEPROM.write(i, int(val[len]));
len++;
}
len = 0;
EEPROM.commit();
}
String ReadEEPROM(byte part) {
int start_addr = part * 16;
String str;
int ch;
int r_len = EEPROM.read(start_addr);
int end_r = start_addr + r_len;
for (int i = start_addr + 1; i < end_r; i++) {
ch = EEPROM.read(i);
str += char(ch);
}
if (checkPhone(str) == false) {
str = "";
}
return str;
}
void ClearEEPROM(byte part) {
int start_addw = part * 16;
int w_len = 11;
EEPROM.write(start_addw, 0);
int end_w = start_addw + w_len;
byte len = 0;
for (int i = start_addw + 1; i < end_w + 1; i++) {
EEPROM.write(i, 0);
len++;
}
len = 0;
EEPROM.commit();
}
void SendSMS(String sms) {
String num1 = ReadEEPROM(1);
String num2 = ReadEEPROM(2);
String num3 = ReadEEPROM(3);
String num4 = ReadEEPROM(4);
String num5 = ReadEEPROM(5);
if (num1 != "") {
SendTextSMS(num1, sms);
}
if (num2 != "") {
SendTextSMS(num2, sms);
}
if (num3 != "") {
SendTextSMS(num3, sms);
}
if (num4 != "") {
SendTextSMS(num4, sms);
}
if (num5 != "") {
SendTextSMS(num5, sms);
}
}
void Call() {
String call = "";
String num1 = ReadEEPROM(1);
String num2 = ReadEEPROM(2);
String num3 = ReadEEPROM(3);
String num4 = ReadEEPROM(4);
String num5 = ReadEEPROM(5);
if (num1 != "") {
call = num1;
} else if (num2 != "") {
call = num2;
} else if (num3 != "") {
call = num3;
} else if (num4 != "") {
call = num4;
} else if (num5 != "") {
call = num5;
}
Serial.println("");
Serial.print("Call to:");
Serial.print(call);
if (call != "") {
readSerialOK("ATD"+call+";");
delay(300);
}
}
void trigSensor1() {
SendSMS(SENSOR1SMSTEXT);
Call();
}
void trigSensor2() {
SendSMS(SENSOR2SMSTEXT);
Call();
}
void setup() {
SIM800.begin(9600);
Serial.begin(9600);
EEPROM.begin(512);
pinMode(IN1, INPUT_PULLUP);
pinMode(IN2, INPUT);
pinMode(SSS, OUTPUT);
digitalWrite(SSS, LOW);
while (readSerial("AT+COPS?").indexOf("+COPS: 0,0,\"") == -1) {
delay(700);
}
configSim800L();
digitalWrite(SSS, HIGH);
}
void loop() {
if (digitalRead(IN1) == LOW) {
trigSensor1();
}
if (digitalRead(IN2) == HIGH) {
trigSensor2();
}
}
Спасибо, если у друзей есть опыт в этой области, расскажите мне.
Заранее спасибо.
1 ответ
Лучший ответ:
Я обнаружил ошибку:
void SendTextSMS(String num, String sms) {
SIM800.print("AT+CMGS=\"");
SIM800.print(num);
SIM800.println("\"");
delay(150);
SIM800.print(sms);
SIM800.write(26);
delay(3000);
Serial.println("");
Serial.print("Send SMS to:");
Serial.print(num);
Serial.print(":");
Serial.println(sms);
}
я заменил задержку на 3000 мс, ошибка устранена.
эта точная проблема и решение повторяются много раз в Интернете, @jsotola