Тема: Arduino + GSM
Показать сообщение отдельно
Старый 14.02.2017, 18:55   #9
skanch
Модератор
 
Аватар для skanch
 
Регистрация: 19.01.2010
Возраст: 58
Город: Санкт-Петербург
Регион: 78, 98
Сообщений: 2,608
skanch has a brilliant futureskanch has a brilliant futureskanch has a brilliant futureskanch has a brilliant futureskanch has a brilliant futureskanch has a brilliant futureskanch has a brilliant futureskanch has a brilliant futureskanch has a brilliant futureskanch has a brilliant futureskanch has a brilliant future
По умолчанию

Цитата:
Сообщение от Xellow Посмотреть сообщение
Никто не делал что то подобное? Или может в интернете натыкался?
Модуль 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 "";


Программки давнишние - уже не помню, что у самого залито... Но точно рабочие. Вот несколько ссылок на соответствующие темы. Здесь, здесь, здесь, еще.
Миниатюры
Нажмите на изображение для увеличения
Название: SIM1.jpg
Просмотров: 523
Размер:	449.7 Кб
ID:	46780  

Последний раз редактировалось admin; 20.03.2017 в 02:43.
skanch вне форума   Ответить с цитированием