Пьезоэлемент, как избавиться от delay();

Тема в разделе "Arduino & Shields", создана пользователем Miheeei, 14 июн 2017.

  1. mcureenab

    mcureenab Гуру

    Да. Так проще, но темп постоянный и воспроизведение зациклено.
     
  2. Miheeei

    Miheeei Нерд

    Ваш код заработал, как отдельный скетч, я только в нем указала свой пин пищалки "#define PiezzoPin 5".
    Вот единственное когда я его в свою программу встреваю он начинает медленно пищать. Не пойму в чем дело. При выводе каких либо данных в сом порт видно что нет не каких задержек, основной цикл loop крутится без тормозов.
    Что касаемо флага "FlagOnBeep": Суть была такова: у меня есть 2 функции OnBeep(); OffBeep();, в каждой своя мелодия для пьезо, в каждой функции был свой влаг "FlagOnBeep, FlagOffBeep".
    Вот код:
    Код (C++):
    void OnBeep()
    {
      if(FlagOnBeep == false)
      {  
        tone(PiezzoPin, 1000, 50);
        delay(100);
        tone(PiezzoPin, 2000, 50);
        delay(100);
        tone(PiezzoPin, 3000, 100);
        FlagOnBeep = true;
      }
    }
    void OffBeep()
    {
      if(FlagOffBeep == false)
      {
      tone(PiezzoPin, 3000, 50);
      delay(100);
      tone(PiezzoPin, 2000, 50);
      delay(100);
      tone(PiezzoPin, 1000, 100);
      FlagOffBeep = true;
      }
    }
    Затем когда мне нужно включить или выключить реле я обращаюсь к этим функциям, т.е. реле включается максимум на 3 минуты и мелодия должна проиграть только в момент включения или выключения.

    Вот код:

    Код (C++):
    // Если сигнал пришел на включение
    {
    digitalWrite(ReleyNasosPin, HIGH);
    FlagOffBeep = false;
    OnBeep();
    }

    // Если пришел на выключение
    {
    digitalWrite(ReleyNasosPin, LOW);
    FlagOnBeep = false;
    OffBeep();
    }
    Как то так.
    Возможно что то еще в моем коде криво, в тему МК я месяца 4 как ударилась, еще только учусь и делаю первый стоящий проект. На сегодняшний день код содержит 728 строк, возможно влияет на скорость работы количество портов в режиме INPUT, их аж 7 шт. и я постоянно их слушаю, возможно переменных много 24 шт. Как не как, контрольный блок для системы водоснабжения!
    В итоге скетч использует 60% памяти, 41% глоб. переменных
     
  3. qwone

    qwone Гик

    Вот к примеру вы спроектировали дом. Замечательный дом. Да что там вы его даже построили и убедились что в нем замечательно живется. А теперь воткнем его в город с ужасной инфраструктурой. И подъехать к вашему дому будет сложно, Подача воды из водоснабжения малая, отвод канализации отсутсвует, и наконец сложно не только подъехать к вашему дому сложно, но и вывести мусор. Вы не виноваты, вы замечательно умеете строить дома, но вы просто не понимаете как строить города, Так что ваши дома в городе станут ненужны.
    Это все к тому, что уметь строить маленькие программы и большие программы, это разные вещи. Ведь главный ресурс это не память программы, не память ОЗУ, а сколько команд может выполнить процессор в единицу времени. И главное как сделать так, что бы ваш процессор не тормозил на одних участках программы, когда надо делать работу на других. Вот эта оптимизация очень сильно запутывает текст программы, что в ней очень сложно разобраться, что за что отвечает, и кто и где тормозит.
     
  4. mcureenab

    mcureenab Гуру

    За 100 мс можно сотни аналоговых прортов опросить и отреагировать.
    Если функция loop работает слишком долго, можно разместить вызовы OnBeep и OffBeep в разные части loop, чтобы чаще уделять им время.
    Но нужно отпрофилировать ваш скетч - то есть измерить время выполнения отдельных кусков кода. Иначе можно оптимизировать то, что и так не плохо работает.
     
  5. Cynep

    Cynep Нерд

    Настроить паузы и убрать зацикливание не сложно. Всего лишь вариант.
     
  6. mcureenab

    mcureenab Гуру

    Это принципиально не изменит подход.
    Тут мелодия из трёх тонов. Кодить длинную мелодию на switch не рационально.
    Есть смысл скармливать автомату массив тонов, длительностей и ожиданий.

    И для стабильного воспроизведения темпа нужно использовать прерывания от таймера.
     
  7. Cynep

    Cynep Нерд

    Тут согласен. Свитч это не правильный выбор. С таймером я пока не знаком.
     
  8. Miheeei

    Miheeei Нерд

    Всем спасибо за советы, Вчера закончила последние наладочные работы, пока вроде устройство работает шустро и без сбоев.
    Конечно буду пытаться оптимизировать код, но не все сразу.
    Возник маленький нюанс, он конечно не по этой теме но все же наверное спрошу.
    Имеется устройство (Гидроаккумулятор) когда в нем падает давление воды он подает мне на контроллер 5 вольтовый сигнал. Вчера столкнулась с проблемой, получается контроллер не запитан-отключен. Гидроаккумулятор подал сигнал 5 в. и в этот момент на контроллере загорелись светодиоды, Он будто подпитал его своим сигналом. Но напряжение просаженное, контроллер от него не запускается. просто стоит с горящими светодиодами. Далее я попробовала в этот момент подать питание на МК и он не включается пока ему мешает эта подпитка. не пойму в чем дело.
    5 вольт с гидроаккумулятора подключила как положено (GND - GND, Vcc - D4) (D4 подтянула к GND резистором на 10k).

    Ниже незамысловатый код.
    Код (C++):
    #define GidrobakPin 4
    #define ReleyNasosPin 6

    bool Gidrobak = false;

    void setup()
    {
      pinMode(GidrobakPin, INPUT);
      pinMode(ReleyNasosPin, OUTPUT);
    }

    void loop()
    {
      Gidrobak = digitalRead(GidrobakPin);
      if(Gidrobak == true)
        {
          digitalWrite(ReleyNasosPin, HIGH);
        }
        else
        {
          digitalWrite(ReleyNasosPin, LOW);
        }
    }
     
     
  9. mcureenab

    mcureenab Гуру

    Посмотрите, как подключен пин внутри МК:

    http://www.atmel.com/ru/ru/Images/doc7799.pdf

    Figure 12-1. I/O Pin Equivalent Schematic

    стр. 67

    Когда контроллер отключен напряжение с пина (Pxn на схеме) выше чем Vcc (стрелка вверх на схеме) и через верхний диод ток течет на Vcc и все потребители.

    Контроллер может не запускаться, если пин Reset не запитан как положено:

    2.2.12 RESET/PC1/dW
    стр. 5.

    либо на плате Arduino заблокирована подача напряжения. У вас какая модель Arduino?

    Вообще это не хорошо. Логические уровни на пинах привязаны к напряжению питания МК. В случае превышения Vcc или пренижения GND в работу включаются защитные диоды. Но их возможности не безграничны. Поставьте оптическую развязку.
     
    arkadyf нравится это.
  10. Miheeei

    Miheeei Нерд

    Вот блин, вы меня загрузили))
    Мой контроллер "Arduino Nano, Atmega328"
    Прилагаю наглядную схему подключения.
     

    Вложения:

  11. mcureenab

    mcureenab Гуру

    Не пойму что мешает. Измерьте напряжение на выходе Reset.
    А в общем не важно. Это плохая идея
    .
    Сделайте подключение через оптическую развязку, пока МК жив.