Arduino मेट्रोनोम - बटन प्रेस पर समय हस्ताक्षर बदलें

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


  }

}

मैं 4 एल ई डी के साथ अरुडिनो यूनो का उपयोग करके मेट्रोनोम बनाने की कोशिश कर रहा हूं, प्रत्येक एलईडी एक बीट है। जब भी मैं पुशबटन दबाता हूं, मैं समय हस्ताक्षर बदलना चाहता हूं, ताकि प्रति माप की विभिन्न संख्याएं हों, लेकिन जब मैं बटन दबाता हूं, तो यह प्रति बार 2 और 3 धड़कन के लिए कोड चलाता है, और फिर वापस जाता है इसके डिफ़ॉल्ट, प्रति बिट 4 धड़कन।

कभी-कभी, यह बटन को दबाए बिना भी यादृच्छिक रूप से बदलता है। मैं 10 के बजाय 220 ओम रेजिस्टस्टर का उपयोग कर रहा हूं, क्योंकि 10 220 की तुलना में अधिक यादृच्छिक रूप से शुरू होता है।

Metronome project picture

1
उन एल ई डी के साथ कोई प्रतिरोधी नहीं हैं
जोड़ा लेखक Joshua, स्रोत
क्या आपके पास उन एल ई डी के साथ श्रृंखला में प्रतिरोधक हैं?
जोड़ा लेखक Nick Gammon, स्रोत

1 उत्तर

आपके पास एल ई डी के साथ श्रृंखला में प्रतिरोधक होना चाहिए। एल ई डी की देखभाल और भोजन देखें। प्रत्येक एलईडी के साथ श्रृंखला में 330 ओएचएमएस आपकी स्थिति में सही होगा।

बिना प्रतिरोधकों के आप आउटपुट पिन से बहुत अधिक वर्तमान ड्राइंग कर रहे हैं। वह वोल्टेज छोड़ देगा और प्रोसेसर रीसेट हो जाएगा। इस प्रकार यह प्रति उपाय 4 बीट्स के डिफ़ॉल्ट पर वापस चला जाता है।

यह प्रोसेसर और एल ई डी दोनों को भी नुकसान पहुंचाता है।

आप बता सकते हैं कि प्रोसेसर setup में अतिरिक्त कोड डालने से रीसेट करता है या नहीं। उदाहरण के लिए, आउटपुट में पिन सेट करने के बाद:

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

यदि आप पिन 3 को 10 बार चमकते देखते हैं, तो आप जानते हैं कि प्रोसेसर रीसेट हो गया है।


मुझे लगता है कि अब आपकी समस्या यह है कि आपके पास स्विच के लिए एक फ़्लोटिंग इनपुट है। जब मैंने आपके स्केच की कोशिश की, कुछ संशोधनों के साथ, यह ठीक काम किया।

मेरा कोड:

/**************************************/
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 के बजाय == कम के लिए हैं।

इसके अलावा, मेट्रोनोम के समय के लिए देरी की बजाय, मैंने इसे millis() परीक्षण करने और समय समाप्त होने पर देखने के लिए बदल दिया। अन्यथा आपको चक्र को दोहराए जाने के लिए पूरे समय स्विच को रोकना होगा।

1
जोड़ा
अब जब मेरे पास प्रतिरोधक हैं, बटन अभी भी समय हस्ताक्षर (टीएस) नहीं बदलता है। मैं इसे अलग तरीके से कैसे तार सकता हूं या कोड बदल सकता हूं?
जोड़ा लेखक Joshua, स्रोत
संशोधित उत्तर देखें।
जोड़ा लेखक Nick Gammon, स्रोत