Светодиоды бар бірқатар резисторлар болуы керек. Жарықдиодты күту және тамақтандыру бөлімін қараңыз. Әрбір жарықдиодты сериялы 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()
тестілеуіне өзгертіп, уақыттың жоғарылауын көрдім. Әйтпесе, цикл қайталанатын барлық уақытқа дейін ажыратқышты ұстап тұру керек.