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

Тема в разделе "Глядите, что я сделал", создана пользователем _jah_69_, 31 мар 2017.

  1. _jah_69_

    _jah_69_ Гик

    Добрый вечер.
    Вдохновленный трудами форумчан, решил собрать себе на лето систему полива по смс ну и так по мелочам .
    Для это цели были приобретены
    Ардуино uno
    3 датчика температуры один на улицу другой в дом третий на подающую трубу газового котла Dh11
    SIM900a mini без проблем адаптировал на наши сети
    DC - понижающий на модуль SIM с 12в до 4.1в
    Блок на 4 реле.
    На данный момент сделано :
    при отправки смс 1on 2on.....4on включает соответствующее реле
    в ответ присылает отчет что реле включил
    Для яблока есть смс командер там все смс можно прописать
    Так же сделано если отправляешь allon или alloff выполняются действие со всеми реле.
    По звонку на модуль звонок сбрасывается и выводится в монитор порта на отправку в смс не наладил,пока тестил весь баланс сожрал.
     

    Вложения:

    • IMG_1739.JPG
      IMG_1739.JPG
      Размер файла:
      968,1 КБ
      Просмотров:
      924
    • IMG_1740.JPG
      IMG_1740.JPG
      Размер файла:
      929,1 КБ
      Просмотров:
      645
    • IMG_1741.JPG
      IMG_1741.JPG
      Размер файла:
      713,8 КБ
      Просмотров:
      969
    • IMG_1742.JPG
      IMG_1742.JPG
      Размер файла:
      714,7 КБ
      Просмотров:
      644
    • IMG_1737.PNG
      IMG_1737.PNG
      Размер файла:
      77 КБ
      Просмотров:
      640
    • IMG_1738.PNG
      IMG_1738.PNG
      Размер файла:
      98,3 КБ
      Просмотров:
      652
    Arduino-cool-2015 нравится это.
  2. _jah_69_

    _jah_69_ Гик

    Код (C++):
    #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);

    }
     
     
    TALex нравится это.
  3. _jah_69_

    _jah_69_ Гик

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

    Вот что вижу в терминале
    ++++++++++
    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
     
  4. TALex

    TALex Нуб

    upload_2017-4-20_17-2-5.png Здравствуйте, тоже пытаюсь сделать, что-то подобное на базе
    GSM модуль NEOWAY M590
    Пока добился только включение и отключение реле с отправкой смс. А с датчиком пока никак. Скачал Ваш код,выдаёт это upload_2017-4-20_17-2-5.png . Не поможете? (Начинающий)
     
  5. _jah_69_

    _jah_69_ Гик

    У меня датчики dht11 чуть выше библиотеки выложил под них. Попробуйте кинуть их в паку с библиотеками
     
  6. _jah_69_

    _jah_69_ Гик

  7. TALex

    TALex Нуб

    Спасибо, сейчас гляну.
     
  8. ostrov

    ostrov Гуру

    Тут sim900, от Neoway почти не отличается.

     
  9. TALex

    TALex Нуб

    Спасибо большое за ответ, у меня так же все работает. Датчик DTH 11 подключил, получаю с него данные в монитор порта. Не могу пока отправить смс с этими данными.
     
  10. _jah_69_

    _jah_69_ Гик

    У меня без проблем если набираешь номер модуль сбрасывает. А в ответ присылает
     

    Вложения:

    • IMG_1774.PNG
      IMG_1774.PNG
      Размер файла:
      107,9 КБ
      Просмотров:
      565
  11. _jah_69_

    _jah_69_ Гик

    Хочу баланс туда добавить
     
  12. TALex

    TALex Нуб

    При компилировании на это ругается
    DHT sens(DHT11); // Указать датчик DHT11, DHT21 или DHT22. (несколько датчиков вписывать не нужно)
    // Подключать можно только одинаковые датчики, то есть нельзя использовать одновременно DHT11 и DHT22
     
  13. TALex

    TALex Нуб

    Баланс получаю по смс, как то так
    if(val.indexOf("money") > -1) // смотрим, что за команда
    {
    delay(3000);
    mySerial.println("ATD#100#;");
    }
    }
    if(val.indexOf("+CUSD") > -1) //если есть входящее sms
    {
    if(val.indexOf("Balance") > -1) // смотрим, что за команда
    {
    delay(3000);

    val = val.substring(val.indexOf("Balance"),val.indexOf("r"));
    sms(String(val), String("+79ХХХХХХХХХ"));// ВПИШИТЕ ВАШ НОМЕР
    }
     
  14. _jah_69_

    _jah_69_ Гик

    Да я сей вариант пробовал. Там проблемка возникает в принципе решаемая из-за приема информации от телефона админа. Щас просто посидеть мозгами поскрипеть времени нет. Так то даже получалось получать но что то другое переставало функционировать. Думаю на майские попробую осилить.
    Есть мысль от двух реле запитать мотор поставить на него привод механники и открывать теплицу
     
  15. _jah_69_

    _jah_69_ Гик

    Последний вариант
     

    Вложения:

    • boevoi-got.ino
      Размер файла:
      18 КБ
      Просмотров:
      345
    TALex нравится это.
  16. TALex

    TALex Нуб

    Спасибо.Всё так же не компилируется пишет, что ДТЧ не имя типа (DTH does not name a type). Что делать, не знаю. Буду наверное учить мат часть.
     
  17. _jah_69_

    _jah_69_ Гик

    У меня строго библиотека для одинаковых dht11 хотя нет один со светодиодом 2 нет.
    Добавил управление мотором открытие двери через 2 реле
     

    Вложения:

    • boevoi_door.ino
      Размер файла:
      23,2 КБ
      Просмотров:
      569
  18. _jah_69_

    _jah_69_ Гик

    Библиотеки какие то из этих
     

    Вложения:

    TALex нравится это.
  19. TALex

    TALex Нуб

    Спасибо, я пока с одним экспериментирую библиотеки какие то есть ( с амперки), сейчас попробую Ваши.
     
  20. TALex

    TALex Нуб

    Огромное спасибо!!! ЗАРАБОТАЛО!!! Еще раз СПАСИБО!