Bird
Raised Fist0
Raspberry Piprogramming~10 mins

Reading sensor data over I2C in Raspberry Pi - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Reading sensor data over I2C
Start
↓
Initialize I2C bus
↓
Set sensor address
↓
Send read command
↓
Read data bytes
↓
Process data
↓
Use or display data
↓
End or repeat
This flow shows how a Raspberry Pi talks to a sensor using I2C: start, set up bus, send command, read data, then use it.
Execution Sample
Raspberry Pi
import smbus
bus = smbus.SMBus(1)
sensor_addr = 0x48
data = bus.read_byte_data(sensor_addr, 0x00)
print(f"Sensor data: {data}")
This code reads one byte from a sensor at address 0x48 and prints it.
Execution Table
StepActionI2C Bus StateSensor AddressData ReadOutput
1Import smbus moduleNot initialized---
2Initialize I2C bus 1Bus 1 ready---
3Set sensor address to 0x48Bus 1 ready0x48--
4Send read command to register 0x00Bus 1 ready0x48--
5Read one byte from sensorBus 1 ready0x4872-
6Print sensor dataBus 1 ready0x4872Sensor data: 72
💡 Data read and printed; program ends or can repeat to read again.
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 5Final
busNoneSMBus(1) objectSMBus(1) objectSMBus(1) objectSMBus(1) object
sensor_addrNoneNone0x480x480x48
dataNoneNoneNone7272
Key Moments - 3 Insights
Why do we initialize the bus with smbus.SMBus(1)?
The number 1 selects the I2C bus on Raspberry Pi (usually bus 1). This is shown in execution_table step 2 where the bus becomes ready.
What does the sensor address 0x48 mean?
It is the unique I2C address of the sensor device. In step 3, we set this address so the bus knows where to send commands.
Why do we read from register 0x00?
Register 0x00 is often the data register in sensors. Step 4 sends the read command to this register to get the sensor value.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of 'data' after step 5?
A0x48
B72
CNone
D1
💡 Hint
Check the 'Data Read' column at step 5 in the execution_table.
At which step is the I2C bus initialized?
AStep 2
BStep 1
CStep 3
DStep 4
💡 Hint
Look at the 'Action' column for bus initialization in the execution_table.
If the sensor address changed to 0x49, which execution_table step would change?
AStep 3 only
BStep 5 only
CSteps 3 and 5
DNo steps change
💡 Hint
Sensor address is set at step 3 and used at step 5 in the execution_table.
Concept Snapshot
Reading sensor data over I2C on Raspberry Pi:
- Import smbus and create bus with smbus.SMBus(1)
- Set sensor I2C address (e.g., 0x48)
- Use bus.read_byte_data(address, register) to read data
- Process or print the data
- Repeat as needed for continuous reading
Full Transcript
This example shows how a Raspberry Pi reads data from a sensor using the I2C protocol. First, the smbus module is imported and the I2C bus 1 is initialized. Then, the sensor's I2C address is set to 0x48. A read command is sent to register 0x00 of the sensor. One byte of data is read from the sensor and stored in the variable 'data'. Finally, the data is printed to the screen. The execution table traces each step, showing the bus state, sensor address, data read, and output. Variables change as the program runs, with 'data' holding the sensor value after reading. Key moments clarify why bus 1 is used, what the sensor address means, and why register 0x00 is read. The visual quiz tests understanding of these steps. This process can be repeated to continuously read sensor data.

Practice

(1/5)
1. What is the main purpose of using the I2C protocol on a Raspberry Pi when working with sensors?
easy
A. To communicate with multiple sensors using unique addresses
B. To increase the Raspberry Pi's processing speed
C. To power the sensors directly from the Raspberry Pi
D. To store sensor data permanently on the Raspberry Pi

Solution

  1. Step 1: Understand I2C communication basics

    I2C allows multiple devices to connect using unique addresses on the same bus.
  2. Step 2: Identify the role of I2C with sensors

    The Raspberry Pi uses I2C to talk to sensors by addressing each one uniquely.
  3. Final Answer:

    To communicate with multiple sensors using unique addresses -> Option A
  4. Quick Check:

    I2C = Multiple devices, unique addresses [OK]
Hint: I2C uses addresses to talk to many devices [OK]
Common Mistakes:
  • Thinking I2C increases processing speed
  • Confusing communication with power supply
  • Assuming I2C stores data permanently
2. Which Python library is commonly used on Raspberry Pi to read data from an I2C sensor?
easy
A. pygame
B. smbus
C. matplotlib
D. requests

Solution

  1. Step 1: Recall common Python libraries for hardware

    For I2C communication on Raspberry Pi, the smbus library is standard.
  2. Step 2: Eliminate unrelated libraries

    pygame is for games, matplotlib for plotting, requests for web requests, so they don't fit.
  3. Final Answer:

    smbus -> Option B
  4. Quick Check:

    Python I2C library = smbus [OK]
Hint: Use smbus for I2C sensor communication [OK]
Common Mistakes:
  • Choosing pygame or matplotlib for sensor reading
  • Confusing web libraries with hardware libraries
3. Given this Python code snippet reading from an I2C sensor, what will be printed?
import smbus
bus = smbus.SMBus(1)
address = 0x48
value = bus.read_byte_data(address, 0x00)
print(value)
medium
A. The string 'value' printed literally
B. An error because SMBus(1) is invalid
C. The I2C address 0x48 printed as decimal
D. The byte value stored at register 0x00 of device 0x48

Solution

  1. Step 1: Understand the code's function

    The code reads one byte from register 0x00 of the device at I2C address 0x48.
  2. Step 2: Identify the output of print(value)

    It prints the numeric byte value read from that register, not the address or a string.
  3. Final Answer:

    The byte value stored at register 0x00 of device 0x48 -> Option D
  4. Quick Check:

    read_byte_data returns register byte value [OK]
Hint: read_byte_data reads register value, not address [OK]
Common Mistakes:
  • Thinking SMBus(1) is invalid (it's correct for Raspberry Pi)
  • Confusing address with data value
  • Expecting string output instead of number
4. What is wrong with this code snippet for reading I2C sensor data?
import smbus
bus = smbus.SMBus(0)
address = 0x40
data = bus.read_byte_data(address, 0x01)
print(data)
medium
A. read_byte_data requires three arguments, missing one
B. The address 0x40 is invalid for I2C devices
C. SMBus(0) is incorrect; Raspberry Pi usually uses bus 1
D. print(data) should be print(bus.read_byte_data)

Solution

  1. Step 1: Check SMBus bus number

    On Raspberry Pi, I2C bus 1 is standard; bus 0 is usually invalid or unused.
  2. Step 2: Verify other code parts

    Address 0x40 is valid, read_byte_data takes two arguments, and print(data) is correct.
  3. Final Answer:

    SMBus(0) is incorrect; Raspberry Pi usually uses bus 1 -> Option C
  4. Quick Check:

    Use SMBus(1) on Raspberry Pi [OK]
Hint: Use SMBus(1) for Raspberry Pi I2C bus [OK]
Common Mistakes:
  • Using SMBus(0) instead of SMBus(1)
  • Thinking I2C addresses like 0x40 are invalid
  • Misunderstanding read_byte_data arguments
5. You want to read temperature data from a sensor at I2C address 0x5A which stores temperature in two registers: 0x07 (MSB) and 0x08 (LSB). How do you correctly combine these bytes to get the temperature value in Python?
hard
A. temp = (bus.read_byte_data(0x5A, 0x07) << 8) | bus.read_byte_data(0x5A, 0x08)
B. temp = bus.read_byte_data(0x5A, 0x07) + bus.read_byte_data(0x5A, 0x08)
C. temp = bus.read_byte_data(0x5A, 0x08) << 8 | bus.read_byte_data(0x5A, 0x07)
D. temp = bus.read_byte_data(0x5A, 0x07) * bus.read_byte_data(0x5A, 0x08)

Solution

  1. Step 1: Understand byte order for temperature

    MSB is the high byte, so shift it left by 8 bits to make space for LSB.
  2. Step 2: Combine MSB and LSB correctly

    Use bitwise OR to combine shifted MSB with LSB for full 16-bit value.
  3. Final Answer:

    temp = (bus.read_byte_data(0x5A, 0x07) << 8) | bus.read_byte_data(0x5A, 0x08) -> Option A
  4. Quick Check:

    Combine MSB << 8 with LSB using OR [OK]
Hint: Shift MSB 8 bits left, OR with LSB to combine bytes [OK]
Common Mistakes:
  • Adding bytes instead of bitwise OR
  • Swapping MSB and LSB order
  • Multiplying bytes instead of combining bits
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard