The most popular electronic sensors use I2C to communicate. This is a 'shared bus' 2 wire protocol, you can have multiple sensors connected to the two SDA and SCL pins as long as they have unique addresses (check this guide for a list of many popular devices and their addresses)
Lets show how to wire up a popular BME280. This sensor provides temperature, barometric pressure and humidity data over I2C
We're going to do this in a lot more depth than our guide pages for each sensor, but the overall technique is basically identical for any and all I2C sensors.
Honestly, the hardest part of using I2C devices is figuring out the I2C address and which pin is SDA and which pin is SCL!

We recommend using a breadboard and some male-male wires.


Wiring
- Connect the Jetson Nano 3.3V power pin to Vin
- Connect the Jetson Nano GND pin to GND
- Connect the Jetson Nano SDA (#3) pin to the BME280 SDI
- Connect the Jetson Nano SCL (#5) pin to to the BME280 SCK
Double-check you have the right wires connected to the right location, it can be tough to keep track of header pins as there are forty of them!
After wiring, we recommend running I2C detection with i2cdetect -r -y 1
to verify that you see the device, in this case its address 77
Install the CircuitPython BME280 Library
OK onto the good stuff, you can now install the Adafruit BME280 CircuitPython library.
As of this writing, not all libraries are up on PyPI so you may want to search before trying to install. Look for circuitpython and then the driver you want.
(If you don't see it you can open up a github issue on circuitpython to remind us!)
Once you know the name, install it with
pip3 install adafruit-circuitpython-bme280
You'll notice we also installed a few other dependancies called spidev, adafruit-pureio, adafruit-circuitpython-busdevice and more. This is a great thing about pip, if you have other required libraries they'll get installed too!
We also recommend an adafruit-blinka update in case we've fixed bugs:
pip3 install --upgrade adafruit_blinka
Run that code!
The finish line is right up ahead. You can now run one of the (many in some cases) example scripts we've written for you.
Check out the examples for your library by visiting the repository for the library and looking in the example folder. In this case, it would be https://github.com/adafruit/Adafruit_CircuitPython_BME280/tree/master/examples
As of this writing there's only two examples. Here's the first one:
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT import time import board from adafruit_bme280 import basic as adafruit_bme280 # Create sensor object, using the board's default I2C bus. i2c = board.I2C() # uses board.SCL and board.SDA # i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c) # OR create sensor object, using the board's default SPI bus. # import digitalio # spi = board.SPI() # bme_cs = digitalio.DigitalInOut(board.D10) # bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, bme_cs) # change this to match the location's pressure (hPa) at sea level bme280.sea_level_pressure = 1013.25 while True: print("\nTemperature: %0.1f C" % bme280.temperature) print("Humidity: %0.1f %%" % bme280.relative_humidity) print("Pressure: %0.1f hPa" % bme280.pressure) print("Altitude = %0.2f meters" % bme280.altitude) time.sleep(2)
Save this code to your Jetson Nano by copying and pasting it into a text file, downloading it directly from the Jetson Nano, etc.
Then in your command line run
python3 bme280_simpletest.py
The code will loop with the sensor data until you quit with a Control-C
Here's the second example:
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-License-Identifier: MIT """ Example showing how the BME280 library can be used to set the various parameters supported by the sensor. Refer to the BME280 datasheet to understand what these parameters do """ import time import board import adafruit_bme280.advanced as adafruit_bme280 # Create sensor object, using the board's default I2C bus. i2c = board.I2C() # uses board.SCL and board.SDA # i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c) # OR create sensor object, using the board's default SPI bus. # SPI setup # import digitalio # spi = board.SPI() # bme_cs = digitalio.DigitalInOut(board.D10) # bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, bme_cs) # Change this to match the location's pressure (hPa) at sea level bme280.sea_level_pressure = 1013.25 bme280.mode = adafruit_bme280.MODE_NORMAL bme280.standby_period = adafruit_bme280.STANDBY_TC_500 bme280.iir_filter = adafruit_bme280.IIR_FILTER_X16 bme280.overscan_pressure = adafruit_bme280.OVERSCAN_X16 bme280.overscan_humidity = adafruit_bme280.OVERSCAN_X1 bme280.overscan_temperature = adafruit_bme280.OVERSCAN_X2 # The sensor will need a moment to gather initial readings time.sleep(1) while True: print("\nTemperature: %0.1f C" % bme280.temperature) print("Humidity: %0.1f %%" % bme280.relative_humidity) print("Pressure: %0.1f hPa" % bme280.pressure) print("Altitude = %0.2f meters" % bme280.altitude) time.sleep(2)
Save this code to your Jetson Nano by copying and pasting it into a text file, downloading it directly from the Jetson Nano, etc.
Then in your command line run
python3 bme280_normal_mode.py
The code will loop with the sensor data until you quit with a Control-C
That's it! Now if you want to read the documentation on the library, what each function does in depth, visit our readthedocs documentation at
https://circuitpython.readthedocs.io/projects/bme280/en/latest/
Page last edited January 22, 2025
Text editor powered by tinymce.