Как подружить random и millis?

Тема в разделе "Arduino & Shields", создана пользователем Tanatos, 20 янв 2019.

  1. Tanatos

    Tanatos Нуб

    Добрый всем день!
    Задумка сделать АнтиКрот, чтоб отпугивать вредителей. Но есть идея прицепить ещё и другие функции к устройству. Но два постоянных delay будут всё остальное морозить. Подскажите, как перевести код на millis?
    Код (C++):
    // Антикрот периодически включает реле с вибродвигателем, шум которого отпугивает кротов, землероек
    // Периодичность случайна, чтоб вредители не могли привыкнуть

    #define AntiKrot 29

    void setup()
    {
    pinMode(AntiKrot, OUTPUT); // реле
    digitalWrite(AntiKrot, 0);
    }

    void loop()
    {
    int timeAntikrotShum = random(3000, 6000); // генерируем длительность шума от 5 до 10 сек
    int timeAntikrotPause = random(8000, 20000); // генерируем паузу от 10 до 25 сек
    digitalWrite(AntiKrot,1);
    delay(timeAntikrotShum);
    digitalWrite(AntiKrot,0);
    delay(timeAntikrotPause);
    }
     
  2. Un_ka

    Un_ka Гуру

    Код (C++):
    if(таймер +период < millis){
    перекидывание пина
    таймер=millis
    }
     
  3. DetSimen

    DetSimen Guest

    Нет
     
  4. Un_ka

    Un_ka Гуру

    Я так делаю? А что не так?
     
  5. DetSimen

    DetSimen Guest

    Код (C++):
    uint32_t now=millis();
    if(now-lastmillis>interval) {
    // do something
    lastmillis=now;
    }
     
    Andrey12 и Tanatos нравится это.
  6. DetSimen

    DetSimen Guest

    Только вычитание гарантирует отсутствие переполнения
     
  7. Un_ka

    Un_ka Гуру

    Понял . Спасибо.
     
  8. Я таки думаю можно и флаги воткнуть, на всякий случай.
     
  9. DetSimen

    DetSimen Guest

    Смотря куда.
     
    Asper Daffy и Сусемьбек нравится это.
  10. Daniil

    Daniil Гуру

    Засекать время включения, а потом проверять прошло ли заданное время. Если нет, то занимать чем-то другим, если да, то отработать процедуру.
     
  11. Tanatos

    Tanatos Нуб

    А для чайника немного нагляднее всё вышесказанное применительно к моему случаю можно? )
    Спасибо
     
  12. Порутчик молчать!!! чтоб гарантия была что стабильно отработает вкл, потом перейдет в выкл. Хотя подумал, что это решается простой проверкой в каком состоянии сейчас пин.
     
  13. Если завтра до компа доберусь попробую накидать. На телефоне неудобно
     
    Tanatos нравится это.
  14. b707

    b707 Гуру

    а куда тут нагляднее?
    Попробуйте чуть мозги напрячь и хотя бы попытайтесь вставить предложенный код в свой скетч
     
  15. Накидал тут. Писал с телефона могут быть ошибки.
    Может будет работать.
    Код (C++):
    #define  Antrikot  3
    bool     Pomogator =0;
    bool     Pomogator_2 =0;
    uint32_t lastmillis = 0;

    void setup() {
    pinMode(Antrikot, OUTPUT);
    digitalWrite(Antrikot, 0);

    }

    void loop() {
      int timeAntrikotShum = random(300, 600);
      int timeAntrikotPause = random(800, 2000);
     
    if (  Pomogator ==0)
    {
       digitalWrite(Antrikot, 1);  
       lastmillis=millis();
       Pomogator =1;
      }
    if(millis()-lastmillis>timeAntrikotShum && Pomogator_2==0  )
      {
       digitalWrite(Antrikot,0);
       lastmillis=millis();
       Pomogator_2=1;
      }

    if(millis()-lastmillis>timeAntrikotPause && Pomogator_2==1)
    {
      digitalWrite(Antrikot,1);
      Pomogator_2=0;
      lastmillis=millis();
    }

    }
    Можно было и без мудрежа с флагами, но компа под рукой нет чтоб код прогнать, поэтому так, чтоб наверняка.
     
  16. b707

    b707 Гуру

    вот эта часть не продумана. Будет работать совсем не так, как вы планируете
    Код (C++):
    #define  Antrikot  3

    void loop() {
      int timeAntrikotShum = random(300, 600);
      int timeAntrikotPause = random(800, 2000);

    }
     
    Сусемьбек нравится это.
  17. Возможно. Это просто набросок.
    Добавил позднее:
    Сообразил как правильнее сделать). Но это совсем пустяк, пусть тс сам сделает.
     
    Последнее редактирование: 20 янв 2019
  18. b707

    b707 Гуру

    сомневаюсь я...
     
  19. Код (C++):
    #define  Antrikot  3
    bool     Pomogator =0;
    bool     Pomogator_2 =0;
    uint32_t lastmillis = 0;
    uint16_t timeAntrikotShum = 0;
    uint16_t timeAntrikotPause = 0;

    void setup() {
    pinMode(Antrikot, OUTPUT);
    digitalWrite(Antrikot, 0);

    }

    void loop() {
     
    if (  Pomogator ==0)
     {  
       digitalWrite(Antrikot, 1);    
       lastmillis=millis();
       timeAntrikotShum = random(300, 600);
       Pomogator =1;
      }
    if(millis()-lastmillis>timeAntrikotShum && Pomogator_2==0  )
      {
       digitalWrite(Antrikot,0);
       lastmillis=millis();
       timeAntrikotPause = random(800, 2000);  
       Pomogator_2=1;
      }

    if(millis()-lastmillis>timeAntrikotPause && Pomogator_2==1)
     {
      digitalWrite(Antrikot,1);
      Pomogator_2=0;
      timeAntrikotShum = random(300, 600);
      lastmillis=millis();
     }

    }
    Лучше?)
     
    b707 нравится это.
  20. b707

    b707 Гуру

    лучше - по крайней мере на первый взгляд должно работать, в отличии от прошлого варианта:)
    Хотя есть куда стремится - один "помогатор" лишний. условие для него лишнее, да и интервалов два не нужно
     
    Asper Daffy, DetSimen и Сусемьбек нравится это.