SMS управление релле, уходит в цикл

sermang
Offline
Зарегистрирован: 30.10.2020

Добрый день!

Есть: SIM800L, arduino nano, 1 канальное релле

Задача: с помощью смс на время включать релле (использую чтобы удалённо перегружать роутер путём отключения питания)

Помогите понять, что в коде не так. После отправки смс, релле срабатывает, приходит смс отчёт, что всё ок, и после этого включение релле и отправка смс отчёта уходит в цикл. Такое ощущение, что не очищаются смс, но не могу понять, что не так.

 #include <SoftwareSerial.h> 
 SoftwareSerial mySerial(2, 3);              // RX, TX 
 char incomingByte; 
 String inputString;
 int relay_1 = A0;                           // Вывод управления реле 1
 void setup() 
 {
   pinMode(relay_1, OUTPUT);                 // Установим вывод как выход
   digitalWrite(relay_1, HIGH);              // Устанавливаем высокий уровень
   Serial.begin(9600);                   
   mySerial.begin(9600); 
 while(!mySerial.available()){               // Зацикливаем и ждем инициализацию SIM800L
    mySerial.println("AT");                  // Отправка команды AT
    delay(1000);                             // Пауза
    Serial.println("Connecting…");          // Печатаем текст
    }
    Serial.println("Connected!");            // Печатаем текст
    delay(2000);
    mySerial.println("AT+CSQ");              // Смотрим уровень сигнала, > 10 нормально
    delay(1000);    
    mySerial.println("AT+CMGF=1");           // Отправка команды AT+CMGF=1
    delay(1000);                             // Пауза
    mySerial.println("AT+CNMI=1,2,0,0,0");   // Отправка команды AT+CNMI=1,2,0,0,0
    delay(1000);                             // Пауза
    mySerial.println("AT+GSMBUSY=1");        // Запрет входящих звонков
    delay(1000);                             // Пауза
    mySerial.println("AT+CMGL=\"REC UNREAD\"");
 }
 void loop()
 {  
   if(mySerial.available()){                  // Проверяем, если есть доступные данные
       delay(100);                            // Пауза
      while(mySerial.available()){            // Проверяем, есть ли еще данные.   
      incomingByte = mySerial.read();         // Считываем байт и записываем в переменную incomingByte   
      inputString += incomingByte;            // Записываем считанный байт в массив inputString   
    }   
       delay(10);                             // Пауза        
       Serial.println(inputString);           // Отправка в "Мониторинг порта" считанные данные
       inputString.toUpperCase();             // Меняем все буквы на заглавные   
       if (inputString.indexOf("RESTART") > -1){ // Проверяем полученные данные, если RESTART включаем реле 1 
        digitalWrite(relay_1, LOW);
        delay(5000);
        digitalWrite(relay_1, HIGH);
        delay(50);
        sms(String("OK Moden restarted"), String("+ХХХХХХХХХХХХ")); // Отправка SMS
        }      
        delay(50); 
       if (inputString.indexOf("OK") == -1){    
        mySerial.println("AT+CMGD=4");      //Удаление всех смс
        delay(1000);}    
        inputString = "";}
 }
 void sms(String text, String phone)  // Процедура Отправка SMS
 {
   Serial.println("SMS send started");
   mySerial.println("AT+CMGS=\"" + phone + "\"");
   delay(500);
   mySerial.print(text);
   delay(500);
   mySerial.print((char)26);
   delay(500);
   Serial.println("SMS send complete");
   delay(2000);
 } 

 

b707
Offline
Зарегистрирован: 26.05.2017

sermang пишет:

Такое ощущение, что не очищаются смс, но не могу понять, что не так.

не там ищете. Переменную inputstring кто за вас будет чистить?

sermang
Offline
Зарегистрирован: 30.10.2020

b707 пишет:

Переменную inputstring кто за вас будет чистить?

inputString = "";

это в коде, не так?

b707
Offline
Зарегистрирован: 26.05.2017

sermang пишет:

inputString = "";

это в коде, не так?

упс, просмотрел.

Тогда такой вопрос - когда код "уходит в цикл" - оператор принт в строчке 38 что-нибудь выводит на печать?

sermang
Offline
Зарегистрирован: 30.10.2020

b707 пишет:

Тогда такой вопрос - когда код "уходит в цикл" - оператор принт в строчке 38 что-нибудь выводит на печать?

Вот, что выводит:

10:54:31.343 -> Connecting…
10:54:31.343 -> Connected!
10:54:35.543 -> AT

10:54:35.543 -> OK
10:54:35.543 -> AT+CSQ

10:54:35.543 -> +CSQ: 0,0
10:54:35.543 -> 
10:54:35.543 -> OK
10:54:35.577 -> AT+CMGF=1

10:54:35.577 -> OK
10:54:35.577 -> AT+CNMI=1,2,
10:55:51.289 -> 
10:55:51.289 -> +CMT: "+ХХХХХХХХХХХХ","","20/10/30,10:57:08+08"
10:55:51.323 -> RESTART
10:55:51.323 -> 
10:55:56.340 -> SMS send started
10:55:57.875 -> SMS send complete
10:56:01.085 -> AT+CMGS="+ХХХХХХХХХХХХ"

10:56:01.085 -> > OK Moden restarted
10:56:01.119 -> +CMGS: 8
10:56:01.119 -> 
10:56:01.119 -> OK

10:56:06.112 -> SMS send started
10:56:07.651 -> SMS send complete
10:56:09.834 -> AT+CMGS="+ХХХХХХХХХХХХ"

10:56:09.834 -> > OK Moden restarted
10:56:09.869 -> +CMGS: 9
10:56:09.869 -> 
10:56:09.869 -> OK

10:56:14.862 -> SMS send started
10:56:16.401 -> SMS send complete
10:56:18.594 -> AT+CMGS="+ХХХХХХХХХХХХ"

10:56:18.594 -> > OK Moden restarted
10:56:23.616 -> SMS send started
10:56:25.155 -> SMS send complete

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sermang пишет:
SMS управление релле, уходит в цикл

Попробуйте управлять реле, может лучше получится.

sermang
Offline
Зарегистрирован: 30.10.2020

ЕвгенийП пишет:

Попробуйте управлять реле, может лучше получится.

Не совсем понял, что вы имеете в виду?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я имею в виду общий подход к делу - сначала нужно изучить матчасть. Нельзя кидаться управлять устройством, даже не зная как оно называется. Это не случайная опечатка - Вы везде пишете "релле".

b707
Offline
Зарегистрирован: 26.05.2017

а в строке 48 точно должно быть == -1 ? Может "не равно" ? - что-то не совсем понимаю логику

sermang
Offline
Зарегистрирован: 30.10.2020

b707 пишет:

а в строке 48 точно должно быть == -1 ? Может "не равно" ? - что-то не совсем понимаю логику

Мне тоже не совсем понятна эта часть, но везде в интернете в аналогичных проектах используется эта часть:

 if (inputString.indexOf("OK") == -1){    
        mySerial.println("AT+CMGDA=\"DEL ALL\"");      
        delay(1000);}

https://robotchip.ru/upravlenie-nagruzkoy-cherez-sms-gsm-i-arduino/

http://www.junradio.com/index/sms_upravljaemoe_rele_na_arduino/0-518

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

при команде CMGF = 1  - режим обычных СМС правильная команда удаления всех смс это CMGDA="DEL ALL"

не понятна логика - зачем читать только не прочитанные СМС а не все? зачем смотреть какой то приход при удалении СМС?

пришла команда - выполнили - очистили