Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/74: Рейтинг темы: голосов - 74, средняя оценка - 4.58
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
1

Реакция на входящие звонки. SIM800L

09.03.2016, 17:44. Просмотров 14738. Ответов 8
Метки нет (Все метки)

Здравствуйте, ктонибуть может подсказать:
Имеем: Arduino uno, SIM800l, светодиод(для примера).
Задача: по входящему звонку с конкретного номера светодиод должен включиться, по второму звонку с этого же номера выключиться.
Меня интересует конкретно вот этот момент, какой командой можно научить модем слать сигнал на Ардуино при входящем звонке? И возможно ли это вообще? Переводить мануал весом в 350 стр. ой как не хочется ради такой мелочи, может кто уже знает такое? Потому что я пока придумал только соединить контакт RING с ардуиной и таким образом узнавать о звонке, но это же всем костылям костылище
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.03.2016, 17:44
Ответы с готовыми решениями:

[SIP] Роутер не воспринимает входящие звонки
Здравствуйте. Помогите, пожалуйста, со следующей проблемой. Решил подключить sip-телефонию через...

Samsung Galaxy J2 не отвечает на входящие звонки
Доброго времени суток! Собственно, сабж. Смарт новый - неделя от роду. Не бился, в настройках...

Arduino + sim800l
Помогите с кодом для ардуино. Включение реле по звонку с sim800l. Все перепробовал, так ничего не...

Arduino sim800l
Ребята нашел хорошую рабочую статью, подредактировал под себя ну там что мне надо оставил то что не...

8
13 / 13 / 2
Регистрация: 11.08.2015
Сообщений: 39
11.03.2016, 06:58 2
Здравствуйте, много писать пока нет времени, под рукой есть код который в ответ на звонок от SIM900 скидывает звонок и отправляет звонившему СМС со значениями температуры и влажности с датчика. Если не сможете нужное вам извлечь из кода, пишите - попробуем разобраться
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <SoftwareSerial.h>
#include <DHT.h>
 
#define DHTPIN 4     // what pin we're connected to
 
#define DHTTYPE DHT11   // DHT 11 
DHT dht(DHTPIN, DHTTYPE);
SoftwareSerial softser(2, 3);
 
String str_1  = "", number  = "";
 
void setup() {
  Serial.begin(9600);
  softser.begin(9600);
  dht.begin();
}
 
void loop() {
  if (softser.available())
  {
    response_on_dial();
  }
}
 
void response_on_dial()
{
  delay(500);
  while (softser.available())
  {
    char c  = softser.read();
    str_1  +=  c;
  }
  // Находим в строке "+79" и выдёргиваем из строки номер телефона
  if (str_1.startsWith("RING", 2))
  {
    int index_number = str_1.lastIndexOf("+79");
    if (index_number != -1)
    {
      number  = str_1.substring(index_number, (index_number + 12));
      // Пришел вызов в номера "number", далее пишем, что делаем
      String str_2  = "Ring!!!   "  + number;
      Serial.println(str_2);
      delay(3000);
      softser.println("ATH");
      // Отправляем СМС
      String response_CMC = "AT+CMGS="" + number + """; 
      float h = dht.readHumidity();
      float t = dht.readTemperature();
      softser.println("AT");
      delay(1000);
      softser.println(response_CMC);
      delay(500);
      softser.print("Temperature ");
      softser.println(t);
      softser.print(" C   Humidity ");
      softser.print(h);
      softser.println(" %");
      delay(500);
      softser.println((char)26);
    }
  }
  str_1 = "";
}
2
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
14.03.2016, 12:58  [ТС] 3
Спасибо за пример, но пока ещё не разобрался полностью. Времени очень мало, только вчера смог посидеть поексперементировать. Пока безрезультатно
0
13 / 13 / 2
Регистрация: 11.08.2015
Сообщений: 39
14.03.2016, 17:30 4
Woland50, попробуйте этот код, работает на SIM900, возможно под SIM800 нужно будет допилить.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <SoftwareSerial.h>
 
#define led 13
 
SoftwareSerial softser(2, 3); // на softser вешаем GSM модуль
 
String str_1  = "", number  = ""; // str_1 - сообщение, number - телефонный номер звонившего
 
void setup() {
  pinMode(led,OUTPUT);
  Serial.begin(9600); // аппаратный UART используется для отладки, наблюдаем за сообщениями в мониторе порта
  softser.begin(9600);
 }
 
void loop() {
  if (softser.available()) // если пришло что то от GSM модуля, то вызываем обработчик
  {
    response_on_dial();
  }
}
 
// Обработчик входящего вызова 
void response_on_dial()
{
  delay(500);
  while (softser.available())
  {
    char c  = softser.read();
    str_1  +=  c; // загоняем в str_1 сообщение от модуля
  }
  // Находим в строке "+79" и выдёргиваем из строки номер телефона
  if (str_1.startsWith("RING", 2))
  {
    int index_number = str_1.lastIndexOf("+79");
    if (index_number != -1)
    {
      number  = str_1.substring(index_number, (index_number + 12));
      // Пришел вызов в номера "number", далее пишем, что делаем
      String str_2  = "Ring!!!   "  + number;
      Serial.println(str_2);
      delay(3000);
      softser.println("ATH"); // сбрасываем вызов АТ-командой "АТН"
    if(digitalRead(led) == LOW) digitalWrite(led,HIGH); // инвертируем выход led
    else digitalWrite(led,LOW);
    }
  }
  str_1 = "";
}
1
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
17.03.2016, 01:42  [ТС] 5
Дошли руки до модема, с этим кодом разобрался немного, большое спасибо, реакция есть. Дальше думаю уже смогу прикрутить на неё то что мне надо. Вот только возникла проблема: до вставки этого куска кода, я в мониторе писал команды и там же получал ответ со статусом выполнения (пример: AT -> OK), а теперь в лучшем случае появляется только первая буква А и ответа нет Вот мой скетч:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <SoftwareSerial.h>
//#include <EEPROM.h>
#include <Bounce.h>
String nomber_Phone = "";//Строка содержит номер телефона. далее Разрешенный номер. 
SoftwareSerial mySerial(2, 3); // RX, TX  +,0,3,2,- (3-3, 2-2)
Bounce bouncer = Bounce(14, 40); //создаем экземпляр класса Bounce для 2 вывода
String currStr = "";//Строка содержит текущую строку, полученую от сим модуля.
char data;//Содержит символ полученый от сим модуля.
String str_1  = "", number  = ""; // str_1 - сообщение, number - телефонный номер звонившего
 
 
void setup() 
 { 
  pinMode(13, OUTPUT);
  pinMode(14, INPUT);   //переключаем 2 вывод в режим входа
  digitalWrite(14, HIGH);  //включаем на нем подтягивающий резистор  
    
  pinMode(13, OUTPUT); 
  Serial.begin(19200);  //Скорость порта для связи Arduino с компьютером
  Serial.println("Goodnight moon!");
  mySerial.begin(19200);  //Скорость порта для связи Arduino с GSM модулем
  mySerial.println("AT");
  delay(500);
  //Serial.println("AT+CMGD=4");//Удаляем всё SMS которые могут содержаться на сим карте.  
  /*for(byte i=0; i<13; i++)   //Чтение Разрешонного номера из EEPROM
  {
  data = EEPROM.read(i);
  nomber_Phone += data;
  }*/
 } 
 void loop() 
{
  if (mySerial.available()) 
  Serial.write(mySerial.read());
  if (Serial.available())
  mySerial.write(Serial.read());
  if (bouncer.update())
  {   
    if (bouncer.read()==0)
    {
    digitalWrite(13, HIGH);
    mySerial.println("ATD +38063xxxxxxx;");   //там цифры у меня
    delay(15000);
    mySerial.println("ATH0");
    digitalWrite(13, LOW);    
    }  
  } 
    if (mySerial.available()) // если пришло что то от GSM модуля, то вызываем обработчик
  {
    response_on_dial();
  }
}
// Обработчик входящего вызова 
void response_on_dial()
{
  delay(500);
  while (mySerial.available())
  {
    char c  = mySerial.read();
    str_1  +=  c; // загоняем в str_1 сообщение от модуля
  }
  // Находим в строке "+38" и выдёргиваем из строки номер телефона
  if (str_1.startsWith("RING", 2))
  {
    int index_number = str_1.lastIndexOf("+38");
    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(13) == LOW) digitalWrite(13,HIGH); // инвертируем выход led
    else digitalWrite(13,LOW);
    }
  }
  str_1 = "";
}
0
13 / 13 / 2
Регистрация: 11.08.2015
Сообщений: 39
17.03.2016, 05:33 6
Woland50, всё правильно. У вас в основном цикле один раз проверяется хардверный порт и два раза софтверный.
Когда в mySerial приходит что то, то в зависимости от того какое условие в данный момент обрабатывается, у вас либо принятый символ отправляется сначала монитор порта, а потом вызывается обработчик response_on_dial() и ворошит весь буфер, либо сразу вызывается обработчик и опять же переворачивает буфер порта и все данные теряются.
1
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
17.03.2016, 16:44  [ТС] 7
А если я их объединю?
C++
1
2
3
4
 void loop() 
{
  if (mySerial.available())   Serial.write(mySerial.read());    response_on_dial();
  if (Serial.available())  mySerial.write(Serial.read());
Так будут выводитья?

Добавлено через 21 минуту
Или нет, надо вот так написать:
Если что-то пришло в mySerial то выполнить поиск RING, если найдено то включить светодид, иначе Serial.write(mySerial.read());
Правильно?
Дома то я проверю, просто сейчас на работе
0
13 / 13 / 2
Регистрация: 11.08.2015
Сообщений: 39
17.03.2016, 16:55 8
Лучший ответ Сообщение было отмечено Woland50 как решение

Решение

Woland50, так попробуйте. Должно работать.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <SoftwareSerial.h>
//#include <EEPROM.h>
#include <Bounce.h>
String nomber_Phone = "";//Строка содержит номер телефона. далее Разрешенный номер. 
SoftwareSerial mySerial(2, 3); // RX, TX  +,0,3,2,- (3-3, 2-2)
Bounce bouncer = Bounce(14, 40); //создаем экземпляр класса Bounce для 2 вывода
String currStr = "";//Строка содержит текущую строку, полученую от сим модуля.
char data;//Содержит символ полученый от сим модуля.
String str_1  = "", number  = ""; // str_1 - сообщение, number - телефонный номер звонившего
 
 
void setup() 
 { 
  pinMode(13, OUTPUT);
  pinMode(14, INPUT);   //переключаем 2 вывод в режим входа
  digitalWrite(14, HIGH);  //включаем на нем подтягивающий резистор  
    
  pinMode(13, OUTPUT); 
  Serial.begin(19200);  //Скорость порта для связи Arduino с компьютером
  Serial.println("Goodnight moon!");
  mySerial.begin(19200);  //Скорость порта для связи Arduino с GSM модулем
  mySerial.println("AT");
  delay(500);
  //Serial.println("AT+CMGD=4");//Удаляем всё SMS которые могут содержаться на сим карте.  
  /*for(byte i=0; i<13; i++)   //Чтение Разрешонного номера из EEPROM
  {
  data = EEPROM.read(i);
  nomber_Phone += data;
  }*/
 } 
 void loop() 
{
  if (Serial.available())
  mySerial.write(Serial.read());
  if (bouncer.update())
  {   
    if (bouncer.read()==0)
    {
    digitalWrite(13, HIGH);
    mySerial.println("ATD +38063xxxxxxx;");   //там цифры у меня
    delay(15000);
    mySerial.println("ATH0");
    digitalWrite(13, LOW);    
    }  
  } 
    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 сообщение от модуля
  }
  // Находим в строке "+38" и выдёргиваем из строки номер телефона
  if (str_1.startsWith("RING", 2))
  {
    int index_number = str_1.lastIndexOf("+38");
    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(13) == LOW) digitalWrite(13,HIGH); // инвертируем выход led
    else digitalWrite(13,LOW);
    }
  }
  str_1 = "";
}
1
0 / 0 / 0
Регистрация: 03.11.2014
Сообщений: 28
21.03.2016, 12:12  [ТС] 9
Спасибо, вроде бы всё работает. Буду пилить дальше
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.03.2016, 12:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

SIM800L+ATMega16 непонятки
доброго времени суток уважаемое сообщество ! пытаюсь подружить эти 2 девайса для приёма и...

Sim800L не могу позвонить
Модуль Sim800 не могу позвонить на другой номер, отправляю команду &quot;ATD+79517484276;\r&quot; в ответ...

Arduino UNO + SIM800L
Доброго времени суток,прошу помочь мне с моей не задачей)). Приобрел с китая UNO и SIM800L,не как...

Прозвонка GSM модуля SIM800L
Уважаемые форумчане, у кого есть модуль SIM800L, не могли бы Вы прозвонить цепь между антенным...

STM32F746, sim800l, воспроизведение аудио
День добрый. Нужно сделать голосове меню. Для начала хочу опробовать на отладочном комплекте...

GSM SIM800L регистрация отклонена
Китайский gsm модем sim800l после двух минут нормальной работы начал отказываться от регистрации в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.