IoT Push notifications: Arduino – Firebase – Android. Step-by-step-practical guide

This tutorial describes how to implement IoT Push notifications using Arduino and Firebase. Using IoT push notifications, we can send notifications to other devices. In this case, we want to send an IoT push notifications from a smart object (like Arduino MKR1000) to a mobile smartphone (i.e. Android smartphone). This project integrates different eco-systems: IoT and Android. This project can have several implementations: for example, we can send a push notification to our smartphone when an alert occurs:

  • gas leakage
  • motion detection
  • higher or lower temperature
  • general failure systems

As an real example to show how to use IoT notifications, we will use a motion detection sensor. In other words,  there is an Arduino MKR1000 connected to a sensor (PIR sensor). When the sensor triggers an event, then MKR1000 makes a call to Firebase server using Firebase API.  Through the Firebase API, the smart object sends IoT push notifications to an Android smartphone. We can use the same way, to send notifications to other devices like iOS and so on.

The idea, that stands behind this project, is shown below:

As you can see, this project uses Firebase API in a different way mixing different worlds!

In the last article, we described how to use Firebase API to create a push notification, in this article we want to expand it and integrate Firebase with Arduino.

Moreover, we have already seen in the last post, how to create an Android app that handles push notification and how to configure it in the Firebase console. If you are new to Firebase, I suggest you read the previous post so that you have a clear idea how things work.

As Android app, this project uses the app we developed in the previous post. You can download it if you want to test the project.

Triggering events to send notification to Firebase

The first step is connecting Arduino MKR1000 to a PIR sensor. The picture below shows how to wire the sensor to MKR1000.

arduino iot push notifications with firebase

The schema is very simple. To know if the PIR sensor detected a movement we have to check if the signal is 1 in the corresponding PIN. The sketch is very simple:

int inputPin = 2;
int pirState = LOW;
void setup() {
  pinMode(inputPin, INPUT);
  Serial.begin(9600);
}
void loop() {
  int val = digitalRead(inputPin);
  if (val == HIGH) {
    if (pirState == LOW) {
      Serial.println("Motion detected");
      pirState = HIGH;
      // Motion detected
    }
  }
  else {
    if (pirState == HIGH) {
     Serial.println("Motion ended!");
     pirState = LOW;
     // Motion ended
  }  
 }
 delay(5000);
}Code language: JavaScript (javascript)

As you can notice, the sketch is very simple. We have to read the signal on the input pin and check if it is 1. If it is 1, then we have detected motion and we can send the notification.

MKR1000 WiFi connection

Before sending a notification, we have to connect Arduino MKR1000 to the internet using WiFi. We can slightly modify the code above and add the WiFi connection:

#include <SPI.h>
#include <WiFi101.h>
int inputPin = 2;
int pirState = LOW;
char ssid[] = "zzzzz-xxxxx"; // your network SSID (name)
char pass[] = "yyyyyyyy"; // your network password
int status = WL_IDLE_STATUS;
WiFiClient client;
void setup() {
Serial.begin(9600);
pinMode(inputPin, INPUT);
// attempt to connect to Wifi network:
 while ( status != WL_CONNECTED) {
   Serial.print("Attempting to connect to WPA SSID: ");
   Serial.println(ssid);
   // Connect to WPA/WPA2 network:
   status = WiFi.begin(ssid, pass);
   // wait 10 seconds for connection:
   delay(10000);
  }
  // you're connected now, so print out the data:
  Serial.println("You're connected to the network");
}Code language: PHP (php)

All done! Now everything is ready and we can focus our attention on the most interesting part: how to send IoT push notifications to a smartphone. There are other ways to send notifications to a smartphone. You can learn how to use PushingBox and PushBullet to send notifcation messages.

Learn More

Internet of Things with Android and Arduino: Control remote Led

How to integrate Android Things with Firebase to develop real-time IoT projects

How to use Ubidots to build IoT projects and integrate it with Android

How to sending IoT push notifications using Arduino and Firebase

To send a push notification we use the Firebase API. We assume you have already created a project in the Firebase console, if not go back to the previous article and read how to configure a Firebase project.
To send a push notification using Firebase it is necessary:

  1. Authenticate our client
  2. Create the message body in JSON
  3. Send the message to a smartphone

To do it, it is necessary to send some header HTTP parameters and a JSON message.  The first thing is set the Firebase host:

Host: fcm.googleapis.comCode language: CSS (css)

then, to authenticate our client we use a secret key, you get from Firebase console:

Authorization: key=AIzaSyC1mHfa_G89CDoNoq2zWhh1iL9---------Code language: HTTP (http)

then we have to set the content type:

Content-Type: application/jsonCode language: HTTP (http)

and finally we specify the HTTP method and the service we want to invoke:

POST /fcm/send HTTP/1.1Code language: HTTP (http)

The body of the IoT push notificiation is in JSON format and is very simple:

{
 "to":"your_phone_key",
 "notification": {
   "body": "test message",
   "title" : "Title"
  }
}Code language: JSON / JSON with Comments (json)

That’s all!! We will make this request using Arduino HTTP library:

void sendDataToFirebase() {
  String data = "{" ;
  data = data + "\"to\": \"your_smartphone_id\"," ;
  data = data + "\"notification\": {" ; data = data + "\"body\":" +
                 \"Motion detected\"," ;
  data = data + "\"title\" : \"Alarm\" " ; data = data + "} }" ;
  Serial.println("Send data...");
  if (client.connect(fcmServer, 80))  {
   Serial.println("Connected to the server..");
   client.println("POST /fcm/send HTTP/1.1");
   client.println("Authorization: key=auth_key");
   client.println("Content-Type: application/json");
   client.println("Host: fcm.googleapis.com");
   client.print("Content-Length: ");
   client.println(data.length());
   client.print("\n");
   client.print(data);
  }
  Serial.println("Data sent...Reading response..");
  while (client.available())  {
   char c = client.read();
   Serial.print(c);
  }
  Serial.println("Finished!");
  client.flush();
  client.stop();
}Code language: PHP (php)

Wrapping up…

So it is very simple to send IoT push notifications and we have integrated two different ecosystems. What will you build using push notifications? Comment below and let me know your experience.

At the end of this post, hopefully, you gained a new knowledge about sending IoT push notifications.

    1. Vicky September 28, 2016
      • Francesco Azzola September 28, 2016
    2. mdotsultan _ October 10, 2016
    3. Alex November 15, 2016
      • Shashank Kumar February 24, 2017
    4. Pingback: IoT project tutorial: Smart plant system November 16, 2016
    5. Farooq August 29, 2017
      • Francesco Azzola September 1, 2017
    6. Francesco Azzola September 14, 2017
    7. Francesco Azzola September 14, 2017
    8. Albert October 16, 2019
    9. Francesco Azzola October 22, 2019
    10. Albert November 18, 2019

    Add Your Comment