Filter results by

Make an IoT Weather Station with SAMI

Read an updated version of this post using ARTIK Cloud.

This article demonstrates using SAMI 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 SAMI 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 download the code samples here.

Build the weather station

Fritzing

Connect to SAMI (it’s free, really!)

  1. First, sign into the SAMI User Portal. 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 SAMI limits the number of messages per day).

Here is the code:

 1 #include "DHT.h"
 2 
 3 #define DHTPIN 2 // data pin
 4 #define DHTTYPE DHT11
 5 
 6 DHT dht(DHTPIN, DHTTYPE);
 7 
 8 void setup() {
 9   Serial.begin(9600);
10   dht.begin();
11 }
12 
13 void loop() {
14   delay(60000); // 1 min
15   float f = dht.readTemperature(true);
16   if (isnan(f)) {
17     Serial.println("200"); // error
18     return;
19   }
20   Serial.println(f);
21 }

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 the User Portal into the placeholders in the code.

Below is the code:

 1 var sami = "https://api.samsungsami.io/v1.1/messages";
 2 var bearer = "Bearer INSERT_TOKEN_HERE";
 3 var sdid = "INSERT_SOURCE_ID";
 4 
 5 var serialport = require("serialport")
 6 var SerialPort = serialport.SerialPort;
 7 var sp = new SerialPort("/dev/ttyACM0", {
 8 	baudrate: 9600,
 9 	parser: serialport.parsers.readline("\n")
10 });
11 
12 var Client = require("node-rest-client").Client;
13 var c = new Client();
14 
15 function build_args (temp, ts) {
16 
17 	var args = {
18 		headers: {
19 			"Content-Type": "application/json",
20 			"Authorization": bearer 
21 		},  
22 		data: { 
23     			"sdid": sdid,
24 			"ts": ts,
25 			"type": "message",
26 			"data": {
27         			"temperature": temp
28     			}
29 		}
30 	};
31 	return args;
32 }
33 
34 sp.on("open", function () {
35 	sp.on('data', function(data) {
36 		var args = build_args(parseInt(data).toString(), new Date().valueOf());
37 
38 		c.post(sami, args, function(data, response) {            
39 			console.log(data);
40         	});	    
41 	});
42 });

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 SAMI.

Log into the SAMI User Portal 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 SAMI Developer Portal. 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?

Top image: CHRIStophe Robert HERVOUËT

Get the ARTIK Newsletter

You like your news fresh! Sign up now and you will be the first to know about our latest software releases, coding tips, upcoming events, new blog posts and more!

By providing your contact information, you agree to our Privacy Policy and Terms of Use, confirm you are an adult 18 years or older, and authorize Samsung™ ARTIK to contact you by email with information about Samsung™ ARTIK products, events, and updates for Samsung IoT Solutions. You may unsubscribe at any time by clicking the link provided in our communications.