Примитивная GSM сигнализация на NEOWAY M590 и Arduino

Примитивная и автономная GSM сигнализация с использованием GSM\GPRS модемом NEOWAY M590 и Arduino, ниже схема подключения и код из видео

Итог этого проекта >> тут <<.

Как все подключено:

Без имени-2

И я таки дописал работу с энергосбережением, старый код в самом низу под спойлером. Для работы со «sleep mode» используется библиотека LowPower.h, взять её можно на гитхабе или скачать с сайта. Она в цикле выключает ардуину на 8 секунд.

Также не забываем что с платы должны быть удален (выключен) светодиод питания, он потребляет ~10мА, что сравнимо с потреблением микроконтроллера. Лучше не использовать платы UNO, nano или другие с интерфейсом USB, USB-TTL конвертер также потребляет электричество, а выключить мы его не можем, лучше использовать микроконтроллер с минимальной обвязкой или версию pro mini, купить GSM модем можно тут.

Код:

тут.
#include <LowPower.h>

#include <SoftwareSerial.h>
SoftwareSerial gsm(7, 8); // RX, TX
//#define gsm Serial1

#define LED 13
#define pinBOOT 5                                     // нога BOOT или K на модеме 
#define wakeUpPin 2                                   /// нога на растяжку  
#define TELLNUMBER "ATD+70001112233;"                 // номер на который будем звонить

boolean flag = 0;
 

void modemOFF(){
  digitalWrite(pinBOOT, HIGH);
  delay(10);
  gsm.println("AT+CPWROFF");
}

void modemON(){
  digitalWrite(pinBOOT, LOW);
  delay(10);
  while(!gsm.find("+PBREADY")); 
}

 

void setup(){  
  Serial.begin(9600);
  gsm.begin(9600);                     /// незабываем указать скорость работы UART модема
  Serial.println("ard_start");
  
  pinMode(LED, OUTPUT);
  pinMode(pinBOOT, OUTPUT);               /// нога BOOT на модеме
  pinMode(wakeUpPin, INPUT_PULLUP);       /// нога на растяжку
  
  digitalWrite(pinBOOT, LOW);          /// включаем модем, для проверки.
                                       /// !!! при подачи питания, нужно надавить на ресет ардуины,
                                       /// !!! модем при включении может просадить питание и ардуина не стартанет 
  while(!gsm.find("+PBREADY"));        /// при включении ждем готовность модема 
  
  gsm.println("ATE0");                // выключаем эхо
  
  Serial.println("modemOFF");
  modemOFF();                          /// и выключаем модем

   
}

void loop() { 
  
    // выключаем ардуину на 8 сек
  LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
    
  
  digitalWrite(LED, HIGH);                         /// можно закомментировать, показываем что не висим.
  delay(25);               
  digitalWrite(LED, LOW);     
    /////////////
  if (digitalRead(wakeUpPin) && flag == 0){       /// проверяем и если оборвали растяжку 
 
    modemON();                  /// включаем модема
    while(1){                   // ждем подключение модема к сети
        gsm.println("AT+COPS?");
        if (gsm.find("+COPS: 0")) break;
        delay(500);  
    }
    delay(100);
    /////////////////////// звоним по указаному номеру
    gsm.println(TELLNUMBER); 
    delay(100);
    if (gsm.find("OK")) Serial.println("ATD+OK!");
    
    while(1){             // проверяем готовность модема, ждем сброс вызова
        gsm.println("AT+CPAS");
        if (gsm.find("0")) break;
        delay(100);  
    }

 
    delay(10000);
    Serial.println("FULL_OFF!");
    
    modemOFF();                           /// выключаем модем,  
    flag = 1;                             /// останавливаем прогу   
                                           
  }
}

 //////


Первая версия кода, без энергосбережения
#include <SoftwareSerial.h>

SoftwareSerial gsm(7, 8); // RX, TX

void modemOFF(){
  digitalWrite(5, HIGH);
  delay(10);
  gsm.println("AT+CPWROFF");
}

void modemON(){
  digitalWrite(5, LOW);
  delay(10);
  while(!gsm.find("+PBREADY")); 
}

void setup(){  
  Serial.begin(9600);
  gsm.begin(115200);             /// незабываем указать скорость работы UART модема
  
  pinMode(5, OUTPUT);           /// нога BOOT на модеме
  pinMode(2, INPUT_PULLUP);     /// нога на растяжку
  
  digitalWrite(5, LOW);         /// включаем модем, для проверки.
                                /// !!! при подачи питания, нужно надавить на ресет ардуины,
                                /// !!! модем при включении может просадить питание и ардуина не стартанет 
  while(!gsm.find("+PBREADY")); /// при включении ждем готовность модема 
  modemOFF();                   /// и выключаем модем
}

void loop() {
  if (digitalRead(2)){          /// если оборвали растяжку
    modemON();                  /// включаем модема
    while(1){                   // ждем подключение модема к сети
        gsm.println("AT+COPS?");
        if (gsm.find("0")) break;
        delay(500);  
    }
    /////////////////////// звоним по указаному номеру
    gsm.println("ATD+79991112233;"); 
    delay(100);
    if (gsm.find("OK")) Serial.println("ATD+OK!");
    while(1){             // проверяем готовность модема, ждем сброс вызова
        gsm.println("AT+CPAS");
        if (gsm.find("0")) break;
        delay(100);  
    }


    
    /////////////////// и\или отправляем SMS
/*      gsm.println("AT+CMGF=1");        delay(100);      gsm.println("AT+CSCS=\"GSM\"");         delay(100);    gsm.println("AT+CMGS=\"79991112233\""); // даем команду на отправку смс    delay(100);    gsm.print("111");             // отправляем текст     gsm.print((char)26);          // символ завершающий передачу    Serial.println("SMS ok");      delay(100);   while(1){             // проверяем готовность модема        gsm.println("AT+CPAS");        if (gsm.find("0")) break;        delay(100);      } */   

    delay(10000);
    Serial.println("FULL_OFF!");
    
    modemOFF();                           /// выключаем модем,  
    while(1);                             /// останавливаем прогу   
  }
  
  if (gsm.available())
    Serial.write(gsm.read());
  if (Serial.available())
    gsm.write(Serial.read());
}

///+PBREADY


 


.