Multi-function Shield

pavlin
pavlin аватар
Offline
Зарегистрирован: 22.05.2018

Хочу сделать чтоб при нажатии на 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) {                        //Зацыклить и остановить плату до перезапуска платы
;
}
      }
    
}

 

 

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

Сколько из этого "кода" вы написали сами? 

Сколько из этого "кода" вы понимаете?

Что вы знаете об алгоритмах? 

 

и последний и контрольный вопрос, вы хотите научится или просто решили что это "просто"? 

pavlin
pavlin аватар
Offline
Зарегистрирован: 22.05.2018

В принцепе написал свё сам, и понимаю что написал, но не уверн правильно ли понимаю. Я хочу научиться, может кто то и лучше знает что писать, но что я знаю то и написал. Я слабовато понимаю как задавать переменные, допустим как привязать пин к слову, и как привязать переменную к слову, типа флаг, или еще луюбую другую, которую мы будем менять в процессе выполнения команд if(). Если вы счетаете что я чево то не понимаю то поясните, я только новичёк, и взялся за такую вроде и простую задачу, но что то маловато опыта и знаний. Алгоритмы, врятли я что то по ним знаю, смотрел примеры, и лепил своё, но я хочу понять. Так что прошу: "Teach me!".

Я часто замечал команду #define и пока питаюс понять как её применить в моём случае, и вообще нужно ли применять.

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

pavlin пишет:

Так что прошу: "Teach me!".

Форум не может заменить учебник.

Да и не должен.

Поэтому "научить" - это вряд ли. Здесь могут только указать направление для "научиться самостоятельно". 

А по поводу алгоритмов - здесь ничего сложного нет: в большинстве случаев контроллер должен действовать точно так же, как поступил бы человек на его месте. Т.е. проблема составления алгоритма лишь в том, чтобы суметь подробно расписать действия, которые мог бы совершать сам в той или иной ситуации.

 

PS. По поводу отдельных команд, - это, опять же, не на форум, а к документации, например, к Кернигану и Ритчи. Что касается #define - команда сложная, особенное если использувется несколько директив каскадом. Но смое первое - то, о чем я уже писал выше - внятно расписать (хотя бы для себя самого), чего именно Вы хотите.

pavlin
pavlin аватар
Offline
Зарегистрирован: 22.05.2018

Согласен, учится я буду сам, вот сейчас и читаю все понятия команд. 

Я хочу сделать паузу в команде 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()  и виполнило условие.

ToRcH2565
Offline
Зарегистрирован: 16.05.2015

pavlin пишет:
В принцепе написал свё сам

Верю с трудом, ну да не суть..

Хотите научится - начните с составления блок схемы вашего приложения, это крайне положительно скажется на понимании алгоритмов =) 

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

pavlin пишет:
Я часто замечал команду #define и пока питаюс понять как её применить в моём случае, и вообще нужно ли применять.

Забудьте про эту комманду..

Вам она нужна будет тогда когда вы будете спокойно писать код без нее..

 

 

pavlin
pavlin аватар
Offline
Зарегистрирован: 22.05.2018

Пока думал как описать проблему, обдумивал варианты решения, и понял что просто над поменять условие.

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

 

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте так, Ваш код не менял - просто добавил несколько строчек согласно Вашего задания. Вот зачем третья кнопка вешает ардуину НЕ понял, может просто выключить ее, и електроенергию можно ЭКОНОМИТЬ.

#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) {                        //Зацыклить и остановить плату до перезапуска платы
      ;
    }
  }

}

 

pavlin
pavlin аватар
Offline
Зарегистрирован: 22.05.2018

Спасибо. отличное решение, да 3 кнопка по сути не нужна, уберу её.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ох и каша же у Вас в голове .. мой ХШ подсказывает, что лет Вам немного, но зато есть опыт программирования EV3 .. так? Или ХШ протирать уже надо или батарейку заменить что ли..

В сообщении №7 строка 22 эквивалентна:

byte btn1 = 0; // умножение любого числа на 2 таких маски === 0!

 

pavlin
pavlin аватар
Offline
Зарегистрирован: 22.05.2018

Ето вы так оскорбляете? Если строка 22 еквивалентна то её можно записать в любой форме, как я записал так и есть, если там лишенее, то я это знаю, мне просто лень выбрасывать с кода,эсли это лишнее нагружает, то мне по барабану, я просто проверяю что как роботает. А эти свои оскорбления оставьте при себе.

 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Оскорблений не прозвучало, Вам показалось. ХШ это хрустальный шар для гаданий- синоним интуиции/догадок на форуме.

Вы из Сербии, или из Черногории?