ESP32 WhatsApp – Cách gửi tin nhắn đến WhatsApp

Trong bài hướng dẫn chủ đề ESP32 WhatsApp này, mình sẽ hướng dẫn bạn cách gửi tin nhắn đến tài khoản WhatsApp. Cụ thể, bạn có thể gửi thông tin nhận được từ cảm biến, gửi tin nhắn cảnh báo khi các chỉ số từ cảm biến cao hoặc thấp hơn 1 giá trị nhất định nào đó, khi phát hiện có sự chuyển động hoặc nhiều ứng dụng thú vị khác.

Để làm được điều đó, chúng ta sẽ dùng Arduino IDE và một API miễn phí là CallMeBot.

WhatsApp là gì?

WhatsApp là một phần mềm miễn phí được phát triển tại Mỹ, và hiện tại có hỗ trợ sử dụng tại Việt Nam. Phần mềm này cho phép bạn nhắn tin và thực hiện các dịch vụ thoại ngay lập tức, thông qua mạng Internet và giảm được chi phí khi gửi SMS.

Bạn có thể cài WhatsApp trên cả Android và iOS.

Dự án ESP32 WhatsApp qua API CallMeBot

Để gửi tin nhắn từ ESP32 đến WhatsApp, chúng ta sẽ dùng 1 API miễn phí có tên là CallMeBot.

Về cơ bản, CallMeBot có cách hoạt động tương tự như 1 cổng, cho phép bạn gửi tin nhắn cho chính mình. Đây là tính năng khá phù hợp cho dự án ESP32 WhatsApp này.

Cách lấy Key API CallMeBot

Trước khi sử dụng API này, bạn cần lấy thông tin Key API theo các hướng dẫn sau:

  • Thêm số điện thoại +34 621 331 709 vào danh bạ điện thoại. Tuy nhiên, bạn hãy kiểm tra lại SDT trên Website CallMeBot (https://www.callmebot.com/) vì đôi khi chúng sẽ thay đổi.
  • Gửi tin nhắn sau “I allow callmebot to send me messages” đến số liên lạc bạn vừa tạo, thông qua WhatsApp.
  • Chờ cho đến khi bạn nhận được thông báo từ bot: “API Activated for your phone number. Your APIKEY is XXXXXX”. XXXXXX đó chính là Key của bạn
Cách lấy Key API CallMeBot cho dự án ESP32 WhatsApp

Ghi chú: Nếu sau 2 phút mà vẫn chưa nhận được Key, bạn hãy thử lại sau 24 giờ nhé!

Chuẩn bị trước khi gửi tin nhắn bằng API CallMeBot

Trước khi gửi tin nhắn, bạn cần gửi yêu cầu POST tới URL sau, nhưng hãy thay thế thành thông tin của bạn nhé:

https://api.callmebot.com/whatsapp.php?phone= [số_điện_thoại] &text= [tin_nhắn] &apikey= [apikey_của_bạn]

Cài đặt thư viện URLEncode

Các tin nhắn được gửi đi cần phải được mã hóa URL, đây được hiểu nôm na là quá trình chuyển đổi các ký tự thành định dạng có thể truyền qua Internet.

Các URL chỉ có thể được gửi qua Internet bằng bộ ký tự ASCII. Khi đó, chúng ta có thể đưa các dấu câu (sắc, huyền, hỏi, ngã, nặng) vào tin nhắn của mình.

Bạn có thể tự mã hóa tin nhắn bằng tay. Tuy nhiên, nó khá rắc rối. Trong hướng dẫn ESP32 Whatsapp này, mình sẽ hướng dẫn bạn cách sử dụng thư viện URLEncode (trên Arduino IDE) để chúng thực hiện việc đó.

Đầu tiên, bạn cần cài thư viện bằng cách mở Arduino IDE, chọn Sketch > Include Library > Manage Libraries và tìm kiếm tên thư viện “URLEncode” như hình, sau đó nhấn vào Install:

Cài thư viện URLEncode cho dự án ESP32 Whatsapp
Cài thư viện URLEncode cho dự án ESP32 WhatsApp

Chương trình lập trình

Dưới đây là đoạn code mẫu đơn giản về ESP32 WhatsApp, cho phép ESP32 gửi tin nhắn đến WhatsApp. Dựa vào đoạn code này, bạn có thể gửi bất kỳ thông tin nào khác mà bạn muốn.

Tuy nhiên, trước khi nạp code vào ESP32 của mình, bạn nhớ thay đổi các thông tin sau để dự án ESP32 WhatsApp hoạt động được nhé:

  • Tên và mật khẩu WiFi
  • Số điện thoại
  • Key API
#include <WiFi.h>    
#include <HTTPClient.h>
#include <UrlEncode.h>

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// +international_country_code + phone number
// Portugal +351, example: +351912345678
String phoneNumber = "REPLACE_WITH_YOUR_PHONE_NUMBER";
String apiKey = "REPLACE_WITH_API_KEY";

void sendMessage(String message){

  // Data to send with HTTP POST
  String url = "https://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message);    
  HTTPClient http;
  http.begin(url);

  // Specify content-type header
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  
  // Send HTTP POST request
  int httpResponseCode = http.POST(url);
  if (httpResponseCode == 200){
    Serial.print("Message sent successfully");
  }
  else{
    Serial.println("Error sending the message");
    Serial.print("HTTP response code: ");
    Serial.println(httpResponseCode);
  }

  // Free resources
  http.end();
}

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());

  // Send Message to WhatsAPP
  sendMessage("Hello from ESP32!");
}

void loop() {
  
}

Giải thích chương trình

Khai báo các thư viện cần dùng trong dự án ESP32 WhatsApp:

#include <WiFi.h>    
#include <HTTPClient.h>
#include <UrlEncode.h>

Chèn thông tin mạng WiFi vào các biến sau:

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Nhập SDT và Key API (Lưu ý sdt phải bắt đầu bằng +84):

String phoneNumber = "REPLACE_WITH_YOUR_PHONE_NUMBER";
String apiKey = "REPLACE_WITH_YOUR_API_KEY";

Mình sẽ tạo 1 hàm sendMessage() để phục vụ dự án ESP32 WhatsApp này. Hàm này sẽ bao gồm tin nhắn bạn muốn gửi đi:

void sendMessage(String message){

Bên trong hàm là URL với các yêu cầu thông tin, sdt, key API và nội dung tin nhắn.

Như đã giới thiệu, tin nhắn khi gửi cần được mã hóa URL. Mình đã khai báo thư viện URLEncode và thư viện này sẽ làm điều đó. Chúng chứa 1 hàm gọi là urlEncode(), chúng sẽ mã hóa bất kỳ nội dung nào mà chúng ta gửi đi thành đối số của

String url = "https://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message);

Tạo một HTTPClient trên URL đó:

HTTPClient http;
http.begin(url);

Chỉ định loại nội dung:

// Specify content-type header
http.addHeader("Content-Type", "application/x-www-form-urlencoded");

Gửi yêu cầu HTTP Post và lưu mã phản hồi:

int httpResponseCode = http.POST(url);

Nếu mã phản hồi về là 200, điều đó đồng nghĩa chúng ta đã đăng thành công. Nếu không thì chương trình đã xảy ra lỗi.

// Send HTTP POST request
int httpResponseCode = http.POST(url);
if (httpResponseCode == 200){
  Serial.print("Message sent successfully");
}
else{
  Serial.println("Error sending the message");
  Serial.print("HTTP response code: ");
  Serial.println(httpResponseCode);
}

Cuối cùng, chúng ta giải phóng tài nguyên:

// Free resources
http.end();

Trong setup(), bạn dùng Serial Monitor cho mục đích xem và gỡ lỗi:

Serial.begin(115200);

Kết nối mạng cục bộ và in địa chỉ IP:

WiFi.begin(ssid, password);
Serial.println("Connecting");
while(WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());

Gọi hàm để gửi tin nhắn đến WhatsApp:

// Send Message to WhatsAPP
sendMessage("Hello from ESP32!");

Demo dự án

Sau khi đổi các thông tin cần thiết như mạng WiFi, SĐT và Key API, bạn hãy nạp code vào ESP32 và mở Serial Monitor ở tốc độ 115200 nhé!

Bây giờ, bạn hãy nhấn nút RST trên mạch. Mạch sẽ kết nối với mạng WiFi và gửi tin nhắn đến WhatsApp.

Trên WhatsApp của điện thoại sẽ nhận được tin nhắn, ví dụ như hình:

Demo dự án ESP32 WhatsApp tại IoTZone

Nếu bạn cũng nhận được tin nhắn trên, đồng nghĩa là bạn đã thực hiện dự án ESP32 WhatsApp thành công!

Lời kết

Trên đây, IoTZone đã hướng dẫn chi tiết cho bạn về dự án ESP32 WhatsApp. Bạn đã biết cách dùng API CallMeBot với ESP32 để gửi tin nhắn đến WhatsApp. Ngoài ra, trên Website IoTZone còn có nhiều hướng dẫn thú vị khác về cách gửi tin nhắn với ESP32, bạn có thể tham khảo nếu thích nhé:

IoTZone – Chuyên cung cấp thiết bị điện tử & tài liệu cho Makers

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *