아두이노 - 음성 전화 걸기 | Arduino - Make Voice Phone Call

이 튜토리얼에서는 아두이노를 사용하여 실시간 VoIP(Voice over Internet Protocol) 전화를 여러분의 전화로 거는 방법을 배울 것입니다. 이 코드는 Arduino Ethernet Shield 2용으로 제공됩니다. 다른 실드/보드와 작동하도록 수정할 수 있습니다.

튜토리얼은 두 가지 경우에 대한 아두이노 코드를 제공합니다:

준비물

1×Arduino UNO R4 WiFi Amazon
1×USB Cable Type-C 쿠팡 | Amazon
1×(Recommended) Screw Terminal Block Shield for Arduino Uno 쿠팡 | Amazon
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno Amazon

Alternatively if using Ethernet:

1×Arduino Uno Amazon
1×USB 2.0 cable type A/B 쿠팡 | Amazon
1×Arduino Ethernet Shield 2 Amazon
1×Ethernet Cable Amazon
1×(Optional) 9V Power Adapter for Arduino Amazon
1×(Recommended) Screw Terminal Block Shield for Arduino Uno 쿠팡 | Amazon
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

필수 요건

IFTTT 및 관련 개념에 대해 잘 모르신다면, 다음 튜토리얼을 읽어보시기를 강력히 추천합니다:

선연결

아두이노 - 이더넷 쉴드 2: 우리는 그저 아두이노 우노/메가 위에 쉴드를 쌓기만 하면 됩니다.

Arduino - Ethernet Shield 2

작동 원리

우리는 해야 합니다:

  • 휴대폰에 IFTTT 앱을 설치하세요(안드로이드와 iOS에서 사용 가능합니다).
  • IFTTT 웹사이트에서 Webhooks와 VoIP Calls 서비스를 연결하는 IFTTT 애플릿을 만드세요.

애플릿을 만들 때:

  • 휴대폰으로 보낼 음성 메시지로 변환되는 문자 메시지를 작성할 수 있습니다.
  • 메시지에 아두이노에서 가져온 데이터를 포함할 수 있습니다.

워크플로우

  • 아두이노가 IFTTT의 Webhooks에 HTTP 요청을 합니다.
  • Webhooks가 IFTTT에서 VoIP Calls 서비스를 트리거합니다.
  • IFTTT의 VoIP Calls 서비스가 텍스트 메시지를 음성 메시지로 변환합니다.
  • IFTTT의 VoIP Calls 서비스가 당신의 전화에 있는 IFTTT 앱으로 전화를 걸습니다.
  • 당신의 전화가 울립니다.
  • 당신이 전화를 받습니다.
  • 음성 메시지가 재생됩니다.

※ NOTE THAT:

  • 메시지는 아두이노 코드가 아니라 애플릿에 지정되어 있습니다.
  • 이것이 VoIP이기 때문에, 당신의 전화는 인터넷에 연결되어 있어야 합니다.
  • VoIP 통화는 무료입니다.
  • 아두이노는 당신에게 말할 수 있지만, 당신은 아두이노에게 말할 수 없습니다.

아두이노에서 IFTTT 사용하는 방법

  • 전화에 IFTTT 앱을 설치하세요.
  • IFTTT 계정을 생성하고 IFTTT에 로그인하세요.
  • Webhooks와 VoIP Calls 서비스의 애플릿(Applet)을 만드세요. 사용하는 이벤트 이름을 적어두세요.
  • 애플릿을 생성한 후, IFTTT에서 Webhooks 키를 받으세요.
  • 아래의 Arduino 코드를 복사하여 Arduino IDE에 붙여넣으세요.
  • Arduino 코드에서 이벤트 이름과 Webhooks 키를 교체하세요.
  • 코드를 Arduino에 업로드하세요.

※ NOTE THAT:

  • 이벤트 이름은 당신이 정합니다. 원하는 이름을 지정할 수 있습니다.
  • Webhooks 키는 IFTTT에 의해 생성됩니다. 변경할 수 없습니다.

이 튜토리얼 마지막에 있는 비디오 튜토리얼을 봐주세요.

아두이노 코드

아두이노 우노 R4 WiFi용 아두이노 IFTTT 코드

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-make-voice-phone-call */ #include <WiFiS3.h> const char ssid[] = "YOUR_WIFI_SSID"; // 네트워크 SSID (이름) 변경 const char pass[] = "YOUR_WIFI_PASSWORD"; // 네트워크 비밀번호 변경 (WPA 사용 시, 또는 WEP 키로 사용) WiFiClient client; int status = WL_IDLE_STATUS; int HTTP_PORT = 80; String HTTP_METHOD = "GET"; char HOST_NAME[] = "maker.ifttt.com"; String PATH_NAME = "/trigger/send-call/with/key/XXXXXXXXXXXXXXXXXXXXX"; // Webhooks 키 변경 String queryString = "?value1=27"; // 예상 온도값은 27°C임 void setup() { Serial.begin(9600); // WiFi 모듈 체크: if (WiFi.status() == WL_NO_MODULE) { Serial.println("WiFi 모듈과의 통신 실패!"); // 계속하지 않음 while (true) ; } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("펌웨어를 업그레이드 해주세요"); } // WiFi 네트워크에 연결 시도: while (status != WL_CONNECTED) { Serial.print("SSID에 연결을 시도 중: "); Serial.println(ssid); // WPA/WPA2 네트워크에 연결. 오픈 또는 WEP 네트워크를 사용하는 경우 이 줄을 변경하세요: status = WiFi.begin(ssid, pass); // 연결을 위해 10초간 대기: delay(10000); } // 보드의 IP 주소 출력: Serial.print("IP 주소: "); Serial.println(WiFi.localIP()); // 80 포트의 웹 서버에 연결: if (client.connect(HOST_NAME, HTTP_PORT)) { // 연결된 경우: Serial.println("서버에 연결됨"); // HTTP 요청 실행: // HTTP 헤더 보내기 client.println("GET " + PATH_NAME + queryString + " HTTP/1.1"); client.println("Host: " + String(HOST_NAME)); client.println("Connection: close"); client.println(); // HTTP 헤더 종료 while (client.connected()) { if (client.available()) { // 서버에서 오는 바이트를 읽고 시리얼 모니터에 출력: char c = client.read(); Serial.print(c); } } // 서버의 연결이 끊어졌으므로, 클라이언트를 중지: client.stop(); Serial.println(); Serial.println("연결 끊김"); } else { // 연결되지 않은 경우: Serial.println("연결 실패"); } } void loop() { }

아두이노 우노/메가용 이더넷 쉴드 2와 함께 사용하는 아두이노 IFTTT 코드

/* * 이 Arduino 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-make-voice-phone-call */ #include <SPI.h> #include <Ethernet.h> // 아두이노 실드 2에 붙어 있는 스티커에 인쇄된 MAC 주소로 아래의 MAC 주소를 대체하세요 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; EthernetClient client; int HTTP_PORT = 80; String HTTP_METHOD = "GET"; char HOST_NAME[] = "maker.ifttt.com"; String PATH_NAME = "/trigger/send-call/with/key/XXXXXXXXXXXXXXXXXXXXX"; // Webhooks 키를 변경하세요 String queryString = "?value1=27"; // 가정된 온도 값은 27°C입니다 void setup() { Serial.begin(9600); // DHCP를 사용하여 이더넷 실드를 초기화합니다: if (Ethernet.begin(mac) == 0) { Serial.println("DHCP를 사용하여 IP 주소를 얻는데 실패했습니다"); while (true); } // 포트 80에서 웹 서버에 연결합니다: if (client.connect(HOST_NAME, HTTP_PORT)) { // 연결됐다면: Serial.println("서버에 연결됨"); // HTTP 요청을 보냅니다: // HTTP 헤더를 전송합니다 client.println("GET " + PATH_NAME + queryString + " HTTP/1.1"); client.println("Host: " + String(HOST_NAME)); client.println("Connection: close"); client.println(); // HTTP 헤더의 끝 while (client.connected()) { if (client.available()) { // 서버에서 오는 바이트를 읽고 시리얼 모니터에 출력합니다: char c = client.read(); Serial.print(c); } } // 서버의 연결이 끊기면, 클라이언트를 정지시킵니다: client.stop(); Serial.println(); Serial.println("연결 끊김"); } else {// 연결되지 않았다면: Serial.println("연결 실패"); } } void loop() { }

※ NOTE THAT:

이 튜토리얼은 동적 IP 주소( DHCP를 통해)를 사용했습니다. 정적 IP 주소를 사용하려면:

결과

위의 두 코드에서, 성공하면,

시리얼 모니터에서의 결과는 아래와 같습니다:

COM6
Send
Connected to server HTTP/1.1 200 OK Date: Thu, 14 May 2020 07:06:40 GMT Content-Type: text/html; charset=utf-8 Content-Length: 44 Connection: close X-Top-SecreTTT: VG9vIGVhc3k/IElmIHlvdSBjYW4gcmVhZCB0a== ETag: W/"2c-4f52ca3d" Server: web_server Congratulations! You've fired the test event disconnected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • 휴대폰이 울리는지 확인하세요.
  • 전화를 받으세요.
  • 음성 메시지를 들으세요.

비디오 튜토리얼

음성 메시지에 센서 데이터를 포함하는 방법

아두이노에서 데이터를 음성 메시지에 포함시키려면, 다음을 수행해야 합니다:

  • Arduino에서: HTTP 요청(쿼리 문자열에서)에 데이터를 포함시킵니다.
  • 애플릿에서: HTTP 요청에서 데이터를 추출하기 위해 설정을 수정합니다.

이 튜토리얼에서 쿼리 스트링이 무엇인지 배울 수 있습니다

IFTTT 애플릿의 설정에서 사용할 수 있는 변수는 5가지가 있습니다.

{{EventName}} Extracted from HTTP request
{{OccurredAt}} System time when event occurs
{{Value1}} Extracted from the variable value1 of query string in HTTP request
{{Value2}} Extracted from the variable value2 of query string in HTTP request
{{Value3}} Extracted from the variable value3 of query string in HTTP request

예를 들면:

  • Arduino에서: 위의 코드에서 String queryString = ""String queryString = "?value1=26&value2=70"로 변경하세요.
  • 애플릿에서: IFTTT 애플릿 설정의 텍스트 메시지를 다음과 같이 수정하세요:

안녕 친구야,

이것은 아두이노 우노입니다, 알려드리고 싶은 것이 있습니다:

  • 외부 온도는 {{Value1}} °C입니다
  • 외부 습도는 {{Value2}} %입니다

위의 모든 값은 {{OccurredAt}}에 측정되었습니다.

행운을 빌고, 건강하세요!

위 메시지에서 "
"는 표시할 때 새 줄을 만듭니다.

음성 메시지는 아래와 같을 것입니다:

유튜브 비디오

센서에서 온도와 승도를 읽고 쿼리 문자열에 넣을 수 있습니다. 센서에서 데이터를 쿼리 문자열에 포함하는 방법을 참조하세요.

도전하세요

위 코드를 기반으로 다음 프로젝트를 만드십시오:

  • 버튼을 누르면 귀하의 전화로 VoIP 전화를 겁니다
  • 문이 열릴 때 귀하의 전화로 VoIP 전화를 겁니다
  • 온도가 너무 높을 때 귀하의 전화로 VoIP 전화를 겁니다

WARNING

이 튜토리얼은 개발 중입니다.

관련 튜토리얼

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!