Multi-function Shield
- Войдите на сайт для отправки комментариев
Втр, 22/05/2018 - 00:50
Хочу сделать чтоб при нажатии на 1 кнопку менялось звучание пьезо, и при нажатии на 2 кнопку - повторялось предыдущее звучание. При нажатии на первую кнопку звук должен проигрываться один раз без повторения. Я сделал что при нажатии меняестья звук но он зацыклен, 3 кнопку прописал на зацыкление бездействия. Проблема в том что я не знаю что писать для 2 кнопки, чтоб повторялась предыдущая часть кода, а как сделать паузу кода, без остановки ардуинки тоже не знаю.
#include <I2C.h> #include <II2C.h> #include <MPU6050.h> #include <MultiFuncShield.h> // Подключаем библиотеку для работы с таймером 1 (она понадобитсся для инициализации Multi-function Shield) #include <TimerOne.h> int regim=1; int flag=0; unsigned int delayTime = 20; void setup() { Serial.begin(9600); // Инициализируем последовательный порт для связи с ПК Timer1.initialize(); // Инициализируем таймер 1 MFS.initialize(&Timer1); // Инициализируем библиотеку функций Multi-function Shield } void loop() { // put your main code here, to run repeatedly: byte btn = MFS.getButton(); // Читаем состояние кнопок в переменную btn byte btn1 = btn & B00111111 & B11000000; // Читаем состояние кнопок в переменную btn1 byte btn2 = BUTTON_2_PIN; // Читаем состояние кнопок в переменную btn2 if(btn==BUTTON_1_PRESSED&&flag==0)//если кнопка нажата // и перемення flag равна 0 , то ... { regim++; flag=1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% if(regim>3)//ограничим количество режимов { regim=1;//так как мы используем только одну кнопку, // то переключать режимы будем циклично } } if(btn==BUTTON_1_SHORT_RELEASE&&flag==1)//если кнопка НЕ нажата //и переменная flag равна - 1 ,то ... { flag=0;//обнуляем переменную "knopka" } if(regim==1)//первый режим { Serial.println("PRESSED1"); MFS.beep(5); delay(500); MFS.beep(5); delay(500); delay(delayTime); //здесь может быть любое ваше действие } if(regim==2)//второй режим { Serial.println("PRESSED2"); MFS.beep(15); delay (1500); MFS.beep(15); delay (1500); //здесь может быть любое ваше действие } if(regim==3)//третий режим { Serial.println("PRESSED3"); MFS.beep(30); delay (3000); MFS.beep(30); delay (3000); //здесь может быть любое ваше действие } if (btn==BUTTON_3_PRESSED) //если кнопка нажата { Serial.println("STOP"); // Вывести на ПК слово "STOP" while (true) { //Зацыклить и остановить плату до перезапуска платы ; } } }
Сколько из этого "кода" вы написали сами?
Сколько из этого "кода" вы понимаете?
Что вы знаете об алгоритмах?
и последний и контрольный вопрос, вы хотите научится или просто решили что это "просто"?
В принцепе написал свё сам, и понимаю что написал, но не уверн правильно ли понимаю. Я хочу научиться, может кто то и лучше знает что писать, но что я знаю то и написал. Я слабовато понимаю как задавать переменные, допустим как привязать пин к слову, и как привязать переменную к слову, типа флаг, или еще луюбую другую, которую мы будем менять в процессе выполнения команд if(). Если вы счетаете что я чево то не понимаю то поясните, я только новичёк, и взялся за такую вроде и простую задачу, но что то маловато опыта и знаний. Алгоритмы, врятли я что то по ним знаю, смотрел примеры, и лепил своё, но я хочу понять. Так что прошу: "Teach me!".
Я часто замечал команду #define и пока питаюс понять как её применить в моём случае, и вообще нужно ли применять.
Так что прошу: "Teach me!".
Форум не может заменить учебник.
Да и не должен.
Поэтому "научить" - это вряд ли. Здесь могут только указать направление для "научиться самостоятельно".
А по поводу алгоритмов - здесь ничего сложного нет: в большинстве случаев контроллер должен действовать точно так же, как поступил бы человек на его месте. Т.е. проблема составления алгоритма лишь в том, чтобы суметь подробно расписать действия, которые мог бы совершать сам в той или иной ситуации.
PS. По поводу отдельных команд, - это, опять же, не на форум, а к документации, например, к Кернигану и Ритчи. Что касается #define - команда сложная, особенное если использувется несколько директив каскадом. Но смое первое - то, о чем я уже писал выше - внятно расписать (хотя бы для себя самого), чего именно Вы хотите.
Согласен, учится я буду сам, вот сейчас и читаю все понятия команд.
Я хочу сделать паузу в команде if(), ардуинка видит что выполняеться условие и сново выполняет без конца, может мне нужна не команда if()?
Может условие поменять?
Ну здесь может я розберусь еще как то. А вот как мне нажатием второй кнопки повторить заново условие, типа перезапустить ардуинку без прогрузки(будто оно заново компилирует). Чтоб прочитало еще раз void loop() и виполнило условие.
Верю с трудом, ну да не суть..
Хотите научится - начните с составления блок схемы вашего приложения, это крайне положительно скажется на понимании алгоритмов =)
Не нужно зубрить все комманды, вы будете постоянно пользоватся только десятком, а остальное, редко пользуемое, всегда можно подсмотреть в справочнике(в гугле).
Забудьте про эту комманду..
Вам она нужна будет тогда когда вы будете спокойно писать код без нее..
Пока думал как описать проблему, обдумивал варианты решения, и понял что просто над поменять условие.
Всем спасиб, за то что заставили меня думать :D
Попробуйте так, Ваш код не менял - просто добавил несколько строчек согласно Вашего задания. Вот зачем третья кнопка вешает ардуину НЕ понял, может просто выключить ее, и електроенергию можно ЭКОНОМИТЬ.
Спасибо. отличное решение, да 3 кнопка по сути не нужна, уберу её.
Ох и каша же у Вас в голове .. мой ХШ подсказывает, что лет Вам немного, но зато есть опыт программирования EV3 .. так? Или ХШ протирать уже надо или батарейку заменить что ли..
В сообщении №7 строка 22 эквивалентна:
Ето вы так оскорбляете? Если строка 22 еквивалентна то её можно записать в любой форме, как я записал так и есть, если там лишенее, то я это знаю, мне просто лень выбрасывать с кода,эсли это лишнее нагружает, то мне по барабану, я просто проверяю что как роботает. А эти свои оскорбления оставьте при себе.
Оскорблений не прозвучало, Вам показалось. ХШ это хрустальный шар для гаданий- синоним интуиции/догадок на форуме.
Вы из Сербии, или из Черногории?