как включить помпу на 3 секунды без delay?

Тема в разделе "Arduino & Shields", создана пользователем Толик Иванов, 4 янв 2016.

  1. Толик Иванов

    Толик Иванов Administrator Администратор

    ребята, помогите разобраться с millis на примере работы помпы. есть часы реального времени и есть помпа. каждый раз когда минуты равны 00 , нужно включить помпу и оставить ее работать на 3 секунды. сначала работало через делей, но во время работы помпы время на дисплее замерало на время работы помпы. могу сделать так чтоб в 00 минут и 00 секунд помпа включалась, а выключалась когда минуты равны 00 и секунды равны 03. но это помоему очень просто. и не очень надежно. хочу сделать на millis , но совсем не умею с ними работать. вот прошу у всех Вас помощи.
     
  2. vvr

    vvr Инженерище

    стандартный пример
    Код (C++):
    const int ledPin =  13;      // номер выхода, подключенного к светодиоду
    // Variables will change:
    int ledState = LOW;             // этой переменной устанавливаем состояние светодиода
    long previousMillis = 0;        // храним время последнего переключения светодиода
    long interval = 1000;           // интервал между включение/выключением светодиода (1 секунда)
    void setup() {
      // задаем режим выхода для порта, подключенного к светодиоду
      pinMode(ledPin, OUTPUT);    
    }
    void loop()
    {
      // здесь будет код, который будет работать постоянно
      // и который не должен останавливаться на время между переключениями свето
      unsigned long currentMillis = millis();
     
      //проверяем не прошел ли нужный интервал, если прошел то
      if(currentMillis - previousMillis > interval) {
        // сохраняем время последнего переключения
        previousMillis = currentMillis;
        // если светодиод не горит, то зажигаем, и наоборот
        if (ledState == LOW)
          ledState = HIGH;
        else
          ledState = LOW;
        // устанавливаем состояния выхода, чтобы включить или выключить светодиод
        digitalWrite(ledPin, ledState);
      }
    }
     
     
    Толик Иванов нравится это.
  3. Толик Иванов

    Толик Иванов Administrator Администратор

    спасибо! ща гляну и попробую разобраться
     
  4. Толик Иванов

    Толик Иванов Administrator Администратор

    спасибо! разобрался! теперь работает на millis:)
    слышал что-то, что счетчик у millis не бесконечный, да еще и ко всему у меня изменена частота ШИМ на ардуине и поэтому 3 секунды у меня получаются равны 100000 милис.
    сделал следующим образом
    Код (C++):
    long interval=100000;

    if(){
    digitalWrite (pomp, HIGH);
    currentMillis = millis();  
      }


    if( (millis() - currentMillis)  > interval){
      digitalWrite (pomp, LOW);
    }

    а что произойдет когда у меня таким образом счетчик милис подойдет к своему заполнению? он обнулится? и есть ли возможность обнулять его всякий раз перед включением помпы?
     
  5. CryNET

    CryNET Гик

    Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.

    P.S.
    По сути разницы нету, когда millis переполняется и сбрасывается на 0, то считайте, будто Arduino "заново" начала свою программу. Думаю не стоит волноваться, тем более 50 дней достаточно не мало и, скорее всего, она у вас не один раз перезагрузится :)
     
    Толик Иванов и vvr нравится это.
  6. vvr

    vvr Инженерище

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

    упс.....опередили:)
     
    Толик Иванов и CryNET нравится это.
  7. Airbus

    Airbus Радиохулиган Модератор

    А чем delay плох тогда?
     
  8. Толик Иванов

    Толик Иванов Administrator Администратор

    у меня при использовании делей в момент работы помпы на дисплее не обновляются показания времени и температуры
     
  9. CryNET

    CryNET Гик

    Т.е. получается некая "многопоточность" на самом примитивном уровне :)
     
  10. Толик Иванов

    Толик Иванов Administrator Администратор

    это одна лиш ветка всех многопоточностей на моем устройстве.
    у меня все работает или по времени или по температуре или по влажности или одновременно все вместе.