PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   Модемы GSM (http://pccar.ru/forumdisplay.php?f=168)
-   -   Arduino + GSM (http://pccar.ru/showthread.php?t=25719)

Xellow 12.02.2017 23:58

Arduino + GSM
 
Добрый вечер всем. Появилась навязчивая мысль, сделать некое устройство на базе Arduino + GSM модуля SIM 800L, которое будет в состоянии по звонку или СМС запросу, выполнять команды(запуск авто, пуск ПК), а так же сообщать в ответных СМС различную информацию, типа - напряжение АКБ, температура авто, удачный/неудачный пуск двигателя и т.д. И плюс использовать возможности перехода в режим энергосбережения Arduino и SIM 800L.
Сейчас уже использую связку Arduino + GSM устройство на базе GSM розетки Мегафона, для автозапуска, но не нравится энергопотребление этого "бутерброда" и не возможность добавлять свои команды и свои СМС в этом варианте.
Никто не делал что то подобное? Или может в интернете натыкался?

YAM1966 13.02.2017 12:10

Ну тогда почитайте это для начала.... или аналогичное.

awtoap 13.02.2017 12:46

Цитата:

Ну тогда почитайте это для начала.... или аналогичное.
И каким боком это к вопросу автора? GPS и GSM не одно и тоже )

Xellow 13.02.2017 12:53

Цитата:

Сообщение от YAM1966 (Сообщение 382204)
Ну тогда почитайте это для начала.... или аналогичное.

То же, не очень понял к чему это))

lti1 13.02.2017 14:58

Есть более бюджетный вариант чем SIM 800, M590, спящем режиме потребляемый ток составляет 2,5-3 мА.

Xellow 13.02.2017 15:18

Железки уже заказал -отступать некуда))

YAM1966 13.02.2017 15:28

SIM800L в плане управления получше, так как ко всему прочему позволяет управляться с помощью DTMF команд с телефона. Да и меньше по габаритам.

lti1 13.02.2017 23:38

YAM1966, согласен. И цена не сильно то и отличается от M590.
Xellow, SIM800L и Arduino работа в режиме энергосбережения.

skanch 14.02.2017 18:55

Вложений: 1
Цитата:

Сообщение от Xellow (Сообщение 382189)
Никто не делал что то подобное? Или может в интернете натыкался?

Модуль SIM800L очень надежный, простой и не требует сложных манипуляций. Единственное требование- это к питанию - от 3.7В до 4.2В. Пользуюсь такими-очень доволен.Ниже несколько скетчей - может пригодятся.

Один с запросом баланса на СИМ и триггером включения канала по звонку.

PHP код:

#include <SoftwareSerial.h>
#include <Bounce.h>
String currStr "";
SoftwareSerial gprsSerial(23);
String nomber_Phone "";//Строка содержит номер телефона
Bounce bouncer Bounce(540); //создаем экземпляр класса Bounce для 5 вывода
//String currStr1 = "";//Строка содержит текущую строку, полученую от сим модуля.
char data;//Содержит символ полученый от сим модуля.
String str_1  ""number  ""// str_1 - сообщение, number - телефонный номер звонившего


 
void setup()
{
   
pinMode(9OUTPUT); //пин к которому подключен светодиод
  
pinMode(5INPUT_PULLUP);   //переключаем 5 вывод в режим входа (от SIM модуля)
  
Serial.begin(9600);
  
gprsSerial.begin(9600);
  
//   Настраиваем приём сообщений 
  //   Между командами даём время на их обработку

  
gprsSerial.println("AT");
  
delay(500);
  
Serial.println("AT+CMGD=4");//Удаляем всё SMS которые могут содержаться на сим карте.  
   
gprsSerial.println("ATE0");                // выключаем эхо

  
delay(100);

   
gprsSerial.println("AT+CLIP=1");                // Включаем АОН

  
delay(100);

 
gprsSerial.println("AT+CSCS=\"GSM\"");          // Режим кодировки текста = GSM (только англ.)

  
delay(100);

  
gprsSerial.println("AT+CNMI=2,2");              // Текст смс выводится в com-порт

  
delay(100);
  
gprsSerial.println("AT+CSQ");// Проверяем уровень сигнала
    
delay(800);

 
gprsSerial.println("AT+CMGF=1"); //устанавливает текстовый режим смс-сообщения
  
delay(300);

  
gprsSerial.println("AT+IFC=1,1"); //устанавливает программный контроль потоком передачи данных 
  
delay(300);

  
gprsSerial.print("AT+CPBS=");//открывает доступ к данным телефонной книги
  
gprsSerial.print((char)34);
  
gprsSerial.print("SM"); // SIM-карты
  
gprsSerial.print((char)34);
  
gprsSerial.println("");
  
//    gprsSerial.print((char)13);
  
delay(300);

  
gprsSerial.println("AT+CNMI=1,2,2,1,0");//включает оповещение о новых сообщениях, 
  //новые сообщения приходят в следующем формате:
  // +CMT: "<номер телефона>", "", "<дата, время>", 
  //а на следующей строчке с первого символа идёт содержимое сообщения
  
delay(300);
 
balance();
 
}


void loop()
{
{
if (
Serial.available())
  
gprsSerial.write(Serial.read());
  
// если поступил звонок
  
if (bouncer.update())
  {   
    if (
bouncer.read()==0)
    {
    
digitalWrite(9HIGH); //включить светодиод
    
gprsSerial.println("ATD +7981*******;");   //показать номер номер телефона
    
delay(15000);
    
gprsSerial.println("ATH0");
    
digitalWrite(9LOW);   //выключить светодиод 
    
}  
  } 
    if (
gprsSerial.available()) // если пришло что то от GSM модуля, то вызываем обработчик
  
{
    
response_on_dial();
  }
}



//++++Запрос баланса+++//
{
  if (
gprsSerial.available()){
    
char currSymb gprsSerial.read();
    if (
'\r' == currSymb) {  //если символ перевод каретки
      
if  (currStr.startsWith("+CUSD: 0,")) {
        
int zzz currStr.indexOf("UAH");
        
String balance=currStr.substring(10,zzz-3); //баланс на сим карте
        
Serial.print(balance);
        
smsSendAlarmcurrStr);
      }
      
currStr "";
    } 
    else if (
'\n' != currSymb) { //если символ НЕ новая строка
      
currStr += String(currSymb);
    }          
  }
}
}
//процедура отправки СМС
void smsSendAlarm(String text
{
    
String NBoss "7981*******"// вместо звездочек вписать номер телефона
    
gprsSerial.println("AT+CMGS=\"" NBoss "\"");  //Отправляем на GSM комманду отправка смс-номер
    
NBoss "";                                //Очищаем перемунную
    
delay(300);                                //Делаем задержку на передачу комманды
    
gprsSerial.print(text);                           //Отправляем на GSM комманду отправка смс-текст
    
text "";                                 //Очищаем перемунную
    
delay(500);                                //Делаем задержку на передачу комманды
   
gprsSerial.print((char)26);                       //Отправляем на GSM комманду отправка смс!
    
delay(5000);                               //Делаем задержку отправку смс
    
}
void balance () {

gprsSerial.print("AT+CUSD=1,");
gprsSerial.print('"');
gprsSerial.print("#100#");
gprsSerial.println('"');

}

// Обработчик входящего вызова 
void response_on_dial()
{
  
delay(500);
  while (
gprsSerial.available())
  {
    
char c  gprsSerial.read();
    
Serial.write(c);
    
str_1  +=  c// загоняем в str_1 сообщение от модуля
  
}
  
// Находим в строке "+7981" и выдёргиваем из строки номер телефона
  
if (str_1.startsWith("RING"2))
  {
    
int index_number str_1.lastIndexOf("+7981");
    if (
index_number != -1)
    {
      
number  str_1.substring(index_number, (index_number 13));
      
// Пришел вызов в номера "number", далее пишем, что делаем
      
String str_2  "Ring!!!"  number;
      
Serial.println(str_2);
      
delay(3000);
      
gprsSerial.println("ATH0"); // сбрасываем вызов АТ-командой "АТН"
     
    
if(digitalRead(9) == LOW
     {
Serial.println("Led ON");
    
digitalWrite(9,HIGH); // инвертируем выход led
     
     
}
    else 
    {
    
digitalWrite(9,LOW);
    
Serial.println("Led OFF");
    }
    }
  }
  
str_1 "";


Второй просто триггер.

PHP код:

#include <SoftwareSerial.h>
//#include <EEPROM.h>
#include <Bounce.h>
String nomber_Phone "";//Строка содержит номер телефона. далее Разрешенный номер. 
SoftwareSerial mySerial(23); // RX, TX  +,0,3,2,- (3-3, 2-2)
Bounce bouncer Bounce(540); //создаем экземпляр класса Bounce для 5 вывода
String currStr "";//Строка содержит текущую строку, полученую от сим модуля.
char data;//Содержит символ полученый от сим модуля.
String str_1  ""number  ""// str_1 - сообщение, number - телефонный номер звонившего
 
 
void setup() 
 { 
  
pinMode(9OUTPUT);
  
pinMode(5INPUT_PULLUP);   //переключаем 5 вывод в режим входа
  //digitalWrite(5, HIGH);  //включаем на нем подтягивающий резистор  
  
pinMode(13OUTPUT); 
  
Serial.begin(19200);  //Скорость порта для связи Arduino с компьютером
  //Serial.println("Goodnight moon!");
  
mySerial.begin(19200);  //Скорость порта для связи Arduino с GSM модулем
  
mySerial.println("AT");
  
delay(500);
  
Serial.println("AT+CMGD=4");//Удаляем всё SMS которые могут содержаться на сим карте.  
  
mySerial.println("ATE0");                // выключаем эхо

  
delay(100);

  
mySerial.println("AT+CLIP=1");                // Включаем АОН

  
delay(100);

  
mySerial.println("AT+CMGF=1");                // Формат СМС = ASCII текст

  
delay(100);

 
mySerial.println("AT+CSCS=\"GSM\"");          // Режим кодировки текста = GSM (только англ.)

  
delay(100);

  
mySerial.println("AT+CNMI=2,2");              // Текст смс выводится в com-порт

  
delay(100);
 
mySerial.println("AT+CSQ");// Проверяем уровень сигнала
    
delay(800);
  
  
  
  
 
 
void loop() 
{
  if (
Serial.available())
  
mySerial.write(Serial.read());
  if (
bouncer.update())
  {   
    if (
bouncer.read()==0)
    {
    
digitalWrite(9HIGH);
    
mySerial.println("ATD +7981*******;");   //т
    
delay(15000);
    
mySerial.println("ATH0");
    
digitalWrite(9LOW);    
    }  
  } 
    if (
mySerial.available()) // если пришло что то от GSM модуля, то вызываем обработчик
  
{
    
response_on_dial();
  }
}
// Обработчик входящего вызова 
void response_on_dial()
{
  
delay(500);
  while (
mySerial.available())
  {
    
char c  mySerial.read();
    
Serial.write(c);
    
str_1  +=  c// загоняем в str_1 сообщение от модуля
  
}
  
// Находим в строке "+7981" и выдёргиваем из строки номер телефона
  
if (str_1.startsWith("RING"2))
  {
    
int index_number str_1.lastIndexOf("+7981");
    if (
index_number != -1)
    {
      
number  str_1.substring(index_number, (index_number 13));
      
// Пришел вызов в номера "number", далее пишем, что делаем
      
String str_2  "Ring!!!"  number;
      
Serial.println(str_2);
      
delay(3000);
      
mySerial.println("ATH0"); // сбрасываем вызов АТ-командой "АТН"
     
    
if(digitalRead(9) == LOW
     {
Serial.println("Led ON");
    
digitalWrite(9,HIGH); // инвертируем выход led
     
}
    else 
    {
    
digitalWrite(9,LOW);
    
Serial.println("Led OFF");
    }
    }
  }
  
str_1 "";



Программки давнишние - уже не помню, что у самого залито... Но точно рабочие. Вот несколько ссылок на соответствующие темы. Здесь, здесь, здесь, еще.

skanch 14.02.2017 20:02

Наткнулся в интернете - можно "прикрутить" под свои нужды.


Часовой пояс GMT +4, время: 05:02.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot