WordPress database error: [Table './meandr_base/anzpz_usermeta' is marked as crashed and last (automatic?) repair failed]
SELECT user_id, meta_key, meta_value FROM anzpz_usermeta WHERE user_id IN (1) ORDER BY umeta_id ASC

0

Arduino UNO — Тайминг. Урок 3

SONY DSC

Обратимся к первому уроку, где мы управляли LED. Между включением и выключением которого была секундная задержка.

В используемой там программе (см. код ниже) был один очень большой недостаток. Для выдержки паузы между вкл/выкл LED в 1 сек. нами была использована функция delay(). В это время контроллер не может выполнять другие команды в главной функции loop()

1
2
3
4
Cinq
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/* Мигание LED
* ------------
*
* Включает и выключает светодиод (LED) подсоединенный
* к выходу 13, с интервалом в 2 секунды
*
*/
int ledPin = 13; // LED подсоединен к выводу 13
void setup()
{
pinMode(ledPin, OUTPUT); // устанавливаем вывод 13 как выход
}
void loop()
{
digitalWrite(ledPin, HIGH); // включаем LED
delay(1000); // пауза 1 секунда
digitalWrite(ledPin, LOW); // выключаем LED
delay(1000); // пауза 1 секунда
}

Первое, что мы сделаем, это внесем небольшие корректировки в функцию loop(). Чтобы сделать код более компактным и изящным, заменим 2 пары строчек на одну пару. Вместо установки значения в HIGH, а затем обратно в LOW, мы получим текущее значение ledPin и проинвертируем его. Т.е. если оно было HIGH, то станет LOW и наоборот.

1
2
3
4
Cinq
void loop()
{
digitalWrite(ledPin, !digitalRead(ledPin)); // включаем/выключаем LED
delay(1000); // задержка 1 сек.
}

Отлично! Теперь мы усовершенствуем функцию delay(). Взамен, мы будем использовать функцию millis(). Данная функция возвращает количество миллисекунд, прошедшее с момента запуска текущей программы. Функция переполнится (вернется в нуль) приблизительно через 50 суток работы программы.

Альтернативной функцией является micros(), которая возвращает количество микросекунд, прошедшее с момента запуска текущей программы. Функция переполнится (вернется в нуль) приблизительно через 70 минут работы программы.

В нашем уроке мы будем использовать функцию millis():

1
2
3
4
Cinq
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/* Мигание LED Версия 2
* ------------------------
* Включает и выключает светодиод (LED) подсоединенный
* к выходу 13, с интервалом в 2 секунды используя функцию millis()
*
*/
int ledPin = 13; // LED подсоединен к выводу 13
unsigned long currentTime;
unsigned long loopTime;
void setup()
{
pinMode(ledPin, OUTPUT); // устанавливаем вывод 13 как выход
currentTime = millis(); // считываем время, прошедшее с момента запуска программы
loopTime = currentTime;
}
void loop()
{
currentTime = millis(); // считываем время, прошедшее с момента запуска программы
if(currentTime >= (loopTime + 1000)){ // сравниваем текущий таймер с переменной loopTime + 1 секунда
digitalWrite(ledPin, !digitalRead(ledPin)); // включаем/выключаем LED
loopTime = currentTime; // в loopTime записываем новое значение
}
// Здесь могут быть другие команды
}

В данном примере мы ввели две дополнительные переменные currentTime и loopTime. В функции setup() обе переменные имеют одно и тоже значение. В функции loop(), переменная currentTime каждый раз обновляется в цикле. Когда currentTime больше чем loopTime на 1 секунду (loopTime + 1000), то LED меняет свое состояние, а переменной loopTime присваивается текущее значение currentTime.

Обратите внимание, что в данном примере мы не использовали функцию delay() и процессор может выполнять другие операции.

administrateur

Laisser un commentaire

Your email address will not be published. Required fields are marked *