GSM сигналка c установкой по звонку M590E GSM GPRS Модул

bester
Offline
Зарегистрирован: 25.06.2016

Здравствуйте. Помогите пожалуйста прикрутить к скечу датчик движения HC-SR505? Пробовал подключать его к цифровому выходу, но сразу после загрузки скетча происходил дозвон на телефон. В скетче менял аналоговый выход на цыфровой.

/// GSM сигналка c установкой по звонку
/// датчиком на прерывателях


#include <EEPROM.h>

//// как подключен модем?
//#include <SoftwareSerial.h>                 // если программный
//SoftwareSerial gsm(7, 8); // RX, TX
#define gsm Serial                           // если аппаратный в UNO
//#define gsm Serial1                          // если аппаратный в леонардо

#define LED 6

#define TELLNUMBER "ATD+79089000682;"                 // номен на который будем звонить
#define SMSNUMBER "AT+CMGS=\"79089000682\""           // номер на который будем отправлять SMS
#define TELMODE "79089000682"                         // номер для установки на охрану

#define SH1 A2              // шлейыф
//#define SH2 A3

#define pinBOOT 5           // нога BOOT или K на модеме 

byte mode = 0;              // 0 - только включили
                            // 1 - установлена охрана
                            // 2 - снята с охраны
                            // при добавлении не забываем посмотреть на 41 строку


void setup() {
  delay(3000);                    //// !! чтобы нечего не повисало при включении
  
  gsm.begin(9600);                         /// незабываем указать скорость работы UART модема
//  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(pinBOOT, OUTPUT);                /// нога BOOT на модеме
  pinMode(SH1, INPUT_PULLUP);              /// нога на растяжку
//  pinMode(SH2, INPUT_PULLUP);              /// нога на растяжку

                                          // читаем режим из еепром
  mode = EEPROM.read(0);
  if (mode > 2) mode = 2;                 // проверяем значение в еепром 
                                      // занимаемся модемом        
  delay(1000);                            
  digitalWrite(LED, HIGH);                // на время включаем лед  
  digitalWrite(pinBOOT, LOW);             /// включаем модем 
 
      // нужно дождатся включения модема и соединения с сетью
  delay(2000);    
//  while(gsm.find("STARTUP"));          /// ждем команды от модема  
  gsm.println("ATE0");                  // выключаем эхо  
  
  while(1){                             // ждем подключение модема к сети
        gsm.println("AT+COPS?");
        if (gsm.find("+COPS: 0")) break;
           digitalWrite(LED, LOW);               // блымаем светодиодом
           delay(50);  
           digitalWrite(LED, HIGH);  
           delay(500); 
    }

//Serial.println("Modem OK"); 
   digitalWrite(LED, LOW);               // блымаем светодиодом
   delay(1500);  
   digitalWrite(LED, HIGH);
   delay(250); 
   digitalWrite(LED, LOW);   
  
}

void loop() {
  
  if (mode == 1){                         // если в режиме охраны
                                          // проверяем датчики
    if (digitalRead(SH1)){                // если обрыв
                                          // отзваниваемся
        gsm.println(TELLNUMBER); 
        delay(2500);                       
          if (gsm.find("NO CARRIER")){      // ищим сброс вызова,  
                                            // снимаем охранку
              mode = 2;
              EEPROM.write(0, mode);
          }
    }
  }

  
  // если охрана снята
  if (mode == 2){
    if (digitalRead(SH1)){  // проверяем датчики, включаем LED
      digitalWrite(LED, HIGH);    
    }
    else digitalWrite(LED, LOW);
  }

  
 // ищим RING
   // если нашли, опрашиваем кто это и ставим на охрану
    if(gsm.find("RING")){                    // если нашли RING
      gsm.println("AT+CLIP=1");              // включаем АОН, 
            
      while(1){                              // в цикле
       if (gsm.find(TELMODE)){               // ищим номер телефона, если нашли
         mode = 1;                           // меняем режим  
         EEPROM.write(0, mode);              // пишим его в еепром
         break;                              // и выходим
       }  
       else{                                 // иначе 
         gsm.println("AT+CPAS");             // спрашиваем состояние модема   
         delay(100);
         if (gsm.find("+CPAS: 0")) break;    // и если он в "готовности", выходим из цикла
       }                                     // если звонок в процессе, возвращает +CPAS: 3
      }                                      // и крутимся дальше
       
        gsm.println("AT+CLIP=0");            // выключаем АОН, 
        delay(500);
        gsm.println("ATH0");                 // сбрасываем вызов 

         digitalWrite(LED, LOW);             // сигнализируем об этом
         delay(500);  
         digitalWrite(LED, HIGH);
         delay(250); 
         digitalWrite(LED, LOW);   
   
    } 
    
}

 

Araris
Offline
Зарегистрирован: 09.11.2012

bester пишет:

но сразу после загрузки скетча происходил дозвон на телефон. В скетче менял аналоговый выход на цыфровой.

1. В то место скетча, где принимается решение начать дозвон, добавьте условие

&& millis() > 60000 // то есть, например, в первую минуту после начала работы не звонить.

2. Аналоговый, или цифровой - в данном случае не имеет значения,.

bester
Offline
Зарегистрирован: 25.06.2016

Возможно  и даже наверняка, я кусок вашего кода не в то место вставляю, после загрузки совершается сразу дозвон.

void loop() {
  
  if (mode == 1){                         // если в режиме охраны
                                          // проверяем датчики
    if (digitalRead(SH1) && millis() > 60000){                // если обрыв
                                          // отзваниваемся
        gsm.println(TELLNUMBER); 
        delay(2500);                       
          if (gsm.find("NO CARRIER")){      // ищим сброс вызова,  
                                            // снимаем охранку
              mode = 2;
              EEPROM.write(0, mode);
          }
    }
  }

И так тоже уже попробовал

void loop() {
  
  if (mode == 1&& millis() > 60000){                         // если в режиме охраны
                                          // проверяем датчики
    if (digitalRead(SH1)){                // если обрыв
                                          // отзваниваемся
        gsm.println(TELLNUMBER); 
        delay(2500);                       
          if (gsm.find("NO CARRIER")){      // ищим сброс вызова,  
                                            // снимаем охранку
              mode = 2;
              EEPROM.write(0, mode);
          }
    }
  }

 

sls
Offline
Зарегистрирован: 30.05.2016

с модулями типа m590 я бы все-таки подождал от модуля +PBREADY, раз уж есть нога, ответственная за включение и выключение оного (pinboot), прежде чем начинать его пытать.

bester
Offline
Зарегистрирован: 25.06.2016

Увеличил задержку для включения модуля до 1 минуты

 digitalWrite(LED, HIGH);                // на время включаем лед  
  digitalWrite(pinBOOT, LOW);             /// включаем модем 
 
      // нужно дождатся включения модема и соединения с сетью
  delay(60000);    
//  while(gsm.find("STARTUP"));          /// ждем команды от модема  
  gsm.println("ATE0");                  // выключаем эхо  

Все равно, после постановки на охрану модуль сразу же отзванивается

sls
Offline
Зарегистрирован: 30.05.2016

bester, второй строкой Вы включили модем и просто ждете 60 секунд, да еще и с помощью delay()

хотя бы просто АТ ему скормите да проверьте, ответил он "OK" или занят какими-то своими делами

bester
Offline
Зарегистрирован: 25.06.2016

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

Без постановки на охрану, датчик работает(когда замечено движение светодиод загорается)

sls
Offline
Зарегистрирован: 30.05.2016

а есть необходимость именно аналоговый вывод садить на контроль шлейфа, цифровых ног недостаточно?

кстати в даташите на датчик тоже указано, что подключать его нужно на цифровой вход

 

 

bester
Offline
Зарегистрирован: 25.06.2016

Ну можно конечно и на цифровые, дело то не в этом, при замене шлейфа на датчик движения при постановке на охрану она сразу же срабатывает и отзванивается

sls
Offline
Зарегистрирован: 30.05.2016

в даташите, на датчик есть пример его правильного подключения - цифровой вход должен иметь низкий уровень, а Вы его присоединяете к ноге, которую сделали input_pullup

void setup() {
Serial.begin(9600);
pinMode(6,INPUT);
digitalWrite(6,LOW);
}

void loop() {

if(digitalRead(6)==HIGH) {
Serial.println("Somebody is here.");

}

else {
Serial.println("Nobody.");

}

delay(1000);

}

строка 3 примера - ногу 6 делаем входом

строка 4 - выставляем на ней низкий уровень

9 - если на входе появляется высокий уровень

10 - значит супостат тут

 

bester
Offline
Зарегистрирован: 25.06.2016


Сделал так, все равно после постановки на охрану модуль сразу начинает отзваниваться. Строки 37,38,76


/// GSM сигналка c установкой по звонку
/// датчиком на прерывателях


#include <EEPROM.h>

//// как подключен модем?
//#include <SoftwareSerial.h>                 // если программный
//SoftwareSerial gsm(7, 8); // RX, TX
#define gsm Serial                           // если аппаратный в UNO
//#define gsm Serial1                          // если аппаратный в леонардо

#define LED 6

#define TELLNUMBER "ATD+79089000682;"                 // номен на который будем звонить
#define SMSNUMBER "AT+CMGS=\"79089000682\""           // номер на который будем отправлять SMS
#define TELMODE "79089000682"                         // номер для установки на охрану

#define SH1 7              // шлейыф
//#define SH2 A3

#define pinBOOT 5           // нога BOOT или K на модеме 

byte mode = 0;              // 0 - только включили
                            // 1 - установлена охрана
                            // 2 - снята с охраны
                            // при добавлении не забываем посмотреть на 41 строку


void setup() {
  delay(3000);                    //// !! чтобы нечего не повисало при включении
  
  gsm.begin(9600);                         /// незабываем указать скорость работы UART модема
//  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(pinBOOT, OUTPUT);                /// нога BOOT на модеме
  pinMode(SH1, INPUT);  /// нога на растяжку
  digitalWrite(SH1,LOW);
//  pinMode(SH2, INPUT_PULLUP);              /// нога на растяжку

                                          // читаем режим из еепром
  mode = EEPROM.read(0);
  if (mode > 2) mode = 2;                 // проверяем значение в еепром 
                                      // занимаемся модемом        
  delay(1000);                            
  digitalWrite(LED, HIGH);                // на время включаем лед  
  digitalWrite(pinBOOT, LOW);             /// включаем модем 
 
      // нужно дождатся включения модема и соединения с сетью
  delay(2000);    
//  while(gsm.find("STARTUP"));          /// ждем команды от модема  
  gsm.println("ATE0");                  // выключаем эхо  
  
  while(1){                             // ждем подключение модема к сети
        gsm.println("AT+COPS?");
        if (gsm.find("+COPS: 0")) break;
           digitalWrite(LED, LOW);               // блымаем светодиодом
           delay(50);  
           digitalWrite(LED, HIGH);  
           delay(500); 
    }

//Serial.println("Modem OK"); 
   digitalWrite(LED, LOW);               // блымаем светодиодом
   delay(1500);  
   digitalWrite(LED, HIGH);
   delay(250); 
   digitalWrite(LED, LOW);   
  
}

void loop() {
  
  if (mode == 1){                         // если в режиме охраны
                                          // проверяем датчики
    if (digitalRead(SH1)==HIGH){                // если обрыв
                                          // отзваниваемся
        gsm.println(TELLNUMBER); 
        delay(2500);                       
          if (gsm.find("NO CARRIER")){      // ищим сброс вызова,  
                                            // снимаем охранку
              mode = 2;
              EEPROM.write(0, mode);
          }
    }
  }

  
  // если охрана снята
  if (mode == 2){
    if (digitalRead(SH1)){  // проверяем датчики, включаем LED
      digitalWrite(LED, HIGH);    
    }
    else digitalWrite(LED, LOW);
  }

  
 // ищим RING
   // если нашли, опрашиваем кто это и ставим на охрану
    if(gsm.find("RING")){                    // если нашли RING
      gsm.println("AT+CLIP=1");              // включаем АОН, 
            
      while(1){                              // в цикле
       if (gsm.find(TELMODE)){               // ищим номер телефона, если нашли
         mode = 1;                           // меняем режим  
         EEPROM.write(0, mode);              // пишим его в еепром
         break;                              // и выходим
       }  
       else{                                 // иначе 
         gsm.println("AT+CPAS");             // спрашиваем состояние модема   
         delay(100);
         if (gsm.find("+CPAS: 0")) break;    // и если он в "готовности", выходим из цикла
       }                                     // если звонок в процессе, возвращает +CPAS: 3
      }                                      // и крутимся дальше
       
        gsm.println("AT+CLIP=0");            // выключаем АОН, 
        delay(500);
        gsm.println("ATH0");                 // сбрасываем вызов 

         digitalWrite(LED, LOW);             // сигнализируем об этом
         delay(500);  
         digitalWrite(LED, HIGH);
         delay(250); 
         digitalWrite(LED, LOW);   
   
    } 
    
}

sls
Offline
Зарегистрирован: 30.05.2016

а может все-таки перевесите m590 на softwareserial, чтобы иметь возможность в мониторе читать диагностику?

ну и, заодно, точка с запятой после номера в TELLNUMBER какую функцию сполняет?

 

bester
Offline
Зарегистрирован: 25.06.2016

На NANO к каким выходам тогда подключиться? Раскоментировал строки 

008
//#include <SoftwareSerial.h>                 // если программный
009
//SoftwareSerial gsm(7, 8); // RX, TX

 

sls
Offline
Зарегистрирован: 30.05.2016

раскомментируйте SoftwareSerial gsm(7,8); если на выводы 7 и 8 ничего не вешали

 

bester
Offline
Зарегистрирован: 25.06.2016
Modem OK
obriv
obriv
obriv

Сделал так, после постановки на охрану в терменалке пишет "obriv" и идет вызов на мой телефон. От куда там берется единица, понять не могу. После постановки на охрану наверное нужно какую то паузу сделать, но где и как не знаю

/// GSM сигналка c установкой по звонку
/// датчиком на прерывателях


#include <EEPROM.h>

//// как подключен модем?
#include <SoftwareSerial.h>                 // если программный
SoftwareSerial gsm(7, 8); // RX, TX
//#define gsm Serial                           // если аппаратный в UNO
//#define gsm Serial1                          // если аппаратный в леонардо

#define LED 4

#define TELLNUMBER "ATD+79089000682;"                 // номен на который будем звонить
#define SMSNUMBER "AT+CMGS=\"79089000682\""           // номер на который будем отправлять SMS
#define TELMODE "79089000682"                         // номер для установки на охрану

#define SH1 6              // шлейыф
//#define SH2 A3

#define pinBOOT 5           // нога BOOT или K на модеме 

byte mode = 0;              // 0 - только включили
                            // 1 - установлена охрана
                            // 2 - снята с охраны
                            // при добавлении не забываем посмотреть на 41 строку


void setup() {
  delay(3000);                    //// !! чтобы нечего не повисало при включении
  
  gsm.begin(9600);                         /// незабываем указать скорость работы UART модема
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(pinBOOT, OUTPUT);                /// нога BOOT на модеме
  pinMode(SH1, INPUT);  /// нога на растяжку
  digitalWrite(SH1,LOW);
//  pinMode(SH2, INPUT_PULLUP);              /// нога на растяжку

                                          // читаем режим из еепром
  mode = EEPROM.read(0);
  if (mode > 2) mode = 2;                 // проверяем значение в еепром 
                                      // занимаемся модемом        
  delay(1000);                            
  digitalWrite(LED, HIGH);                // на время включаем лед  
  digitalWrite(pinBOOT, LOW);             /// включаем модем 
 
      // нужно дождатся включения модема и соединения с сетью
  delay(2000);    
  while(gsm.find("STARTUP"));          /// ждем команды от модема  
  gsm.println("ATE0");                  // выключаем эхо  
  
  while(1){                             // ждем подключение модема к сети
        gsm.println("AT+COPS?");
        if (gsm.find("+COPS: 0")) break;
           digitalWrite(LED, LOW);               // блымаем светодиодом
           delay(50);  
           digitalWrite(LED, HIGH);  
           delay(500); 
    }

  Serial.println("Modem OK"); 
   digitalWrite(LED, LOW);               // блымаем светодиодом
   delay(1500);  
   digitalWrite(LED, HIGH);
   delay(250); 
   digitalWrite(LED, LOW);   
  
}

void loop() {
  
  if (mode == 1){                         // если в режиме охраны
    Serial.println("obriv");                                      // проверяем датчики
    if (digitalRead(SH1)==HIGH){                // если обрыв
                                          // отзваниваемся
        gsm.println(TELLNUMBER); 
        delay(2500);                       
          if (gsm.find("NO CARRIER")){      // ищим сброс вызова,  
                                            // снимаем охранку
              mode = 2;
              EEPROM.write(0, mode);
          }
    }
  }

  
  // если охрана снята
  if (mode == 2){
    if (digitalRead(SH1)){  // проверяем датчики, включаем LED
      digitalWrite(LED, HIGH);    
    }
    else digitalWrite(LED, LOW);
  }

  
 // ищим RING
   // если нашли, опрашиваем кто это и ставим на охрану
    if(gsm.find("RING")){                    // если нашли RING
      gsm.println("AT+CLIP=1");              // включаем АОН, 
            
      while(1){                              // в цикле
       if (gsm.find(TELMODE)){               // ищим номер телефона, если нашли
         mode = 1;                           // меняем режим  
         EEPROM.write(0, mode);              // пишим его в еепром
         break;                              // и выходим
       }  
       else{                                 // иначе 
         gsm.println("AT+CPAS");             // спрашиваем состояние модема   
         delay(100);
         if (gsm.find("+CPAS: 0")) break;    // и если он в "готовности", выходим из цикла
       }                                     // если звонок в процессе, возвращает +CPAS: 3
      }                                      // и крутимся дальше
       
        gsm.println("AT+CLIP=0");            // выключаем АОН, 
        delay(500);
        gsm.println("ATH0");                 // сбрасываем вызов 

         digitalWrite(LED, LOW);             // сигнализируем об этом
         delay(500);  
         digitalWrite(LED, HIGH);
         delay(250); 
         digitalWrite(LED, LOW);   
   
    } 
    
}

sls
Offline
Зарегистрирован: 30.05.2016

строки 75 и 76 местами поменяйте :)

сейчас у Вас выводится obriv, как только система стала на охрану, а не когда изменилось состояние входа

 

bester
Offline
Зарегистрирован: 25.06.2016

Поменял. Сразу после Modem OК пишет obriv

 

bester
Offline
Зарегистрирован: 25.06.2016

Может вход датчика к земле притянуть? не пыхнет? Датчик отцепил, все равно пишет obriv. Притянул через 10 ком-не помогло

sls
Offline
Зарегистрирован: 30.05.2016

а привесьте вместо датчика светодиод на +5в через резистор 300 Ом-1кОм, для наглядности

bester
Offline
Зарегистрирован: 25.06.2016

Он не загорается почему то. 0 нет я так понимаю на 6 контакте ардеины почему то. 0,67 вольта на нем. Прижал к земле через 10 кОм, диод загорелся, звонок приходит когда снимаю подтяжку. Заменяю диод на датчик, при постановке на охрану с модуля сразу происходит набор.

/// GSM сигналка c установкой по звонку
/// датчиком на прерывателях

// донат, https://money.yandex.ru/to/410012486954705

#include <EEPROM.h>

//// как подключен модем?
#include <SoftwareSerial.h>                 // если программный
SoftwareSerial gsm(7, 8); // RX, TX
//#define gsm Serial                           // если аппаратный в UNO
//#define gsm Serial1                          // если аппаратный в леонардо

#define LED 4

#define TELLNUMBER "ATD+79089000682;"                 // номен на который будем звонить
#define SMSNUMBER "AT+CMGS=\"79089000682\""           // номер на который будем отправлять SMS
#define TELMODE "79089000682"                         // номер для установки на охрану

#define SH1 6              // шлейыф
//#define SH2 A3

#define pinBOOT 5           // нога BOOT или K на модеме 

byte mode = 0;              // 0 - только включили

                            // 1 - установлена охрана
                            // 2 - снята с охраны
                            // при добавлении не забываем посмотреть на 41 строку


void setup() {
  delay(3000);                    //// !! чтобы нечего не повисало при включении
  
  gsm.begin(9600);                         /// незабываем указать скорость работы UART модема
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(pinBOOT, OUTPUT);                /// нога BOOT на модеме
  pinMode(SH1, INPUT);  /// нога на растяжку
  digitalWrite(SH1,LOW);
//  pinMode(SH2, INPUT_PULLUP);              /// нога на растяжку

                                          // читаем режим из еепром
  mode = EEPROM.read(0);
  if (mode > 2) mode = 2;                 // проверяем значение в еепром 
                                      // занимаемся модемом        
  delay(1000);                            
  digitalWrite(LED, HIGH);                // на время включаем лед  
  digitalWrite(pinBOOT, LOW);             /// включаем модем 
 
      // нужно дождатся включения модема и соединения с сетью
  delay(2000);    
  while(gsm.find("STARTUP"));          /// ждем команды от модема  
  gsm.println("ATE0");                  // выключаем эхо  
  
  while(1){                             // ждем подключение модема к сети
        gsm.println("AT+COPS?");
        if (gsm.find("+COPS: 0")) break;
           digitalWrite(LED, LOW);               // блымаем светодиодом
           delay(50);  
           digitalWrite(LED, HIGH);  
           delay(500); 
    }

  Serial.println("Modem OK"); 
   digitalWrite(LED, LOW);               // блымаем светодиодом
   delay(1500);  
   digitalWrite(LED, HIGH);
   delay(250); 
   digitalWrite(LED, LOW);   
  
}

void loop() {
  
  Serial.println("obriv");
  if (mode == 1){                         // если в режиме охраны
                                          // проверяем датчики
    if (digitalRead(SH1)==HIGH){                // если обрыв
                                          // отзваниваемся
        gsm.println(TELLNUMBER); 
        delay(2500);                       
          if (gsm.find("NO CARRIER")){      // ищим сброс вызова,  
                                            // снимаем охранку
              mode = 2;
              EEPROM.write(0, mode);
          }
    }
  }

  
  // если охрана снята
  if (mode == 2){
    if (digitalRead(SH1)){  // проверяем датчики, включаем LED
      digitalWrite(LED, HIGH);    
    }
    else digitalWrite(LED, LOW);
  }

  
 // ищим RING
   // если нашли, опрашиваем кто это и ставим на охрану
    if(gsm.find("RING")){                    // если нашли RING
      gsm.println("AT+CLIP=1");              // включаем АОН, 
            
      while(1){                              // в цикле
       if (gsm.find(TELMODE)){               // ищим номер телефона, если нашли
         mode = 1;                           // меняем режим  
         EEPROM.write(0, mode);              // пишим его в еепром
         break;                              // и выходим
       }  
       else{                                 // иначе 
         gsm.println("AT+CPAS");             // спрашиваем состояние модема   
         delay(100);
         if (gsm.find("+CPAS: 0")) break;    // и если он в "готовности", выходим из цикла
       }                                     // если звонок в процессе, возвращает +CPAS: 3
      }                                      // и крутимся дальше
       
        gsm.println("AT+CLIP=0");            // выключаем АОН, 
        delay(500);
        gsm.println("ATH0");                 // сбрасываем вызов 

         digitalWrite(LED, LOW);             // сигнализируем об этом
         delay(500);  
         digitalWrite(LED, HIGH);
         delay(250); 
         digitalWrite(LED, LOW);   
   
    } 
    
}

 

sls
Offline
Зарегистрирован: 30.05.2016

в принципе, 0.67В это нормально для логического 0

попробуйте датчик заменить на кнопку последовательно с 1-10к на +5В и сделайте паузу после инициализации модема, как советовал Araris

bester
Offline
Зарегистрирован: 25.06.2016

sls пишет:

и сделайте паузу после инициализации модема, как советовал Araris

&& millis() > 60000

Я не знаю, куда это нужно вставить.

Кнопку поставил, что с нажатой, что нет, в терминалку пишет "obriv"

Проблема пока не решена. Как подключить датчик движения к модулю GSM?