Bird
Raised Fist0
Embedded Cprogramming~10 mins

Sensor reading through ADC (temperature, light) in Embedded C - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to start the ADC conversion.

Embedded C
ADC_StartConversion([1]);
Drag options to blanks, or click blank then click option'
AADC0
BADC2
CADC3
DADC1
Attempts:
3 left
💡 Hint
Common Mistakes
Using the wrong ADC module like ADC1 or ADC2.
Forgetting to start the ADC conversion.
2fill in blank
medium

Complete the code to read the ADC value from the temperature sensor channel.

Embedded C
uint16_t tempValue = ADC_ReadChannel([1]);
Drag options to blanks, or click blank then click option'
A2
B3
C1
D0
Attempts:
3 left
💡 Hint
Common Mistakes
Reading from the wrong ADC channel.
Using an invalid channel number.
3fill in blank
hard

Fix the error in the code to convert ADC value to temperature in Celsius.

Embedded C
float temperatureC = ([1] * 330.0) / 1023.0;
Drag options to blanks, or click blank then click option'
AADC_Value
BtempValue
Cadc_reading
DsensorVal
Attempts:
3 left
💡 Hint
Common Mistakes
Using undefined variables like ADC_Value or adc_reading.
Forgetting to use the correct variable for conversion.
4fill in blank
hard

Fill both blanks to read light sensor value and convert it to voltage.

Embedded C
uint16_t lightRaw = ADC_ReadChannel([1]);
float lightVoltage = (lightRaw * [2]) / 1023.0;
Drag options to blanks, or click blank then click option'
A1
B3.3
C2
D5.0
Attempts:
3 left
💡 Hint
Common Mistakes
Using wrong ADC channel for light sensor.
Using incorrect reference voltage for conversion.
5fill in blank
hard

Fill all three blanks to create a dictionary mapping sensor names to their converted values.

Embedded C
float sensorValues[] = {temperatureC, lightVoltage};
const char* sensorNames[] = {"Temp", "Light"};
for(int [1] = 0; [1] < 2; [1]++) {
    printf("%s: %.2f\n", [2][[1]], [3][[1]]);
}
Drag options to blanks, or click blank then click option'
Ai
BsensorNames
CsensorValues
Dj
Attempts:
3 left
💡 Hint
Common Mistakes
Using wrong loop variable names.
Mixing up sensorNames and sensorValues arrays.

Practice

(1/5)
1. What is the main purpose of using an ADC (Analog-to-Digital Converter) in embedded systems when reading sensors like temperature or light?
ADC converts:
easy
A. Analog sensor signals into digital values the microcontroller can process
B. Digital signals into analog voltages for sensors
C. Temperature readings directly into Celsius values
D. Light intensity into sound signals

Solution

  1. Step 1: Understand ADC function

    ADC changes continuous analog signals from sensors into digital numbers.
  2. Step 2: Match function to options

    Only Analog sensor signals into digital values the microcontroller can process correctly describes converting analog sensor signals to digital values.
  3. Final Answer:

    Analog sensor signals into digital values the microcontroller can process -> Option A
  4. Quick Check:

    ADC converts analog to digital [OK]
Hint: Remember: ADC means Analog to Digital Converter [OK]
Common Mistakes:
  • Confusing ADC with DAC (Digital-to-Analog Converter)
  • Thinking ADC outputs temperature directly
  • Assuming ADC converts digital to analog
2. Which of the following is the correct way to start an ADC conversion on channel 3 in embedded C?
ADC_StartConversion(____);
easy
A. 3
B. "3"
C. channel3
D. ADC_Channel_3

Solution

  1. Step 1: Identify correct channel constant

    Embedded C ADC functions usually use predefined constants like ADC_Channel_3 for clarity.
  2. Step 2: Check options for proper syntax

    ADC_Channel_3 uses the correct constant; others are either raw numbers or strings, which are incorrect.
  3. Final Answer:

    ADC_Channel_3 -> Option D
  4. Quick Check:

    Use predefined channel constants [OK]
Hint: Use ADC_Channel_x constants, not raw numbers or strings [OK]
Common Mistakes:
  • Passing channel number as string
  • Using raw integers without constants
  • Using undefined variable names
3. Given this code snippet reading ADC value from a temperature sensor:
int adc_value = ADC_Read(ADC_Channel_1);
float voltage = (adc_value / 1023.0) * 5.0;
float temperature = (voltage - 0.5) * 100;
printf("Temp: %.1f C\n", temperature);

What will be the output if adc_value is 216?
medium
A. Temp: 60.0 C
B. Temp: 55.0 C
C. Temp: 55.5 C
D. Temp: 50.0 C

Solution

  1. Step 1: Compute voltage from adc_value

    voltage = (216 / 1023.0) * 5.0 ≈ 1.055 V
  2. Step 2: Compute temperature from voltage

    temperature = (1.055 - 0.5) * 100 = 55.5 °C
  3. Step 3: Format output with printf

    %.1f formats 55.5 as "55.5", so output is "Temp: 55.5 C"
  4. Final Answer:

    Temp: 55.5 C -> Option C
  5. Quick Check:

    (adc / 1023.0 * 5.0 - 0.5) * 100 ≈ 55.5 [OK]
Hint: Calculate voltage first, then apply temperature formula [OK]
Common Mistakes:
  • Using integer division instead of float
  • Forgetting to subtract 0.5V before multiplying
  • Mixing up ADC max value (1023) and voltage reference
4. Identify the error in this code snippet intended to read light sensor value and print voltage:
int adc_val = ADC_Read(ADC_Channel_2);
float voltage = adc_val / 1023 * 3.3;
printf("Voltage: %.2f V\n", voltage);
medium
A. Integer division causes voltage to be zero
B. printf format specifier should be %d instead of %f
C. Incorrect ADC channel used for light sensor
D. Missing semicolon after ADC_Read call

Solution

  1. Step 1: Analyze division operation

    adc_val and 1023 are integers, so adc_val / 1023 does integer division, which truncates to 0 if adc_val < 1023.
  2. Step 2: Effect on voltage calculation

    Integer division results in 0 or 1, so voltage becomes 0 or 3.3 incorrectly.
  3. Final Answer:

    Integer division causes voltage to be zero -> Option A
  4. Quick Check:

    Use float division to avoid zero voltage [OK]
Hint: Cast numerator or denominator to float before division [OK]
Common Mistakes:
  • Forgetting to cast to float
  • Assuming integer division works for floats
  • Using wrong printf format specifier
5. You want to read both temperature and light sensors using ADC channels 1 and 2 respectively. Which code snippet correctly reads both sensors and converts their ADC values to voltages assuming 10-bit ADC and 3.3V reference?
int temp_adc = ADC_Read(ADC_Channel_1);
int light_adc = ADC_Read(ADC_Channel_2);
float temp_voltage = (float)temp_adc / 1023 * 3.3;
float light_voltage = (float)light_adc / 1023 * 3.3;
hard
A. Should divide by 1024 instead of 1023 for voltage calculation
B. Correct as is, both readings converted properly
C. Missing ADC initialization before reading sensors
D. ADC_Read should be called only once for both sensors

Solution

  1. Step 1: Check ADC reading and conversion

    ADC_Read called separately for each channel, storing in int variables.
  2. Step 2: Voltage conversion uses float cast and divides by 1023 (max ADC value for 10-bit), multiplied by 3.3V reference.

    This is correct for 10-bit ADC.
  3. Final Answer:

    Correct as is, both readings converted properly -> Option B
  4. Quick Check:

    Separate reads and float division with 1023 max value [OK]
Hint: Cast ADC value to float before division for accurate voltage [OK]
Common Mistakes:
  • Dividing by 1024 instead of 1023
  • Not initializing ADC before reading
  • Trying to read both sensors with one ADC_Read call
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