Summary: Getting the arduino to read the temperature

My Arduino has been sitting on my desk for some time and I thought it was about time to get it working again. I figured I would get it to do something simple: read the temperature from an LM35 sensor.

My setup consists of:

  1. An Arduino Duemilenove,
  2. An LM35 connected to the Arduino
  3. A Computer running Linux Mint,
  4. An account at ThingSpeak for storing and plotting the data.

The Arduino

To get the temperature reading from the LM35 I programmed the arduino to:

  1. Read from the analog port (A0).
  2. Convert the 0-1023 (10bit) to a value between 0 and 5V (Vsupply).
  3. Convert that voltage to temperature based on the LM35 outputing 10mV/C.
    /* Reads the voltage output from an LM35
    and converts the voltage to a temperature C.
    The analog input: 0 - 1023
    Vs: 5V
    LM35 output: 10mV/C
    */

    int inputPin = A0;     // LM35 output connected to Analog pin0
    int inputValue = 0;    // analog sensor value 0 to 1023
    float temperature = 0; //initialize temperature variable
    char tempValue[]="";

    void setup() {
      // inputPin is an INPUT
      pinMode(inputPin, INPUT);  
      Serial.begin(9600);

    }

    void loop() {
      // read the voltage from the LM35
      inputValue = analogRead(inputPin);

      //map the analog reading of the LM35 based on a Vs: 5V and Vin: 10mV/C
      temperature=(float(inputValue)/1023.0)*500.0;
      //print to USB
      Serial.print("Temperature: ");
      Serial.println(temperature,1);

    }

The output from the Arduino looks like:

    Temperature: 25

Read the Arduino output and send to ThingSpeak

The output from the Arduino was read by a python script on my laptop. It received the temperature from the Arduino and then posted it to my account at ThingSpeak. You could just as easily write the temperatures to a file, but I like how easy it is to get a nice chart from ThingSpeak.

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    #

    import serial
    import re
    import requests
    import ConfigParser

    def sendToThingSpeak(temperature, api_key):
        Parameters={"key":api_key, "field1":temperature.group(1)}
        response=requests.post("https://api.thingspeak.com/update", params=Parameters)
        return (response)


    print "Starting ..."
    config = ConfigParser.ConfigParser()
    config.read('config.cfg')
    api_key = config.get('default','api_key')

    #Search pattern for the temperature value
    dataForm = r'Temperature: (\d+\.\d*)'
    repeat = True

    #set up the USB port
    print "Setting up serial ..."
    ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=None)

    while(repeat):
    #read in the temperature from the Arduino
        dataLine=ser.readline()

        if dataLine: #if the reading was successful
            temperature=re.search(dataForm,dataLine) #extract the temperature from the reading
            if temperature:
                print temperature.group(1)
                repeat=False
                response = sendToThingSpeak(temperature, api_key)
                print response
    serial.close()

And the config.cfg file is just

    [default]
    api_key:your thingspeak key

I used crontab to run the python script every 20 minutes. Since I used a config file to keep my api_key I had to get crontab cd into the python scripts directory then run the script. As well since the script prints output, the output needs to be directed to a log file.

crontab

    */20 * * * * cd path/to/python/script.py %% ./pythonscript.py >> script.log

I then can call the chart from thingspeak and place it on my page using

    <iframe width="620" height="370" style="border: 1px solid #cccccc;" src="https://thingspeak.com/channels/8220/charts/1?width=600&height=350&results=20"></iframe>

The values are then plotted using the ThingSpeaks chart api.