Learn Arduino with Olympia Circuits
Learn Arduino
  • Home
    • Get Started
    • How to Use This Site
  • Electronics
    • The Basics
    • Electricity Flows like Water
    • Electronic Components
    • The Arno Board
  • Programming
    • The Basics
    • setup and loop Blocks
    • Variables and Arrays
    • Connecting with the Pins
    • Flow Control >
      • if Statement
      • Loops
      • Delays
    • Functions
    • Serial Communication
    • USB
    • Some Thoughts
  • Projects
    • Projects 1 >
      • 1.01: Blink
      • 1.02 Blink x2
      • 1.03 Blink Faster
      • 1.04 LED Chase!
      • 1.05 Wait To Blink
      • 1.06 Blink a Little Faster Now
      • 1.07 LED Fade
      • 1.08 RGB Blink
      • 1.09 Change RGB Color with SW1
      • 1.10 Fade RGB Colors
      • 1.11 Reaction Time Game
    • Projects 2 >
      • 2.01 Hello World
      • 2.02 Talk Back
      • 2.03 ASCII Values
      • 2.04 Ski Game
      • 2.05 Demonstration of the String Object
    • Projects 3 >
      • 3.01 Read the Potentiometer
      • 3.02 ASCIIbet Soup
      • 3.03 Potentiometer sets LED Brightness
      • 3.04 Potentiometer Sets Blink Rate
      • 3.05 LED Chase, Part II
    • Projects 4 >
      • 4.01 Bringing the Piezo to Life
      • 4.02 Controlling the Piezo with a Function
      • 4.03 Piezo C Major
      • 4.04 Piezo Greensleaves
      • 4.05 Piezo Metronome
      • 4.06 Piezo as an Input
      • 4.07 Piezo as an Input 2
      • 4.08 Metronome II
      • 4.09 Piezo Playback
      • 4.10 Piezo Fireworks
      • 4.11 Piezo Mosquito
    • Projects 5 >
      • 5.01 The Phototransistor
      • 5.02 Light and Sound
      • 5.03 Light and Sound II
    • Projects 6 >
      • 6.01 EEPROM
      • 6.02 I2C Address Scan
      • 6.03 Read the I2C Temperature Sensor
      • 6.04 High Temperature Alarm
    • Projects 7 >
      • 7.01 Arno Phone Home
      • 7.02 Keyboard Alphabet
      • 7.03 Move Mouse
      • 7.04 Draw Squares
    • Special Projects >
      • Bike Light Demo
  • References
    • Arno Pin Key
    • Arno Schematic
    • Project Index

Project 5.03 Light and Sound II 

This project is similar to Project 5.02 except the light intensity measured by the phototransistor is reported by changing the rate at which the piezo clicks.  The effect is something like a Geiger counter.

Concepts: analogRead, map function

Circuits:
  • Circuit 4
  • Circuit 5


  • Select Sketch

    ///////////////////////////////////////////////////
    //Project 5.03 Light and Sound II
    int photoTran = A1;
    int reading = 0;
    long clickTime = 0;
    int piezo = 12;
    long lastClick = 0;
    void setup(){
    pinMode(photoTran,INPUT);
    pinMode(piezo,OUTPUT);
    Serial.begin(9600);
    }
    void loop(){
    reading = analogRead(photoTran);
    clickTime = (long) map(reading,0,1023,500,1);
    if(clickTime > 450) clickTime = 5000;
    if(millis() > lastClick + clickTime){
    piezoTone(4000,5);
    lastClick = millis();
    }
    }
    void piezoTone(long freq, long duration){
    long aSecond = 1000000;
    long period = aSecond/freq;
    duration = duration*1000;
    duration = duration/period;
    for(long k = 0; k < duration; k++){
    digitalWrite(piezo,HIGH);
    delayMicroseconds(period/2);
    digitalWrite(piezo,LOW);
    delayMicroseconds(period/2);
    }
    }
    ///////////////////////////////////////////////////

    Like in our past projects, we don’t want to use the delay statement to control the frequency of clicks.  We want to keep measuring the phototransistor and updating the time between clicks.  We use the variable lastClick to keep track of when we last sounded a click:

    long lastClick = 0;

    We measure the photoTran pin and map the values between 1 and 500.  The higher the light level, the shorter the time between clicks.  We cast clickTime to a long variable type since we want to add it to millis(), which also returns a long value:

      reading = analogRead(photoTran);

      clickTime = (long) map(reading,0,1023,500,1);

    We found that the effect is more interesting if we create a longer delay between clicks when little light hits the phototransistor.  So we set a longer delay when clickTime is greater than 450:

      if(clickTime > 450) clickTime = 5000;

    At the bottom of the loop() block we test to see if enough time has elapsed between clicks:

    if(millis() > lastClick + clickTime){

    If so, we sound a click and then reset lastClick before returning to the top of the loop() block.

        piezoTone(4000,5);

        lastClick = millis();

      }

    Back to Projects 5

    Copyright Olympia Circuits LLC 2014. All Rights Reserved.