//************************************************************************
//************************************************************************
#include
#include
#include
#include
#include
#include "WProgram.h"
#ifdef __MWERKS__
//* I use Metrowerks CodeWarior for editing and syntax checking
//* this is ONLY to make Codewarrior happy
void sprintf(...);
void dtostrf(...);
long pgm_read_dword_near(...);
short pgm_read_word_near(...);
short pgm_read_byte_near(...);
#define prog_uint32_t long
#define prog_int16_t short
#define prog_uint8_t byte
#define PROGMEM
#define _USE_LOCAL_LIBRARY_VERSION_
#endif
#include "HardwareSerial.h"
//* analog starts at 14
#define kPin_Button_1 14
#define kPin_Button_2 15
#define kPin_Button_3 16
#define kPin_Button_4 17
#define kPin_Button_5 7
#define kPin_Button_6 8
#define kPin_Button_7 13
#define kPin_Buzzer 6
//************************************************************************
void PlayNote(int noteFrequency, int theDuration)
{
long pulseWidth;
long startMilliSecs;
// pulseWidth = 500000 / noteFrequency;
pulseWidth = 250000 / noteFrequency;
startMilliSecs = millis();
while ((millis() - startMilliSecs) < (theDuration * 80))
{
//* play our tone!
digitalWrite(kPin_Buzzer, HIGH);
delayMicroseconds(pulseWidth);
digitalWrite(kPin_Buzzer, LOW);
delayMicroseconds(pulseWidth);
}
}
//************************************************************************
void PlayCI3K(int noteOffset, int divideFactor)
{
PlayNote((noteOffset + 396) / divideFactor, 6);
PlayNote((noteOffset + 440) / divideFactor, 6);
PlayNote((noteOffset + 352) / divideFactor, 6);
PlayNote((noteOffset + 176) / divideFactor, 6);
PlayNote((noteOffset + 264) / divideFactor, 6);
}
#pragma mark -
#pragma mark Button processing
static boolean gButton1_pressed;
static boolean gButton2_pressed;
static boolean gButton3_pressed;
static boolean gButton4_pressed;
static boolean gButton5_pressed;
static boolean gButton6_pressed;
static boolean gButton7_pressed;
//************************************************************************
//* returns true if any button is down
static boolean GetButtons(void)
{
gButton1_pressed = !digitalRead(kPin_Button_1);
gButton2_pressed = !digitalRead(kPin_Button_2);
gButton3_pressed = !digitalRead(kPin_Button_3);
gButton4_pressed = !digitalRead(kPin_Button_4);
gButton5_pressed = !digitalRead(kPin_Button_5);
gButton6_pressed = !digitalRead(kPin_Button_6);
gButton7_pressed = !digitalRead(kPin_Button_7);
return( gButton1_pressed || gButton2_pressed || gButton3_pressed || gButton4_pressed ||
gButton5_pressed || gButton6_pressed || gButton7_pressed);
}
#pragma mark -
//************************************************************************
void setup()
{
analogWrite(kPin_Buzzer, 128);
gButton1_pressed = false;
gButton2_pressed = false;
gButton3_pressed = false;
gButton4_pressed = false;
gButton5_pressed = false;
gButton6_pressed = false;
gButton7_pressed = false;
//* set up the buttons
pinMode(kPin_Button_1, INPUT);
pinMode(kPin_Button_2, INPUT);
pinMode(kPin_Button_3, INPUT);
pinMode(kPin_Button_4, INPUT);
pinMode(kPin_Button_5, INPUT);
pinMode(kPin_Button_6, INPUT);
pinMode(kPin_Button_7, INPUT);
//*****************************************************************************
//* now this may seem at bit strange, but we are going to set the outputs
//* on all of the buttin INPUTS to HIGH. This turns on the internal pull up
//* so we dont have to have external pull ups (Thanks Tim H for this info)
//*****************************************************************************
digitalWrite(kPin_Button_1, HIGH);
digitalWrite(kPin_Button_2, HIGH);
digitalWrite(kPin_Button_3, HIGH);
digitalWrite(kPin_Button_4, HIGH);
digitalWrite(kPin_Button_5, HIGH);
digitalWrite(kPin_Button_6, HIGH);
digitalWrite(kPin_Button_7, HIGH);
delay(100); //* give the inputs time to settle
analogWrite(kPin_Buzzer, 0);
}
//************************************************************************
void loop()
{
int noteOffset;
int divideFactor;
//* no data from serial port, check the buttons
if (GetButtons())
{
pinMode(kPin_Buzzer, OUTPUT);
//* simple debounce
delay(50);
GetButtons(); //* get the buttons again
noteOffset = 0;
divideFactor = 1;
if (gButton1_pressed)
{
noteOffset = 0;
divideFactor = 1;
}
else if (gButton2_pressed)
{
noteOffset = 100;
divideFactor = 2;
}
else if (gButton3_pressed)
{
noteOffset = 200;
divideFactor = 3;
}
PlayCI3K(noteOffset, divideFactor);
delay(250);
}
}
#pragma mark -
|