Управление Реле через СМС модуль 800L V.2

Antifreeze
Offline
Зарегистрирован: 09.07.2020

Добрый день, подскажите пожалуйста новичку. Делаю тестовый стенд по управлению реле через смс. Код работает но как результат вместо 1 смс о выполненном действии, отправляет смс до бесконечности, подскажите что не так в коде. Спасибо.

#include <SoftwareSerial.h>
#define PIN_RELAY 5
SoftwareSerial mySerial(4, 3);
char incomingByte; 
String inputString;
void setup() {
  pinMode(PIN_RELAY, OUTPUT);
  digitalWrite(PIN_RELAY, HIGH);
  Serial.begin(9600);
  mySerial.begin(9600);
  while(!mySerial.available()){
    mySerial.println("AT");
    delay(1000);         
    Serial.println("Connecting…");
    }
    Serial.println("Connected!");
    mySerial.println("AT+CMGF=1");
    delay(1000);   
    mySerial.println("AT+CNMI=1,2,0,0,0");
    delay(1000);
    mySerial.println("AT+CMGL=\"REC UNREAD\"");
}
 
void loop() 
{
  if(mySerial.available())
  {
   delay(100);
    while(mySerial.available())
    {      
    incomingByte = mySerial.read();
    inputString += incomingByte;
    }
    delay(10);
    Serial.println(inputString);
    inputString.toUpperCase();
    if (inputString.indexOf("ON") > -1)
          {
           digitalWrite(PIN_RELAY, LOW);
           sms(String("Heater - ON"), String("+79650474047"));
          }
           
       if (inputString.indexOf("OFF") > -1)
          {
           digitalWrite(PIN_RELAY, HIGH);
           sms(String("Heater - OFF"), String("+79650474047"));
          }
           delay(50);
           
        if (inputString.indexOf("OK") == -1)
        {    
        mySerial.println("AT+CMGDA=\"DEL ALL\"");      
        delay(1000);
        }     
        inputString = "";
      }
 }
 
 void sms(String text, String phone) 
 {
   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);
 }
Antifreeze
Offline
Зарегистрирован: 09.07.2020
#include <SoftwareSerial.h>
#define PIN_RELAY 5
SoftwareSerial mySerial(4, 3);
char incomingByte; 
String inputString;
void setup() {
  pinMode(PIN_RELAY, OUTPUT);
  digitalWrite(PIN_RELAY, HIGH);
  Serial.begin(9600);
  mySerial.begin(9600);
  while(!mySerial.available()){
    mySerial.println("AT");
    delay(1000);         
    Serial.println("Connecting…");
    }
    Serial.println("Connected!");
    mySerial.println("AT+CMGF=1");
    delay(1000);   
    mySerial.println("AT+CNMI=1,2,0,0,0");
    delay(1000);
    mySerial.println("AT+CMGL=\"REC UNREAD\"");
}

void loop() 
{
  if(mySerial.available())
  {
   delay(100);
    while(mySerial.available())
    {      
    incomingByte = mySerial.read();
    inputString += incomingByte;
    }
    delay(10);
    Serial.println(inputString);
    inputString.toUpperCase();
    if (inputString.indexOf("ON") > -1)
          {
           digitalWrite(PIN_RELAY, LOW);
           sms(String("Heater - ON"), String("+7"));
          }
           
       if (inputString.indexOf("OFF") > -1)
          {
           digitalWrite(PIN_RELAY, HIGH);
           sms(String("Heater - OFF"), String("+7"));
          }
           delay(50);
           
        if (inputString.indexOf("OK") == -1)
        {    
        mySerial.println("AT+CMGDA=\"DEL ALL\"");      
        delay(1000);
        }     
        inputString = "";
      }
 }

 void sms(String text, String phone) 
 {
   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);
 }

 

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

добавить некую переменную, при старте присваивать ей = 0, при отправке проверять не равна ли она =1, после отправки присвоить единичку.

Antifreeze
Offline
Зарегистрирован: 09.07.2020

При старте присваивать в setup или loop ?

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

Setup выполняется один раз при включении

Antifreeze
Offline
Зарегистрирован: 09.07.2020
void loop() 
{
  otpr = 0;
  if(mySerial.available())
  {
   delay(100);
    while(mySerial.available())
    {      
    incomingByte = mySerial.read();
    inputString += incomingByte;
    }
    delay(10);
    Serial.println(inputString);
    inputString.toUpperCase();
    if (inputString.indexOf("ON") > -1 && otpr == 0)
          {
           otpr == 1;
           digitalWrite(PIN_RELAY, LOW);
           sms(String("Heater - ON"), String("+7"));
          }
          delay (50);
           
       if (inputString.indexOf("OFF") > -1 && otpr == 0)
          {
           otpr == 1;
           digitalWrite(PIN_RELAY, HIGH);
           sms(String("Heater - OFF"), String("+7"));
          }
           delay(50);
           
        if (inputString.indexOf("OK") == -1)
        {    
        mySerial.println("AT+CMGDA=\"DEL ALL\"");      
        delay(200);
        }     
        inputString = "";
      }
 }

 void sms(String text, String phone) 
 {
   Serial.println("SMS send started");
   mySerial.println("AT+CMGS=\"" + phone + "\"");
   delay(200);
   mySerial.print(text);
   delay(200);
   mySerial.print((char)26);
   delay(200);
   Serial.println("SMS send complete");
   delay(200);
 }

Теперь все работает, но дублируются сообщения в мониторе порта и ответная смс приходит только через 1 мин, а раньше сразу приходила

SMS send started
SMS send complete
AT+CMGS="+7"
 
> Heater - ON
SMS send started
SMS send complete