Функция отправки 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-ом .  

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

01#include <RemoteReceiver.h>
02#include <RCSwitch.h>
03#include <SoftwareSerial.h>
04 
05#include "SIM900.h"
06#include "sms.h"
07 
08RCSwitch mySwitch = RCSwitch();
09SMSGSM sms;
10int numdata;
11boolean started=false;
12char smsbuffer[160];
13char n[20];
14 
15void setup() {
16  Serial.begin(9600);
17  RemoteReceiver::init(0, 3, showCode);// для этой библиотеки пин 2
18  mySwitch.enableReceive(1); // а для этой  пин 3
19}
20 
21/* =======ДЛЯ ФУНКЦИИ ОТПРАВКИ SMS СООБЩЕНИЯ========
22  if (gsm.begin(2400)){ // включаем шильд
23      started=true;
24  }
25   
26   
27  sms.SendSMS("+7********", "ROOM_ALARM!!!"); // отправляем SMS
28*/
29 
30 
31void loop() {
32   
33  if (mySwitch.available()) {
34    int value = mySwitch.getReceivedValue();
35     
36    if (mySwitch.getReceivedValue() == 9290441) { //код с датчика движения № 1
37        Serial.println("ROOM_ONE");// вместо этого ставим
38        mySwitch.resetAvailable(); // отправку смс
39        }
40       
41    if (mySwitch.getReceivedValue() == 12901577) { //код с датчика движения № 2
42        Serial.println("ROOM_TWO"); // вместо этого ставим
43        mySwitch.resetAvailable(); // отправку смс
44        }
45     
46    }
47  
48   
49}
50       /* ЛОВИМ ЗВОНОК С ДВЕРИ  */
51void showCode(unsigned long receivedCode, unsigned int period) {
52  if (receivedCode == 500904)
53  Serial.println("DOOR"); 
54}

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

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 +- сек после срабатывания (сеть Мегафон). 

Вот код.

01#include <RemoteReceiver.h>
02#include <RCSwitch.h>
03#include <plcLib.h>
04#include <SoftwareSerial.h>
05#include "SIM900.h"
06#include "sms.h"
07 
08int alarm = 0; // сосотояние - НЕТ СИГНАЛОВ
09int led = 13;
10RCSwitch mySwitch = RCSwitch();
11SMSGSM sms;
12int numdata;
13boolean started=false;
14char smsbuffer[160];
15char n[20];
16 
17 
18void setup() {
19  Serial.begin(9600);
20  RemoteReceiver::init(0, 3, showCode);
21  mySwitch.enableReceive(1);
22  pinMode(led, OUTPUT); 
23  if (gsm.begin(2400)){  
24      started=true;
25    }   
26}
27 
28// Дверной звонок
29void showCode(unsigned long receivedCode, unsigned int period) {
30  if (receivedCode == 500904)
31     alarm = 1;
32}
33 
34void loop() {
35 
36  if (started){        // Если модуль заработал - мигаем светодиодом
37      digitalWrite(led, HIGH);
38      delay(1000);              
39      digitalWrite(led, LOW);   
40      delay(1000);
41      }else {
42      digitalWrite(led, HIGH);
43      }
44       
45  if (alarm == 1){  // Отправляем сообщения
46      sms.SendSMS("+7********", "3BOHOK!!!");
47      delay (2000);
48      alarm = 0;
49      }else if (alarm == 2){
50                sms.SendSMS("+7********", "KYXHIA!!!");
51                delay (2000);
52                alarm = 0;
53                }else if (alarm == 3){
54                          sms.SendSMS("+7********", "DBOP!!!");
55                          delay (2000);
56                          alarm = 0;
57                          }
58                   
59                           
60  if (mySwitch.available()) {
61     int value = mySwitch.getReceivedValue();
62     if (mySwitch.getReceivedValue() == 9290441) {
63        alarm = 2;
64        mySwitch.resetAvailable();
65        }
66     if (mySwitch.getReceivedValue() == 12901577) {
67        alarm = 3;
68        mySwitch.resetAvailable();
69        }
70    }                
71}

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

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-ом ).

Код:

001#include <RemoteReceiver.h>
002#include <RCSwitch.h>
003#include <SoftwareSerial.h>
004#include <plcLib.h>
005#include "DHT.h"
006#include "SIM900.h"
007#include "sms.h"
008#include "call.h"
009 
010#define pirPin 6
011#define Relay 9
012#define Siren 10
013#define DHTPIN 11
014#define led 13
015#define DHTTYPE DHT22
016#define inputA  A3
017#define inputB  A1
018#define inputC  A2
019#define inputD  A0
020 
021int Value = 0; // флаг на ноль
022boolean Alarm = true; // сигнализация ВКЛ.
023 
024int readStateA = 0, readStateB = 0, readStateC = 0, readStateD = 0; //состояние кнопок брелка на ноль
025 
026RCSwitch mySwitch = RCSwitch();
027 
028int calibrationTime = 30;//установки проводного даьчика движения
029long unsigned int lowIn, pause = 5000;
030boolean takeLowTime, lockLow = true;
031 
032CallGSM call;//учтановки GSM шилда
033SMSGSM sms;
034int numdata;
035boolean started=false;
036char pos, data, smsbuffer[180];
037char *p, *PhoneMessage[7] = {"+79*********", "ATD#100#;", "3BOHOK!!!", "KYXHA!!!", "KOMHATA!!!", "BXOD!!!", ""};
038 
039DHT dht(DHTPIN, DHTTYPE); //установки DHT22
040char *tmp;
041float t;
042 
043void setup() {
044  Serial.begin(9600);
045  RemoteReceiver::init(0, 3, showCode);
046  mySwitch.enableReceive(1);
047  pinMode(inputA, INPUT);
048  pinMode(inputB, INPUT);
049  pinMode(inputC, INPUT);
050  pinMode(inputD, INPUT);
051  dht.begin();
052  pinMode(led, OUTPUT);
053  pinMode(Relay, OUTPUT);
054  pinMode(pirPin, INPUT);
055  pinMode(Siren, OUTPUT);
056  digitalWrite(pirPin, LOW);
057  digitalWrite(Relay, HIGH);
058  for(int i = 0; i < calibrationTime; i++){} 
059  if (gsm.begin(2400)){               
060      started=true;
061    }   
062}
063 
064//////////////////////Функция приема с дверного звонка////////////////
065void showCode(unsigned long receivedCode, unsigned int period) {    //
066  if (receivedCode == 500904)                                       //
067      Value = 2;                                                    //                                              
068}                                                                   //
069//////////////////////////////////////////////////////////////////////
070 
071///////////////////////////////////Функция отправки СМС////////////////////////////////////  
072void ReadSendSMS (char* phone, char* msg, byte st){                                      //
073  if(st == 1){                                                                           //
074  sms.SendSMS(phone, msg);                                                               //
075  Value = 0;                                                                             //
076  }                                                                                      //    
077}                                                                                        //                                          
078///////////////////////////////////////////////////////////////////////////////////////////
079 
080 
081void loop() {
082   
083  readStateA = digitalRead(inputA);
084  readStateB = digitalRead(inputB);
085  readStateC = digitalRead(inputC);
086  readStateD = digitalRead(inputD);
087 
088//////////Управление с брелка////////
089  if (readStateA == HIGH){ //ВКЛ.  //
090      Alarm = true;                //
091      started = true;              //
092      Value = 1;                   //
093      delay (2000);                //
094  } else if (readStateB == HIGH){  //
095      Value = 7;  //ВЫКЛ.          //
096         }                         //
097/////////////////////////////////////
098       
099/////////////Считывание с беспроводных датчиков////////////////
100  if (mySwitch.available()){                                 //
101      if(mySwitch.getReceivedValue() == 9290441) {           //
102          delay(2000);                                       //
103          Value = 3;                                         //
104          mySwitch.resetAvailable();                         //
105       } else if(mySwitch.getReceivedValue() == 12901577) {  //
106                  delay(2000);                               //
107                  Value = 4;                                 //
108                  mySwitch.resetAvailable();                 //  
109               }                                             //
110  }                                                          //
111///////////////////////////////////////////////////////////////
112     
113 
114/////////////////////////Выполнение команд/////////////////////////
115  if (Alarm && started){                                         //                                                                                                                                    //
116      digitalWrite(led, HIGH); //дежурный сигнал                 //
117      delay(700);                                                //
118      digitalWrite(led, LOW);                                    //
119      delay(700);                                                //
120///////////////////Прием с датчика на улице/////////////////     //
121  if(digitalRead(pirPin) == HIGH){                        //     //                         
122     Value = 5;                                           //     // 
123     takeLowTime = true;                                  //     //
124     } else if (digitalRead(pirPin) == LOW) {             //     //
125               if(takeLowTime){                           //     // 
126                  lowIn = millis();                       //     // 
127                  takeLowTime = false;                    //     // 
128                  Value = 0;                              //     // 
129               }                                          //     // 
130               if(!lockLow && millis() - lowIn > pause){  //     //
131                 lockLow = true;                          //     // 
132                 delay(50);                               //     // 
133               }                                          //     // 
134            }                                             //     //
135////////////////////////////////////////////////////////////     //
136                                                                 //
137      switch(Value){                                             //
138         case 1://ВКЛ.                                           //
139               digitalWrite(Relay, LOW);                         //
140               digitalWrite(Siren, HIGH);                        //
141               delay(170);                                       //
142               digitalWrite(Relay, LOW);                         //
143               digitalWrite(Siren, LOW);                         //
144               delay(150);                                       //
145               digitalWrite(Relay, LOW);                         //
146               digitalWrite(Siren, HIGH);                        //
147               delay(150);                                       //
148               digitalWrite(Relay, LOW);                         //
149               digitalWrite(Siren, LOW);                         //
150               delay(2000);                                      //
151               digitalWrite(Relay, HIGH);                        //
152               Value = 0;                                        //
153               break;                                            //
154         case 2://дверной звонок                                 //
155               ReadSendSMS(PhoneMessage[0], PhoneMessage[2], 1); //   
156               break;                                            //
157         case 3://кухня                                          //   
158               ReadSendSMS(PhoneMessage[0], PhoneMessage[3], 1); //
159               break;                                            //
160         case 4://комната                                        //  
161               ReadSendSMS(PhoneMessage[0], PhoneMessage[4], 1); //
162               break;                                            //
163         case 5: //вход                                          //
164               ReadSendSMS(PhoneMessage[0], PhoneMessage[5], 1); //
165               digitalWrite(Relay, LOW);                         //
166               delay(1000);                                      //
167               digitalWrite(Siren, HIGH);                        //
168               digitalWrite(Relay, LOW);                         //
169               delay(4000);                                      //
170               digitalWrite(Siren, LOW);                         //   
171               digitalWrite(Relay, LOW);                         //
172               delay(10000);                                     //
173               digitalWrite(Relay, HIGH);                        //
174               break;                                            //
175         case 6://баланс и температура                           //
176                ///????????????????????                          //               
177               break;                                            //
178         case 7://ВЫКЛ.                                          //
179               digitalWrite(Relay, LOW);                         //
180               digitalWrite(Siren, HIGH);                        //
181               delay(150);                                       //
182               digitalWrite(Relay, LOW);                         //
183               digitalWrite(Siren, LOW);                         //
184               delay(1000);                                      //
185               digitalWrite(Relay, HIGH);                        //
186               started = false;                                  //
187               Alarm = false;                                    //
188               break;                                            // 
189          }                                                      //
190  } else {                                                       //
191           digitalWrite(led, HIGH);                              //
192         }                                                       //
193///////////////////////////////////////////////////////////////////
194 
195///////////////////Чтение входящих СМС//////////////////////    
196/*if (Alarm && started && Value == 0){                                             
197    pos = sms.IsSMSPresent(SMS_UNREAD);                         
198    if(pos > 0){                                        
199       sms.GetSMS(pos,PhoneMessage[0],smsbuffer,180);                                               
200       p = strstr(smsbuffer,"tmp");                                                        
201}
202*/                                                          
203 
204//////////Управление фонарем над дверью/////////
205  if (!Alarm){                                //
206      if (readStateC == HIGH){                //           
207          digitalWrite(Relay, LOW);           //
208      } else if (readStateD == HIGH){         //
209                  digitalWrite(Relay, HIGH);  //
210              }                               //
211  }                                           //              
212////////////////////////////////////////////////              
213      
214}

 

 

 

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"., пробовал залить вот такой пример но ответа нет:

01HardwareSerial & mySerial = Serial;
02 
03void setup() 
04{
05  Serial.begin(9600);
06  mySerial.begin(9600);
07  //Serial.println("AT");
08  mySerial.println("AT+CSQ");
09}
10 
11void loop()
12{
13  if (mySerial.available())
14    Serial.write(mySerial.read());
15  if (Serial.available())
16    mySerial.write(Serial.read());
17}

 

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 (-) модема и контроллера соединить, а то про это постоянно забывают.