Go Down

Topic: A little instrument for the danger shield (Read 2196 times) previous topic - next topic


This is a program I made that sounds a tone when a button is pressed on the danger shield. The frequensy of the tone depends on the position of the slider next to the button pressed.

It also shows a number from 0 to 9 (that corresponds to the position of the active slider) on the 7-segment display.

The program is inspired by this video on youtube:
But I couldn't find the program used in the video anywhere, so here it is. :)

Also a big thanks to PaulS and Newbie for their help with debugging and explaining to me.

The code:
Code: [Select]
//The serial bytes for the numbers 0-9 to show up at the sevenseg display.
const byte ledCharSet[10] = {


int toneFreq; //The frequensy of the tone coming out of the speaker.
int sliderPosNumber; //A number 0-9, the position of the active slider.

int prevButton1State = HIGH; //These are to prevent the buttons from interrupting each other. With this noTone () is only called at the moment you realese the button,
int prevButton2State = HIGH;//not the whole time it's realeased.
int prevButton3State = HIGH;

const int slider1Pin = A0;
const int slider2Pin = A1;
const int slider3Pin = A2;
const int button1Pin = 12;
const int button2Pin = 11;
const int button3Pin = 10;
const int buzzerPin = 3;

#define LATCH 7 //These are pins for output to the shift reg. controlling the sevenseg. Don't know if they have to be #define but they were in the code i c/p:ed from.
#define CLOCK 8
#define DATA 4

void setup() {
 pinMode(button1Pin, INPUT);
 pinMode(button2Pin, INPUT);
 pinMode(button3Pin, INPUT);
 pinMode(buzzerPin, OUTPUT);
 pinMode(LATCH, OUTPUT);
 pinMode(CLOCK, OUTPUT);
 pinMode(DATA, OUTPUT);

void loop() {
 int button1State = digitalRead(button1Pin);
 if (button1State == LOW) //LOW == pressed.
   int slider1Val = analogRead(slider1Pin);
   toneFreq = map(slider1Val, 0, 1023, 200, 600); //Converts the number from the slider to a number between 200 and 600 for the tone() function to use as frequensy.
   tone(buzzerPin, toneFreq); //Outputs a tone to the buzzer. The frequensy depends on the position of the slider.
   sliderPosNumber = map(slider1Val, 0, 1030, 0, 10); //Converts the slider position to a number between 0 and 9. It should be 0-1023 to 0-9, but the numbers are rounded down
   //and for some reson my Ard. only detects the slider going up to 1021
   digitalWrite(LATCH, LOW); //Tells the shift register that this is the beginning of a new segment of binary code.
   shiftOut(DATA, CLOCK, MSBFIRST, ~(ledCharSet[sliderPosNumber])); //Takes a code from the array at the top and sends to the shift reg.
   digitalWrite(LATCH, HIGH); //Tells the shift reg. that this is the end of the code.
 if (button1State != prevButton1State) //If it detects a change from pressed to realesed (LOW to HIGH) on button1, it stops the tone.
   if (button1State == HIGH)
 prevButton1State = button1State; //So the code above can detect button releases.
 //This code is repeated twice for button&slider 2&3.
 int button2State = digitalRead(button2Pin);
   if (button2State == LOW)
     int slider2Val = analogRead(slider2Pin);
     toneFreq = map(slider2Val, 0, 1023, 400, 800);
     tone(buzzerPin, toneFreq);
     sliderPosNumber = map(slider2Val, 0, 1030, 0, 10);
     digitalWrite(LATCH, LOW);
     shiftOut(DATA, CLOCK, MSBFIRST, ~(ledCharSet[sliderPosNumber]));
     digitalWrite(LATCH, HIGH);
 if (button2State != prevButton2State)
   if (button2State == HIGH)
 prevButton2State = button2State;

 int button3State = digitalRead(button3Pin);
   if (button3State == LOW)
     int slider3Val = analogRead(slider3Pin);
     toneFreq = map(slider3Val, 0, 1023, 600, 1200);
     tone(buzzerPin, toneFreq);
     sliderPosNumber = map(slider3Val, 0, 1030, 0, 10);
     digitalWrite(LATCH, LOW);
     shiftOut(DATA, CLOCK, MSBFIRST, ~(ledCharSet[sliderPosNumber]));
     digitalWrite(LATCH, HIGH);
 if (button3State != prevButton3State)
   if (button3State == HIGH)
 prevButton3State = button3State;

Go Up

Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

via Egeo 16
Torino, 10131