Reading temperature sensor (LM35, TMP36) in Arduino - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When reading a temperature sensor like LM35 or TMP36, the program runs repeatedly to get new data.
We want to know how the time it takes grows as we read more data points.
Analyze the time complexity of the following code snippet.
const int sensorPin = A0;
int sensorValue = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(sensorPin);
float voltage = sensorValue * (5.0 / 1023.0);
float temperatureC = voltage * 100.0; // for LM35
Serial.println(temperatureC);
delay(1000);
}
This code reads the temperature sensor once every second and prints the temperature in Celsius.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The
loop()function runs repeatedly, reading the sensor once each time. - How many times: It runs indefinitely, once per second due to the
delay(1000).
Each time the loop runs, it reads one sensor value and processes it.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 readings | 10 sensor reads and calculations |
| 100 readings | 100 sensor reads and calculations |
| 1000 readings | 1000 sensor reads and calculations |
Pattern observation: The total work grows directly with the number of readings taken.
Time Complexity: O(n)
This means the time to read and process temperature grows linearly with how many times you read it.
[X] Wrong: "Reading the sensor once takes longer if I read more times later."
[OK] Correct: Each sensor read takes about the same time, no matter how many times you do it later. The time adds up only because you do it more times.
Understanding how repeated sensor readings affect program time helps you design efficient loops and timing in embedded projects.
"What if we read multiple sensors inside the loop? How would the time complexity change?"
Practice
analogRead() function do when reading from an LM35 temperature sensor?Solution
Step 1: Understand analogRead() function
TheanalogRead()function reads the voltage level on an analog pin and returns a number between 0 and 1023 representing that voltage.Step 2: Relate to LM35 sensor output
The LM35 outputs an analog voltage proportional to temperature, soanalogRead()reads this voltage level.Final Answer:
It reads the voltage level from the sensor's analog output pin. -> Option DQuick Check:
analogRead() reads voltage level = A [OK]
- Thinking analogRead() converts voltage to temperature
- Assuming analogRead() sends commands to sensor
- Confusing analogRead() with digitalRead()
Solution
Step 1: Understand analog to voltage conversion
The analog reading ranges from 0 to 1023 for 0 to 5 volts. To get voltage, multiply reading by (5.0 / 1023.0).Step 2: Check each option
float voltage = analogRead(sensorPin) * (5.0 / 1023.0); correctly applies the formula. Others either divide incorrectly or multiply by wrong factors.Final Answer:
float voltage = analogRead(sensorPin) * (5.0 / 1023.0); -> Option CQuick Check:
Voltage = reading * (5/1023) [OK]
- Dividing by 5 instead of multiplying
- Using 1024 instead of 1023 in denominator
- Multiplying by 5 without dividing by 1023
int sensorPin = A0; int reading = 250; float voltage = reading * (5.0 / 1023.0); float temperatureC = voltage * 100; Serial.println(temperatureC);
Solution
Step 1: Calculate voltage from reading
voltage = 250 * (5.0 / 1023.0) ≈ 1.22 volts.Step 2: Calculate temperature in Celsius
temperatureC = 1.22 * 100 ≈ 122 °C. Serial.println displays approximately 122.19, closest to 122.0.Final Answer:
122.0 -> Option AQuick Check:
Voltage ≈1.22V, Temp = voltage*100 = 122 [OK]
- Forgetting to multiply voltage by 100
- Using wrong analog to voltage conversion
- Confusing TMP36 formula with LM35
int sensorPin = A0; int reading = analogRead(sensorPin); float voltage = reading / 1023 * 5.0; float temperatureC = (voltage - 0.5) * 100; Serial.println(temperatureC);
Solution
Step 1: Analyze voltage calculation
reading / 1023 * 5.0uses left-to-right precedence: firstreading / 1023(int / int = integer division, truncates), then * 5.0, yielding wrong voltage.Step 2: Rule out other options
A: Formula (voltage - 0.5)*100 correct for TMP36. B: Pin declaration int is fine. D: Serial.println prints floats fine.Final Answer:
The voltage calculation divides before multiplying, causing integer division error. -> Option AQuick Check:
Use float divisor to avoid integer division [OK]
- Using integer 1023 instead of float 1023.0
- Misunderstanding operator precedence
- Thinking Serial.println() can't print floats
Solution
Step 1: Confirm TMP36 formula
Temperature = (voltage - 0.5) * 100.Step 2: Check voltage conversion
Correct: reading * (5.0 / 1023.0). Avoid integer division like reading / 1023 * 5 (truncates) or 5 / 1023 (zero).Step 3: Verify loop structure
A1 pin, analogRead, Serial.println, delay(1000) must all align with correct math.Final Answer:
int sensorPin = A1; void loop() { int reading = analogRead(sensorPin); float voltage = reading * (5.0 / 1023.0); float temperatureC = (voltage - 0.5) * 100; Serial.println(temperatureC); delay(1000); } -> Option BQuick Check:
TMP36 temp = (voltage - 0.5)*100 with float math [OK]
- Using LM35 formula for TMP36 sensor
- Integer division in voltage calculation
- Using integer math like 5 / 1023 resulting in zero
