Bird
0
0
Raspberry Piprogramming~20 mins

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

Choose your learning style9 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.