Объединение скетчей

Демьян
Offline
Зарегистрирован: 10.07.2013

Всем привет, не так давно купил плату Arduino Uno R3, предварительно почитав решил, что это для меня в самый раз, т.к. давно привычка все прошивать, но с микроконтроллерами до этого дела не имел, поэтому и купил, решил освоить так сказать.

Тема конечно глупая, но до этого я не связывался с С++, только немного с php, проблема в незнании синтаксиса, а нужно объединить 2 скетча, вроде как объединил, но нормально в таком виде как получилось не функционирует.

Задача скетча по срадствам нажатия на тактовую кнопку включать диод на 13 выходе, второй же скетч банально проигрывает мелодию через пьезодинамик.

Так вот при объединении музыка из динамика идет, но на такутовую кнопку реагировать перестает, не выключает, а при нажатии диод немного промигивает.

Вот объединенный скетч:

int switchPin = 8;
int ledPin = 13;
int speakerPin = 9;
int length = 15;      
char notes[] = "ccggaagffeeddc "; 
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
int tempo = 300;
boolean lastButton = LOW;
boolean ledOn = false;
void setup()

{ 
  pinMode(switchPin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(speakerPin, OUTPUT);
}
void playTone(int tone, int duration) {
  for (long i = 0; i < duration * 1000L; i += tone * 2) {
    digitalWrite(speakerPin, HIGH);
    delayMicroseconds(tone);
    digitalWrite(speakerPin, LOW);
    delayMicroseconds(tone);
  }
}
void playNote(char note, int duration) {
  char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
  
  for (int i = 0; i < 8; i++) 
  {
    if (names[i] == note) 
    {
      
      playTone(tones[i], duration);
    }
  }
}

void loop()

{ 

  if (digitalRead(switchPin) == HIGH && lastButton == LOW)
{
  
  ledOn = !ledOn;
  lastButton = HIGH;
  digitalWrite(ledPin, HIGH);
}
else 
{ 
lastButton = digitalRead(switchPin);  
digitalWrite(ledPin, ledOn);
for (int i = 0; i < length; i++) {
    if (notes[i] == ' ') {
      delay(beats[i] * tempo);
    } else {
      playNote(notes[i], beats[i] * tempo);
    }

    delay(tempo / 2); 
}
}
}

Подскажите, где что поправить?

Мне бы пока суть ошибки понять, что не так сделал, а потом уже примусь за более тщательное курение мануалов по теме.=)

Может что то пропустил в посте, но голова туго варит в такое время, так что, если что, извиняйте.

step962
Offline
Зарегистрирован: 23.05.2011

Демьян пишет:

Мне бы пока суть ошибки понять, что не так сделал, а потом уже примусь за более тщательное курение мануалов по теме.=)

Суть ошибки - проверка нажатия кнопки должна быть не (только) в суперцикле (loop).

Если вы хотите добиться немедленной реакции на нажатие, то следует подключать механизм прерываний.

Если же вы хотите просто более-менее оперативно реагировать на нажатие кнопки, добавьте соответствующую проверку между проигрываниями отдельных нот вашей мелодии, то есть в цикле for.

Ну и разберитесь, когда же все-таки мелодия должна запускаться на проигрывание, а когда прерываться. Тут вам пригодятся многочисленные обсуждения типа "как мигать светодиодом без delay()" - их много на этом форуме.

То же самое относится и к кнопке - когда должен гореть светодиод? В момент нажатия на кнопку (т.е. вспыхнул на мгновение и тут же погас) или все то время, пока кнопка удерживается нажатой? В первом случае отслеживаем событие (изменение состояния кнопки), во втором - состояние. 

Logik
Offline
Зарегистрирован: 05.08.2014
Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Logik пишет:

Это точно улучшит - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

он тебя услышал #6

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Демьян, можете, конечно, воспользоваться советом step962 и добавить в скетч аппаратные прерывания, затем продублировать массу проверок и продолжать вставляьт костыли при каждом новом усложнении скетча, но я посоветую Вам пойти другим путем.

Есть исходник blink - своего рода hellow_world для Ардуино. Он, если честно, нгаписан в "неправильной" манере. Пока он работает - хорошо, но добавить к нему второй такой же - уже большая проблема. А добавить третий - почти невозможно.

И есть альтернативный "правильный" вариант - blink without delay. Вот он написан так, что легко объединяется любое количество подобных скетчей.

Т.е. мысль такая: любой скетч, который предполагается объединять с другими, должен быть написан в "правильной" менере. Если же это не так, скетч необходимо переписать из "неправильного" в "правильный".

Logik
Offline
Зарегистрирован: 05.08.2014

Клапауций 112 пишет:

Logik пишет:

Это точно улучшит - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

он тебя услышал #6

))))

такого еще не было )))

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Logik пишет:

такого еще не было )))

никогда... и, вот - опять.