This sketch is used by Exercise: Sensor Fade.
Full Source Code
The full code is all in one file SensorFade.ino.
// SensorFade - read a photosensor and control several LEDs at different brightnesses // // Copyright (c) 2016, Garth Zeglin. All rights reserved. Licensed under the // terms of the BSD 3-clause license as included in LICENSE. // // This program assumes that: // // 1. A sensor is attached to analog input A0. The exercise uses a photocell // with a 5.6K pull-down resistor in a voltage divider. // // 2. Pins 5 and 6 are attached via dropping resistors to LEDs which connect to // ground. The output pin is used to source current; the logic will be // positive (HIGH = ON). // ================================================================================ // Definitions of constant values. const int LED1PIN = 5; const int LED2PIN = 6; const int SENSORPIN = A0; const int BLINKDELAY = 500; // interval between fixed blinks, in milliseconds // The following declarations define scaling constants and thresholds for // interpreting the analog input signal. The input range for a typical // photocell with a 5.6K bias resistor is centered around 4 volts. This can be // verified using a voltmeter to check the range of inputs on A0 and adjust the // following V_DARK and V_LIGHT values. Note the use of the scaling factors to // scale the measured voltages into ADC units. // These are physically measured voltages defining the typical dark and light // input voltages. You may need to change these: const float V_DARK = 3.5; // in Volts const float V_LIGHT = 4.2; // in Volts // These are properties of the Arduino analog-to-digital converter: const float ADC_MAX_VOLTAGE = 5.0; // in Volts const int ADC_RANGE = 1024; // in dimensionless ADC units // These thresholds are calculated from the other constants. const int V_LOW = V_DARK * (ADC_RANGE/ADC_MAX_VOLTAGE); // in dimensionless ADC units const int V_HIGH = V_LIGHT * (ADC_RANGE/ADC_MAX_VOLTAGE); // in dimensionless ADC units // ================================================================================ // Global variable declarations. // Counter variable to keep to track of the number of update periods for // defining the blinks of the onboard LED. int led_cycle_count = 0; // ================================================================================ // Configure the hardware once after booting up. This runs once after pressing // reset or powering up the board. void setup(void) { // Initialize the hardware digital pin 13 as an output. The 'OUTPUT' symbol // is pre-defined by the Arduino system. pinMode(LED_BUILTIN, OUTPUT); // Initialize the external LEDs as outputs. pinMode(LED1PIN, OUTPUT); pinMode(LED2PIN, OUTPUT); // Produce a timed sequence of blinks to indicate the start of the program. fixed_blink_pattern(); // this function is defined below } // ================================================================================ // Run one iteration of the main event loop. The Arduino system will call this // function over and over forever. // This function continuously maps changes of the photocell input level into // pulse-width-modulated (PWM) output on the LED. void loop(void) { // Read the voltage on the sensor input. This function returns a value // between 0 and 1023 representing a voltage between 0 and 5V. int sensor = analogRead(SENSORPIN); // Compute proportional signals to drive the LEDs by mapping an input range to // the output range. The input thresholds are defined above in this file. The // PWM output is scaled from 0 to 255. int led1_value = map(sensor, V_LOW, V_HIGH, 0, 255); int led2_value = map(sensor, V_LOW, V_HIGH, 255, 0); // symmetric scaling // Emit PWM signals with a proportional average power; the LEDs will have // variable brightness. The constrain function will ensure the values stay // within the correct limits. analogWrite(LED1PIN, constrain(led1_value, 0, 255)); analogWrite(LED2PIN, constrain(led2_value, 0, 255)); // Blink the onboard LED. led_cycle_count is a global variable defined above. if (led_cycle_count == 0) { digitalWrite(LED_BUILTIN, LOW); } else if (led_cycle_count == 32) { digitalWrite(LED_BUILTIN, HIGH); } // Increase the cycle count for the next iteration. if (led_cycle_count < 63) { led_cycle_count += 1; } else { led_cycle_count = 0; } // Delay for a short interval to create a periodic sampling rate. delay(20); }
Read more: Arduino Sketch SensorFade