Raspberry Pi Pico W: Send Messages to WhatsApp (MicroPython)

In this guide, you’ll learn how to send messages to WhatsApp with the Raspberry Pi Pico using a free API CallMeBot. This can be useful to receive notifications from your board with sensor readings, and alert messages when a sensor reading is above or below a certain threshold, when motion is detected, and many other applications.

Raspberry Pi Pico W Send Messages to WhatsApp MicroPython

New to the Raspberry Pi Pico? Read the following guide: Getting Started with Raspberry Pi Pico (and Pico W).

Table of Contents

Prerequisites

Before proceeding, make sure you check the following prerequisites:

MicroPython Firmware

To follow this tutorial you need MicroPython firmware installed in your Raspberry Pi Pico board. You also need an IDE to write and upload the code to your board.

micorpython logo

The recommended MicroPython IDE for the Raspberry Pi Pico is Thonny IDE. Follow the next tutorial to learn how to install Thonny IDE, flash MicroPython firmware, and upload code to the board.

Alternatively, if you like programming using VS Code, you can start with the following tutorial:

Introducing WhatsApp

WhatsApp logo

“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 phone’s 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 don’t have it already.

CallMeBot WhatsApp API

To send messages to your WhatsApp account with the Raspberry Pi Pico, we’ll use a free API service called CallMeBot. 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. All the information about how to send messages using the API can be found here.

Getting the CallMeBot API Key

Before starting to use 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).

1) Add the phone number +34 611 01 16 37 to your Phone Contacts (name it as you wish);

Important: Please check the official instructions because the number might change without further notice.

2) Send the following message: “I allow callmebot to send me messages” to the new Contact created (using WhatsApp of course);

3) Wait until you receive the message “API Activated for your phone number. Your APIKEY is XXXXXX” from the bot.

Get CallMeBot API key

Note: if you don’t 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. Additionally, double-check that you’re sending the message to the right number (check the number on the official page here).

CallMeBot API

To send a message using the CallMeBot API you need to make a 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:

Send Messages to WhatsApp – MicroPython Code

To send messages to your WhatsApp account, the Raspberry Pi Pico needs to send a request to the URL we’ve seen previously.

The following code sends a test message to your account when you run the code.

# Rui Santos & Sara Santos - Random Nerd Tutorials
# Complete project details at https://RandomNerdTutorials.com/raspberry-pi-pico-w-whatsapp-micropython/

import network
import requests
from time import sleep

# Wi-Fi credentials
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'

# Your phone number in international format (including the + sign)
phone_number = 'YOUR_PHONE_NUMER_INTERNATIONAL_FORMAT'
# Example: phone_number = '+351912345678'

# Your callmebot API key
api_key = 'CALLMEBOT_API_KEY'

# Init Wi-Fi Interface
def init_wifi(ssid, password):
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    # Connect to your network
    wlan.connect(ssid, password)
    # Wait for Wi-Fi connection
    connection_timeout = 10
    while connection_timeout > 0:
        if wlan.status() >= 3:
            break
        connection_timeout -= 1
        print('Waiting for Wi-Fi connection...')
        sleep(1)
    # Check if connection is successful
    if wlan.status() != 3:
        return False
    else:
        print('Connection successful!')
        network_info = wlan.ifconfig()
        print('IP address:', network_info[0])
        return True

def send_message(phone_number, api_key, message):
    # Set the URL
    url = f'https://api.callmebot.com/whatsapp.php?phone={phone_number}&text={message}&apikey={api_key}'

    # Make the request
    response = requests.get(url)
    # check if it was successful
    if (response.status_code == 200):
        print('Success!')
    else:
        print('Error')
        print(response.text)
try: 
    # Connect to WiFi
    if init_wifi(ssid, password):
        # Send message to WhatsApp "Hello"
        # ENTER YOUR MESSAGE BELOW (URL ENCODED) https://www.urlencoder.io/
        message = 'Hello%20from%20the%20Raspberry%20Pi%20Pico%21' 
        send_message(phone_number, api_key, message)
except Exception as e:
    print('Error:', e)

View raw code

You need to insert your network credentials, phone number, and CallMeBot API key to make it work.

How the Code Works

Let’s take a quick look at how the code works. Alternatively, you can skip to the demonstration section.

We start by including the required libraries.

import network
import requests
from time import sleep

Insert your network credentials in the following variables so that the Pico can connect to your local network to access the internet.

# Wi-Fi credentials
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'

Insert your phone number in international format (including the + sign) in the following line:

phone_number = 'YOUR_PHONE_NUMER_INTERNATIONAL_FORMAT'

Example:

phone_number = '+351912345678'

Then, insert the CallMeBot API key you’ve got previously.

api_key = 'CALLMEBOT_API_KEY'

We create a function called init_wifi() to connect the Pi to your local network.

def init_wifi(ssid, password):
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    # Connect to your network
    wlan.connect(ssid, password)
    # Wait for Wi-Fi connection
    connection_timeout = 10
    while connection_timeout > 0:
        if wlan.status() >= 3:
            break
        connection_timeout -= 1
        print('Waiting for Wi-Fi connection...')
        sleep(1)
    # Check if connection is successful
    if wlan.status() != 3:
        return False
    else:
        print('Connection successful!')
        network_info = wlan.ifconfig()
        print('IP address:', network_info[0])
        return True

To make it easier to adapt the code for future projects, we created a function called send_message() that contains all the necessary instructions to send messages to WhatsApp. This function accepts as arguments the phone number, CallMeBot API key, and the message you want to send. You just need to call this function with the required arguments when you want to send a message.

def send_message(phone_number, api_key, message):
  # Set the URL
  url = f'https://api.callmebot.com/whatsapp.php?phone={phone_number}&text={message}&apikey={api_key}'
  # Make the request
  response = requests.get(url)
  # check if it was successful
  if (response.status_code == 400):
    print('Success!')
  else:
    print('Error')
    print(response.text)

Now that we’ve created all the necessary functions, call the init_wifi() function to connect the Pico to your local network.

if init_wifi(ssid, password):

We created a variable called message that contains the text that we want to send. The message should be in URL-encoded format. You can use this tool to convert your text to URL-encoded format.

message = 'Hello%20from%20the%20Raspberry%20Pi%20Pico%21'

Finally, call the send_message() function to send the message.

send_message(phone_number, api_key, message)

Demonstration

After inserting your network credentials, WhatsApp number, and CallMeBot API key, run the previous code on your Raspberry Pi Pico.

If everything goes as expected, it should connect to the internet and make a successful request.

Raspberry Pi Pico connect to callmebot success

After a few seconds, you should receive a new message on your WhatsApp account.

Raspberry Pi Pico send messages to whatsapp

Wrapping Up

In this tutorial, you learned how to send messages to your WhatsApp account by making a request to the callmebot API. We’ve shown you how to send a simple text message.

You can easily modify this example to send sensor readings or alert messages, for example. We have several getting started tutorials for basic sensors that you may find useful:

If you would like to learn more about the Raspberry Pi Pico, make sure to take a look at our resources:



Learn how to build a home automation system and we’ll cover the following main subjects: Node-RED, Node-RED Dashboard, Raspberry Pi, ESP32, ESP8266, MQTT, and InfluxDB database DOWNLOAD »
Learn how to build a home automation system and we’ll cover the following main subjects: Node-RED, Node-RED Dashboard, Raspberry Pi, ESP32, ESP8266, MQTT, and InfluxDB database DOWNLOAD »

Enjoyed this project? Stay updated by subscribing our newsletter!

3 thoughts on “Raspberry Pi Pico W: Send Messages to WhatsApp (MicroPython)”

Leave a Comment

Download Our Free eBooks and Resources

Get instant access to our FREE eBooks, Resources, and Exclusive Electronics Projects by entering your email address below.