Сомнение в части кодировании мигания без задержки
Код 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()
здесь и почему?
@Arduino Newbie, 👍2
1 ответ
Это распространенное недоразумение для начинающих Arduino.
Во втором коде вы делаете
unsigned long currentmillis = millis();
вне какой-либо функции, то есть в глобальном масштабе. Эти переменные объявляются в самом начале программы, еще до того, как будет сконфигурирован исходный материал Arduino (например, конфигурация Timer0 для работы millis ()
). Переменная будет иметь нулевое значение. А переменные волшебным образом не привязаны к источнику. То, что вы там делаете,-это одноразовое задание. currentmillis
не будет иметь будущих значений millis()
. Он останется неизменным до тех пор, пока вы не измените его в своем коде. Во втором коде вы никогда не меняете currentmillis
, таким образом, is останется на том же значении навсегда, что не позволит коду работать правильно.
В первом коде значение присваивается на каждой итерации loop ()
, поэтому вы можете быть уверены, что оно имеет очень актуальное значение millis ()
, когда вы используете его впоследствии.
Этот принцип кодирования работает точно так же, как если бы вы пекли пиццу, регулярно глядя на часы, чтобы проверить время, пока вы делаете другие вещи. С вашим первым кодом вы очень регулярно смотрите на часы, чтобы не пропустить время, чтобы достать пиццу из духовки. Со вторым кодом вы только один раз смотрите на часы, еще до того, как положили пиццу в духовку, и больше никогда; так что ваша пицца сгорит.
- когда я закончил кодировать свои 3 двигателя постоянного тока, все эти ошибки накопились, одна из них сказала, что в программе есть случайный «/ 302».
- Почему светодиодное состояние ведет себя по-другому?
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
Понял, спасибо @chrisl, @Arduino Newbie