In this post, I’ll explain how to transmit time and temperature using a TMP36 sensor and an Arduino. The application that you will develop executes on an Arduino and transmits the time and temperature at a periodic rate of around 10 seconds across a Serial bus (e.g. USB) to a host computer (such as your personal laptop computer).
Requirements
Here are the requirements I created for this project:
- The system must execute on an Arduino.
- A temperature sensor connected to an Arduino must be calibrated.
- The main program must use a Round Robin with interrupts design:
- The temperature must be captured and converted to Fahrenheit.
- The temperature must begin recording after the temperature has stabilized at room temperature.
- The temperature must be recorded at a periodic rate of around 10 seconds (i.e. 10,000 milliseconds) at room temperature.
- The temperature must then be recorded for 5 minutes at a periodic rate of around 10 seconds inside a refrigerator.
- The temperature must then be recorded for 5 minutes at a periodic rate of around 10 seconds at room temperature.
- The time and temperature must be transmitted across a Serial bus such as USB to my host.
- The time and temperature data must be exported as a comma separated value file.
- The comma separated value file must be read into a spreadsheet program (e.g. Microsoft Excel).
- The temperature vs time must be plotted.
Hardware Design
The following components are used in this project. You will need:
Here is the diagram of the TMP36 temperature sensor:

Here is the diagram of the hardware setup:


Here are the steps for setting up the hardware of the Serial Transmit of Temperature system:
- Step 1. Place the TMP36 sensor on the breadboard. Each lead of the sensor will be on a different rail section of the breadboard.
- Step 2. Connect a jumper wire between the ground lead of the TMP36 sensor and the – rail of the breadboard.
- Step 3. Connect a jumper wire between the – rail of the breadboard and the GND pin of the Arduino.
- Step 4. Connect a jumper wire between the 5V pin of the Arduino and the + rail of the breadboard.
- Step 5. Connect a jumper wire between + rail of the breadboard and the 5V lead of the TMP36 sensor.
- Step 6. Connect a jumper wire between the middle output lead of the TMP36 sensor and the Analog 0 pin of the Arduino.


Here are the steps for calibrating the TMP36 sensor:
We will use the One Point Calibration technique using a known temperature, 32°F, which is the freezing point of water.
- Crush several ice cubes and place in a plastic bag with some distilled water (Ada 2015).
- Close the bag up, making sure it is tied tight.
- Make sure the bag is completely dry on the outside and place it on top of the TMP36 sensor.
- Adjust temperature accordingly to calibrate.
Implementation
Here is the source code that you will need to load to your Arduino:
#include <TimerOne.h> // This TimerOne.h library handles time-based interrupts /** * In this program, we develop an application which executes on an Arduino * and transmits the time and temperature at a periodic rate of around 10 * seconds across a Serial bus (USB) to the Host. * * Uses the timer interrupts technique discussed on page 270 in * "Exploring Arduino: Tools and Techniques for Engineering Wizardry" * by Jeremy Blum * * @version 7.0 2019-02-14 * @author Addison Sears-Collins */ // Assign a name to the TMP36 sensor pin on the Arduino Uno const unsigned int TEMP_SENSOR_PIN = A0; // Flag used to stop the program bool done = false; // Used for capturing the time unsigned long time; // Used for capturing the temperature in Fahrenheit float temp_fahrenheit; /** * Function runs only once, after each powerup or reset of the Arduino Uno */ void setup() { // Open the serial port and set the data transmission rate to 9600 bits // per second. 9600 is the default baud rate for Arduino Uno. Serial.begin(9600); // Show a welcome message as human-readable ASCII text Serial.println("SERIAL TRASMIT OF TEMPERATURE PROGRAM"); Serial.println("This program transmits the time and temperature at a periodic"); Serial.println("rate of ~10 seconds across a Serial bus (USB) to the Host."); Serial.println("Created by Addison Sears-Collins"); Serial.println(""); Serial.println("Press ! to end the program"); Serial.println(""); Serial.println("Recording temperature every 10 seconds..."); Serial.println(""); Serial.println("TIME, TEMPERATURE IN DEGREES FAHRENHEIT"); // Interrupt: Set a timer of length 10000000 microseconds (10 seconds) Timer1.initialize(10000000); //Runs "isr_read_temperature" on each timer interrupt Timer1.attachInterrupt(isr_read_temperature); } /** * Main function */ void loop() { // Wait 100 seconds for temperature to stabilize // Temperature is being read in the background // via the interrupts delay(100000); while(!done) { // Display the time and temperature display_time_and_temperature(); // End program if sentinel is entered end_program(); // Display time and temperature every 10 seconds delay(10000); } // Do nothing while (true) {} } /** * This function is the interrupt service routine. * It reads the voltage and converts to degrees Fahrenheit */ void isr_read_temperature() { // Read the voltage of the TMP36 sensor int sensor_voltage = analogRead(TEMP_SENSOR_PIN); // Calibrated. Equation taken from datasheet. // http://kookye.com/wp-content/uploads/samplecode/tempsensor.txt temp_fahrenheit = 5.1 + ((125 * sensor_voltage) >> 8); } /** * Function displays the time and temperature */ void display_time_and_temperature() { // Capture the time and covert to seconds time = millis() / 1000; // Display the time Serial.print(time); Serial.print(" , "); // Println so the next line begins on a new line // Display the temperature in Fahrenheit Serial.println(temp_fahrenheit); } /** * This function ends the program */ void end_program() { // Used for reading data from the serial monitor char ch; // Check to see if ! is available to be read if (Serial.available()) { // Read the character // Serial.read() returns the first (oldest) character in the buffer // and removes that byte of data from the buffer ch = Serial.read(); // End the program if an exclamation point is entered in the // serial monitor if (ch == '!') { done = true; Serial.println("Finished recording temperature. Goodbye."); } } }
