Примитивная 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;                             /// останавливаем прогу   
                                           
  }
}

 //////


 

Первая версия кода, без энергосбережения

 

.