![]()
IoT Unlocked: Your Journey to Innovation Starts Now
![]()
IoT Unlocked: Your Journey to Innovation Starts Now

In this step-by-step guide on CSV Data Logger on Raspberry Pi Pico, on this project we captures the temperature readings from an onboard sensor, logs them to a CSV file along with timestamps, and reads back the logged data for analysis or monitoring.
This Sensor Data Logger project is perfect for beginners and enthusiasts alike, this guide will empower you to unlock the full potential of Raspberry Pi Pico in data logging and beyond. Join us to enhance your projects with precise, easy-to-manage sensor data logging capabilities!
The Raspberry Pi Pico is a tiny, fast, and versatile board built using the RP2040 microcontroller chip. With its low cost and high performance, it’s an ideal choice for various projects, including data logging. CSV (Comma-Separated Values) files are a straightforward file format used to store tabular data, making them perfect for logging sensor data over time.
To start, connect your Raspberry Pi Pico to your computer using the Micro-USB cable. If you haven’t already, you’ll need to install MicroPython onto your Pico. This can be done through the Thonny IDE, which offers an easy interface to install MicroPython directly.
You can go through: How To Get Started with Raspberry Pi Pico in 2024
First, we initialize the temperature sensor. The Raspberry Pi Pico doesn’t come with a dedicated temperature sensor but has an ADC (Analog to Digital Converter) that can be used to approximate the CPU temperature. This method is more about demonstrating the capability rather than obtaining precise environmental temperatures.
import machine
import time
import os
def read_temperature():
adc = machine.ADC(4) # Use ADC pin GP4
conversion_factor = 3.3 / (65535) # ADC conversion factor
sensor_value = adc.read_u16() * conversion_factor
temperature = 27 - (sensor_value - 0.706) / 0.001721 # Temperature conversion formula
return temperature
Next, we focus on the log_temperature function, which is responsible for creating a CSV file if it doesn’t exist and appending new temperature readings alongside their timestamps.
It involves checking if the file exists, creating it with a header if necessary, and then appending each new temperature reading with a timestamp. The code leverages the time.localtime() function to generate timestamps and formats them for readability.

This method allows for a structured and accessible way to log temperature data over time, providing a foundation for data analysis or monitoring applications.
def log_temperature():
file_name = "temperature_log.csv"
timestamp = time.localtime()
temperature = read_temperature()
timestamp_str = format_timestamp(timestamp)
# Check if CSV file exists, create it with a header if it doesn't
if not file_name in os.listdir():
with open(file_name, 'w') as file:
file.write('Timestamp,Temperature (°C)\n')
# Append temperature data to the CSV file
with open(file_name, 'a') as file:
file.write('{},{:.2f}\n'.format(timestamp_str, temperature))
The format_timestamp function neatly formats the timestamp into a human-readable string for easier analysis.
def format_timestamp(timestamp):
year, month, day, hour, minute, second, *_ = timestamp
timestamp_str = "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(year, month, day, hour, minute, second)
return timestamp_str
For analyzing or simply checking the logged data, the read_temperature_log function reads the CSV file, skipping the header, and parses each line to collect timestamps and temperature readings.
def read_temperature_log():
file_name = "temperature_log.csv"
temperature_data = []
if file_name in os.listdir():
with open(file_name, 'r') as file:
next(file) # Skip header
for line in file:
parts = line.strip().split(',')
if len(parts) >= 2:
timestamp = parts[0].strip('(') # Clean up timestamp
temperature = float(parts[1])
temperature_data.append((timestamp, temperature))
else:
print("Invalid line:", line)
return temperature_data
Finally, the script demonstrates a simple loop where temperature readings are logged every 2 seconds, up to 5 readings, after which the logged data is printed out before resetting the counter and repeating the process.
counter = 0
while True:
counter += 1
if counter <= 5:
log_temperature()
else:
print(read_temperature_log())
counter = 0
time.sleep(2)
You can check out this GitHub Gist or copy from below code snippet:
import machine
import time
import os
# Function to read temperature sensor
def read_temperature():
adc = machine.ADC(4) # Use ADC pin GP4
conversion_factor = 3.3 / (65535) # ADC conversion factor
sensor_value = adc.read_u16() * conversion_factor
temperature = 27 - (sensor_value - 0.706) / 0.001721 # Convert sensor value to temperature (formula may vary)
return temperature
# Function to log temperature data to CSV file
def log_temperature():
file_name = "temperature_log.csv"
timestamp = time.localtime()
temperature = read_temperature()
print(temperature)
timestamp_str = format_timestamp(timestamp)
# Check if CSV file exists, if not create it with header
if not file_name in os.listdir():
with open(file_name, 'w') as file:
file.write('Timestamp,Temperature (°C)\n')
# Append temperature data to CSV file
with open(file_name, 'a') as file:
file.write('{},{:.2f}\n'.format(timestamp_str, temperature))
def format_timestamp(timestamp):
year, month, day, hour, minute, second, *_ = timestamp
timestamp_str = "{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}".format(year, month, day, hour, minute, second)
return timestamp_str
# Function to read temperature data from CSV file
def read_temperature_log():
file_name = "temperature_log.csv"
temperature_data = []
# Check if CSV file exists
if file_name in os.listdir():
with open(file_name, 'r') as file:
# Skip header line
next(file)
# Read each line and parse data
for line in file:
parts = line.strip().split(',')
if len(parts) >= 2:
timestamp = parts[0].strip('(') # Remove any extra characters from the timestamp
temperature = float(parts[1])
temperature_data.append((timestamp, temperature))
else:
print("Invalid line:", line)
return temperature_data
counter = 0
# Example usage: Log temperature every 5 seconds
while True:
counter += 1
if counter <=5:
log_temperature()
else:
print(read_temperature_log())
counter = 0
time.sleep(2)
This temperature logging project is a great starting point for anyone looking to get hands-on with the Raspberry Pi Pico and delve into data logging and sensor reading. With this foundation, you can expand the project by integrating different sensors, enhancing the data logging capabilities, or even setting up a web server to monitor the readings in real time. Happy coding!
While the onboard sensor of Raspberry Pi Pico provides approximate temperature readings, for more precise measurements, consider calibrating the sensor or using external sensors with higher accuracy.
You can export the CSV data to popular data analysis tools like Python’s Pandas or Matplotlib libraries to visualize the temperature trends over time in interactive graphs or charts.
Yes, by incorporating conditional statements into the code, you can trigger alerts or notifications when temperature readings exceed predefined thresholds. This functionality can be useful for early warning systems or remote monitoring applications.
Raspberry Pi Pico doesn’t have a dedicated temperature sensor. Instead, it uses the onboard ADC (Analog to Digital Converter) to approximate the CPU temperature. This method converts the analog temperature signal into a digital value that can be read by the microcontroller.
Yes, you can adjust the time.sleep() function in the code to control the logging interval. For example, setting time.sleep(60) would log temperature data every 60 seconds, while time.sleep(3600) would log data every hour.
Read also: How to Build Your Own Web Server on Raspberry Pi Pico W and Phew: A Step-by-Step Guide