Arduino metronoom - Wijzig de maatsoort bij het indrukken van de knop

/**************************************/
const int lowestPin = 1;//the lowest one attach to
const int speaker = 13;
int ts = 4;//how many beats you want
int count = 1;
const int keyPin = 12;
int buttonState = 0;
int bpm = 120;
/**************************************/
void setup()
{
  for (int thisPin = 1; thisPin <= ts; thisPin++)
  {
    pinMode(thisPin, OUTPUT); //initialize thisPin as an output
    pinMode(6, INPUT);


  }
  pinMode(keyPin, INPUT);
}

/****************************************/
void loop()
{

  //iterate over the pins
  //turn the led on from lowest to the highest



  if (digitalRead(keyPin) == HIGH && ts == 2) {
    ts = 3;
    delay(2000);
  }

  else if (digitalRead(keyPin) == HIGH && ts == 3) {
    ts = 4;
    delay(2000);
  }

  else if (digitalRead(keyPin) == HIGH && ts == 4)
  {
    ts = 2;
    delay(2000);
  }

  for (int thisPin = 1; thisPin <= ts; thisPin++)
  {

    bpm = pulseIn(6, HIGH);

    pinMode(13, OUTPUT);
    if (ts > 4)
    {
      if (count > 3)
        for (int a = 4; a <= ts; a++) {
          digitalWrite(a - 3, HIGH);
        }

    }
    else
      digitalWrite(thisPin, HIGH);

    if (count == 1)
      tone(13, 1500, 100);
    else
      tone(13, 1000, 100);

    delay(bpm - 52);
    pinMode(13, INPUT);
    digitalWrite(thisPin, LOW);


    count++;
    if (count > ts)
      count = 1;


  }

}

Ik probeer een metronoom te maken met Arduino Uno, met 4 LED's, elke LED is een tel. Ik wil de maatsoort wijzigen elke keer dat ik op de drukknop druk, zodat er een verschillend aantal beats per maat is, maar als ik op de knop druk, wordt de code eenmaal voor 2 en 3 slagen per maat uitgevoerd en gaat dan terug standaard 4 slagen per maat.

Soms verandert het zelfs zonder op de knop te drukken, willekeurig. Ik gebruik een weerstand van 220 ohm in plaats van 10, omdat 10 veel willekeuriger begint dan de 220.

Metronome project picture

1
Er zijn geen weerstanden met die LED's
toegevoegd de auteur Joshua, de bron
Heb je weerstanden in serie met die LED's?
toegevoegd de auteur Nick Gammon, de bron

1 antwoord

Je moet weerstanden in serie hebben met de LED's. Zie Verzorging en invoer van LED's . 330 ohm in serie met elke LED zou ongeveer goed zijn in jouw situatie.

Zonder weerstanden trek je veel te veel stroom van de uitgangspennen. Dat zou de spanning laten vallen en de processor zou opnieuw worden ingesteld. Dus het gaat terug naar de standaard van 4 slagen per maat.

Het beschadigt ook de processor en de LED's.

U kunt zien of de processor opnieuw wordt ingesteld door extra code in setup te plaatsen. Na het instellen van de pinnen op de uitgangen bijvoorbeeld:

 for (int i = 0; i < 10; i++)
    {
    digitalWrite (3, HIGH);
    delay (200);
    digitalWrite (3, LOW);
    delay (200);
    }

Als u tien keer knipperend knippert, weet u dat de processor is gereset.


Ik denk dat je probleem nu is dat je een zwevende input hebt voor de switch. Toen ik je schets probeerde, met een paar aanpassingen, werkte het prima.

Mijn code:

/**************************************/
const int lowestPin = 1;//the lowest one attach to
const int speaker = 13;
int ts = 4;//how many beats you want
int count = 1;
const int keyPin = 12;
int buttonState = 0;
int bpm = 120;
/**************************************/
void setup()
{
  for (int thisPin = 1; thisPin <= ts; thisPin++)
  {
    pinMode(thisPin, OUTPUT); //initialize thisPin as an output
    pinMode(6, INPUT);
  }
  pinMode(keyPin, INPUT_PULLUP);
}

/****************************************/
void loop()
{

  //iterate over the pins
  //turn the led on from lowest to the highest

  if (digitalRead(keyPin) == LOW && ts == 2) {
    ts = 3;
    delay(2000);
  }

  else if (digitalRead(keyPin) == LOW && ts == 3) {
    ts = 4;
    delay(2000);
  }

  else if (digitalRead(keyPin) == LOW && ts == 4)
  {
    ts = 2;
    delay(2000);
  }

  for (int thisPin = 1; thisPin <= ts; thisPin++)
  {

    bpm = pulseIn(6, HIGH);
    //bpm = 1000;

    pinMode(speaker, OUTPUT);
    if (ts > 4)
    {
      if (count > 3)
        for (int a = 4; a <= ts; a++) {
          digitalWrite(a - 3, HIGH);
        }
    }
    else
      digitalWrite(thisPin, HIGH);

    if (count == 1)
      tone(speaker, 1500, 100);
    else
      tone(speaker, 1000, 100);

    unsigned long now = millis ();
    while (millis() - now < (bpm - 52))
      {
     //quit delay if switch pressed
      if (digitalRead(keyPin) == LOW)
        break;
      }

    pinMode(speaker, INPUT);
    digitalWrite(thisPin, LOW);

    count++;
    if (count > ts)
      count = 1;

  }//end of for each pin

}//end of loop

Merk op dat de invoer van de schakelaar nu INPUT_PULLUP is, wat betekent dat deze HOOG wordt getrokken door een interne weerstand. De tests zijn nu dus voor == LOW in plaats van == HIGH .

Ook, in plaats van een vertraging voor de timing van de metronoom, veranderde ik het in het testen van millis() en het kijken of de tijd om is. Anders moet je de schakelaar ingedrukt houden gedurende de hele tijd dat een cyclus zich herhaalt.

1
toegevoegd
Nu dat ik weerstanden heb, verandert de knop de maatsoort (ts) nog steeds niet. Hoe kan ik dit anders verbinden of de code wijzigen?
toegevoegd de auteur Joshua, de bron
Zie gewijzigd antwoord.
toegevoegd de auteur Nick Gammon, de bron