Sigfox Talking Plant




Introduction: Sigfox Talking Plant

What is Sigfox Talking Plant?

It is a simple project based on Sigfox network to make a plant talk on Twitter.
The main goal is to demonstrate how to make an easy IoT prototype using Sigfox network.
You can see a demo at

Which microcontrollers will be used?

In this tutorial, we will be using an Arduino UNO and an ATMEL EVK shield.
Other dev kits are available on Sigfox Partners Network.

How long does it take to make it?

From scratch, it took me 3 days to make the plant talk on Twitter. However, all the source code is available on Github. So, within an hour or two, you will be able to make it work.

Do I need any previous knowledge?

You don't need any previous knowledge although knowing Arduino and Javascript is a plus. The web app will be an AngularJS app and we will be using a NodeJS server.

Is it useful?

Good question! You can use this project to gather a community around the plant or just to remember your followers to water the plant. Feel free to share the way you have been using this project ;)

Who am I?

My name is Louis Moreau, I'm an intern at Sigfox. My mission is to create prototypes and PoC using Sigfox network. I want these projects to be fun and instructive. I want to show you how easy is it to develop the first steps of your ideas. I will try to make this tutorial as complete as I can. Do not hesitate to ask me for more details if needed : Github

In order to make this tutorial, I've been using myself few projects :

Step 1: Understand Sigfox

What is Sigfox?

Sigfox is a connectivity solution dedicated to the Internet of Things.
The operated network is currently operating in +15 countries, on every continent.
Focused on tiny messages (up to 12 bytes) & low energy consumption, it currently powers 7 million devices. Various Sigfox-compatible technical solutions are available, from different silicon vendors. This project uses a Arduino shield from Atmel (see below)

Step 2: Hardware Requirements

In this tutorial, we will be using :

  • an ATMEL EVK shield
  • a USB cable (type A)
  • a 10 kΩ resistor
  • a photocell resistor
  • a moisture sensor
  • few male-to-male cables
  • a breadboard

What we need is to get the soil moisture, the luminosity and the temperature. The temperature sensor is already provided with the ATMEL shield, thus we only need to add the photocell resistor (to get the luminosity) and the moisture sensor.

Step 3: Hardware Connections

Step 4: Arduino Code Using (ATMEL Shield)

Install Arduino IDE:

You need to install the Arduino IDE :

Choose your OS, download it and install it.

Get the source code:

You can download the source code on Github :

Basic understanding of Arduino programming :

Before starting each program, we start with two "base" functions: void setup() and void loop().

  • void setup() is executed in first. It is used to initialise the card.
  • void loop() is executed infinitely (as long as power is provided)

See more on

Our program:

Open the sigfox_talking_plant_atmel.ino file in Arduino IDE. You will see that both setup() and loop() functions are present. Two other functions are also present, sensorActivity() and sendValues().

Now, we need to define the input, the variables and the sleeping time:

At the beginning of the program, you will see :

  • #define TIMEINTERVALL 3600000; This is the time interval between each sensor values reading. 3600000 corresponds to an hour in milliseconds (60 min x 60 seconds x 1000)
  • #define photores A0; We define the pin A0 to be the input pin to read values from the photocell.
  • #define moisture A1; We define the pin A1 to be the input pin to read values from the moisture sensor.
  • unsigned long timer;
  • unsigned int lum;
  • unsigned int moist;

Let's have a deeper look into the functions:

  • setup():
    In this function, the card is initialised, we check that the shield is present, we activate it and we get the ID and the PAC number from the shield. Then we set it in its sleeping mode and initialize the timer.
  • loop():
    Two options are available to activate the sensorActivity function. You can either press the button or wait for the delay defined with the TIMEINTERVALL value.
  • sensorActivity():
    This function will be used to read the values from the sensors and then call the sendValues function. For the brightness and moisture sensors, they are not integrated with the shield library. Thus we need to use the analogRead function to get the input value.
    I used a map function to convert it in percentage and to calibrate the input.
    For the temperature, we use the library, thus, we need to activate the shield using SIGsh.SIGFOXon() and use SIGsh.readTemp() to get the temperature.
    Finally, we call the sendValues() function with the moisture, luminosity and temperature as parameters.
    In the provided code, the power is also included
  • sendValues():
    At first, we create a buffer to add the obtained values.
    As Sigfox use very small data, we need to optimise it. This is why we only take the lower byte of the integer values.
    Explanation: unsigned int's weight is 16 bits (2 bytes) on Atmega-based boards. Sigfox can send up to 12 bytes. As the values we get will be between 0 and 100, 1 byte is enough to store them.
    See more about integers weights here.
    Then we send the buffer and the length using the provided library (SIGsh.sendMessage)

Run the code:

Try now to compile the code using the check button on the upper-left corner and upload it using the button just next. (Don't forget to add the serial port is it not automatically detected: Tools > Serial Port > your arduino port).

Open the serial monitor and press the button. If everything works fine. You will get the status "OK" on your console.

Next step is to activate your card.

Step 5: Dev Kit Activation

To activate your dev kit, go to and choose your provider.

Depending on your location, pick your country and then fill the device's ID, the PAC number and your details.

Both ID and PAC number are written on your dev kit or your box.

Check your emails and log in. Your device will appear in your account. Click on its ID and go to messages to check if you received anything.

Step 6: Back End Using NodeJS

Before setting up the callbacks in the back end Sigfox, we need to set up our own server to receive the data.

In order to do that, we will be using NodeJS. In fact, we will be using LoopBack framework to make this even easier.

What is Loopback?

On their website it is said:

LoopBack is a highly-extensible, open-source Node.js framework.

You can:

  • Quickly create dynamic end-to-end REST APIs.
  • Connect devices and browsers to data and services.
  • Use Android, iOS, and AngularJS SDKs to easily create client apps. Add-on components for push, file management, 3rd-party login, and geolocation.
  • Use StrongLoop Arc to visually edit, deploy, and monitor LoopBack apps.StrongLoop API Gateway acts an intermediary between API consumers (clients) and API providers to externalise, secure, and manage APIs.
  • Runs on-premises or in the cloud

What you should remember is that you can create a REST API in few minutes :)

Source code:

You can download directly the source code on Github

Install Loopback using npm:

$ npm install -g strongloop

Create your app:

$ slc loopback

[?] What's the name of your application? sigfox-talking-plant-backend
create hello-world/ info change the working directory to hello-world I'm all done. Running npm install for you to install the required dependencies. ...

Run the visual interface and create the models:

$ slc arc

Then go to the composer and add a new model "device". Fill the properties as shown in the picture. Repeat this to create the message (and randomTwit models eventually if you wish to customise the twits).

Now, you can run the server by clicking on the "play" button on the upper-right corner.

Note that I changed the port to be 3001 on my computer because my port 3000 is busy.

Go to http://localhost:3000/explorer/ to see your API end points.

You can also run the application from a terminal by typing:

$ node .

Store your data in a database:

If you want to store the data somewhere, you can add a datasource. Loopback framework support MySQL, PostgreSQL, MongoDB and many others. Right now, your data will be loose if you stop the server or restart it.

You even can decide to store the data in a json file. To do so,on the project's root, go to /server/datasource.json and copy this :

{"db": { "name": "db", "connector": "memory", "file": "mydata.json" }}

Create Twitter app:

Go to and create an app.
Go to Keys and Access Tokens to get your credentials.

Sending twits:

Install twitter node module :

$ npm install twitter

Go to /common/models/message.js to configure twits to be sent when a new message is created.

Replace the code by the following :

var Twitter = require('twitter');
module.exports = function(Message) {
//Use the environment variables in production var client = new Twitter({
consumer_key: process.env.TWITTER_CONSUMER_KEY,
consumer_secret: process.env.TWITTER_CONSUMER_SECRET,
access_token_key: process.env.TWITTER_ACCESS_TOKEN_KEY,
access_token_secret: process.env.TWITTER_ACCESS_TOKEN_SECRET, });

//Available methods :
// client.get(path, params, callback);
//, params, callback);
//, params, callback);

Message.afterRemote('create', function (ctx, message, next){ console.log('> testing afterRemote function'); console.log('time : '+message.time); console.log('device id : '+message.device); console.log('data : ';'statuses/update', {status: "Hello, the temperature is "+message.temp+" °C, the ground moisture is "+message.hum+" % and the brightness is "+message.lum+" %}, function(error, tweet, response){
if(error) console.log(error);
console.log(tweet); // Tweet body.
console.log(response); // Raw response object. });
next(); }); };

You can publish your app on Heroku to test it!

Step 7: Create a Callback in Sigfox Backend

Now that our server is in place, we need to configure to callbacks in Sigfox Backend.

Sigfox offers a callback service: every time a message is received by the network, we set up the way we want it to be forwarded to our application server. URL, content-type, request body, ...

Log in your sigfox backend account and go to "Device Type", then click on card's name.
On the menu at the right, you will be able to see at the bottom "callbacks".
Click on "New" (upper-right corner) and then "Custom callback".

You will see a form with various options, set them as:

  • Type: Data / Uplink
  • Channel: Url
  • Send duplicate: leave uncheck
  • Custom payload config: temp::uint:8 humidity::uint:8 lum::uint:8 voltage::uint:16
  • Url pattern: http://your-url:your-port/api/messages
  • Use HTTP method: POST
  • Send SNI: Leave uncheck
  • Headers: Leave blank
  • Content type: application/json
  • Body:


"device" : "{device}",
"data" : "{data}",
"temp" : {customData#temp},
"hum": {customData#humidity},
"lum": {customData#lum},
"voltage": {customData#voltage}

To validate, click on OK.

Step 8: Create the Frontend App


  • NodeJS (with NPM)
  • Bower
  • Gulp


  • Clone the repository:
    $ git clone
  • Install the NodeJS dependencies:
    $ npm install.
  • Install the Bower dependencies:
    $ bower install.
  • Run the gulp build task:
    $ gulp build.
  • Run the gulp default task:
    $ gulp.
    This will build any changes made automatically, and also run a live reload server on http://localhost:8888.
    Ensure your preferred web server points towards the dist directory.


Continue developing the dashboard further by editing the src directory. With the gulp command, any file changes made will automatically be compiled into the specific location within the dist directory.

Modules & Packages:

By default, project includes ui.bootstrap, ui.router and ngCookies.

If you'd like to include any additional modules/packages not included with this project, add them to your bower.json file and then update the src/index.html file, to include them in the minified distribution output.

Configure your own base URL:

Go to /src/js/services/http-service.js and change the base URL

Run the app:

To run the app just run in a terminal:

$ gulp

Step 9: Go Further

Yeah, you made it!!

From now on, the possibilities and endless.
Feel free to modify, adapt, share and let me know what you did with the project.

We haven't discussed about the random tweets options because that might be a bit beyond the scope of this tutorial. The idea I had was to let people add their custom messages using tags to make the tweets more friendly.

Thank you for your attention :)

I will be glad to answer your questions (Twitter or Github)

Internet of Things Contest 2016

Runner Up in the
Internet of Things Contest 2016

First Time Author Contest 2016

Participated in the
First Time Author Contest 2016

Be the First to Share


    • Game Design: Student Design Challenge

      Game Design: Student Design Challenge
    • For the Home Contest

      For the Home Contest
    • Make It Bridge

      Make It Bridge



    Question 3 years ago

    J'ai pas mal de problème avec NodeJS, je suis bloquer après l'installation de LoopBack en utilisant NPM (npm install -g strongloop) ensuite je veux créer mon application est donc je fais cette commande : (slc loopback) et j'ai cette image qui apparaît puis plus rien qui s'affiche, est-ce normal ?

    Ps : j'ai télécharger votre code source ( que dois-je faire avec, comment dois-je l'utiliser ?
    Merci beaucoup !
    I have a lot of trouble with NodeJS, I'm blocking after installing LoopBack using NPM (npm install -g strongloop) then I want to create my application so I'm doing this command: (slc loopback) and I this image that appears then nothing is displayed, is this normal?

    Ps: I download your source code( what should I do with, how should I use it?
    Thank you very much!

    5 years ago

    So can you use any sensors and send their information to a Sigfox network??? And if so how is this done?

    Can the sensor data then be pulled from the Sigfox cloud and be displayed on a mobile in a specific app?


    6 years ago

    Hi Luisomoreau,

    Can you mention the pin connection diagram between the arduino uno and atmel evk shield.


    6 years ago

    As the wake pin PD6 is not an interrupt pin, how could it wake up from sleep. Can anyone clarify it please.


    Reply 6 years ago

    Hi senaug82,

    As far as I remember, I have just use the timer to wake the device up...

    This project was not power efficient at all ;)

    Akin Yildiz
    Akin Yildiz

    6 years ago

    cool stuff, very detailed project..

    are you familiar with my work.?


    Reply 6 years ago

    Hey! Nice project!! If you want to use Sigfox network to get the sensors data, feel free to contact me to get more info.


    Reply 6 years ago

    Hi luisomoreau,

    In your code you have used the PD6 as wake pin, but it is not an interrupt pin. How will it wake the microcontroller from sleep. Please clarify me.


    6 years ago

    awesome project, and thanks for the atak55002 link, v useful


    6 years ago

    Very interesting project! Do you know any alternative to Sigfox? (Its not avaiable in my country)


    Reply 6 years ago

    Hey simonp862,

    Thanks !

    I don't really know about alternatives to Sigfox... In which country are you ?


    6 years ago

    Nice! All the details for this are very well put together. This is a great IoT project, well done! :)