Make an IoT Weather Station with ARTIK Cloud

This post updates our previous article to use ARTIK Cloud.

This article demonstrates using ARTIK Cloud with simple, off-the-shelf sensors and hardware. Specifically, we will be gathering climate data from a low-cost temperature sensor and relaying that data to the cloud via ARTIK Cloud APIs. From there, we can analyze our collected data in real-time or historically. This autonomous combination of hardware, software and networking is now being referred to as IoT (Internet of Things).

This article assumes you have experience uploading code to an Arduino Uno with the IDE and running a Raspberry Pi.

Hardware components we will use in our demo

  • Raspberry Pi with a network connection
  • Arduino Uno with a breadboard
  • Temperature sensor (DHT11)
  • USB and power cables, plus wiring for the breadboard

Arduino and Raspberry Pi

Software we will write

  • A Node.js script running on the Raspberry Pi
  • A Sketch program running on the Arduino

You can browse the source here.

Build the weather station

Fritzing

Connect to ARTIK Cloud (it’s free, really!)

  1. First, sign into My ARTIK Cloud. If you don’t have a Samsung account, you can create one at this step.
  2. Click to connect a device. Choose the already defined device type “Temp Sensor”.
  3. Name your device using your name (e.g., “Dan Temp Sensor”).
  4. Click “Connect Device…”. You’re taken back to the dashboard.
  5. Click the name of the device you just added. In the pop-up, click “Generate Device Token…”.
  6. Copy the device ID and device token on this screen. You will use these in the code.

Set up the Arduino and the temperature sensor

Now let’s wire the sensor. We are using a DHT11 here. They are not the most accurate, but they are cheap and easy to use for our simple use case.

Wire the Arduino

Using the Arduino IDE, upload the Arduino code (dht11.ino) to the Uno. This code reads the temperature data from the sensor and sends the value (in Fahrenheit) to the serial port every 2 seconds (you can change this parameter in the code later, since ARTIK Cloud limits the number of messages per day).

Here is the code:

#include "DHT.h"
 
#define DHTPIN 2 // data pin
#define DHTTYPE DHT11
 
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
   Serial.begin(9600);
   dht.begin();
}
 
void loop() {
   delay(60000); // 1 min
   float f = dht.readTemperature(true);
   if (isnan(f)) {
     Serial.println("200"); // error
     return;
   }
   Serial.println(f);
}

Set up the Raspberry Pi

Connect your Raspberry Pi to a monitor, mouse and keyboard. Ensure that ethernet or WiFi is working, and make sure the OS is up-to-date:

$ sudo apt-get update
$ sudo apt-get upgrade

If not already installed, install Node.js for ARM, then add the packages ‘serialport’ and ‘node-rest-client’ via npm:

$ npm install serialport
$ npm install node-rest-client

Now connect the serial port from the Arduino to the USB on the Raspberry Pi.

Connect Arduino and Raspberry Pi

Finally, copy the Node.js code (weather.js) to the Raspberry Pi (use scp to transfer it, or simply create a file and paste the code). Insert the device token and device ID you collected from My ARTIK Cloud into the placeholders in the code.

Below is the code:

var artikcloud = "https://api.artik.cloud/v1.1/messages";
var bearer = "Bearer INSERT_DEVICE_TOKEN_HERE";
var sdid = "INSERT_DEVICE_ID_HERE";

var serialport = require("serialport")
var SerialPort = serialport.SerialPort;
var sp = new SerialPort("/dev/ttyACM0", {
 baudrate: 9600,
 parser: serialport.parsers.readline("\n")
});

var Client = require("node-rest-client").Client;
var c = new Client();

function build_args (temp, ts) {

 var args = {
   headers: {
     "Content-Type": "application/json",
     "Authorization": bearer 
   },  
   data: { 
         "sdid": sdid,
     "ts": ts,
     "type": "message",
     "data": {
             "temperature": temp
         }
   }
 };
 return args;
}

sp.on("open", function () {
 sp.on('data', function(data) {
   var args = build_args(parseInt(data).toString(), new Date().valueOf());

   c.post(artikcloud, args, function(data, response) {            
     console.log(data);
         });     
 });
});

Fire it up and view the results!

Let’s start the Node.js program on the Raspberry Pi from the terminal:

$ node weather.js

You should see a JSON output, which is the response from ARTIK Cloud.

Log into the My ARTIK Cloud once again.

View your device data as it’s generated by clicking the magnifying glass in the device box.

Temperature data visualization

Where to go from here?

The sky’s the limit. The DHT11 also records humidity, and you can define your own device type with multiple fields using the ARTIK Cloud Developer Dashboard. So, a logical next step could be adding humidity to the mix.

Also, wouldn’t it be interesting to know where your weather station is located? What about gathering GPS coordinates from an additional sensor—or even hardcoded, if the weather station will not be moved? That could certainly be added with more data fields.

There are other sensors that detect barometric pressure and wind speed. Why not capture a full array of weather data for your particular microclimate wherever you may be?