Сомнение в части кодировании мигания без задержки

arduino-uno coding-standards

Код 1 (здесь unsigned long currentmillis = millis() находится в области цикла):

const int LED = 2;
unsigned long previousmillis = 0 ;
const long delaytime = 1500;
int ledstate = HIGH;

void setup() {
 pinMode(LED,OUTPUT);
}

void loop() {
  unsigned long currentmillis = millis();
  if (currentmillis - previousmillis >= delaytime) {
    previousmillis = currentmillis;
    if (ledstate == HIGH) {
      ledstate = LOW;
    } else{
      ledstate = HIGH;
    }
    digitalWrite(LED,ledstate);
  }  
}

Код 2 (здесь unsigned long currentmillis = millis() находится выше void setup()):

const int LED = 2;
unsigned long previousmillis = 0 ;
unsigned long currentmillis = millis();
const long delaytime = 1500;
int ledstate = HIGH;

void setup() {
 pinMode(LED,OUTPUT);
}

void loop() {
  if (currentmillis - previousmillis >= delaytime) {
    previousmillis = currentmillis;
    if (ledstate == HIGH) {
      ledstate = LOW;
    } else {
      ledstate = HIGH;
    }
    digitalWrite(LED,ledstate);
  }  
}

Код 1 работает, а код 2 не работает. Каково значение позиции unsigned long currentmillis = millis() здесь и почему?

, 👍2


1 ответ


4

Это распространенное недоразумение для начинающих Arduino.

Во втором коде вы делаете

unsigned long currentmillis = millis();

вне какой-либо функции, то есть в глобальном масштабе. Эти переменные объявляются в самом начале программы, еще до того, как будет сконфигурирован исходный материал Arduino (например, конфигурация Timer0 для работы millis ()). Переменная будет иметь нулевое значение. А переменные волшебным образом не привязаны к источнику. То, что вы там делаете,-это одноразовое задание. currentmillis не будет иметь будущих значений millis(). Он останется неизменным до тех пор, пока вы не измените его в своем коде. Во втором коде вы никогда не меняете currentmillis, таким образом, is останется на том же значении навсегда, что не позволит коду работать правильно.

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

Этот принцип кодирования работает точно так же, как если бы вы пекли пиццу, регулярно глядя на часы, чтобы проверить время, пока вы делаете другие вещи. С вашим первым кодом вы очень регулярно смотрите на часы, чтобы не пропустить время, чтобы достать пиццу из духовки. Со вторым кодом вы только один раз смотрите на часы, еще до того, как положили пиццу в духовку, и больше никогда; так что ваша пицца сгорит.

,

Понял, спасибо @chrisl, @Arduino Newbie