We use I2C to talk to sensors and get their data easily. It helps the Raspberry Pi read information like temperature or light from small devices.
Reading sensor data over I2C in Raspberry Pi
import smbus bus = smbus.SMBus(1) # Use I2C bus 1 sensor_address = 0x48 # Sensor I2C address register = 0x00 # Register to read from # Read a byte from the sensor data = bus.read_byte_data(sensor_address, register)
bus = smbus.SMBus(1) opens the I2C bus number 1 on Raspberry Pi.
sensor_address is the unique address of your sensor on the I2C bus.
data = bus.read_byte_data(0x48, 0x00)
data = bus.read_word_data(0x48, 0x01)
bus.write_byte_data(0x48, 0x01, 0x60)
This program reads temperature data from a TMP102 sensor connected via I2C. It reads raw data, adjusts byte order, converts it to Celsius, and prints it every 2 seconds.
import smbus import time # Initialize I2C bus bus = smbus.SMBus(1) # Sensor I2C address (example: TMP102 temperature sensor) sensor_address = 0x48 # Register to read temperature data temp_register = 0x00 while True: # Read two bytes from temperature register raw = bus.read_word_data(sensor_address, temp_register) # Swap bytes because sensor sends data in big endian swapped = ((raw << 8) & 0xFF00) + (raw >> 8) # Convert to temperature (TMP102 specific formula) temp_c = (swapped >> 4) * 0.0625 print(f"Temperature: {temp_c:.2f} °C") time.sleep(2)
Make sure I2C is enabled on your Raspberry Pi using raspi-config.
Use the command i2cdetect -y 1 in terminal to find your sensor's address.
Different sensors may require different ways to convert raw data to meaningful values.
I2C lets Raspberry Pi talk to sensors using addresses and registers.
Use smbus library to read and write data over I2C.
Always check your sensor's datasheet for correct addresses and data formats.
Practice
Solution
Step 1: Understand I2C communication basics
I2C allows multiple devices to connect using unique addresses on the same bus.Step 2: Identify the role of I2C with sensors
The Raspberry Pi uses I2C to talk to sensors by addressing each one uniquely.Final Answer:
To communicate with multiple sensors using unique addresses -> Option AQuick Check:
I2C = Multiple devices, unique addresses [OK]
- Thinking I2C increases processing speed
- Confusing communication with power supply
- Assuming I2C stores data permanently
Solution
Step 1: Recall common Python libraries for hardware
For I2C communication on Raspberry Pi, the smbus library is standard.Step 2: Eliminate unrelated libraries
pygame is for games, matplotlib for plotting, requests for web requests, so they don't fit.Final Answer:
smbus -> Option BQuick Check:
Python I2C library = smbus [OK]
- Choosing pygame or matplotlib for sensor reading
- Confusing web libraries with hardware libraries
import smbus bus = smbus.SMBus(1) address = 0x48 value = bus.read_byte_data(address, 0x00) print(value)
Solution
Step 1: Understand the code's function
The code reads one byte from register 0x00 of the device at I2C address 0x48.Step 2: Identify the output of print(value)
It prints the numeric byte value read from that register, not the address or a string.Final Answer:
The byte value stored at register 0x00 of device 0x48 -> Option DQuick Check:
read_byte_data returns register byte value [OK]
- Thinking SMBus(1) is invalid (it's correct for Raspberry Pi)
- Confusing address with data value
- Expecting string output instead of number
import smbus bus = smbus.SMBus(0) address = 0x40 data = bus.read_byte_data(address, 0x01) print(data)
Solution
Step 1: Check SMBus bus number
On Raspberry Pi, I2C bus 1 is standard; bus 0 is usually invalid or unused.Step 2: Verify other code parts
Address 0x40 is valid, read_byte_data takes two arguments, and print(data) is correct.Final Answer:
SMBus(0) is incorrect; Raspberry Pi usually uses bus 1 -> Option CQuick Check:
Use SMBus(1) on Raspberry Pi [OK]
- Using SMBus(0) instead of SMBus(1)
- Thinking I2C addresses like 0x40 are invalid
- Misunderstanding read_byte_data arguments
Solution
Step 1: Understand byte order for temperature
MSB is the high byte, so shift it left by 8 bits to make space for LSB.Step 2: Combine MSB and LSB correctly
Use bitwise OR to combine shifted MSB with LSB for full 16-bit value.Final Answer:
temp = (bus.read_byte_data(0x5A, 0x07) << 8) | bus.read_byte_data(0x5A, 0x08) -> Option AQuick Check:
Combine MSB << 8 with LSB using OR [OK]
- Adding bytes instead of bitwise OR
- Swapping MSB and LSB order
- Multiplying bytes instead of combining bits
Ready to prove it?
Pass the test and this pattern moves unknown
