ESP8266 NodeMCU: Send Messages to WhatsApp
In this guide, youll learn how to send messages to your WhatsApp account with the ESP8266 NodeMCU board. This can be useful to receive notifications from the ESP8266 with sensor readings, alert messages when a sensor reading is above or below a certain threshold, when motion is detected, and many other applications. Well program the ESP8266 using Arduino IDE and to send the messages well use a free API called CallMeBot.
We have a similar tutorial for the ESP32 board:
Introducing WhatsApp
WhatsApp Messenger, or simply WhatsApp, is an internationally available American freeware, cross-platform centralized instant messaging and voice-over-IP service owned by Meta Platforms. It allows you to send messages using your phones internet connection, so you can avoid SMS fees.
WhatsApp is free and is available for Android and iOS. Install WhatsApp on your smartphone if you dont have it already.
CallMeBot WhatsApp API
To send messages to your WhatsApp account with the ESP8266, well use a free API service called CallMeBot service. You can learn more about CallMeBot at the following link:
Basically, it works as a gateway that allows you to send a message to yourself. This can be useful to send alert messages from the ESP8266.
All the information about how to send messages using the API, can be found here.
Getting the CallMeBot API KEY
Before starting using the API, you need to get the CallmeBot WhatsApp API key. Follow the next instructions (check this link for the instructions on the official website).
Add the phone number +34 644 31 95 65 to your Phone Contacts. (Name it as you wish); Send the following message: I allow callmebot to send me messages to the new Contact created (using WhatsApp of course); Wait until you receive the message API Activated for your phone number. Your APIKEY is XXXXXX from the bot.
Note: If you dont receive the API key in 2 minutes, please try again after 24hs. The WhatsApp message from the bot will contain the API key needed to send messages using the API
CallMeBot API
To send a message using the CallMeBot API you need to make a POST request to the following URL (but using your information):
https://api.callmebot.com/whatsapp.php?phone=[phone_number]&text=[message]&apikey=[your_apikey]
[phone_number] : phone number associated with your WhatsApp account in international format;
[message] : the message to be sent, should be URL encoded.
[your_apikey] : the API key you received during the activation process in the previous section.
For the official documentation, you can check the following link: https://www.callmebot.com/blog/free-api-whatsapp-messages/
Installing the URLEncode Library
As weve seen previously, the message to be sent needs to be URL encoded. URL encoding converts characters into a format that can be transmitted over the Internet. URLs can only be sent over the Internet using the ASCII character-set.
This will allow us to include characters like c, , , a, u in our messages. You can learn more about URL encoding here.
You can encode the message yourself, or you can use a library, which is much simpler. Well use the UrlEncode library that can be installed on your Arduino IDE.
Go to Sketch > Include Library > Manage Libraries and search for URLEncode library by Masayuki Sugahara as shown below.
Sending Messages to WhatsApp ESP8266 Code
The following example code sends a message to your WhatsApp account when the ESP8266 first boots. This is a simple example to show you how to send messages. After understanding how it works, the idea is to incorporate it into your own projects.
/* Rui Santos Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-send-messages-whatsapp/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClient.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 = "http://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message); WiFiClient client; HTTPClient http; ht!
tp.begin(client, 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 ESP8266!"); } void loop() { }
View raw code
How the Code Works
Sending a message to WhatsApp using the CallMeBot API is very straightforward. You just need to make an HTTP POST request.
First, include the necessary libraries:
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClient.h> #include <UrlEncode.h>
Insert your network credentials on the following variables:
const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Insert your phone number and API key. The phone number should be in international format (including the + sign).
String phoneNumber = "REPLACE_WITH_YOUR_PHONE_NUMBER"; String apiKey = "REPLACE_WITH_YOUR_API_KEY";
sendMessage()
We create a function called sendMessage() that you can call later to send messages to WhatsApp. This function accepts as an argument the message you want to send.
void sendMessage(String message){
Inside the function, we prepare the URL for the request with your information, phone number, API key, and message.
As weve seen previously, the message needs to be URL encoded. Weve included the UrlEncode library to do that. It contains a function called urlEncode() that encodes whatever message we pass as argument (urlEncode(message)).
String url = "http://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message);
Create and start an HTTPClient on that URL:
HTTPClient http; http.begin(url);
Specify the content type:
// Specify content-type header http.addHeader("Content-Type", "application/x-www-form-urlencoded");
Finally, send the HTTP post request. The following line sends the request and saves the response code:
int httpResponseCode = http.POST(url);
If the response code is 200, it means the post request was successful. Otherwise, something went wrong.
// 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); }
Finally, free up the resources:
// Free resources http.end();
setup()
In the setup(), initialize the Serial Monitor for debugging purposes.
Serial.begin(115200);
Connect to your local network and print the board IP address.
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());
Then, we can send a message to WhatsApp by simply calling the sendMessage() function. In this case, were sending the message Hello from ESP8266!
// Send Message to WhatsAPP sendMessage("Hello from ESP8266!");
Demonstration
After inserting your network credentials, phone number and API key, you can upload the code to your board.
After uploading, open the Serial Monitor at a baud rate of 115200 and press the board RST button. It should successfully connect to your network and send the message to WhatsApp.
Go to your WhatsApp account. After a few seconds, you should receive the ESP8266 message.
Wrapping Up
In this tutorial, you learned how to use the CallMeBot API with the ESP8266 to send messages to your WhatsApp account. This can be useful to send sensor readings regularly to your inbox, send a notification when motion is detected, send an alert message when a sensor reading is above or below a certain threshold, and many more applications.
We also have tutorials for other types of messages (email and Telegram messages):
We hope you find this tutorial useful.
Learn more about the ESP8266 with our resources:
Thanks for reading.
We have a similar tutorial for the ESP32 board:
Introducing WhatsApp
WhatsApp Messenger, or simply WhatsApp, is an internationally available American freeware, cross-platform centralized instant messaging and voice-over-IP service owned by Meta Platforms. It allows you to send messages using your phones internet connection, so you can avoid SMS fees.
WhatsApp is free and is available for Android and iOS. Install WhatsApp on your smartphone if you dont have it already.
CallMeBot WhatsApp API
To send messages to your WhatsApp account with the ESP8266, well use a free API service called CallMeBot service. You can learn more about CallMeBot at the following link:
Basically, it works as a gateway that allows you to send a message to yourself. This can be useful to send alert messages from the ESP8266.
All the information about how to send messages using the API, can be found here.
Getting the CallMeBot API KEY
Before starting using the API, you need to get the CallmeBot WhatsApp API key. Follow the next instructions (check this link for the instructions on the official website).
Add the phone number +34 644 31 95 65 to your Phone Contacts. (Name it as you wish); Send the following message: I allow callmebot to send me messages to the new Contact created (using WhatsApp of course); Wait until you receive the message API Activated for your phone number. Your APIKEY is XXXXXX from the bot.
Note: If you dont receive the API key in 2 minutes, please try again after 24hs. The WhatsApp message from the bot will contain the API key needed to send messages using the API
CallMeBot API
To send a message using the CallMeBot API you need to make a POST request to the following URL (but using your information):
https://api.callmebot.com/whatsapp.php?phone=[phone_number]&text=[message]&apikey=[your_apikey]
[phone_number] : phone number associated with your WhatsApp account in international format;
[message] : the message to be sent, should be URL encoded.
[your_apikey] : the API key you received during the activation process in the previous section.
For the official documentation, you can check the following link: https://www.callmebot.com/blog/free-api-whatsapp-messages/
Installing the URLEncode Library
As weve seen previously, the message to be sent needs to be URL encoded. URL encoding converts characters into a format that can be transmitted over the Internet. URLs can only be sent over the Internet using the ASCII character-set.
This will allow us to include characters like c, , , a, u in our messages. You can learn more about URL encoding here.
You can encode the message yourself, or you can use a library, which is much simpler. Well use the UrlEncode library that can be installed on your Arduino IDE.
Go to Sketch > Include Library > Manage Libraries and search for URLEncode library by Masayuki Sugahara as shown below.
Sending Messages to WhatsApp ESP8266 Code
The following example code sends a message to your WhatsApp account when the ESP8266 first boots. This is a simple example to show you how to send messages. After understanding how it works, the idea is to incorporate it into your own projects.
/* Rui Santos Complete project details at https://RandomNerdTutorials.com/esp8266-nodemcu-send-messages-whatsapp/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. */ #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClient.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 = "http://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message); WiFiClient client; HTTPClient http; ht!
tp.begin(client, 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 ESP8266!"); } void loop() { }
View raw code
How the Code Works
Sending a message to WhatsApp using the CallMeBot API is very straightforward. You just need to make an HTTP POST request.
First, include the necessary libraries:
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClient.h> #include <UrlEncode.h>
Insert your network credentials on the following variables:
const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Insert your phone number and API key. The phone number should be in international format (including the + sign).
String phoneNumber = "REPLACE_WITH_YOUR_PHONE_NUMBER"; String apiKey = "REPLACE_WITH_YOUR_API_KEY";
sendMessage()
We create a function called sendMessage() that you can call later to send messages to WhatsApp. This function accepts as an argument the message you want to send.
void sendMessage(String message){
Inside the function, we prepare the URL for the request with your information, phone number, API key, and message.
As weve seen previously, the message needs to be URL encoded. Weve included the UrlEncode library to do that. It contains a function called urlEncode() that encodes whatever message we pass as argument (urlEncode(message)).
String url = "http://api.callmebot.com/whatsapp.php?phone=" + phoneNumber + "&apikey=" + apiKey + "&text=" + urlEncode(message);
Create and start an HTTPClient on that URL:
HTTPClient http; http.begin(url);
Specify the content type:
// Specify content-type header http.addHeader("Content-Type", "application/x-www-form-urlencoded");
Finally, send the HTTP post request. The following line sends the request and saves the response code:
int httpResponseCode = http.POST(url);
If the response code is 200, it means the post request was successful. Otherwise, something went wrong.
// 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); }
Finally, free up the resources:
// Free resources http.end();
setup()
In the setup(), initialize the Serial Monitor for debugging purposes.
Serial.begin(115200);
Connect to your local network and print the board IP address.
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());
Then, we can send a message to WhatsApp by simply calling the sendMessage() function. In this case, were sending the message Hello from ESP8266!
// Send Message to WhatsAPP sendMessage("Hello from ESP8266!");
Demonstration
After inserting your network credentials, phone number and API key, you can upload the code to your board.
After uploading, open the Serial Monitor at a baud rate of 115200 and press the board RST button. It should successfully connect to your network and send the message to WhatsApp.
Go to your WhatsApp account. After a few seconds, you should receive the ESP8266 message.
Wrapping Up
In this tutorial, you learned how to use the CallMeBot API with the ESP8266 to send messages to your WhatsApp account. This can be useful to send sensor readings regularly to your inbox, send a notification when motion is detected, send an alert message when a sensor reading is above or below a certain threshold, and many more applications.
We also have tutorials for other types of messages (email and Telegram messages):
We hope you find this tutorial useful.
Learn more about the ESP8266 with our resources:
Thanks for reading.
Comentarios
Publicar un comentario