Как остановить выполнение действия?

Тема в разделе "Флудилка", создана пользователем Храпундель, 21 янв 2020.

  1. Здравствуйте!
    Озадачился проектом и приступил к решению.

    Компоненты:
    1. HR-SR04
    2. MP3_player
    3.Arduino nano
    4. Кнопка

    Подскажите, пожалуйста, как остановить постоянное опрашивания датчика HR-SR04? Данный датчик используется для привлечения внимания оператора, а после того как привлекли внимание, оператор нажимает кнопку и запускает рандомный файл. После цикл повторяется.
    А если HR-SR04 не привлек внимание человека для нажатия кнопки, то ждем n-время и повторяем действие.

    А сейчас:
    1. привлекаем внимание (HR-SR04 запускает музыку)
    2.нажимаем кнопку (запускаем рандомный файл), но при этом продолжается опрос датчика HR-SR04 и запускает проигрывание файла, перебивая действие вызванное нажатием кнопки.

    Подскажите, пожалуйста, что можно записать в код. Мысли на исходе(

    игруха.png
    Код (C++):
    #include <SoftwareSerial.h> // подключаем библиотеку SoftwareSerial
    #include <DFPlayer_Mini_Mp3.h> // подключаем библиотеку DFPlayer_Mini_Mp3
    SoftwareSerial mySerial(11, 10);
    // используем PIN 10 и PIN 11 для программного порта
    // 11 - RX, 10 - TX

    #define Trig 7
    #define Echo 6
    bool isClick = 1;
    int pinButton = 4;

    // переменная для хранения текущего время работы программы в мс
    unsigned long currentMillis = 0;
    // переменная для хранения времени работы программы
    // с последнего резкого вверх скачка вредных газов
    long previousMillisPlay = 0;
    // переменная для хранения времени работы программы
    // с последнего вывода данных в Serial
    long previousMillisSerial = 0;

    void setup () {
      Serial.begin (9600);
      pinMode(Trig, OUTPUT); //инициируем как выход
      pinMode(Echo, INPUT); //инициируем как вход
      pinMode(pinButton, INPUT_PULLUP);
      mySerial.begin (9600); // открываем софт-порт
      mp3_set_serial (mySerial); // задаем порт для плеера
      mp3_set_volume (15); //устанавливаем уровень громкости
    }

    unsigned int impulseTime=0;
    unsigned int distance_sm=0;

    void loop () {
     
      digitalWrite(Trig, HIGH);
      /* Подаем импульс на вход trig дальномера */
      delayMicroseconds(10); // равный 10 микросекундам
      digitalWrite(Trig, LOW); // Отключаем
      impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса
      distance_sm=impulseTime/58; // Пересчитываем в сантиметры
      Serial.println(distance_sm); // Выводим на порт
      if (distance_sm<30) // Если расстояние менее 30 сантиметром
     
    { // На этом этапе происходит вкл/выкл mp_3
      mp3_play(random(1, 5));;
      Serial.println("Play");
         delay(6000);
       
    }
    else {
          previousMillisPlay = 0;
        }

       isClick = ClickButton(isClick);
       if (isClick == 0)
       {
          mp3_play(random(5, 20));
          Serial.println("Play");
       }
       else {
          previousMillisPlay = 0;
        }
    }

    // метод обработки нажатия кнопки
    boolean ClickButton(boolean lastClick)
    {  
      boolean clickButton = digitalRead(pinButton);
      if (clickButton != lastClick)
      {
        delay(5);
        clickButton = digitalRead(pinButton);
      }
      return clickButton;
    }
     
  2. DetSimen

    DetSimen Guest

    Можно записать разные операторы языка Си, нужные для желаемого действия.
     
  3. parovoZZ

    parovoZZ Гуру

    Ты давай не выпендривайся, а скажи за оператор, который сможет
     
  4. DetSimen

    DetSimen Guest

    "Даччик, СТОЙ!!! Раз-два." Делов то.
     
    Ariadna-on-Line и issaom нравится это.
  5. parovoZZ

    parovoZZ Гуру

    А это точно на сях? Новая спецификация под давлением Правительства РФ? Точнее сказать, контрспецификация.
     
  6. DetSimen

    DetSimen Guest

    Это секретный Си. Военная разработка.
     
  7. parovoZZ

    parovoZZ Гуру

    break и return?
     
  8. DetSimen

    DetSimen Guest

    break и abort()
     
  9. b707

    b707 Гуру

    что ж так мало мыслей у вас? - ну подумайте, есть же оператор if
    Неужели не пришло в голову написать что-то вроде

    if (если кнопка не нажата) - опрашивать датчик
    else - не опрашивать датчик

    Делов то...
     
  10. SergeiL

    SergeiL Оракул Модератор

    Не, полностью остановить сможет только : :)
    Код (C++):
    while(1);
     
  11. DetSimen

    DetSimen Guest

    abort() это тот же while(true); тока еще сначала прерывания запрещает, чтоб тока Reset помогал.
     
    Daniil и SergeiL нравится это.
  12. SergeiL

    SergeiL Оракул Модератор

    А я с abort() не сталкивался на МК. :(
    UPD: Вспомнил, под DOS, Windows - это был _exit.
     
    Последнее редактирование: 22 янв 2020
  13. DetSimen

    DetSimen Guest

    Daniil и SergeiL нравится это.
  14. DetSimen

    DetSimen Guest

    я его, кстати, часто использую, когда продолжение невозможно. :)
    abort.jpg
     
  15. b707

    b707 Гуру

    delay(250) явно маловато для информирования юзера о проблеме. Я бы тут вместо abort() вставил все-таки while(1) - пусть мигает лампочками ошибки, пока пользователь не выключит
     
  16. DetSimen

    DetSimen Guest

    не. это длдя того, чтоб надпись Err9 на TM1637 успеть вывести. Так она там до сброса и зависнет
    Код (C++):
        case enDisplayState::Error:
                str_Error[3] = '0' + ErrorNo;
                Disp.Print(str_Error);
            break;
     
    Работает чётко. раз 6 за 3 года ловил отвалившийся даччик. Это заоконный термометр.
     
    Daniil, SergeiL и b707 нравится это.
  17. parovoZZ

    parovoZZ Гуру

    полностью же не просили, только
    Как кот за птичкой в окно за датчиком сигал?
     
  18. Asper Daffy

    Asper Daffy Иксперд

    Перестать его опрашивать не пробовали?
     
  19. :):):)хахаха
     
  20. Подскажите, пожалуйста, как прописать в коде. Спасибо