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()?
if(regim==1) { Serial.println("PRESSED1"); MFS.beep(5); delay(500); MFS.beep(5); delay(500); }Может условие поменять?
if(regim==1&&btn==BUTTON_1_PRESSED) { Serial.println("PRESSED1"); MFS.beep(5); delay(500); MFS.beep(5); delay(500); }Ну здесь может я розберусь еще как то. А вот как мне нажатием второй кнопки повторить заново условие, типа перезапустить ардуинку без прогрузки(будто оно заново компилирует). Чтоб прочитало еще раз void loop() и виполнило условие.
Верю с трудом, ну да не суть..
Хотите научится - начните с составления блок схемы вашего приложения, это крайне положительно скажется на понимании алгоритмов =)
Не нужно зубрить все комманды, вы будете постоянно пользоватся только десятком, а остальное, редко пользуемое, всегда можно подсмотреть в справочнике(в гугле).
Забудьте про эту комманду..
Вам она нужна будет тогда когда вы будете спокойно писать код без нее..
Пока думал как описать проблему, обдумивал варианты решения, и понял что просто над поменять условие.
if(regim==1&&btn==BUTTON_2_PRESSED||regim==1&&btn==BUTTON_1_PRESSED)//первый режим { Serial.println("PRESSED1"); MFS.beep(5); delay(500); MFS.beep(5); delay(500); delay(delayTime); //здесь может быть любое ваше действие }Всем спасиб, за то что заставили меня думать :D
Попробуйте так, Ваш код не менял - просто добавил несколько строчек согласно Вашего задания. Вот зачем третья кнопка вешает ардуину НЕ понял, может просто выключить ее, и електроенергию можно ЭКОНОМИТЬ.
#include <I2C.h> #include <II2C.h> #include <MPU6050.h> #include <MultiFuncShield.h> // Подключаем библиотеку для работы с таймером 1 (она понадобитсся для инициализации Multi-function Shield) #include <TimerOne.h> int regim = 1; bool flag = 0; bool fl_regim; //Добавляем переменную для звучания 1 раз 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% fl_regim = 1; // Меняем для звучания 1 раз if (regim > 3) //ограничим количество режимов { regim = 1; //так как мы используем только одну кнопку, // то переключать режимы будем циклично } } if (btn == BUTTON_1_SHORT_RELEASE && flag == 1) //если кнопка НЕ нажата //и переменная flag равна - 1 ,то ... { flag = 0; //обнуляем переменную "knopka" } if (regim == 1 && fl_regim == 1) //первый режим { fl_regim = 0;// Меняем для звучания 1 раз Serial.println("PRESSED1"); MFS.beep(5); delay(500); MFS.beep(5); delay(500); delay(delayTime); //здесь может быть любое ваше действие } if (regim == 2 && fl_regim == 1) //второй режим { fl_regim = 0;// Меняем для звучания 1 раз Serial.println("PRESSED2"); MFS.beep(15); delay (1500); MFS.beep(15); delay (1500); //здесь может быть любое ваше действие } if (regim == 3 && fl_regim == 1) //третий режим { fl_regim = 0;// Меняем для звучания 1 раз Serial.println("PRESSED3"); MFS.beep(30); delay (3000); MFS.beep(30); delay (3000); //здесь может быть любое ваше действие } if (btn == BUTTON_2_PRESSED && !fl_regim) //если кнопка нажата - Возвращае предыдущее звучание { fl_regim = 1;// Меняем для звучания 1 раз if (regim > 1) --regim; //Возвращае предыдущее звучание else regim = 3; } if (btn == BUTTON_3_PRESSED) //если кнопка нажата { Serial.println("STOP"); // Вывести на ПК слово "STOP" while (true) { //Зацыклить и остановить плату до перезапуска платы ; } } }Спасибо. отличное решение, да 3 кнопка по сути не нужна, уберу её.
Ох и каша же у Вас в голове .. мой ХШ подсказывает, что лет Вам немного, но зато есть опыт программирования EV3 .. так? Или ХШ протирать уже надо или батарейку заменить что ли..
В сообщении №7 строка 22 эквивалентна:
Ето вы так оскорбляете? Если строка 22 еквивалентна то её можно записать в любой форме, как я записал так и есть, если там лишенее, то я это знаю, мне просто лень выбрасывать с кода,эсли это лишнее нагружает, то мне по барабану, я просто проверяю что как роботает. А эти свои оскорбления оставьте при себе.
Оскорблений не прозвучало, Вам показалось. ХШ это хрустальный шар для гаданий- синоним интуиции/догадок на форуме.
Вы из Сербии, или из Черногории?