Arduino metronome - Уақыт қолтаңбасын басу арқылы өзгерту

/**************************************/
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;


  }

}

Мен Arduino Uno арқылы метроном жасауға тырысамын, оның әрқайсысы 4 жарықдиодты светодиод. Басу түймесін басқан сайын уақыт белгісін өзгерткім келеді, сондықтан әр шарадағы әр түрлі соққылар саны болады, бірақ мен батырманы басқан кезде, бір рет 2 және 3 соққыға арналған кодты бір рет қояды, содан кейін кері қайтады әдепкі бойынша, әр шараға 4 рет.

Кейде тіпті батырманы баспай-ақ өзгермейді. Мен 10 орнына 220 ом қарсы пайдаланамын, себебі 10 10-дан 220-ға қарағанда кездейсоқ қарағанда басталады.

Metronome project picture

1
Светодиодтармен ешқандай кедергі жоқ
қосылды автор Joshua, көзі
Сізде сол светодиоды бар резисторлар бар ма?
қосылды автор Nick Gammon, көзі

1 жауаптар

Светодиоды бар бірқатар резисторлар болуы керек. Жарықдиодты күту және тамақтандыру бөлімін қараңыз. Әрбір жарықдиодты сериялы 330 ohms өз жағдайыңызда дұрыс болады.

Резисторлар болмаса, сіз шығыс түйреуіштерінен өте көп ток шығарасыз. Бұл кернеуді төмендетіп, процессор қайта қалпына келеді. Осылайша, ол бір шарадағы 4 соққылардың дефолтына оралады.

Ол сондай-ақ процессорды да, жарықдиодты да зақымдайды.

Процессордың қосымша кодты setup ішіне қою арқылы қалпына келтіретінін білуге ​​болады. Мысалы, түйреуіштерді қорытындыға қойғаннан кейін:

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

Егер сіз 3 рет жыпылықтай бастасаңыз, процессордың қалпына келтірілгенін білесіз.


Менің ойымша, қазір сіздің коммутаторға өзгермелі кірісіңіз бар деп ойлаймын. Мен сіздің нобайыңызды бірнеше модификациялауға тырыстым, ол жақсы жұмыс істеді.

Менің коды:

/**************************************/
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

Коммутатордың кірісі енді INPUT_PULLUP болып табылады, ол ішкі резистор арқылы жоғары тартылғанын білдіреді. Осылайша, тестілер енді == HIGH емес, == LOW үшін.

Сондай-ақ, метрономның уақытының кешігуінің орнына, оны millis() тестілеуіне өзгертіп, уақыттың жоғарылауын көрдім. Әйтпесе, цикл қайталанатын барлық уақытқа дейін ажыратқышты ұстап тұру керек.

1
қосылды
Енді менің резисторларым бар, түйме уақыт белгісін өзгертпейді (ts). Мұны басқаша қалай сына аламын немесе кодты өзгерте аламын?
қосылды автор Joshua, көзі
Өзгертілген жауапты қараңыз.
қосылды автор Nick Gammon, көзі