HOW TO: Make UDOO Neo an IoT Gateway of Sensors

0 Flares Filament.io 0 Flares ×

Introduction
This HOW TO is the first of two. This one is meant for beginners who just bought a Neo and want to connect it to the Internet and want to see their sensor data online. The second HOW TO will be about controlling the Neo’s Arduino in and ouputs through a local website on your Neo, so you can control it from everywhere in your house and from every connected device (smartphone, laptop, desktop) that has a web browser.

Thingspeak

So this HOW TO is about sending sensor data to an IoT dashboard cloud supplier like Thingspeak. But there are more like for example data.sparkfun.com

Summary
1: Create a Thingspeak channel so we can upload data to this IoT cloud hosting.
2: Connect the Neo to the Internet so it can connect to Thingspeak.
3: Create a Python program on the Linux side to send the data to Thingspeak.
4: Create an Arduino sketch for reading sensor data and sending it to the Linux side.
5. Check your Thingspeak channel and confirm data transfer.
6. Read multiple sensors and send to Thingspeak.

Let’s begin! If you have any questions on this How To you are free to ask, just comment this thread.

Step 1: Create a Thingspeak channel.
Create Thingspeak channel with 1 temp field. You can use the following instruction: https://nl.mathworks.com/help/thingspeak/collect-data-in-a-new-channel.html

Step 2:
Connect the Neo to the Internet.
For connecting the Neo to the internet you can use the following instruction: Use Neo as a headless IoT Device

Step 3: Create a Python program on the Linux side to send the data to Thingspeak.
Copy this Python code, save it as UdooNeoSensor.py in your home folder on the Neo.
Replace the key value with your own Thingspeak Write API Key
Python is preinstalled on the Neo so you dont have to install anything for this.
After saving this Python code you can run it ín a linux terminal console: sudo python UdooNeoSensor.py
We are using the Linux /dev/ttyMCC serial device that is implemented on the Neo for communicating between the Linux and Arduino side.
Tip: To copy the code open the Neo desktop through VNC Remote Desktop so you can copy/paste it from your web browser on your PC to the text editor (leafpad) on the Neo with the standard Ctrl-C Ctrl-V commands.

 

#!/usr/bin/env python
# This program logs a Arduino Sensor on an Udoo Neo to a Thingspeak Channel
# To use, get a Thingspeak.com account, set up a channel, and capture the Channel Key at https://thingspeak.com/docs/tutorials/
# Then paste your channel ID in the code for the value of "key" below.
# Then run as sudo python UdooNeoSensor.py

import httplib, urllib
import time
import serial
sleep = 16 # how many seconds to sleep between posts to the channel, API limit min 15 sec
key = 'Put your Thingspeak Channel Key here'  # Thingspeak channel to update

DEBUG = False # set to True to  get more debug prints in the Python console

#Create serial device for reading serial
arduino = serial.Serial('/dev/ttyMCC',115200,timeout=0)
arduino.flushOutput()
arduino.flushInput()
serial_buffer = ""
line = ""

temp_str = '0'
temp = 0

#init for arduino so Arduino knows it can send data.
arduino.write("I\n")

def ReadArduino(arduino_out):
    global serial_buffer, line
    arduino_out = ""
    serial_data = arduino.read()                 # Read 1 character
    while serial_data:                             # If there is a character proceed
        serial_buffer += serial_data            # Add character to buffer
        if DEBUG: print "ReadArduino:Serial buffer:",(repr(serial_buffer))
        # if there is a new line in it, then create Line string
        if "\r\n" in serial_buffer:
            if DEBUG: print "ReadArduino:New Line:",(repr(serial_buffer))
            line = serial_buffer
            serial_buffer = "" # empty Serial buffer
        serial_data = arduino.read()
        # if there is a Line string then finish reading the Line
        if line:
                # strip string for unwanted characters
                line = line.replace("\r\n", "")
                arduino_out = line
                if DEBUG: print "ReadArduino:arduino_out:", arduino_out
                line = ""
                if arduino_out == "": arduino_out = None
                # add the last character to the new buffer
                serial_buffer += serial_data
                return arduino_out

#Report Udoo Neo Arduino Sensor data to Thingspeak Channel
def writesensordata():
    global temp, temp_str
    while True:
        #read arduino data and make it a integer value
        temp_str = ReadArduino(temp_str)
        if temp_str is None:
            temp_str = '0'
        temp = int(temp_str)
        params = urllib.urlencode({'field1': temp, 'key':key })
        headers = {"Content-typZZe": "application/x-www-form-urlencoded","Accept": "text/plain"}
        conn = httplib.HTTPConnection("api.thingspeak.com:80")
        try:
            conn.request("POST", "/update", params, headers)
            response = conn.getresponse()
            print temp
            print response.status, response.reason
            data = response.read()
            conn.close()
        except:
            print "connection failed"
        break
#sleep for desired amount of time
if __name__ == "__main__":
        while True:
                writesensordata()
                time.sleep(sleep)

Step 4: Create Arduino sketch for reading sensor and sending it to Serial
Use the following code to read an Arduino analog (temperature) sensor on pin A0 and send it to serial (see also https://www.arduino.cc/en/Tutorial/AnalogReadSerial for more info). I modified the code a bit to slow down the read frequency and to be sure the data is send to the Linux side of the Neo.
Copy the code in a new sketch (as a start use the IDE on the Neo) and save it. Compile and upload it to the Arduino side of the Neo.
You can check the results of this sketch with the Serial Monitor of the Arduino IDE.
You first have to send a character to the Arduino in order to get the sensor data displayed (every 16 seconds). Be sure the Python program is not running, else you will get a reading conflict of the /dev/ttytMCC serial device.

void setup() {
  // initialize serial communication:
  Serial.begin(115200);
  delay(100);
  pinMode(13, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  while ( Serial.available() > 0 ) {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  // print out the value you read:
  digitalWrite(13, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);  // wait for a second.
  Serial.println(sensorValue); // If LED stays high longer you have serial timeout
  digitalWrite(13, LOW);  // turn the LED off by making the voltage LOW
  delay(10000);  // wait for a 10 seconds to prevent buffer overflow
  }
}

Step 5: Check your Thingspeak channel and confirm data transfer
Be sure the Python program and the Arduino sketch are running.
Open your Thingspeak channel and you should see the temperature uploading into Thingspeak website.

You can check my data here: https://thingspeak.com/channels/144274
I did not change the value of the sensor so this is a very straight line :)
You can download the values and there is an update every 16 seconds:
2016-08-10 23:22:00 UTC,12,685
2016-08-10 23:22:17 UTC,13,684
2016-08-10 23:22:33 UTC,14,685
2016-08-10 23:22:49 UTC,15,684
2016-08-10 23:23:06 UTC,16,684
2016-08-10 23:23:22 UTC,17,685

Step 6: Read multiple sensors and send to Thingspeak
If you have more sensors you can send all data in one string (use Serial.print() and end with a Serial.println() ) to the A9 and split this string into multiple values again in Python.
I will add an example for that later.

References
Use Neo as a headless IoT Device
UDOO NEO Serial Communication Examples
Python programming for beginners

Disclaimer: I am not a programmer, just a computer enthusiast. The code provided is tested but is not guaranteed to be the best in class. :) The code and How To is written for beginners to give a start in using the Neo. At the moment this How To is work in progress so updates are foreseen.

Originally written by: waltervl

If you got any question, suggestion or idea, just visit our forum and comment the following topic: https://www.udoo.org/forum/threads/how-to-make-udoo-neo-an-iot-gateway-of-sensors.6103/#post-23911

By:
0 Flares Twitter 0 Facebook 0 Google+ 0 LinkedIn 0 Pin It Share 0 Filament.io 0 Flares ×