Bird
Raised Fist0
Raspberry Piprogramming~20 mins

Reading sensor data over I2C in Raspberry Pi - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
I2C Sensor Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
What is the output of this I2C sensor read code?
Consider this Python code snippet running on a Raspberry Pi to read 2 bytes from an I2C sensor at address 0x48. What will be printed?
Raspberry Pi
import smbus
bus = smbus.SMBus(1)
address = 0x48
raw = bus.read_i2c_block_data(address, 0, 2)
value = (raw[0] << 8) | raw[1]
print(value)
AAn integer between 0 and 65535 representing the sensor data
BA list of two integers representing the raw bytes read
CA TypeError because read_i2c_block_data returns a string
DA runtime IOError because the sensor address is invalid
Attempts:
2 left
💡 Hint
The read_i2c_block_data returns a list of integers representing bytes.
🧠 Conceptual
intermediate
1:00remaining
Which I2C bus number should you use on Raspberry Pi 4?
On a Raspberry Pi 4, which bus number corresponds to the default I2C pins (SDA, SCL) you should use in smbus.SMBus()?
A3
B0
C2
D1
Attempts:
2 left
💡 Hint
The default I2C bus on Raspberry Pi models after version 1 is bus 1.
🔧 Debug
advanced
2:00remaining
Why does this I2C read code raise an IOError?
This code snippet raises an IOError when run on Raspberry Pi. What is the most likely cause? import smbus bus = smbus.SMBus(1) address = 0x50 data = bus.read_byte(address) print(data)
AThe bus number 1 is invalid on Raspberry Pi
BThe sensor at address 0x50 is not connected or powered on
Cread_byte requires a command argument which is missing
DThe address 0x50 is reserved and cannot be used
Attempts:
2 left
💡 Hint
IOError usually means no device responded at that address.
📝 Syntax
advanced
2:30remaining
Which option correctly reads a signed 16-bit value from I2C sensor?
You want to read a signed 16-bit integer from an I2C sensor at address 0x40 using smbus. Which code snippet correctly converts the two bytes to a signed integer?
Raspberry Pi
import smbus
bus = smbus.SMBus(1)
address = 0x40
raw = bus.read_i2c_block_data(address, 0, 2)
A
value = (raw[1] &lt;&lt; 8) | raw[0]
if value &gt; 32767:
    value -= 65536
B
value = raw[0] + (raw[1] &lt;&lt; 8)
if value &gt; 32767:
    value -= 65536
C
value = (raw[0] &lt;&lt; 8) | raw[1]
if value &gt; 32767:
    value -= 65536
D
value = (raw[0] &lt;&lt; 8) + raw[1]
if value &gt; 32767:
    value -= 65536
Attempts:
2 left
💡 Hint
The sensor sends high byte first, then low byte. Use parentheses carefully.
🚀 Application
expert
2:00remaining
How many bytes will this I2C read return?
You run this code on Raspberry Pi to read data from an I2C sensor: import smbus bus = smbus.SMBus(1) address = 0x68 count = 6 data = bus.read_i2c_block_data(address, 0x3B, count) print(len(data)) How many bytes will be printed?
A6
B5
C7
D0
Attempts:
2 left
💡 Hint
The count argument specifies how many bytes to read.

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