Bird
Raised Fist0
Raspberry Piprogramming~20 mins

Reading analog sensors through ADC in Raspberry Pi - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
ADC Mastery Badge
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Reading ADC value with MCP3008
What is the output of this code snippet that reads channel 0 from an MCP3008 ADC connected to a Raspberry Pi?
Raspberry Pi
import spidev
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1350000

def read_adc(channel):
    adc = spi.xfer2([1, (8 + channel) << 4, 0])
    data = ((adc[1] & 3) << 8) + adc[2]
    return data

value = read_adc(0)
print(value)
AA list of three integers representing raw SPI bytes
BAn integer between 0 and 1023 representing the analog value
CA string describing the ADC channel
DA runtime error due to incorrect SPI usage
Attempts:
2 left
💡 Hint
The MCP3008 ADC returns a 10-bit value from 0 to 1023 for each channel.
🧠 Conceptual
intermediate
1:00remaining
Understanding ADC resolution
If an ADC has a 12-bit resolution, what is the maximum integer value it can output?
A1023
B8191
C2047
D4095
Attempts:
2 left
💡 Hint
The maximum value is 2^bits - 1.
🔧 Debug
advanced
2:00remaining
Fixing incorrect SPI data reading
What error does this code produce when trying to read from MCP3008? import spidev spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1350000 def read_adc(channel): adc = spi.xfer2([1, 8 + channel << 4, 0]) data = ((adc[1] & 3) << 8) + adc[2] return data print(read_adc(0))
AWrong output because of operator precedence error
BTypeError because of wrong data type in SPI transfer
CSyntaxError due to missing parentheses
DNo error, correct output
Attempts:
2 left
💡 Hint
Check how the bit shift and addition are grouped in the list argument.
📝 Syntax
advanced
1:30remaining
Identify the syntax error in ADC reading function
Which option contains a syntax error in this ADC reading function?
Raspberry Pi
def read_adc(channel):
    adc = spi.xfer2([1, (8 + channel) << 4, 0])
    data = ((adc[1] & 3) << 8) + adc[2]
    return data
A
atad nruter    
]2[cda + )8 &lt;&lt; )3 &amp; ]1[cda(( = atad    
)]0 ,4 &lt;&lt; )lennahc + 8( ,1[(2refx.ips = cda    
:)lennahc(cda_daer fed
B
def read_adc(channel):
    adc = spi.xfer2([1, (8 + channel) &lt;&lt; 4, 0])
    data = ((adc[1] &amp; 3) &lt;&lt; 8) + adc[2]
    return data
C
def read_adc(channel)
    adc = spi.xfer2([1, (8 + channel) &lt;&lt; 4, 0])
    data = ((adc[1] &amp; 3) &lt;&lt; 8) + adc[2]
    return data
D
ef read_adc(channel):
    adc = spi.xfer2([1, (8 + channel) &lt;&lt; 4, 0])
    data = ((adc[1] &amp; 3) &lt;&lt; 8) + adc[2]
    return data
Attempts:
2 left
💡 Hint
Check the function definition line for missing colon.
🚀 Application
expert
2:00remaining
Calculating voltage from ADC reading
Given a 10-bit ADC (0-1023) with a 3.3V reference, what is the voltage value for an ADC reading of 512?
A1.65 V
B3.3 V
C2.56 V
D0.66 V
Attempts:
2 left
💡 Hint
Voltage = (ADC reading / max ADC value) * reference voltage.

Practice

(1/5)
1. Why do we need an ADC (Analog-to-Digital Converter) like MCP3008 when using a Raspberry Pi to read sensors?
easy
A. Because Raspberry Pi cannot read analog signals directly
B. Because Raspberry Pi has no USB ports
C. Because Raspberry Pi cannot connect to Wi-Fi
D. Because Raspberry Pi does not support Python

Solution

  1. Step 1: Understand Raspberry Pi's input capabilities

    The Raspberry Pi's GPIO pins can only read digital signals (on/off), not analog voltages.
  2. Step 2: Role of ADC

    An ADC like MCP3008 converts analog voltages from sensors into digital numbers the Pi can read.
  3. Final Answer:

    Because Raspberry Pi cannot read analog signals directly -> Option A
  4. Quick Check:

    ADC needed for analog input = Because Raspberry Pi cannot read analog signals directly [OK]
Hint: Remember: Pi reads digital only, ADC converts analog to digital [OK]
Common Mistakes:
  • Thinking Pi can read analog signals directly
  • Confusing ADC with Wi-Fi or USB functions
  • Assuming Python support relates to ADC
2. Which of the following is the correct way to call a function named read_adc to read from channel 2?
easy
A. read_adc[channel=2]
B. read_adc{2}
C. read_adc(2)
D. read_adc 2

Solution

  1. Step 1: Understand Python function call syntax

    Functions are called with parentheses and arguments inside, e.g., function_name(argument).
  2. Step 2: Apply to read_adc function

    To read channel 2, call read_adc(2). Other options use invalid syntax.
  3. Final Answer:

    read_adc(2) -> Option C
  4. Quick Check:

    Function call uses parentheses = read_adc(2) [OK]
Hint: Use parentheses for function calls in Python [OK]
Common Mistakes:
  • Using square brackets instead of parentheses
  • Using curly braces instead of parentheses
  • Omitting parentheses entirely
3. What will be the output of this code snippet reading from channel 0 if the sensor voltage corresponds to a digital value of 512?
value = read_adc(0)
print(value)
medium
A. Error
B. 0
C. 1023
D. 512

Solution

  1. Step 1: Understand ADC output range

    MCP3008 outputs values from 0 to 1023 representing 0V to max voltage.
  2. Step 2: Given sensor voltage corresponds to 512

    Calling read_adc(0) returns the digital value 512, which is printed.
  3. Final Answer:

    512 -> Option D
  4. Quick Check:

    ADC value matches sensor voltage = 512 [OK]
Hint: ADC returns 0-1023 values; print shows that number [OK]
Common Mistakes:
  • Assuming output is voltage instead of digital number
  • Expecting max value 1023 always
  • Thinking code causes error
4. Identify the error in this code snippet that reads from channel 1:
def read_sensor():
    value = read_adc[1]
    return value

print(read_sensor())
medium
A. Incorrect print syntax
B. Using square brackets instead of parentheses to call read_adc
C. Missing return statement in function
D. Function name is invalid

Solution

  1. Step 1: Check function call syntax inside read_sensor

    The code uses read_adc[1], which is invalid syntax for calling a function.
  2. Step 2: Correct syntax for function call

    It should be read_adc(1) with parentheses to call the function.
  3. Final Answer:

    Using square brackets instead of parentheses to call read_adc -> Option B
  4. Quick Check:

    Function calls need parentheses = Using square brackets instead of parentheses to call read_adc [OK]
Hint: Use parentheses, not brackets, to call functions [OK]
Common Mistakes:
  • Using brackets [] instead of parentheses ()
  • Forgetting to return value
  • Misusing print statement
5. You want to read analog values from 4 sensors connected to channels 0 to 3 using MCP3008 and store them in a dictionary with keys as channel numbers. Which code snippet correctly does this?
hard
A. values = {ch: read_adc(ch) for ch in range(4)}
B. values = [read_adc(ch) for ch in range(1,4)]
C. values = {read_adc(ch): ch for ch in range(4)}
D. values = dict(read_adc(ch) for ch in range(4))

Solution

  1. Step 1: Understand the goal

    We want a dictionary with keys as channel numbers (0 to 3) and values as readings from read_adc.
  2. Step 2: Analyze each option

    values = {ch: read_adc(ch) for ch in range(4)} uses dictionary comprehension correctly: keys are channels, values are readings. values = [read_adc(ch) for ch in range(1,4)] creates a list, not a dictionary. values = {read_adc(ch): ch for ch in range(4)} swaps keys and values incorrectly. values = dict(read_adc(ch) for ch in range(4)) tries to create dict from generator of values only, causing error.
  3. Final Answer:

    values = {ch: read_adc(ch) for ch in range(4)} -> Option A
  4. Quick Check:

    Dict comprehension with channel keys = values = {ch: read_adc(ch) for ch in range(4)} [OK]
Hint: Use dict comprehension: {key: value for key in range} [OK]
Common Mistakes:
  • Using list instead of dict for key-value pairs
  • Swapping keys and values in dict comprehension
  • Passing wrong arguments to dict() constructor
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