Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/GSMExamplesReceiveVoiceCall

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Прием голосового звонка[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()

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

  1. Arduino - Receive Voice Call