Multiple sensor fusion in Arduino - Time & Space Complexity
When combining data from multiple sensors, the time it takes to process all inputs matters.
We want to know how processing time grows as we add more sensors.
Analyze the time complexity of the following code snippet.
const int sensorCount = 5;
int sensorValues[sensorCount];
void readSensors() {
for (int i = 0; i < sensorCount; i++) {
sensorValues[i] = analogRead(i);
}
}
void loop() {
readSensors();
// process sensorValues here
}
This code reads values from multiple sensors one by one and stores them in an array.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop reading each sensor value.
- How many times: It runs once per sensor, so sensorCount times.
As the number of sensors increases, the time to read all sensors grows in a straight line.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 sensor reads |
| 100 | 100 sensor reads |
| 1000 | 1000 sensor reads |
Pattern observation: Doubling the number of sensors doubles the work.
Time Complexity: O(n)
This means the time to read sensors grows directly with the number of sensors.
[X] Wrong: "Reading multiple sensors takes the same time no matter how many sensors there are."
[OK] Correct: Each sensor read takes time, so more sensors mean more total time.
Understanding how sensor reading time grows helps you design efficient embedded systems and shows you can think about performance clearly.
What if we read sensors in parallel using interrupts? How would the time complexity change?
Practice
Solution
Step 1: Understand sensor fusion concept
Multiple sensor fusion means combining data from different sensors to get more reliable results.Step 2: Identify the main goal
The goal is to improve accuracy by using data from multiple sources.Final Answer:
To combine data from different sensors for better accuracy -> Option BQuick Check:
Sensor fusion = combine data for accuracy [OK]
- Thinking sensor fusion just adds more sensors
- Confusing power saving with fusion
- Assuming sensors work independently
Solution
Step 1: Recall Arduino sensor reading functions
Arduino uses digitalRead() for digital sensors and analogRead() for analog sensors.Step 2: Identify correct function for analog sensors
analogRead() reads analog sensor values needed for fusion.Final Answer:
analogRead() -> Option AQuick Check:
Analog sensor read = analogRead() [OK]
- Using digitalRead() for analog sensors
- Choosing non-existent functions like sensorRead()
- Confusing function names
int sensor1 = 400; int sensor2 = 600; int fusedValue = (sensor1 + sensor2) / 2; Serial.println(fusedValue);
Solution
Step 1: Calculate sum of sensor values
sensor1 + sensor2 = 400 + 600 = 1000Step 2: Calculate average for fusion
Average = 1000 / 2 = 500Final Answer:
500 -> Option AQuick Check:
(400+600)/2 = 500 [OK]
- Adding but forgetting to divide
- Dividing by wrong number
- Printing wrong variable
int sensor1 = analogRead(A0); int sensor2 = analogRead(A1); int fusedValue = sensor1 + sensor2 / 2; Serial.println(fusedValue);
Solution
Step 1: Analyze operator precedence in expression
Division (/) has higher precedence than addition (+), so sensor2 / 2 happens first.Step 2: Understand the effect on fusedValue
Expression equals sensor1 + (sensor2 / 2), not (sensor1 + sensor2) / 2 as intended.Final Answer:
The division operator has higher precedence, so sensor2 is divided by 2 before adding sensor1 -> Option DQuick Check:
Operator precedence causes wrong fusion calculation [OK]
- Ignoring operator precedence
- Thinking analogRead() is invalid on A0/A1
- Believing Serial.println() can't print ints
Solution
Step 1: Understand correct averaging formula
Average = sum of values divided by number of values, so (300+450+500)/3.Step 2: Check each option's calculation
int fused = (300 + 450 + 500) / 3; correctly sums all and divides by 3. int fused = 300 + 450 + 500 / 3; divides only 500 by 3, wrong order. int fused = (300 + 450 + 500) * 3; multiplies sum by 3, wrong. int fused = (300 + 450 + 500) / 2; divides by 2, wrong count.Final Answer:
int fused = (300 + 450 + 500) / 3; -> Option CQuick Check:
Average = sum/3 = correct fusion [OK]
- Missing parentheses causing wrong math order
- Dividing only last value
- Multiplying instead of dividing
Ready to prove it?
Pass the test and this pattern moves unknown
