Arduino Gọi Điện Thoại Bằng Giọng Nói

Trong hướng dẫn này, chúng ta sẽ học cách sử dụng Arduino để thực hiện một cuộc gọi VoIP (Voice over Internet Protocol) thời gian thực tới điện thoại của bạn. Mã nguồn có sẵn cho Arduino Ethernet Shield. Bạn có thể chỉnh sửa nó để nó hoạt động với shield hoặc board khác.

Hướng dẫn cung cấp mã Arduino cho hai trường hợp:

Phần cứng cần chuẩn bị

1×Arduino UNO R4 WiFi
1×Alternatively, DIYables STEM V4 IoT
1×(Tùy chọn) DIYables STEM V4 IoT
1×USB Cable Type-A to Type-C (for USB-A PC)
1×USB Cable Type-C to Type-C (for USB-C PC)

Alternatively if using Ethernet:

1×Arduino Uno R3
1×USB 2.0 cable type A/B (for USB-A PC)
1×USB 2.0 cable type C/B (for USB-C PC)
1×Arduino Ethernet Shield
1×Ethernet Cable
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino UNO R4
1×(Khuyến nghị) Breadboard Shield for Arduino UNO R4
1×(Khuyến nghị) Enclosure for Arduino UNO R4
1×(Khuyến nghị) Power Splitter for Arduino UNO R4
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Điều kiện tiên quyết

Nếu bạn chưa biết về IFTTT và các khái niệm liên quan, chúng tôi khuyến nghị bạn đọc các bài hướng dẫn sau:

Sơ đồ đấu dây

  • Arduino - Ethernet Shield: chúng ta chỉ cần ghép shield lên Arduino Uno/Mega
Arduino - mạch Ethernet shield

Cách hoạt động

Chúng ta cần:

  • Cài đặt ứng dụng IFTTT trên điện thoại của bạn (có sẵn cho Android và iOS).
  • Tạo một Applet IFTTT trên trang web IFTTT, kết nối Webhooks với dịch vụ Cuộc gọi VoIP.

Khi chúng ta tạo Applet:

  • Chúng ta có thể viết tin nhắn văn bản, sau đó tin nhắn này sẽ được chuyển thành tin nhắn thoại để gửi tới điện thoại.
  • Chúng ta có thể chèn dữ liệu từ Arduino vào tin nhắn.

Quy trình làm việc

  • Arduino gửi một yêu cầu HTTP tới Webhooks của IFTTT,
  • Webhooks kích hoạt dịch vụ VoIP Calls trên IFTTT
  • Dịch vụ VoIP Calls trên IFTTT chuyển văn bản thành tin nhắn thoại.
  • Dịch vụ VoIP Calls trên IFTTT gọi điện tới ứng dụng IFTTT trên điện thoại của bạn.
  • Điện thoại của bạn đang đổ chuông.
  • Bạn nhận cuộc gọi.
  • Tin nhắn thoại được phát.

※ Lưu ý:

  • Thông điệp được xác định trên Applet, không phải trong mã Arduino.
  • Vì đây là VoIP, điện thoại của bạn cần được kết nối với Internet.
  • Cuộc gọi VoIP miễn phí.
  • Arduino có thể nói chuyện với bạn, nhưng bạn không thể nói chuyện với Arduino.

Cách sử dụng IFTTT với Arduino

  • Cài đặt ứng dụng IFTTT trên điện thoại của bạn
  • Tạo một tài khoản IFTTT (https://ifttt.com/join) và đăng nhập vào IFTTT.
  • Tạo một Applet cho các dịch vụ Webhooks và VoIP Calls. Vui lòng ghi lại tên sự kiện mà chúng tôi sử dụng.
  • Sau khi tạo Applet, lấy khóa Webhooks từ IFTTT.
  • Sao chép mã Arduino dưới đây và dán vào Arduino IDE.
  • Thay thế tên sự kiện và khóa Webhooks trong mã Arduino.
  • Tải mã lên Arduino

※ Lưu ý:

  • Tên sự kiện do bạn chỉ định. Bạn có thể đặt bất kỳ tên nào.
  • Khóa Webhooks được IFTTT tạo ra. Bạn không thể thay đổi nó.

Xem video hướng dẫn ở cuối bài hướng dẫn này.

Mã Arduino

Mã Arduino IFTTT cho Arduino Uno R4 WiFi

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-make-voice-phone-call */ #include <WiFiS3.h> const char ssid[] = "YOUR_WIFI_SSID"; // change your network SSID (name) const char pass[] = "YOUR_WIFI_PASSWORD"; // change your network password (use for WPA, or use as key for 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"; // change your Webhooks key String queryString = "?value1=27"; // the supposed temperature value is 27°C void setup() { Serial.begin(9600); // check for the WiFi module: if (WiFi.status() == WL_NO_MODULE) { Serial.println("Communication with WiFi module failed!"); // don't continue while (true) ; } String fv = WiFi.firmwareVersion(); if (fv < WIFI_FIRMWARE_LATEST_VERSION) { Serial.println("Please upgrade the firmware"); } // attempt to connect to WiFi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // wait 10 seconds for connection: delay(10000); } // print your board's IP address: Serial.print("IP Address: "); Serial.println(WiFi.localIP()); // connect to web server on port 80: if (client.connect(HOST_NAME, HTTP_PORT)) { // if connected: Serial.println("Connected to server"); // make a HTTP request: // send HTTP header client.println("GET " + PATH_NAME + queryString + " HTTP/1.1"); client.println("Host: " + String(HOST_NAME)); client.println("Connection: close"); client.println(); // end HTTP header while (client.connected()) { if (client.available()) { // read an incoming byte from the server and print it to serial monitor: char c = client.read(); Serial.print(c); } } // the server's disconnected, stop the client: client.stop(); Serial.println(); Serial.println("disconnected"); } else { // if not connected: Serial.println("connection failed"); } } void loop() { }

Mã Arduino IFTTT cho Arduino Uno/Mega với Ethernet Shield

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-make-voice-phone-call */ #include <SPI.h> #include <Ethernet.h> // replace the MAC address below by the MAC address printed on a sticker on the Arduino Shield 2 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"; // change your Webhooks key String queryString = "?value1=27"; // the supposed temperature value is 27°C void setup() { Serial.begin(9600); // initialize the Ethernet shield using DHCP: if (Ethernet.begin(mac) == 0) { Serial.println("Failed to obtaining an IP address using DHCP"); while (true); } // connect to web server on port 80: if (client.connect(HOST_NAME, HTTP_PORT)) { // if connected: Serial.println("Connected to server"); // make a HTTP request: // send HTTP header client.println("GET " + PATH_NAME + queryString + " HTTP/1.1"); client.println("Host: " + String(HOST_NAME)); client.println("Connection: close"); client.println(); // end HTTP header while (client.connected()) { if (client.available()) { // read an incoming byte from the server and print it to serial monitor: char c = client.read(); Serial.print(c); } } // the server's disconnected, stop the client: client.stop(); Serial.println(); Serial.println("disconnected"); } else {// if not connected: Serial.println("connection failed"); } } void loop() { }

※ Lưu ý:

Tutorial này đã sử dụng địa chỉ IP động (qua DHCP). Nếu bạn muốn sử dụng địa chỉ IP tĩnh:

Kết quả

Trong hai đoạn mã ở trên, nếu thành công,

  • Kết quả trong Serial Monitor trông như dưới đây:
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  
  • Kiểm tra điện thoại của bạn có đang đổ chuông hay không.
  • Nhận cuộc gọi.
  • Nghe tin nhắn thoại.

Video hướng dẫn

Cách tích hợp dữ liệu cảm biến vào tin nhắn thoại

Để đưa dữ liệu từ Arduino vào tin nhắn thoại, chúng ta cần làm:

  • Trong Arduino: Chèn dữ liệu vào yêu cầu HTTP (trong chuỗi truy vấn).
  • Trong Applet: Thay đổi cài đặt để trích xuất dữ liệu từ yêu cầu HTTP.

Bạn có thể tìm hiểu chuỗi truy vấn là gì trong bài hướng dẫn này

Có 5 biến có thể sử dụng trong cài đặt của Applet IFTTT.

{{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

Ví dụ:

  • Trong Arduino: Thay String queryString = "" bằng String queryString = "?value1=26&value2=70" trong các mã ở trên.
  • Trong Applet: Chỉnh sửa tin nhắn văn bản trong cài đặt của Applet IFTTT như sau:

Chào bạn,


Đây là Arduino Uno, tôi muốn thông báo cho bạn rằng:

  • Nhiệt độ ngoài trời là {{Value1}} °C
  • Độ ẩm ngoài trời là {{Value2}} %


Tất cả các giá trị nêu trên được đo tại {{OccurredAt}}

thẻ xuống dòng

Chúc may mắn và khỏe mạnh!

Trong tin nhắn ở trên, hãy để '
' tạo thành một dòng mới khi hiển thị.

Tin nhắn thoại sẽ như sau:

Video trên YouTube

Bạn có thể đọc nhiệt độ và độ ẩm từ cảm biến và đưa vào chuỗi truy vấn. Xem cách đưa dữ liệu từ cảm biến vào chuỗi truy vấn

Thách thức bản thân

Dựa trên mã ở trên, hãy thực hiện dự án sau:

  • Gọi VoIP tới điện thoại của bạn khi nút được nhấn
  • Gọi VoIP tới điện thoại của bạn khi cửa được mở
  • Gọi VoIP tới điện thoại của bạn khi nhiệt độ quá nóng ...

WARNING

Hướng dẫn này đang được phát triển.

Bài hướng dẫn liên quan