100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Programming

Reading Common Sensors

Learn how to interface Arduino with common sensors — potentiometers, light-dependent resistors, temperature sensors, PIR motion detectors, and ultrasonic rangefinders — using voltage dividers, libraries, and pulse timing.

I/O & SensorsIntermediate11 min readJul 10, 2026
Analogies

Categories of Sensors

Sensors fall into a few broad categories that determine how you read them. Analog sensors output a continuous voltage you capture with analogRead(), such as a potentiometer, a light-dependent resistor (LDR), or a TMP36 temperature sensor. Digital sensors give a simple HIGH/LOW signal you read with digitalRead(), like a PIR motion detector. More complex sensors communicate over protocols such as I2C or one-wire and almost always come with a library that hides the low-level details. Knowing a sensor's category tells you immediately which reading strategy to reach for.

🏏

Cricket analogy: Categorizing sensors is like knowing a bowler's type before facing them — pace, spin, or swing each demands a different stance, just as analog, digital, and protocol sensors each demand a different reading approach.

Analog Sensors and the Voltage Divider

Many analog sensors are variable resistors, meaning they do not output a voltage by themselves — you must build a voltage divider. For a light-dependent resistor, you wire the LDR in series with a fixed resistor (often 10k) between 5V and ground and read the junction between them with an analog pin. As light changes the LDR's resistance, the junction voltage shifts and analogRead() tracks it. Some analog sensors are active and output a voltage directly: the TMP36, for instance, produces 10mV per degree Celsius with a 500mV offset, so temperature equals (voltage - 0.5) times 100.

🏏

Cricket analogy: A voltage divider is like the balance of a seesaw partnership at the crease — the junction reading depends on the ratio of the two batsmen's contributions, just as it depends on the ratio of the LDR and fixed resistor.

Active analog sensors (like the TMP36) output a usable voltage directly and need no divider, whereas passive resistive sensors (like an LDR or a thermistor) change resistance and must sit in a voltage divider so that change becomes a readable voltage. Always check a sensor's datasheet to know which kind you have.

Digital and Library-Driven Sensors

A PIR (passive infrared) motion sensor is refreshingly simple: it outputs HIGH when it detects movement and LOW otherwise, so a single digitalRead() tells you if something moved. More sophisticated sensors like the DHT11 and DHT22 measure temperature and humidity but use a proprietary one-wire timing protocol that is impractical to bit-bang yourself, so you install a library (for example DHT.h) and call methods like readTemperature() and readHumidity(). Libraries are the standard way to talk to I2C and SPI devices too, letting you focus on your application rather than protocol timing.

🏏

Cricket analogy: A PIR's simple HIGH/LOW is like a run-out appeal answered by a raised finger — one clear signal. A DHT library is like the third umpire handling all the technical review so you just get the verdict.

cpp
#include <DHT.h>

#define DHTPIN 4
#define DHTTYPE DHT22   // DHT11 or DHT22
DHT dht(DHTPIN, DHTTYPE);

const int pirPin = 7;

void setup() {
  Serial.begin(9600);
  dht.begin();
  pinMode(pirPin, INPUT);
}

void loop() {
  float tempC = dht.readTemperature();  // degrees Celsius
  float hum   = dht.readHumidity();     // percent

  if (isnan(tempC) || isnan(hum)) {
    Serial.println("DHT read failed");  // sensor returns NaN on error
  } else {
    Serial.print("T="); Serial.print(tempC);
    Serial.print("C  H="); Serial.print(hum); Serial.println("%");
  }

  if (digitalRead(pirPin) == HIGH) {
    Serial.println("Motion detected!");
  }

  delay(2000);  // DHT22 needs ~2s between reads
}

Ultrasonic Distance with pulseIn()

The HC-SR04 ultrasonic rangefinder measures distance by timing sound. You send a 10-microsecond HIGH pulse on its TRIG pin, the sensor emits an ultrasonic burst, and its ECHO pin goes HIGH for a duration equal to the round-trip travel time. You capture that duration with pulseIn(echoPin, HIGH), which returns microseconds. Because sound travels about 343 meters per second (roughly 29 microseconds per centimeter, round trip), distance in centimeters is the pulse duration divided by 58. This trigger-then-time pattern is a common technique for time-of-flight sensors.

🏏

Cricket analogy: Timing an echo is like judging a run by the time between the bat's crack and the ball reaching the boundary; pulseIn measures that travel time, and you convert it to distance just as a fielder gauges range by delay.

Do not read a DHT22 faster than about once every two seconds or a DHT11 faster than once per second — polling too quickly returns stale or NaN values. Also check for isnan() on DHT readings, and note the HC-SR04's ECHO pin outputs 5V; on 3.3V boards use a level shifter or voltage divider on ECHO to avoid damaging the input.

  • Analog sensors use analogRead(); digital sensors use digitalRead(); complex sensors use libraries.
  • Passive resistive sensors like LDRs need a voltage divider to produce a readable voltage.
  • Active sensors like the TMP36 output a voltage directly (10mV per degree C, 0.5V offset).
  • PIR sensors output a simple HIGH when motion is detected.
  • DHT11/DHT22 use a one-wire protocol best handled by a library such as DHT.h.
  • The HC-SR04 measures distance via time-of-flight: trigger, then time the echo with pulseIn().
  • Respect each sensor's timing limits and check for NaN or error values.

Practice what you learned

Was this page helpful?

Topics covered

#Programming#ArduinoProgrammingStudyNotes#ReadingCommonSensors#Reading#Common#Sensors#Categories#StudyNotes#SkillVeris#ExamPrep