Функция отправки SMS с GSM/GPRS шилда SIM900

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

Всем привет !!! Програмить  я  только учусь,  по этому прошу вашей помощи. Сильно не ругайте )))).

Делаю сигнализацию на беспроводных датчиках движения,  с возможностью принимать сигнал дверного звонка, и  вкл./выкл. сигнализации с помощью с пульта.

Система состоит из следующих компонентов:

  1. arduino mini pro
  2. GSM/GPRS шилд SIM900,
  3. Приемник XY-MK-5V (433 mHz)
  4. Беспроводные датчики  движения (433 mHz)
  5. Дверной звонок на TL 2262  (433 mHz)
  6. Пульт с приемником в комплекте 2262/2272  (433 mHz)

 

Методом  «тыка» определил ,  что для приёма сигнала с датчиков движения подошла библиотека RCSwith (подключен к pin 2), 

а для дверного звонка RemoteSwich (подключен к pin 3), хотя звонок на TL 2262 и по идее должен ловиться RCSwith-ом .  

Прием сигналов с датчиков:

#include <RemoteReceiver.h>
#include <RCSwitch.h>
#include <SoftwareSerial.h>

#include "SIM900.h"
#include "sms.h"

RCSwitch mySwitch = RCSwitch();
SMSGSM sms;
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];

void setup() {
  Serial.begin(9600);
  RemoteReceiver::init(0, 3, showCode);// для этой библиотеки пин 2
  mySwitch.enableReceive(1); // а для этой  пин 3
}

/* =======ДЛЯ ФУНКЦИИ ОТПРАВКИ SMS СООБЩЕНИЯ========
  if (gsm.begin(2400)){ // включаем шильд
      started=true;
  }
  
  
  sms.SendSMS("+7********", "ROOM_ALARM!!!"); // отправляем SMS
*/


void loop() {
  
  if (mySwitch.available()) {
    int value = mySwitch.getReceivedValue();
    
    if (mySwitch.getReceivedValue() == 9290441) { //код с датчика движения № 1
        Serial.println("ROOM_ONE");// вместо этого ставим 
        mySwitch.resetAvailable(); // отправку смс
        }
      
    if (mySwitch.getReceivedValue() == 12901577) { //код с датчика движения № 2
        Serial.println("ROOM_TWO"); // вместо этого ставим
        mySwitch.resetAvailable(); // отправку смс
        }
    
    }
 
  
}
       /* ЛОВИМ ЗВОНОК С ДВЕРИ  */
void showCode(unsigned long receivedCode, unsigned int period) {
  if (receivedCode == 500904)
  Serial.println("DOOR");  
}

Прошу помочь в следующем:

1. Как правильно написать функцию для отправки СМС под библиотеку  SIM900,  при срабатывании датчиков движения и звонка.

2. Возможно ли использовать одну библиотеку И для датчика движения И для звонка. Может что-то изменить в самой библиотеке RCSwich чтобы она принимала коды  с датчика и звонка и при этом занимала бы один пин на ардуине.

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

4. Можно ли использовать XY-MK-5V для приема сигналов с пульта вместо его «родного» приемника.

Спасибо.

com
Offline
Зарегистрирован: 06.09.2013

к библиотеке под sim900 идет масса примеров, в том числе и для отправки смс

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

Вопрос в том как сделать функцию отправки смс при срабатывании датчиков. А примеры я все смотрел.

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Попробуйте почитать что такое функции...

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

Ок, еще раз прочитаю, хотельсь бы конкретно по данному вопросу получить совет.

com
Offline
Зарегистрирован: 06.09.2013

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

Jaqwerty пишет:

Вопрос в том как сделать функцию отправки смс при срабатывании датчиков. А примеры я все смотрел.

можно трактовать так

1. я не умею писать функции (любые)

2.я не умею писать функции, которые отправляют смс

3.я умею писать любые функции, но не умею их вызывать по срабатыванию датчика.

будем гадать или подождем экстрасенсов? есть тут один, мохнатый, с хрустальными шарами :)

MDV
Offline
Зарегистрирован: 08.08.2013

в двух словах, вводите переменную значение которой изменяется при срабатывание датчиков, далее условие проверки значения данной переменной если 0 все ок если нет шлём смс. мона усложнить и отправлять еще разный текст при срабатывании разных датчиков.

дря примера сходите на амперку там один товарищь реализовал нечто подобное.

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

Гадать и вызывать с хрустальными шарами не надо ))))))))).  Наврное п.3 

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

MDV благодарю, буду "копать" по Вашему совету

JollyBiber
JollyBiber аватар
Offline
Зарегистрирован: 08.05.2012

Мой совет: нарисуйте на бумажке алгоритм и посмотрите на него внимательно, там будут ответы на все Ваши вопросы. Если не знаете что такое алгоритмы - почитайте сначала про них.

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

В общем на выходных поставил на "боевое дежурство" свою сигнализацию, как смог так сделал. СМСки от  датчиков движения и звонка приходят примерно  через 10 +- сек после срабатывания (сеть Мегафон). 

Вот код.

#include <RemoteReceiver.h>
#include <RCSwitch.h>
#include <plcLib.h>
#include <SoftwareSerial.h>
#include "SIM900.h"
#include "sms.h"

int alarm = 0; // сосотояние - НЕТ СИГНАЛОВ
int led = 13;
RCSwitch mySwitch = RCSwitch();
SMSGSM sms;
int numdata;
boolean started=false;
char smsbuffer[160];
char n[20];


void setup() {
  Serial.begin(9600);
  RemoteReceiver::init(0, 3, showCode); 
  mySwitch.enableReceive(1);
  pinMode(led, OUTPUT);  
  if (gsm.begin(2400)){   
      started=true;
    }    
}

// Дверной звонок
void showCode(unsigned long receivedCode, unsigned int period) {
  if (receivedCode == 500904)
     alarm = 1;
}

void loop() {

  if (started){        // Если модуль заработал - мигаем светодиодом
      digitalWrite(led, HIGH); 
      delay(1000);               
      digitalWrite(led, LOW);    
      delay(1000); 
      }else {
      digitalWrite(led, HIGH);
      }
      
  if (alarm == 1){  // Отправляем сообщения 
      sms.SendSMS("+7********", "3BOHOK!!!"); 
      delay (2000);
      alarm = 0; 
      }else if (alarm == 2){
                sms.SendSMS("+7********", "KYXHIA!!!"); 
                delay (2000);
                alarm = 0; 
                }else if (alarm == 3){
                          sms.SendSMS("+7********", "DBOP!!!"); 
                          delay (2000);
                          alarm = 0; 
                          }
                  
                          
  if (mySwitch.available()) {
     int value = mySwitch.getReceivedValue();
     if (mySwitch.getReceivedValue() == 9290441) {
        alarm = 2;
        mySwitch.resetAvailable(); 
        }
     if (mySwitch.getReceivedValue() == 12901577) {
        alarm = 3;
        mySwitch.resetAvailable(); 
        }
    }                 
}

если кто подскажет как что можно "оптимизировать" буду благодарен. ))))))

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

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

ЧТО ЕСТЬ:

GSM/GPRS SIM900 (пины 4, 5, 7, 8)

приемник XY-MK-5V(пины 2,3 - из за 2 разных библиотек приходится занимать два пина - плохо) 

приемник брелка 2262/2272  (пины А0, А1, А2, А3)

реле уличного фонаря (пин 9)

сирена (пин 10)

беспроводные датчики движения и звонок (11 метров через 2 стены)

Сигнализация ставится и снимается с брелка, после снятия можно включать выключать уличный фонарь.

ЧТО ПОКА НЕ ПОБЕДИЛ:

1. Как сделать автоматизированную проверку баланса, который при уменьшении например до 10 рублей слал смс что надо положить денюжку (может быть использовать millis() ).

2. Также при отправке например "tmp" присылал сообщение о температуре в доме.

4. Почему то RCSwith не заработал с библиотекой plcLib, не авилебл и все(((

5. Ну и из предыдущих: -  .. Можно что-то изменить в  библиотеке RCSwich чтобы занимая один пин на ардуине она принимала коды И с датчиков движения И со звонка (он сейчас работает на библиотеке RemoteSwich ( pin 3), хотя микруха в звонке TL 2262 и по описаниям должна ловиться RCSwith-ом ).

Код:

#include <RemoteReceiver.h>
#include <RCSwitch.h>
#include <SoftwareSerial.h>
#include <plcLib.h>
#include "DHT.h"
#include "SIM900.h"
#include "sms.h"
#include "call.h"

#define pirPin 6
#define Relay 9
#define Siren 10
#define DHTPIN 11
#define led 13
#define DHTTYPE DHT22
#define inputA  A3 
#define inputB  A1 
#define inputC  A2 
#define inputD  A0 

int Value = 0; // флаг на ноль
boolean Alarm = true; // сигнализация ВКЛ.

int readStateA = 0, readStateB = 0, readStateC = 0, readStateD = 0; //состояние кнопок брелка на ноль

RCSwitch mySwitch = RCSwitch();

int calibrationTime = 30;//установки проводного даьчика движения
long unsigned int lowIn, pause = 5000;
boolean takeLowTime, lockLow = true;

CallGSM call;//учтановки GSM шилда
SMSGSM sms;
int numdata;
boolean started=false;
char pos, data, smsbuffer[180];
char *p, *PhoneMessage[7] = {"+79*********", "ATD#100#;", "3BOHOK!!!", "KYXHA!!!", "KOMHATA!!!", "BXOD!!!", ""};

DHT dht(DHTPIN, DHTTYPE); //установки DHT22
char *tmp;
float t;

void setup() {
  Serial.begin(9600);
  RemoteReceiver::init(0, 3, showCode); 
  mySwitch.enableReceive(1);
  pinMode(inputA, INPUT);
  pinMode(inputB, INPUT);
  pinMode(inputC, INPUT);
  pinMode(inputD, INPUT);
  dht.begin();
  pinMode(led, OUTPUT);
  pinMode(Relay, OUTPUT);
  pinMode(pirPin, INPUT);
  pinMode(Siren, OUTPUT);
  digitalWrite(pirPin, LOW);
  digitalWrite(Relay, HIGH);
  for(int i = 0; i < calibrationTime; i++){}  
  if (gsm.begin(2400)){                
      started=true;
    }    
}

//////////////////////Функция приема с дверного звонка////////////////
void showCode(unsigned long receivedCode, unsigned int period) {    //
  if (receivedCode == 500904)                                       //
      Value = 2;                                                    //                                               
}                                                                   //
//////////////////////////////////////////////////////////////////////

///////////////////////////////////Функция отправки СМС////////////////////////////////////   
void ReadSendSMS (char* phone, char* msg, byte st){                                      //
  if(st == 1){                                                                           //
  sms.SendSMS(phone, msg);                                                               // 
  Value = 0;                                                                             // 
  }                                                                                      //     
}                                                                                        //                                           
/////////////////////////////////////////////////////////////////////////////////////////// 


void loop() {
  
  readStateA = digitalRead(inputA);
  readStateB = digitalRead(inputB);
  readStateC = digitalRead(inputC);
  readStateD = digitalRead(inputD);

//////////Управление с брелка////////
  if (readStateA == HIGH){ //ВКЛ.  //
      Alarm = true;                // 
      started = true;              //
      Value = 1;                   // 
      delay (2000);                //
  } else if (readStateB == HIGH){  //
      Value = 7;  //ВЫКЛ.          // 
         }                         //
///////////////////////////////////// 
      
/////////////Считывание с беспроводных датчиков////////////////
  if (mySwitch.available()){                                 // 
      if(mySwitch.getReceivedValue() == 9290441) {           //
          delay(2000);                                       //
          Value = 3;                                         // 
          mySwitch.resetAvailable();                         // 
       } else if(mySwitch.getReceivedValue() == 12901577) {  //
                  delay(2000);                               //
                  Value = 4;                                 //
                  mySwitch.resetAvailable();                 //   
               }                                             //
  }                                                          //
///////////////////////////////////////////////////////////////
    

/////////////////////////Выполнение команд/////////////////////////
  if (Alarm && started){                                         //                                                                                                                                    //
      digitalWrite(led, HIGH); //дежурный сигнал                 //
      delay(700);                                                //
      digitalWrite(led, LOW);                                    //
      delay(700);                                                //
///////////////////Прием с датчика на улице/////////////////     //
  if(digitalRead(pirPin) == HIGH){                        //     //                          
     Value = 5;                                           //     //  
     takeLowTime = true;                                  //     //
     } else if (digitalRead(pirPin) == LOW) {             //     //
               if(takeLowTime){                           //     //  
                  lowIn = millis();                       //     //  
                  takeLowTime = false;                    //     //  
                  Value = 0;                              //     //  
               }                                          //     //  
               if(!lockLow && millis() - lowIn > pause){  //     // 
                 lockLow = true;                          //     //  
                 delay(50);                               //     //  
               }                                          //     //  
            }                                             //     // 
////////////////////////////////////////////////////////////     //
                                                                 // 
      switch(Value){                                             //
         case 1://ВКЛ.                                           // 
               digitalWrite(Relay, LOW);                         // 
               digitalWrite(Siren, HIGH);                        // 
               delay(170);                                       //
               digitalWrite(Relay, LOW);                         //
               digitalWrite(Siren, LOW);                         // 
               delay(150);                                       //
               digitalWrite(Relay, LOW);                         // 
               digitalWrite(Siren, HIGH);                        //
               delay(150);                                       //
               digitalWrite(Relay, LOW);                         //
               digitalWrite(Siren, LOW);                         // 
               delay(2000);                                      //
               digitalWrite(Relay, HIGH);                        //
               Value = 0;                                        // 
               break;                                            //
         case 2://дверной звонок                                 //
               ReadSendSMS(PhoneMessage[0], PhoneMessage[2], 1); //    
               break;                                            //
         case 3://кухня                                          //    
               ReadSendSMS(PhoneMessage[0], PhoneMessage[3], 1); //
               break;                                            //
         case 4://комната                                        //   
               ReadSendSMS(PhoneMessage[0], PhoneMessage[4], 1); // 
               break;                                            //
         case 5: //вход                                          //
               ReadSendSMS(PhoneMessage[0], PhoneMessage[5], 1); //
               digitalWrite(Relay, LOW);                         // 
               delay(1000);                                      //
               digitalWrite(Siren, HIGH);                        // 
               digitalWrite(Relay, LOW);                         // 
               delay(4000);                                      //
               digitalWrite(Siren, LOW);                         //    
               digitalWrite(Relay, LOW);                         // 
               delay(10000);                                     // 
               digitalWrite(Relay, HIGH);                        //
               break;                                            //
         case 6://баланс и температура                           //
                ///????????????????????                          //                
               break;                                            //
         case 7://ВЫКЛ.                                          //
               digitalWrite(Relay, LOW);                         //
               digitalWrite(Siren, HIGH);                        //
               delay(150);                                       // 
               digitalWrite(Relay, LOW);                         //
               digitalWrite(Siren, LOW);                         // 
               delay(1000);                                      // 
               digitalWrite(Relay, HIGH);                        //
               started = false;                                  //
               Alarm = false;                                    //
               break;                                            //  
          }                                                      //
  } else {                                                       //
           digitalWrite(led, HIGH);                              // 
         }                                                       //
///////////////////////////////////////////////////////////////////

///////////////////Чтение входящих СМС//////////////////////     
/*if (Alarm && started && Value == 0){                                              
    pos = sms.IsSMSPresent(SMS_UNREAD);                          
    if(pos > 0){                                         
       sms.GetSMS(pos,PhoneMessage[0],smsbuffer,180);                                                
       p = strstr(smsbuffer,"tmp");                                                         
} 
*/                                                           

//////////Управление фонарем над дверью/////////
  if (!Alarm){                                //
      if (readStateC == HIGH){                //            
          digitalWrite(Relay, LOW);           //
      } else if (readStateD == HIGH){         //
                  digitalWrite(Relay, HIGH);  //
              }                               //
  }                                           //               
////////////////////////////////////////////////               
     
}

 

 

 

com
Offline
Зарегистрирован: 06.09.2013

в плане конструктивной критики советую заменить общение через смс на передачу данных, а то разоритесь на смс-ках. При сдельном тарифе 3 руб/мег на мониторинг температуры в гараже/погребе у меня в месяц уходит рублей 10, ну максимум 20

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

На счет температуры полностью согласен но думаю датчики движения должны быть всетаки на смс.  А у Вас система только мониторит температуру?

com
Offline
Зарегистрирован: 06.09.2013

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

система мониторит температуру с нескольких датчиков, включает/выключает подогреватель. ну и статус обогревателей тоже сообщает. раз в 3 часа передается полное состояние системы, по запросу - состояние в настоящее время

если хочется исходящие смс, то можно сделать отправку сообщения на эл. почту, а уже к почтовому ящику привязать дублирование через смс - тогда смс будет бесплатно

MDV
Offline
Зарегистрирован: 08.08.2013

COM добрый день.
Какой бы библиотекой пользуетесь и если не жалко пришлите скетч. Колдую над чем то похожим шлю данные на народный монитор но хочу еще и дистанционное управление сделать.

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

здравствуйте уважаемые форумчане!!! 

в общем сигнализация работала исправно и бесперерывно в течении 2 лет, сохраняя относительное спокойствие в душе)))). И вот решил я все это дело аккуратно упаковать в раздаточною коробку 10х14, нарисовал и вытраил новую плату под размер коробки, все собрал, подключаю свой шилд ..... и ничего, т.е. он ловит сеть (гудки при дозвоне), но ни sms, ни выдичи какой либо информации в монитор порта нет (когда я открываю монитор он "перезагружается" но ничего в монитор не идет). Пробовал как c библиотекой sim900, так и просто через softwareserial - результат нулевой, от шилда связи нет.

Конфигурация системы пержняя :     miniPro (пины 4,5) + sim900 (пины 7,8, 9); питание через - 7805 (с конденсаторной обвязкой), блок питания трансформаторный 7,5V   1А

Может кто сталкивался с такой проблемой, хотябы поскажите что можно проверить на шилде?

 

     

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Мне кажется, раздаточная коробка - не самое лучшее место для размещения электроники.

А если она еще должна и сеть ловить, то, боюсь, металлические стенки этого ей сделать не позволят.

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

извиняюсь - на раздаточная а распред.коробка, для электропроводки, и она пластиковая))))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015
Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

уверен что  в современных раздаточных коробках есть место микроконтроллеру)))), только вот шилд мой не работает

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

Ещё вопрос - подскажите код для подключения шилда к ардуине через hardware serial

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Я так понимаю, Serial.begin(NNNN); , где NNNN - скорость обмена, которую поддерживает шилд.

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

подскажите пожалуста примеры кода для общения с шилдом через аппаратный uart

MDV
Offline
Зарегистрирован: 08.08.2013

Привет.
Примеры будут зависит от применяемой библиотеки и того что ты хочешь получить от модема.
Можешь посмотреть в интернете (на амперке или jt5)

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

Приветствую. 

Мне хотя бы получить ОК на АТ. Я соединяю пины 0,1 miniPro  к  пинам 0,1 GSM шилда. Перемычки на "hw"., пробовал залить вот такой пример но ответа нет:

HardwareSerial & mySerial = Serial;

void setup()  
{
  Serial.begin(9600);
  mySerial.begin(9600);
  //Serial.println("AT");
  mySerial.println("AT+CSQ");
}

void loop() 
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

 

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

на форуме нашел только как подключают к меге . Но это никак не применимо к минипро. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Подключать надо перекрёстно - RX-TX, TX-RX. Скорости работы порта должны быть одинаковые - в шилде и ардуине.

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

на шилде разьемы 0 - rx, 1- tx,   на миниПро 0 - tx, 1- rx, подключаю вроде правильно, а как установить скорость шилда?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Jaqwerty пишет:

на шилде разьемы 0 - rx, 1- tx,   на миниПро 0 - tx, 1- rx, подключаю вроде правильно, а как установить скорость шилда?

Через любую терминальную программу, подключив шилд через USB-TTL-конвертер. Или - со стороны ардуины подобрать скорость порта перебором.

Jaqwerty
Jaqwerty аватар
Offline
Зарегистрирован: 25.06.2014

ОК, спасабо понятно. Тогда подскажите пожалуйста код.

MDV
Offline
Зарегистрирован: 08.08.2013

Привет Посмотри пример на jt5 там и код есть и схема соединения.
При сондинении не забудь gnd (-) модема и контроллера соединить, а то про это постоянно забывают.