Show Posts
Pages: [1]
1  Forum 2005-2010 (read only) / Troubleshooting / Sketch keeps going on: January 24, 2011, 02:51:49 am
Okay so what i'm trying to do is make an LED dice based on the tutorial HERE http://www.instructables.com/id/Arduino-Led-Dice/ The "die" rolls and displays a number between 1&6I got the sketch he wrote up and it runs perfectly. But being the tinkerer i am i wasnt satisfied. Eventually i want to involve two die on one breadboard to play a "game" of sorts. When one player wins a sound plays (right now it is set to play a sound byte from SMB) using the tone library. Right now while im troubleshooting i have it to play the tone when a 4 is rolled. The problem im having is that it will randomly pick a number and then "print" it to the die (using the "disp" function) multiple times instead of just one. This makes no visible change but when a 4 is rolled the sound will play more then once. It seems almost random how many times is is sent into the disp function but its always between 1 and 3. I'm very new to arduino and would probably consider this my first real project and I've tried everything i can think of. Any help would be much appreciated

My code isn't commented at all because its nowhere near completed but if you have question about what any part of the code does please ask.

disp(int rand)  ---  Displays the random number on the die

blank() ---  Clears the die completly turning all LEDs off

play_rtttl(char *p) --- plays the sound when called

Code:
int pin1 = 4;
int pin2 = 6;
int pin3 = 7;
int pin4 = 5;
int buttonPin = 2;
int ran;

#include <Tone.h>
Tone tone1;
#define OCTAVE_OFFSET 0

int notes[] = {
  0,
  NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4,
  NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5,
  NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6,
  NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7
};
char *song = "smbdeath:d=4,o=5,b=90:8p,16b,16f6,16p,16f6,16f.6,16e.6,16d6,16c6,16p,16e,16p,16c";

void setup ()
{
  tone1.begin(3);
  pinMode (pin1, OUTPUT);
  pinMode (pin2, OUTPUT);
  pinMode (pin3, OUTPUT);
  pinMode (pin4, OUTPUT);
  pinMode (buttonPin, INPUT);
  randomSeed(analogRead(A1));
}
#define isdigit(n) (n >= '0' && n <= '9')
void loop()
{
  while(digitalRead(buttonPin)==HIGH)
  {
    ran = random(1,7);
    for(int x = 1;x<=3;x++){
      blank();
      if(x==1){
        digitalWrite(pin2,HIGH);
      }
      if(x==2){
        digitalWrite(pin3,HIGH);
        digitalWrite(pin1,HIGH);
      }
      if(x==3){
        digitalWrite(pin4,HIGH);
      }
      delay(45);
      if(digitalRead(buttonPin)==LOW)
      {
        blank();
        disp(ran);
      }
    }
  }
}



void disp(int rand)
{
  switch(rand)
  {
  case 1:
    digitalWrite (pin4, HIGH);
    break;
  case 2:
    digitalWrite (pin1, HIGH);
    break;
  case 3:
    digitalWrite (pin3, HIGH);
    digitalWrite (pin4, HIGH);
    break;
  case 4:
    digitalWrite (pin1, HIGH);
    digitalWrite (pin3, HIGH);
    break;
  case 5:
    digitalWrite (pin1, HIGH);
    digitalWrite (pin3, HIGH);
    digitalWrite (pin4, HIGH);
    break;
  case 6:
    digitalWrite (pin1, HIGH);
    digitalWrite (pin2, HIGH);
    digitalWrite (pin3, HIGH);
    break;
  }
  if(rand == 4)
  {
    play_rtttl(song);
  }
}




void blank()
{
  digitalWrite(pin1,LOW);
  digitalWrite(pin2,LOW);
  digitalWrite(pin3,LOW);
  digitalWrite(pin4,LOW);
}





void play_rtttl(char *p)
{
  byte default_dur = 4;
  byte default_oct = 6;
  int bpm = 63;
  int num;
  long wholenote;
  long duration;
  byte note;
  byte scale;

  while(*p != ':') p++;
  p++;

  if(*p == 'd')
  {
    p++;
    p++;              // skip "d="
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    if(num > 0) default_dur = num;
    p++;                   // skip comma
  }
  if(*p == 'o')
  {
    p++;
    p++;              // skip "o="
    num = *p++ - '0';
    if(num >= 3 && num <=7) default_oct = num;
    p++;                   // skip comma
  }
  if(*p == 'b')
  {
    p++;
    p++;              // skip "b="
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }
    bpm = num;
    p++;                   // skip colon
  }
  wholenote = (60 * 1000L / bpm) * 4;
  while(*p)
  {
    num = 0;
    while(isdigit(*p))
    {
      num = (num * 10) + (*p++ - '0');
    }

    if(num) duration = wholenote / num;
    else duration = wholenote / default_dur;  // we will need to check if we are a dotted note after

      // now get the note
    note = 0;

    switch(*p)
    {
    case 'c':
      note = 1;
      break;
    case 'd':
      note = 3;
      break;
    case 'e':
      note = 5;
      break;
    case 'f':
      note = 6;
      break;
    case 'g':
      note = 8;
      break;
    case 'a':
      note = 10;
      break;
    case 'b':
      note = 12;
      break;
    case 'p':
    default:
      note = 0;
    }
    p++;

    // now, get optional '#' sharp
    if(*p == '#')
    {
      note++;
      p++;
    }

    // now, get optional '.' dotted note
    if(*p == '.')
    {
      duration += duration/2;
      p++;
    }

    // now, get scale
    if(isdigit(*p))
    {
      scale = *p - '0';
      p++;
    }
    else
    {
      scale = default_oct;
    }

    scale += OCTAVE_OFFSET;

    if(*p == ',')
      p++;       // skip comma for next note (or we may be at the end)

    // now play the note

    if(note)
    {
      tone1.play(notes[(scale - 4) * 12 + note]);
      delay(duration);
      tone1.stop();
    }
    else
    {
      delay(duration);
    }
  }
}



2  Forum 2005-2010 (read only) / Interfacing / Switches rookie problem on: January 18, 2011, 09:03:51 pm
I fairly new with everything so this is proably an obvious question. What I'm trying to do is use a single on/off switch to turn on both a breadboard arduino connected to a 9V battery and a laser diode connected to 2x AAA's (3v). If I connected both ground (black) wires to one pole of the switch would flipping the switch cause both devices (breadboard arduino and laser) to turn on? Or is there something I don't know about the power that this would cause an issue?

Thanks for the help!
Pages: [1]