Using a TMP36 sensor with micro:bit

Every maker has their favourite sensor, board, component.

For me the humble L298N is my motor controller of choice, the DS18B20 for temperature sensing, and IR obstacle sensor for simple input.

But recently I stumbled upon the TMP36, another temperature sensor, but this is an analogue sensor. Meaning that the output of the sensor is a voltage, rather than a string of data, in the case of the DS18B20.
After having used the sensor with a Raspberry Pi, via an MCP3008 ADC. I wondered if I could use it with micro:bit and the micro Python language.

So here goes.

Hardware

alt The circuit for the project is really simple. We just connect the 3V and GND from the micro:bit to the sensor. Then we connect the middle output pin of the TMP36 to pin0 of the micro:bit.

alt Connecting the TMP36 with croc clips is possible, but be careful that the pins/clips don't touch each other.

alt I'm lucky enough to have a Proto-Pic exhi:bit provided by CPC for a future micro:bit expansion board mega test that I am working on.

Now plug in the micro USB lead to your micro:bit, and then connect it to your computer, where it should appear as a USB flash drive.

Software

alt Everyone who knows me, knows that I love Python so I coded this project using the mu editor

Code

To start, I imported all of the microbit library.

from microbit import *  

Then I created a while True loop which will continuously run the code inside of the loop. Remember the code inside the loop is now indented.

while True:  

Now we read the raw analog voltage which the output pin of our TMP36 is sending to pin0 of the micro:bit. Then we multiply that value by the output of 3300 (milivolts) divided by the number of analog steps that our micro:bit can read (0 to 1023).

    raw = pin0.read_analog() * (3000 / 1023.0)

To convert the values into something human readable, in this case the temperature in Celsius. We have to do a little more maths. We take 100 from the raw value, then divide it by 10, finally we subtract 40.

    temp_C = ((raw - 100.0) / 10) - 40.

Now in order to see the value, we print it to the Repl. But to keep the temperature values neat, we restrict them to 3 decimal places using round()

    print(round(temp_C,3))

Lastly we sleep for 1 second, before the loop repeats.

    sleep(1000)

Complete code listing

from microbit import *  
while True:  
    raw = pin0.read_analog() * (3000 / 1023.0)
    temp_C = ((raw - 100.0) / 10) - 40.0
    print(round(temp_C,3))
    sleep(1000)

Flash the code to your micro:bit!

alt Click on Flash, to send the code to your attached micro:bit. When ready click on Repl to see the temperature data scroll across the screen.

So what can I do with this?

If you have a few micro:bits then you could use the radio functionality to send temperature data to a central micro:bit which can then collate and act upon the data it receives.

Accuracy

The TMP36 can be around ±2°C so for any mission critical / scientific projects, this sensor is not highly accurate.