Объединение скетчей
- Войдите на сайт для отправки комментариев
Всем привет, не так давно купил плату 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); } } }
Подскажите, где что поправить?
Мне бы пока суть ошибки понять, что не так сделал, а потом уже примусь за более тщательное курение мануалов по теме.=)
Может что то пропустил в посте, но голова туго варит в такое время, так что, если что, извиняйте.
Мне бы пока суть ошибки понять, что не так сделал, а потом уже примусь за более тщательное курение мануалов по теме.=)
Суть ошибки - проверка нажатия кнопки должна быть не (только) в суперцикле (loop).
Если вы хотите добиться немедленной реакции на нажатие, то следует подключать механизм прерываний.
Если же вы хотите просто более-менее оперативно реагировать на нажатие кнопки, добавьте соответствующую проверку между проигрываниями отдельных нот вашей мелодии, то есть в цикле for.
Ну и разберитесь, когда же все-таки мелодия должна запускаться на проигрывание, а когда прерываться. Тут вам пригодятся многочисленные обсуждения типа "как мигать светодиодом без delay()" - их много на этом форуме.
То же самое относится и к кнопке - когда должен гореть светодиод? В момент нажатия на кнопку (т.е. вспыхнул на мгновение и тут же погас) или все то время, пока кнопка удерживается нажатой? В первом случае отслеживаем событие (изменение состояния кнопки), во втором - состояние.
Это точно улучшит - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Это точно улучшит - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
он тебя услышал #6
Демьян, можете, конечно, воспользоваться советом step962 и добавить в скетч аппаратные прерывания, затем продублировать массу проверок и продолжать вставляьт костыли при каждом новом усложнении скетча, но я посоветую Вам пойти другим путем.
Есть исходник blink - своего рода hellow_world для Ардуино. Он, если честно, нгаписан в "неправильной" манере. Пока он работает - хорошо, но добавить к нему второй такой же - уже большая проблема. А добавить третий - почти невозможно.
И есть альтернативный "правильный" вариант - blink without delay. Вот он написан так, что легко объединяется любое количество подобных скетчей.
Т.е. мысль такая: любой скетч, который предполагается объединять с другими, должен быть написан в "правильной" менере. Если же это не так, скетч необходимо переписать из "неправильного" в "правильный".
Это точно улучшит - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
он тебя услышал #6
))))
такого еще не было )))
такого еще не было )))
никогда... и, вот - опять.