Здравствуйте. Помогите разобраться.

serg233
Offline
Зарегистрирован: 02.02.2016

 Здравствуйте. Помогите разобраться. Был скетч, написанный несколько лет назад -gsm реле с функцией сигнализации и звонком на номер при срабатывании датчика движения. Недавно решил добавить функцию  контроля напряжения: при включении, выключении посылает смс On, Off. И реле одно выключает. Вроде все работает. Но происходят периодические срабатывания сигнализации. Заливаю старый скетч. Все работает нормально. Может есть у кого-нибудь какие-нибудь идеи? Буду благодарен за любую помощь.

serg233
Offline
Зарегистрирован: 02.02.2016
#include <SoftwareSerial.h>

SoftwareSerial gprsSerial(8, 7); // установка контактов 2 и 3 для программного порта (для микроконтроллера ардуино убать букву D)

bool rele = HIGH, rele2 = HIGH, rele3 = HIGH, rele4 = HIGH, rele5 = HIGH;

#define RELE 9   // (для микроконтроллера ардуино убать букву D)
#define RELE2 5   // (для микроконтроллера ардуино убать букву D)
#define RELE3 6   // (для микроконтроллера ардуино убать букву D)
#define RELE4 3   // (для микроконтроллера ардуино убать букву D)
#define RELE5 10  // 

#define SENSOR 2  // 
#define SENSOR2 11  //

int call = 0;
char* adminNumber[] = {"+7918xxxxxxxx", "+7xxxxxxx", "+7xxxxxxxxx" ,"+7"};
int8_t i;

String currStr = ""; // если эта строка сообщение,
boolean isStringMessage = false; //  то ставим флаг на разрешение оброботки SMS

bool signale = false;
bool signale2 = false;
unsigned long t = 0;


void setup()
{
  //Serial.begin(9600);
  gprsSerial.begin(9600);
  
  pinMode(RELE, OUTPUT); digitalWrite(RELE, HIGH);
  pinMode(RELE2, OUTPUT); digitalWrite(RELE2, HIGH);
  pinMode(RELE3, OUTPUT); digitalWrite(RELE3, HIGH);
  pinMode(RELE4, OUTPUT); digitalWrite(RELE4, HIGH);
  pinMode(RELE5, OUTPUT); digitalWrite(RELE5, HIGH);
  pinMode(SENSOR, INPUT); digitalWrite(SENSOR, HIGH);
  pinMode(SENSOR2, INPUT); //digitalWrite(SENSOR2, HIGH);

  // настройка приема сообщений
  gprsSerial.print("AT+CMGF=1\r"); delay(500);          // устанавливаем текстовый режим смс-сообщения
  gprsSerial.print("AT+IFC=1, 1\r"); delay(500);        // устанавливаем программный контроль потоком передачи данных
  gprsSerial.print("AT+CPBS=\"SM\"\r"); delay(500);     // открываем доступ к данным телефонной книги SIM-карты
  gprsSerial.print("AT+CNMI=1,2,2,1,0\r"); delay(700);  // включает оповещение о новых сообщениях, новые сообщения приходят в следующем формате: +CMT: "<номер телефона>", "", "<дата, время>",  
}

void loop()
{
  //Serial.println(signale2);
  //Serial.println(SENSOR2);
  //delay(100);

  while (!gprsSerial.available())
  {
    if (digitalRead(SENSOR) == LOW && signale == false) 
    {
      signale = true;
      digitalWrite(RELE5, LOW);

      gprsSerial.println("ATD+7xxxxxxxx;"); // Здесь должен позвонить.!!!!!!!!!!!!!!!!!
      t = millis();
     // Serial.println(" on");
      //Serial.println(signale2);
      delay(1000);


    }
    
    if(signale == true && millis() - t > 180000) digitalWrite(RELE5, HIGH);
    if(signale == true && digitalRead(RELE5) == HIGH) signale = false;

 if (digitalRead(SENSOR2) == HIGH && signale2 == false) 
    {
      signale2 = true;
     // digitalWrite(RELE5, LOW);
      
       gprsSerial.print("AT+CMGS=\"+7xxxxxxxxxx\"\r");  // Отправка СМС на указанный номер +792100000000"
       delay(300);
        gprsSerial.print("220 ON");       // Тест сообщения
         delay(300);
         gprsSerial.print((char)26);// (требуется в соответствии с таблицей данных)
        delay(300);
        gprsSerial.println();
       // Serial.println("220 oN");
       // Serial.println(signale2);
         delay(1000);
    }

 if (digitalRead(SENSOR2) == LOW && signale2 == true) 
    {
      signale2 = false;
      digitalWrite(RELE2, HIGH);
      
       gprsSerial.print("AT+CMGS=\"+7xxxxxxxxx\"\r");  // Отправка СМС на указанный номер +792100000000"
         delay(300);
        gprsSerial.print("220 OFF");       // Тест сообщения
         delay(300);
         gprsSerial.print((char)26);// (требуется в соответствии с таблицей данных)
        delay(300);
        gprsSerial.println();
        //Serial.println("220 oFF");
        //Serial.println(signale2);
        //  delay(1000);
    }
  }

   

  char currSymb = gprsSerial.read(); // записываем в переменую символы, которые получили от модуля.

  if ('\r' == currSymb) 
  {
    // если получили символ перевода коректи в начало строки, это означает что передача сообщения от модуля завершена.
    if (isStringMessage) 
    { 
      // если текущая строка – сообщение, то…
      if (!currStr.compareTo("On2"))
      { 
        // если текст сообщения совпадает с "on", то включаем низкоуровневое реле.
        rele = LOW;
        digitalWrite(RELE, rele);
      }
      
      if (!currStr.compareTo("Off2"))
      { 
        // если текст сообщения совпадает с "off", то выключаем низкоуровневое реле.
        rele = HIGH;
        digitalWrite(RELE, rele);
      }

      //isStringMessage = false;
    }

    if (isStringMessage) 
    {
      // если текущая строка – сообщение, то…
      if (!currStr.compareTo("On"))
      { 
        // если текст сообщения совпадает с "on", то включаем низкоуровневое реле.
        rele2 = LOW;
        digitalWrite(RELE2, rele2);
      }
      
      if (!currStr.compareTo("Off")) { // если текст сообщения совпадает с "off",
        rele2 = HIGH;                        // то выключаем низкоуровневое реле.
        digitalWrite(RELE2, rele2);
      }


      if (!currStr.compareTo("On3")) { // если текст сообщения совпадает с "on",
        rele3 = LOW;                        // то включаем низкоуровневое реле.
        digitalWrite(RELE3, rele3);
      }
      
      if (!currStr.compareTo("Off3")) { // если текст сообщения совпадает с "off",
        rele3 = HIGH;                        // то выключаем низкоуровневое реле.
        digitalWrite(RELE3, rele3);
      }

      //isStringMessage = false;

      if (isStringMessage) { // если текущая строка – сообщение, то…

        if (!currStr.compareTo("On4")) { // если текст сообщения совпадает с "on",
          rele4 = LOW;                        // то включаем низкоуровневое реле.
          digitalWrite(RELE4, rele4);
        }
        
        if (!currStr.compareTo("Off4")) { // если текст сообщения совпадает с "off",
          rele4 = HIGH;                        // то выключаем низкоуровневое реле.
          digitalWrite(RELE4, rele4);
        }

        isStringMessage = false;
      }
    }
    else 
    {
      if (currStr.startsWith("+CMT"))
      { 
        // если текущая строка начинается с "+CMT", то следующая сообщение
        for (i = 0; i <= 1; i++)
        { 
          // число 3 - это количество заданных тел.номеров.
          if (currStr.indexOf(adminNumber[i])) //сверяем номер с номером прешедним SMS
          {
           // Serial.println(adminNumber[i]);
            isStringMessage = true;
            break;
          }
        }

      }
    }
    currStr = "";
  }
  else if ('\n' != currSymb)
  { 
    //  игнорируем второй символ в последовательности переноса строки: \r\n , и
    currStr += String(currSymb); //дополняем текущую команду новым сиволом
  }
  
}

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018
serg233
Offline
Зарегистрирован: 02.02.2016

Исправил.

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

Если всё так, как Вы написали, то проблема скорее всего наводная. Как Вы подаёте "220" на 11 пин? Нарисуйте схему всего устройства (с питанием и т.п.). Думаю, что там собака и зарыта.

serg233
Offline
Зарегистрирован: 02.02.2016

Через контактор. Он замыкает и размыкает питание 6 в на пин 11. Пин подтянут резистором . Схему пока сложновато будет нарисовать.Еслиивикоде нет явных ошибок буду искать в схеме.

serg233
Offline
Зарегистрирован: 02.02.2016

Закрыто.

SergeiL
SergeiL аватар
Offline
Зарегистрирован: 05.11.2018

serg233 пишет:
Закрыто.

Так а в чем было дело?

Оставьте информацию для тех у кого будет похожая ситуация.