Arduino:Примеры/GSMExamplesReceiveVoiceCall

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Перевел 364226 статей для сайта.</br>Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Прием голосового звонка[1]

Этот скетч при помощи платы Arduino и подключенного к ней модуля GSM Shield принимает голосовой звонок. Подключившись, он показывает номер, от которого пришел звонок, а по завершению разговора вешает трубку. Чтобы слышать голос и говорить самому, вам нужно подключить к Shield динамик и микрофон.

Необходимое оборудование

  • Плата Arduino;
  • Модуль Arduino + Telefonica GSM/GPRS Shield;
  • Микрофон и динамик, подсоединенные к GSM Shield;
  • SIM-карта;

Цепь

GSMShield ArduinoUno.png

Arduino GSM Shield, установленная поверх Arduino Uno

Код

Во-первых, импортируем библиотеку GSM.

1 #include <GSM.h>

Функционал SIM-карты может быть заблокирован PIN-кодом. В таком случае нам потребуется директива #define, с помощью которой мы определим этот PIN-код как константу. Если у вашей SIM-карты PIN-кода нет, то можете оставить это место пустым.

1 #define PINNUMBER ""

Создаем экземпляры классов GSM и GSMVoiceCall.

1 GSM gsmAccess;
2 GSMVoiceCall vcs;

Создаем массив типа char, в котором будем хранить входящий номер.

1 char numtel[20];

В секции setup() инициализируем последовательную передачу данных на компьютер. Открыв соединение, отправляем сообщение, информирующее о начале работы скетча.

1 void setup(){
2   Serial.begin(9600); 
3   Serial.println("Receive Voice Call");

Создаем локальную переменную для отслеживания статуса соединения. Благодаря этому скетч не запустится до тех пор, пока SIM-карта не подключится к сети.

1 boolean notConnected = true;

Подключаемся к сети, вызывая функцию gsmAccess.begin(), в которой PIN-код SIM-карты будет в качестве аргумента. Поместив его в блоке while(), мы сможем постоянно проверять статус соединения. Когда модем подключится, функция gsmAccess() вернет значение GSM_READY. Воспользуемся им, как сигналом для того, чтобы задать для переменной notConnected значение true или false. Если подключиться не удалось, сообщаем об этом на Serial Monitor.

 1 while(notConnected)
 2   {
 3     if(gsmAccess.begin(PINNUMBER)==GSM_READY)
 4       notConnected = false;
 5     else
 6     {
 7       Serial.println("Not connected");
 8       delay(1000);
 9     }
10   }

Чтобы удостовериться, что модем готов принимать входящие звонки, воспользуемся функцией hangCall().

1 vcs.hangCall();

Заканчиваем setup() выводом двух сообщений на Serial Monitor – о том, что GSM инициализирован, а скетч ждет звонка.

1 Serial.println("GSM initialized.");
2   Serial.println("Awaiting call.");
3 }

В секции loop() воспользуемся оператором switch для управления тем, по какому сценарию может пойти работа программы. Для того, чтобы определить статус скетча, вызовем функцию getvoiceCallStatus().

1 void loop()
2 {
3   switch (vcs.getvoiceCallStatus()) 
4   {

Если функция getvoiceCallStatus() возвращает значение IDLE_CALL, то дальше ничего не происходит.

1 case IDLE_CALL:
2 
3       break;

Если getvoiceCallStatus() возвращает значение RECEIVINGCALL, это значит, что вам кто-то звонит. Воспользуемся функцией retrieveCallingNumber() для того, чтобы записать входящий номер в созданный вами массив numtel, а затем выводим его на Serial Monitor.

Теперь впишем функцию answerCall() для того, чтобы инициировать голосовую коммуникацию со звонящим.

 1 case RECEIVINGCALL:
 2 
 3       Serial.println("RECEIVING CALL");
 4 
 5       vcs.retrieveCallingNumber(numtel, 20);
 6 
 7       Serial.print("Number:");
 8       Serial.println(numtel);
 9 
10       vcs.answerCall();         
11       break;

Когда вы ответите на звонок, функция getvoiceCallStatus() вернет значение TALKING. В то же время скетч будет ждать символа новой строки, чтобы запустить функцию hangCall() и тем самым прервать звонок.

Закрываем оператор switch.

1 case TALKING:
2 
3       Serial.println("TALKING. Enter line to interrupt.");
4       while(Serial.read()!='\n')
5         delay(100);
6       vcs.hangCall();
7       Serial.println("HANG. Waiting Call.");      
8       break;
9   }

И небольшая задержка перед тем, как начинать новый заход через цикл.

1 delay(1000);
2 }

Загрузив код, откройте Serial Monitor. Убедитесь, что Serial Monitor настроен таким образом, что при нажатии на кнопку ввода отправляет только символ новой строки.

 1 /*
 2 Прием голосового звонка
 3 
 4 Этот скетч для Arduino GSM Shield получает голосовые звонки,
 5 отображает входящий номер, ждет несколько секунд и вежливо кладет трубку.
 6 
 7 Цепь:
 8 * Arduino GSM Shield
 9 *  Микрофон и динамик, подключенные к Shield.
10 Если их не будет, ни передавать свой голос, ни слышать чужой вы не сможете. 
11 
12 Создан в марте 2012 Хавьером Зорзано (Javier Zorzano).
13 
14 Этот код не защищен авторским правом.
15 */
16 
17 // Библиотеки:
18 #include <GSM.h>
19 
20 // PIN-код:
21 #define PINNUMBER ""
22 
23 // Создаем экземпляры классов:
24 GSM gsmAccess; // включая параметр «true» для активации отладки
25 GSMVoiceCall vcs;
26 
27 
28 char numtel[20];           // буфер для хранения входящего номера
29 
30 void setup()
31 {
32   // Инициализируем последовательную передачу данных:
33   Serial.begin(9600);
34   Serial.println("Receive Voice Call");  //  "Принимаем голосовой звонок"
35 
36   // Состояние соединения:
37   boolean notConnected = true;
38 
39   // Запускаем GSM Shield.
40   // Если SIM-карта заблокирована PIN-кодом, указываем его параметром в функции gsmAccess.begin():
41   while(notConnected)
42   {
43     if(gsmAccess.begin(PINNUMBER)==GSM_READY)
44       notConnected = false;
45     else
46     {
47       Serial.println("Not connected");  //  "Подключиться не удалось"
48 
49       delay(1000);
50     }
51   }
52 
53   // Эта функция помогает удостовериться,
54   // что модем готов к принятию входящих звонков:
55   vcs.hangCall();
56 
57   Serial.println("Waiting Call");  //  "Ожидание звонка"
58 }
59 
60 void loop()
61 {
62   // Проверяем статус голосового звонка:
63   switch (vcs.getvoiceCallStatus()) 
64   {
65     case IDLE_CALL: // ничего не происходит
66 
67       break;
68 
69     case CALLING: // этого сценария никогда не возникнет, потому что звонок делаем не мы
70 
71       Serial.println("CALLING");  //  "Звонок"
72       break;
73 
74     case RECEIVINGCALL: // Да! Кто-то нам звонит
75 
76       Serial.println("RECEIVING CALL");  //  "Прием звонка"
77 
78       // «Изымаем» входящий телефонный номер:
79       vcs.retrieveCallingNumber(numtel, 20);
80 
81       // Выводим этот номер на Serial Monitor:
82       Serial.print("Number:");  //  "Номер:"
83       Serial.println(numtel);
84 
85       // Отвечаем на звонок, устанавливаем соединение:
86       vcs.answerCall();         
87       break;
88 
89     case TALKING:  // в этом сценарии связь уже установлена, а скетч ждет, когда она будет прервана:
90 
91       Serial.println("TALKING. Enter line to interrupt.");  //  "Идет разговор. Нажмите на клавишу ввода, чтобы прервать звонок."
92       while(Serial.read()!='\n')
93         delay(100);
94       vcs.hangCall();
95       Serial.println("HANG. Waiting Call."); //  "Звонок окончен. Ожидание нового звонка"
96       break;
97   }
98   delay(1000);
99 }

См.также

  1. GSM Constructor
  2. GSM.begin()
  3. GSM.shutdown()
  4. GSMVoiceCall Constructor
  5. getVoiceCallStatus()
  6. ready()
  7. voiceCall()
  8. answerCall()
  9. hangCall()
  10. retrieveCallingNumber()

Внешние ссылки