как прекратить выполнение программы?

Тема в разделе "Arduino & Shields", создана пользователем varvik85, 5 окт 2015.

  1. varvik85

    varvik85 Нерд

    Здравствуйте!
    Подскажите новичку, пожалуйста. Задумка такая, как только срабатывает датчик проигрывается один раз мелодия.Датчик в виде сопротивления.Программа определяет сопротивление и если оно нужного номинала проигрывает один раз мелодию.
    Код (C++):
    #include "pitches.h"

    int a = 0;
    byte f = 0;
    // ноты в мелодии:

    int melody[] = {

    NOTE_C4, NOTE_E4,NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5,};

    // продолжительность ноты: 4 = четверть ноты, 8 = восьмая часть, и т.д.:

    int noteDurations[] = {

    8, 8, 8, 4,8,4 };


    void setup () {
     
      pinMode (A0, INPUT_PULLUP);
      pinMode(13, OUTPUT);
    //перебор нот мелодии:



    }


    void loop () {
    // не нужно повторять мелодию.
      a = analogRead(A0);

    if (a > 300  && a < 370)
    {
      f = 0;
    }
    else
    {
    f = 1;
    }

    if (f == 0)
    {
    musika();
    }

    }

    void musika() {
      for (int thisNote = 0; thisNote < 8; thisNote++) {

    // для расчета продолжительности мелодии взята одна секунда
    //разделенная на тип ноты.
    //e.g. четверть ноты= 1000 / 4, восьмая часть = 1000/8, etc.
    int noteDuration = 1000/noteDurations[thisNote];

    tone (10, melody[thisNote],noteDuration);

    //чтоб разделить ноты установим минимальную паузу между ними.
    // длительност ноты + 30% вполне подойдет:

    int pauseBetweenNotes = noteDuration * 1.30;
    delay (pauseBetweenNotes);

    // stop the tone playing:

    noTone (10);

    }
    }
    Но проблема в том ,что если датчик будет включен постоянно то мелодия будет постоянно повторятся, а мне нужно чтоб она сработала один раз. Как сделать чтоб она сработала разово?
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Почти правильно. Вы флаг немного не так используете ;)
    Код (C++):
    #include "pitches.h"

    int a = 0;
    boolean flagPlayOnce = true;  // при true НАДО проиграть музыку 1 раз
    // ноты в мелодии:

    int melody[] = {

    NOTE_C4, NOTE_E4,NOTE_G4, NOTE_C5, NOTE_G4, NOTE_C5,};

    // продолжительность ноты: 4 = четверть ноты, 8 = восьмая часть, и т.д.:

    int noteDurations[] = {

    8, 8, 8, 4,8,4 };


    void setup () {
      pinMode (A0, INPUT_PULLUP);
      pinMode(13, OUTPUT);
    //перебор нот мелодии:
    }


    void loop ()
    {
    // не нужно повторять мелодию.
      a = analogRead(A0);

    if (a > 300  && a < 370 ) // если кнопка нажата
        {
           musika();
        }
       else
        {
        // к флагу тут ничего не относится
        }
    }

    void musika()
    if flagPlayOnce == true // если разрешено, играем мелодию
    {
      for (int thisNote = 0; thisNote < 8; thisNote++)
       {
        // для расчета продолжительности мелодии взята одна секунда
        //разделенная на тип ноты.
        //e.g. четверть ноты= 1000 / 4, восьмая часть = 1000/8, etc.
        int noteDuration = 1000/noteDurations[thisNote];

        tone (10, melody[thisNote],noteDuration);

        //чтоб разделить ноты установим минимальную паузу между ними.
        // длительност ноты + 30% вполне подойдет:

        int pauseBetweenNotes = noteDuration * 1.30;
        delay (pauseBetweenNotes);

        // stop the tone playing:

        noTone (10);
        }
      flagPlayOnce = false; // ставим метку, что музыка уже сыграла один раз
      }
    }
     
  3. varvik85

    varvik85 Нерд

    Спасибо огромное!