Различия между millis(); delay(); micros(); and delayMicroseconds()

Тема в разделе "Arduino & Shields", создана пользователем CryNET, 2 фев 2014.

  1. CryNET

    CryNET Гик

    Приветствую всех!

    Хотелось бы узнать их различия, и в каких случаях нужно использовать каждую из них?

    Буду благодарен за ответ :)
     
  2. geher

    geher Гуру

    Все просто.
    millis и micros возвращают количество соответственно миллисекунд и микросекунд с начала старта программы. Могут быть использованы для измерения времени между двумя событиями.
    delay и delayMicrodseconds - задержка на указанный в аргументе период соответственно в миллисекундах и микросекундах. Используется для того, чтобы просто тормознуть исполнение алгоритма на указанное время.
     
    CryNET нравится это.
  3. CryNET

    CryNET Гик

    т.е millis() с момента старта МК считает время, и если мой МК работает 2 дня (48 часов), то он эти часы в секунды мне будет возвращать? Его можно как-нибудь "обнулять"? Какие манипуляции можно с ним делать?
     
  4. CryNET

    CryNET Гик

    Я хотел бы сделать что-то вроде "Если кнопка нажата 2 секунды - включить 13 LED; Если нажата 5 секунд - выключить 13 LED;" Как это можно организовать?
     
  5. geher

    geher Гуру

    Это вроде беззнаковое 32 бит целое, обнуляется по переполнению (после 0xFFFFFFFF следует 0). Обнулить его самому, если я правлильно понимаю, можно только выполнив ресет микроконтроллера (кнопкой перезапуска, если имеется, импульсом на пин).
     
    Последнее редактирование: 2 фев 2014
  6. geher

    geher Гуру

    Засекаем нажатие на кнопку. Запоминаем сразу после этого значение, возвращаемое millis, проверяем периодически разницу между текущим значением, возвращаемым millis и запомненным вместе с состоянием кнопки. Если разница больше или равна 2000, но пока еще меньше 5000, а кнопка все еще нажата - включить LED. Если разница больше или равна 5000, а кнопка все еще нажата - выключить LED.
    Возможно, при проверке значения millis придется отдельно рассмотреть случай перехода значения millis через 0. Можно также менять поведение, если кнопка нажата больше двух секунд, но все еще не отпущена, учитывать текущее состояние LED,
     
    CryNET нравится это.
  7. CryNET

    CryNET Гик

    Спасибо - будем пробовать :)
    Если получится нормальный скетч - выложу сюда, быть может кому-нибудь понадобится "кик-старт" как и мне :)
     
  8. geher

    geher Гуру

    Для примера, выжимки из моего кода, реализация включения подсветки индикатора на 5 сек.
    Правда переход через ноль обработан просто. После перехода подсветка гаснет вне зависимости от того, прошли ли положенные 5 сек.

    Код (Text):

    // Пин, к которому подключен затвор транзистора управления подсветкой
    #define LCDLIGHTPIN 10
    // Пин, на который заведена кнопка управления подсветкой
    // В Arduino Micro это не только RX, но и внешнее прерывание 2
    #define LCDLIGHTBUTTONPIN 0
    // Время, когда была нажата кнопка, в миллисекундах от включения платы
    volatile unsigned long lcdLightTime;
    // Признак, что  подсветка должна быть включена
    volatile unsigned long lcdLightOn;
    ...
    void setup()
    {
    ...
      pinMode(LCDLIGHTPIN,OUTPUT);
      pinMode(LCDLIGHTBUTTONPIN,INPUT_PULLUP);
      digitalWrite(LCDLIGHTPIN,LOW);
      lcdLightOn=0;
      attachInterrupt(2, LCDButtonInterrupt, FALLING);
    ...
    }
    void loop()
    {
    ...
    processlcdlight();
    ...
    }
    void LCDButtonInterrupt()
    {
      lcdLightOn=1;
      lcdLightTime=millis();
    }
    void processlcdlight(){
      if (lcdLightOn){
        digitalWrite(LCDLIGHTPIN,HIGH);
        if ((millis()>lcdLightTime+5000)||
            (millis()<lcdLightTime))
        lcdLightOn=0;
      }
      if (!lcdLightOn){
        digitalWrite(LCDLIGHTPIN,LOW);
      }
    }
    ...
     
    CryNET нравится это.