Analog Input

As we have seen, an Arduino digital input is one that have one of two states: HIGH or LOW. Most Arduino implementations also permit you to connect an input whose value can be any value between 0 volts and (by default) the power-supply voltage, and then convert the input level to an integer value between 0 an 1023. The Arduino literature refers to these as “analog” inputs. The process of converting a physical analog signal to a digital representation is called analog to digital conversion (ADC).

Consult the documentation for your specific Arduino board to determine which pins support analog input. On the Arduino UNO, inputs A0 through A5 can be used as analog inputs.

Night light

The following example uses an analog input and a digital output to build a simple night-light. A cadmium-sulfide photo-sensitive resistor (commonly called CdS cells) is used in a voltage divider setup to produce a voltage that changes with the amount of light incident on the sensor. If the voltage is above a certain threshold, the Arduino will turn on the LED.

CdS cells are notoriously tweaky devices. A lot of experimentation with your particular cell will probably be required to see what your circuit is actually doing—quite likely requiring the use of the serial communication to report the ADC values (see this for an example).

There are more reliable and calibrated light-level sensors available that may be a better (but significantly more expensive!) choice if you wish not to deal with the tweakiness of Cds cells.

FIXME We need a circuit diagram

In the following example, we output the light-level reading to serial communication. This should help you get a feel for the range of numbers that result from for your particular unit.

cds2serial.ino
/*
 CdS to Serial
 Ouptut the reading on the CdS pin to Serial.
 */
 
const int inputPin = A0;         // use analog 0 (A0) as input pin
const int ledPin = 13;           // connect the LED to pin 13
 
int lightLevel = 0;              // used to store the input value
 
void setup() {
  Serial.begin(9600);            // initialize serial communication
  pinMode(ledPin, OUTPUT);       // make LED's pin an output
}
 
void loop() {
  lightLevel = analogRead(inputPin);  // get an analog reading      
  Serial.println(lightLevel);         // print out the reading
  delay(500);                         // delay between reads
}

And here is the working nightlight. You may have to adjust lightThreshold so it works well with your particular CdS cell.

NightLight.ino
/*
 NightLight
 Turn an LED on when the ambient light is below a certain value.
 */
 
const int lightThreshold = 800;  // value below which LED turns on
const int inputPin = A0;         // use analog 0 (A0) as input pin
const int ledPin = 13;           // connect the LED to pin 13
 
int lightLevel = 0;              // used to store the input value
 
void setup() {
  pinMode(ledPin, OUTPUT);       // make LED's pin an output
}
 
void loop() {
  lightLevel = analogRead(inputPin);  // get an analog reading      
 
  if (lightLevel <= lightThreshold)
    digitalWrite(ledPin, HIGH);       // turn the LED on
  else
    digitalWrite(ledPin, LOW);        // turn the LED off
}