Система управления и мониторинга по СМС

_jah_69_
Offline
Зарегистрирован: 31.03.2017

Добрый вечер.

Вдохновленный трудами форумчан, решил собрать себе на лето систему полива по смс ну и так по мелочам .

Для это цели были приобретены

Ардуино uno

3 датчика температуры один на улицу другой в дом третий на подающую трубу газового котла Dh11

SIM900a mini без проблем адаптировал на наши сети

DC - понижающий на модуль SIM с 12в до 4.1в

Блок на 4 реле.

На данный момент сделано :

при отправки смс 1on 2on.....4on включает соответствующее реле

в ответ присылает отчет что реле включил

Для яблока есть смс командер там все смс можно прописать

Так же сделано если отправляешь allon или alloff выполняются действие со всеми реле.

По звонку на модуль звонок сбрасывается и выводится в монитор порта на отправку в смс не наладил,пока тестил весь баланс сожрал.

_jah_69_
Offline
Зарегистрирован: 31.03.2017
#include <SoftwareSerial.h>
#include "stDHT.h"
String statusHome;
DHT sens(DHT11); // Указать датчик DHT11, DHT21 или DHT22. (несколько датчиков вписывать не нужно)
// Подключать можно только одинаковые датчики, то есть нельзя использовать одновременно DHT11 и DHT22

SoftwareSerial GsmSerial(2, 3);          // RX-2 pin, TX-3 pin



String AdminPhone="79051111111";              // Телефон админа

int pinReley1=8;                                // Номер порта светодиода, который будем включать/выключать
int pinReley2=9;
int pinReley3=10;
int pinReley4=11;



void setup()
  {
  pinMode(A0, INPUT);
  digitalWrite(A0, HIGH);
  pinMode(A1, INPUT);
  digitalWrite(A1, HIGH);
  pinMode(A2, INPUT);
  digitalWrite(A2, HIGH);


  pinMode(pinReley1, OUTPUT);                       // Режим порта на вывод
  pinMode(pinReley2, OUTPUT);
  pinMode(pinReley3, OUTPUT);
  pinMode(pinReley4, OUTPUT);

  digitalWrite(pinReley1, HIGH);
  digitalWrite(pinReley2, HIGH);
  digitalWrite(pinReley3, HIGH);
  digitalWrite(pinReley4, HIGH);

  


  Serial.begin(9600);

  GsmSerial.begin(9600);                        // Устанавливаем скорость связи Ардуино и модема

  

  GsmSerial.println("ATE0");                // выключаем эхо

  delay(100);

  GsmSerial.println("AT+CLIP=1");                // Включаем АОН

  delay(100);

  GsmSerial.println("AT+CMGF=1");                // Формат СМС = ASCII текст

  delay(100);

  GsmSerial.println("AT+CSCS=\"GSM\"");          // Режим кодировки текста = GSM (только англ.)

  delay(100);

  GsmSerial.println("AT+CNMI=2,2");              // Текст смс выводится в com-порт

  delay(100);

  

  String str="";

  while(str.indexOf("+COPS: 0") == -1) {        // Ждем пока модем будет готов

    GsmSerial.println("AT+COPS?");

    str=ReadCom();

    delay(300);

  }

}

  

void loop()

{
  

  
  
  String strSms = ReadCom();                  // Читаем смс, если есть

  while (strSms.length()==0)                                  {

    delay(500);

    strSms = ReadCom();

  }



  // Если телефон админа, то читаем дальше

  if (strSms.indexOf(AdminPhone) > -1)   {

    if (strSms.indexOf("+CMT") > -1)     {    // Если смс

   
     
      // Кодовое слово "1on" первое реле зажигаем

      if (strSms.indexOf("1on") > -1) {    // Если обнаружено ключевое слово на включение
      

        digitalWrite(pinReley1,LOW);             // Включаем 1реле

        SendSms("Reley1=on", AdminPhone);       // Можем отправить смс, что включили

        Serial.println("Reley1=on");

      }

      // Кодовое слово "1off" отключем первое реле

      if (strSms.indexOf("1off") > -1){    // Если обнаружено ключевое слово на выключение

        digitalWrite(pinReley1,HIGH);             // Выключаем светодиод

        SendSms("Reley1=off", AdminPhone);     // Можем отправить смс, что выключили

        Serial.println("Reley1=off");

      }

     // Кодовое слово "2on" 2 реле зажигаем

      if (strSms.indexOf("2on") > -1) {    // Если обнаружено ключевое слово на включение
      

        digitalWrite(pinReley2,LOW);             // Включаем светодиод

        SendSms("Reley2=on", AdminPhone);       // Можем отправить смс, что включили

        Serial.println("Reley2=on");

      }

      // Кодовое слово "2off" отключем первое реле

      if (strSms.indexOf("2off") > -1){    // Если обнаружено ключевое слово на выключение

        digitalWrite(pinReley2,HIGH);             // Выключаем светодиод

        SendSms("Reley2=off", AdminPhone);     // Можем отправить смс, что выключили

        Serial.println("Reley2=off");

      }



     // Кодовое слово "3on" 3 реле зажигаем

      if (strSms.indexOf("3on") > -1) {    // Если обнаружено ключевое слово на включение
      

        digitalWrite(pinReley3,LOW);             // Включаем светодиод

        SendSms("Reley3=on", AdminPhone);       // Можем отправить смс, что включили

        Serial.println("Reley3=on");

      }

      // Кодовое слово "3off" отключем первое реле

      if (strSms.indexOf("3off") > -1){    // Если обнаружено ключевое слово на выключение

        digitalWrite(pinReley3,HIGH);             // Выключаем светодиод

        SendSms("Reley3=off", AdminPhone);     // Можем отправить смс, что выключили

        Serial.println("Reley3=off");

      }




     // Кодовое слово "4on" первое реле зажигаем

      if (strSms.indexOf("4on") > -1) {    // Если обнаружено ключевое слово на включение
      

        digitalWrite(pinReley4,LOW);             // Включаем светодиод

        SendSms("Reley4=on", AdminPhone);       // Можем отправить смс, что включили

        Serial.println("Reley4=on");

      }

      // Кодовое слово "4off" отключем первое реле

      if (strSms.indexOf("4off") > -1){    // Если обнаружено ключевое слово на выключение

        digitalWrite(pinReley4,HIGH);             // Выключаем светодиод

        SendSms("Reley4=off", AdminPhone);     // Можем отправить смс, что выключили

        Serial.println("Reley4=off");

      }

// Кодовое слово "allon" все реле зажигаем

      if (strSms.indexOf("allon") > -1) {    // Если обнаружено ключевое слово на включение
       
        digitalWrite(pinReley1,LOW);
        delay(1500);
        digitalWrite(pinReley2,LOW);
        delay(1500);
        digitalWrite(pinReley3,LOW);
        delay(1500);
        digitalWrite(pinReley4,LOW);
        // Включаем светодиод

        SendSms("Reley=all-on", AdminPhone);       // Можем отправить смс, что включили

        Serial.println("Reley=all-on");

      }


// Кодовое слово "alloff" все реле зажигаем

      if (strSms.indexOf("alloff") > -1) {    // Если обнаружено ключевое слово на включение
       
        digitalWrite(pinReley1,HIGH);
        delay(1500);
        digitalWrite(pinReley2,HIGH);
        delay(1500);
        digitalWrite(pinReley3,HIGH);
        delay(1500);
        digitalWrite(pinReley4,HIGH);             // Включаем светодиод

        SendSms("Reley=all-on", AdminPhone);       // Можем отправить смс, что включили

        Serial.println("Reley=all-on");

      }

   }
    if (strSms.indexOf("RING") > -1)     {    // Если звонят (выполняется на каждый гудок)
   
    GsmSerial.println("ATD#100#;\r"); // делаем запрос баланса
    delay(2500);
    
    GsmSerial.println("ATH0"); // Сброс после гудка
   
      // Можем, что нибудь выполнить
       int t = sens.readTemperature(A0); // чтение датчика на пине 2
  int h = sens.readHumidity(A0);    // чтение датчика на пине 2
  delay(2000);
  
   int t2 = sens.readTemperature(A1); // чтение датчика на пине 3
  int h2 = sens.readHumidity(A1);    // чтение датчика на пине 3
  delay(2000);
  
  int t3 = sens.readTemperature(A2); // чтение датчика на пине 3
  int h3 = sens.readHumidity(A2);    // чтение датчика на пине 3
  delay(2000);
  

  
  Serial.print("Home: ");
  Serial.print(h);
  Serial.print(" %");
  Serial.print("Home: ");
  Serial.print(t);
  Serial.println(" C ");
  Serial.print("Out: ");
  Serial.print(h2);
  Serial.print(" %");
  Serial.print("Out: ");
  Serial.print(t2);
  Serial.println(" C "); 
  Serial.print("Kotel: ");
  Serial.print(h3);
  Serial.print(" %");
  Serial.print("Out: ");
  Serial.print(t3);
  Serial.println(" C "); 
  
  int Reley1status = digitalRead(8); // Получить состояние пина 8: 
  int Reley2status = digitalRead(9); //Управляемое устройство 9
  int Reley3status = digitalRead(10);//Управляемое устройство 10
  int Reley4status = digitalRead(11);//Управляемое устройство 11
  statusHome = String("Home")+int(h)+String("%")+String("Home")+int(t)+String("C")+String("Out")+int(h2)+String("%")+String("Out")+int(t2)+String("C")+String("Kotel")+int(h3)+String("%")+String("Kotel")+int(t3)+String("C")+int(Reley1status)+int(Reley2status)+int(Reley3status)+int(Reley4status);
    Serial.print(Reley1status);
     Serial.print(Reley2status);
      Serial.print(Reley3status);
       Serial.print(Reley4status);
   Serial.print(statusHome);
    //Serial.println("start call");
                              


}


  if (strSms.indexOf("NO CARRIER") > -1){   // Если звонок окончен

    //SendSms("called", AdminPhone);     // Можем отправить смс, что нам звонили

    Serial.println("end call");

  }

}

}

// Читает смс

String ReadCom()

{

  int chCode = 0;                              // Код символа

  String strSms = "";                          // Текст

  if (GsmSerial.available()) {                 // Есть данные от модема

    delay(300);

    // Считываем смс с com-порта модема

    while (GsmSerial.available()) {            // Если есть еще символы, то читаем

      chCode = GsmSerial.read();               // Считываем очередной символ

      strSms += char(chCode);                  // Добавляем к строке

      delay(10);

    }

  }

  if (strSms.length()>0) {

    Serial.println("++++++++++");

    //Serial.println();

    Serial.println(strSms.length());

    Serial.println(strSms);

  }

  return strSms;

}



// Отправляет текст смс на определенный номер

void SendSms(String text, String phone)

{

  phone="+"+phone;

  GsmSerial.println("AT+CMGS=\"" + phone + "\""); // Заголовок АТ команды и номер телефона

  delay(500);

  GsmSerial.print(text);                          // Текст смс

  delay(500);

  GsmSerial.print((char)26);                      // Конец сообщения и отправляем смс

  delay(500);

}
 

 

_jah_69_
Offline
Зарегистрирован: 31.03.2017

 

Второй день бьюсь над установкой четырёх кнопок на каждое реле что бы нажал включил нажал выключил.

Не выходит каменный цветок.
Не плохо было бы добавить к отчету о статусе дома цифру балнса
Буду очень признателен за совет или оптимизацию написанного.
Последний раз программировал на спектруме в лохматые годы. Потому тяжело даются приданья старины далекой.

Вот что вижу в терминале
++++++++++
36

OK

+COPS: 0,0,"Beeline"

OK

++++++++++
46

RING

+CLIP: "+79051111111",145,"",,"",0

Home: 48 %Home: 26 C 
Out: 52 %Out: 25 C 
Kotel: 44 %Out: 25 C 
1111Home48%Home26COut52%Out25CKotel44%Kotel25C1111++++++++++
63

OK

+CUSD: 0,"Vash balans -3.00 rub. Bonus: 0.00 rub. Bespl

 

 

 

_jah_69_
Offline
Зарегистрирован: 31.03.2017

#include <SoftwareSerial.h>
#include "stDHT.h"
String statusHome;
DHT sens(DHT11); // Указать датчик DHT11, DHT21 или DHT22. (несколько датчиков вписывать не нужно)
// Подключать можно только одинаковые датчики, то есть нельзя использовать одновременно DHT11 и DHT22

SoftwareSerial GsmSerial(2, 3);               // RX-2 pin, TX-3 pin

String AdminPhone="790511111111";              // Телефон админа

int pinReley1=8;                              // Номер порта светодиода, который будем включать/выключать
int pinReley2=9;
int pinReley3=10;
int pinReley4=11;

int But1Pin = 4;                             // Подключаем кнопку к выходу 4
int But2Pin = 5;                             // Подключаем кнопку к выходу 5
int But3Pin = 6;                             // Подключаем кнопку к выходу 6
int But4Pin = 7;                             // Подключаем кнопку к выходу 7
int flag=0;
////////////////////////////////////////////////////////////////////////////////////////////////////////

void setup() 
{
pinMode(A0, INPUT);                          // Подключаем температурные датчики DHT11 на A0
digitalWrite(A0, HIGH);                      // На пин А0-5вольт
pinMode(A1, INPUT);                          // Подключаем температурные датчики DHT11 на A0
digitalWrite(A1, HIGH);                      // На пин А0-5вольт
pinMode(A2, INPUT);                          // Подключаем температурные датчики DHT11 на A0
digitalWrite(A2, HIGH);                      // На пин А0-5вольт

pinMode(pinReley1, OUTPUT);                  // Режим порта реле1 на вывод
pinMode(pinReley2, OUTPUT);                  // Режим порта реле2 на вывод
pinMode(pinReley3, OUTPUT);                  // Режим порта реле3 на вывод
pinMode(pinReley4, OUTPUT);                  // Режим порта реле4 на вывод

digitalWrite(pinReley1, HIGH);               // Режим порта реле1 выкл на старте
digitalWrite(pinReley2, HIGH);               // Режим порта реле2 выкл на старте
digitalWrite(pinReley3, HIGH);               // Режим порта реле3 выкл на старте
digitalWrite(pinReley4, HIGH);               // Режим порта реле4 выкл на старте

pinMode(But1Pin, INPUT);                     // Режим порта кнопки1 на вход (на замыкание)
pinMode(But2Pin, INPUT);                     // Режим порта кнопки2 на вход (на замыкание)
pinMode(But3Pin, INPUT);                     // Режим порта кнопки3 на вход (на замыкание)
pinMode(But4Pin, INPUT);                     // Режим порта кнопки4 на вход (на замыкание)

///////////////////////////////////////////////////////////////////////////////////////////////

Serial.begin(9600);                          // Скорость порта 9600
GsmSerial.begin(9600);                       // Устанавливаем скорость связи Ардуино и модема
GsmSerial.println("ATE0");                   // выключаем эхо
delay(100);                                   
GsmSerial.println("AT+CLIP=1");              // Включаем АОН
delay(100);
GsmSerial.println("AT+CMGF=1");              // Формат СМС = ASCII текст
delay(100);
GsmSerial.println("AT+CSCS=\"GSM\"");        // Режим кодировки текста = GSM (только англ.)
delay(100); 
GsmSerial.println("AT+CNMI=2,2");            // Текст смс выводится в com-порт
delay(100); 
String str="";
while(str.indexOf("+COPS: 0") == -1)       // Ждем пока модем будет готов
      {
      GsmSerial.println("AT+COPS?");              // Информация об операторе
      str=ReadCom();
      delay(300); 
      } 

}

void loop() 
{
   
         String strSms = ReadCom();                  // Читаем смс, если есть
         while (strSms.length()==0) 
 {
             if(digitalRead(But1Pin) == HIGH && flag == 0)      
                 { 
                
                 digitalWrite(pinReley1, !digitalRead(pinReley1));
                 flag = 1;
                 delay(500);
                 }
  
            if(digitalRead(But1Pin) == LOW && flag == 1)
                {
                flag = 0;
                delay(500);
                int Reley1status = digitalRead(8);
                Serial.print(pinReley1);
                } 
             
            if(digitalRead(But2Pin) == HIGH && flag == 0)      
                { 
                 
                digitalWrite(pinReley2, !digitalRead(pinReley2));
                flag = 1;
                delay(500);
                }
  
            if(digitalRead(But2Pin) == LOW && flag == 1)
                {
                flag = 0;
                delay(500);
                int Reley2status = digitalRead(9);
                Serial.print(pinReley2);
                }  
            
             if(digitalRead(But3Pin) == HIGH && flag == 0)
                {   
                 
                digitalWrite(pinReley3, !digitalRead(pinReley3));
                flag = 1;
                delay(500);
                }
  
            if(digitalRead(But3Pin) == LOW && flag == 1)
                {
                flag = 0;
                delay(500);
                int Reley3status = digitalRead(10);
                Serial.print(pinReley3);
                }  
             
              if(digitalRead(But4Pin) == HIGH && flag == 0)   
                 { 
                  
                 digitalWrite(pinReley4, !digitalRead(pinReley4));
                 flag = 1;
                 delay(500);
                 }
  
              if(digitalRead(But4Pin) == LOW && flag == 1)
                 {
                 flag = 0;
                 delay(500);
                 int Reley4status = digitalRead(11);
                 Serial.print(pinReley4);               
                 }    
          else  
        
          delay(500);
          strSms = ReadCom();
    }
                             
    // Если телефон админа, то читаем дальше
if (strSms.indexOf(AdminPhone) > -1) 

          {
          if (strSms.indexOf("+CMT") > -1)         // Если смс
          
                  {
// Кодовое слово "1on" первое реле зажигаем
                  if (strSms.indexOf("1on") > -1)     // Если обнаружено ключевое слово на включение
                  
                            {
                            digitalWrite(pinReley1,LOW);             // Включаем 1реле
                            SendSms("Reley1=on", AdminPhone);       // Можем отправить смс, что включили
                            Serial.println("Reley1=on");
                            }
// Кодовое слово "1off" отключем первое реле
                  if (strSms.indexOf("1off") > -1)    // Если обнаружено ключевое слово на выключение

                            {
                            digitalWrite(pinReley1,HIGH);             // Выключаем светодиод
                            SendSms("Reley1=off", AdminPhone);     // Можем отправить смс, что выключили
                            Serial.println("Reley1=off");
                            }
// Кодовое слово "2on" 2 реле зажигаем
                  if (strSms.indexOf("2on") > -1)     // Если обнаружено ключевое слово на включение
                  
                            {    
                            digitalWrite(pinReley2,LOW);             // Включаем светодиод
                            SendSms("Reley2=on", AdminPhone);       // Можем отправить смс, что включили
                            Serial.println("Reley2=on");
                            }
// Кодовое слово "2off" отключем первое реле
                  if (strSms.indexOf("2off") > -1)    // Если обнаружено ключевое слово на выключение

                            {
                            digitalWrite(pinReley2,HIGH);             // Выключаем светодиод
                            SendSms("Reley2=off", AdminPhone);     // Можем отправить смс, что выключили
                            Serial.println("Reley2=off");
                            }
// Кодовое слово "3on" 3 реле зажигаем
                  if (strSms.indexOf("3on") > -1)     // Если обнаружено ключевое слово на включение
                            { 
                            digitalWrite(pinReley3,LOW);             // Включаем светодиод
                            SendSms("Reley3=on", AdminPhone);       // Можем отправить смс, что включили
                            Serial.println("Reley3=on");
                            }
// Кодовое слово "3off" отключем первое реле
                  if (strSms.indexOf("3off") > -1)    // Если обнаружено ключевое слово на выключение

                            {
                            digitalWrite(pinReley3,HIGH);             // Выключаем светодиод
                            SendSms("Reley3=off", AdminPhone);     // Можем отправить смс, что выключили
                            Serial.println("Reley3=off");
                            }
// Кодовое слово "4on" первое реле зажигаем
                  if (strSms.indexOf("4on") > -1)     // Если обнаружено ключевое слово на включение
                            {
                            digitalWrite(pinReley4,LOW);             // Включаем светодиод
                            SendSms("Reley4=on", AdminPhone);       // Можем отправить смс, что включили
                            Serial.println("Reley4=on");
                            }
// Кодовое слово "4off" отключем первое реле
                  if (strSms.indexOf("4off") > -1)    // Если обнаружено ключевое слово на выключение

                            {
                            digitalWrite(pinReley4,HIGH);             // Выключаем светодиод
                            SendSms("Reley4=off", AdminPhone);     // Можем отправить смс, что выключили
                            Serial.println("Reley4=off");
                            }
// Кодовое слово "allon" все реле зажигаем
                  if (strSms.indexOf("allon") > -1)     // Если обнаружено ключевое слово на включение
       
                            {
                            digitalWrite(pinReley1,LOW);
                            delay(1500);
                            digitalWrite(pinReley2,LOW);
                            delay(1500);
                            digitalWrite(pinReley3,LOW);
                            delay(1500);
                            digitalWrite(pinReley4,LOW);
                            SendSms("Reley=all-on", AdminPhone);       
                            Serial.println("Reley=all-on");
                            }
// Кодовое слово "alloff" все реле зажигаем
                  if (strSms.indexOf("alloff") > -1)     // Если обнаружено ключевое слово на включение
                            {
                            digitalWrite(pinReley1,HIGH);
                            delay(1500);
                            digitalWrite(pinReley2,HIGH);
                            delay(1500);
                            digitalWrite(pinReley3,HIGH);
                            delay(1500);
                            digitalWrite(pinReley4,HIGH);             // Включаем светодиод
                            SendSms("Reley=all-on", AdminPhone);       // Можем отправить смс, что включили
                            Serial.println("Reley=all-on");
                            }
                            
                            
//// Кодовое слово "bal" проверка баланса
//                if (strSms.indexOf("bal") > -1)     // Если обнаружено ключевое слово на включение
//                GsmSerial.println("ATD#100#;\r"); // делаем запрос баланса     
//                delay(5000);
                          
                        
                   }      
          }

if (strSms.indexOf("RING") > -1)         // Если звонят (выполняется на каждый гудок)
   
          {
                  GsmSerial.println("ATD#100#;\r"); // делаем запрос баланса
                  delay(2500);
                  GsmSerial.println("ATH0"); // Сброс после гудка
// Можем, что нибудь выполнить
                  int t = sens.readTemperature(A0); // чтение датчика на пине 2
                  int h = sens.readHumidity(A0);    // чтение датчика на пине 2
                  delay(2000);
  
                  int t2 = sens.readTemperature(A1); // чтение датчика на пине 3
                  int h2 = sens.readHumidity(A1);    // чтение датчика на пине 3
                  delay(2000);
  
                  int t3 = sens.readTemperature(A2); // чтение датчика на пине 3
                  int h3 = sens.readHumidity(A2);    // чтение датчика на пине 3
                  delay(2000);
  
                  Serial.print("Home: ");
                  Serial.print(h);
                  Serial.print(" %");
                  Serial.print("Home: ");
                  Serial.print(t);
                  Serial.println(" C ");
                  Serial.print("Out: ");
                  Serial.print(h2);
                  Serial.print(" %");
                  Serial.print("Out: ");
                  Serial.print(t2);
                  Serial.println(" C "); 
                  Serial.print("Kotel: ");
                  Serial.print(h3);
                  Serial.print(" %");
                  Serial.print("Out: ");
                  Serial.print(t3);
                  Serial.println(" C "); 
                  int Reley1status = digitalRead(8); // Получить состояние пина 8: 
                  int Reley2status = digitalRead(9); //Управляемое устройство 9
                  int Reley3status = digitalRead(10);//Управляемое устройство 10
                  int Reley4status = digitalRead(11);//Управляемое устройство 11
                  statusHome = String("Home")+int(h)+String("%")+String("Home")+int(t)+String("C")+String("Out")+int(h2)+String("%")+String("Out")+int(t2)+String("C")+String("Kotel")+int(h3)+String("%")+String("Kotel")+int(t3)+String("C")+int(Reley1status)+int(Reley2status)+int(Reley3status)+int(Reley4status);
                  Serial.print(Reley1status);
                  Serial.print(Reley2status);
                  Serial.print(Reley3status);
                  Serial.print(Reley4status);
                  Serial.print(statusHome);
                  SendSms((statusHome), AdminPhone); // Отправка смс со статусами
//Serial.println("start call");
          }

         if (strSms.indexOf("NO CARRIER") > -1)   // Если звонок окончен
         
          {
//SendSms("called", AdminPhone);     // Можем отправить смс, что нам звонили
                  Serial.println("end call");
          }
        








 
} // LOOP закрылся

// Читает смс

String ReadCom()

{

          int chCode = 0;                              // Код символа
          String strSms = "";                          // Текст
          if (GsmSerial.available())                  // Есть данные от модема
          {
          delay(300);
// Считываем смс с com-порта модема
          while (GsmSerial.available())             // Если есть еще символы, то читаем
                   {
                   chCode = GsmSerial.read();               // Считываем очередной символ
                   strSms += char(chCode);                  // Добавляем к строке
                   delay(10);
                   }
           }
           if (strSms.length()>0) 
           
                   {
                   Serial.println("++++++++++");
//Serial.println();
                   Serial.println(strSms.length());
                   Serial.println(strSms);
                   }
            return strSms;
}
// Отправляет текст смс на определенный номер
void SendSms(String text, String phone)

           {
           phone="+"+phone;
           GsmSerial.println("AT+CMGS=\"" + phone + "\""); // Заголовок АТ команды и номер телефона
           delay(500);
           GsmSerial.print(text);                          // Текст смс
           delay(500);
           GsmSerial.print((char)26);                      // Конец сообщения и отправляем смс
           delay(500);
           }

 

yucan
Offline
Зарегистрирован: 20.04.2015

Какое приложение на смартфоне используете? Проект, я так понимаю, не закончен...

b707
Онлайн
Зарегистрирован: 26.05.2017

_jah_69_ пишет:
Буду очень признателен за совет или оптимизацию написанного.

При таком коде у вас очень скоро начнутся проблемы с памятью. Подозреваю, что уже сейчас переменные используют порядка 50% доступного ОЗУ.

Для того, чтобы решить проблему, вам надо:

а) перенести все статичные строки (команды модема, диагностические сообщения. тексты СМС) во флеш-память

б) перестать использовать класс String

Кроме того, в коде куча операторов delay. причем с большими задержками. Это означает, что например кнопки  к этому скетчу уже не прикрутить.

Ну и сам код, сорри, выглядит как-то... - по-детски. что ли. Избегайте повторения одного и того же кода - если какой-то код встречается в программе больше двух раз - используйте циклы и подпрограммы. Переменные одинакового типа - команды модема, номера пинов и тп - организуйте в массивы и структуры.

Andrey12
Andrey12 аватар
Онлайн
Зарегистрирован: 26.12.2014

b707 пишет:

При таком коде у вас очень скоро начнутся проблемы с памятью. Подозреваю, что уже сейчас переменные используют порядка 50% доступного ОЗУ.

Нет, пока всего только 33% что не так критично. Но согласен, если развивать проект то с объектом String скоро понадобится MEGA.

Скетч использует 11128 байт (34%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 685 байт (33%) динамической памяти, оставляя 1363 байт для локальных переменных. Максимум: 2048 байт.

b707 пишет:

Кроме того, в коде куча операторов delay. причем с большими задержками. Это означает, что например кнопки  к этому скетчу уже не прикрутить.

Дело не только в том что кнопки не прикрутить, тут еще беда в абсолютной нестабильности. 

GsmSerial.println("AT+CMGS=\"" + phone + "\""); // Заголовок АТ команды и номер телефона
delay(500);
GsmSerial.print(text);                          // Текст смс
delay(500);
GsmSerial.print((char)26);                      // Конец сообщения и отправляем смс
delay(500);

А вы уверены что в течении delay(500) SIM ответит? И ответит правильно? То есть ответ вы не мониторите и надеетесь что всегда в ответ приходит ОК?

Причем у вас после всех обращений к SIM стоит delay а не разбор ответа модема.

Хотя в одном месте есть ожидание ответа, но тоже не есть правильно, причем тут оператор и готовность к работе?


while(str.indexOf("+COPS: 0") == -1)       // Ждем пока модем будет готов
      {
      GsmSerial.println("AT+COPS?");              // Информация об операторе
      str=ReadCom();
      delay(300); 
      } 

У SIM900 есть команда AT+CPAS Информация о состояние модуля и ответы которые подучаем от SIM:

0 – готов к работе
2 – неизвестно
3 – входящий звонок
4 – голосовое соединение
 
_jah_69_
Offline
Зарегистрирован: 31.03.2017

Благодарю за замечания. Я в курсе что там не идеал. С учетом того что это мой первый проект и летний период отработал на твёрдую 4ку. Было что пару раз зависим Gsm модуль. А так я в целом информацию по датчикам получаю полив включается. Единственное что не получилось реализовать так это открытие теплицы. И то проблем возникла в падении напряжения мотор стеклоподъемника бмв даже не дернулся на расстоянии 20м. В этом году кину старый акум рядом и драйвер мотора поставлю