Найти в Дзене
Вишенка на торте

Ардуино, простой код (delay, millis)

Продолжаю рассказывать скучный текст про ардуино.
Рассмотрим как работает код.

Тело программы выполняется циклично в функции loop{}. Доходит до конца программы и начинается всё сначала. Рассмотрим на самом распространенном, но, слегка измененном примере.

Подключим реле управления светом в комнате на пин 7. Будем включать и выключать свет (реле) каждые 5 секунд. Команда на включение pinMode (7, HIGH), а на выключение pinMode (7, LOW);

void loop()
{
pinMode (7, HIGH);
delay(5000);
pinMode (7, LOW);
delay(5000);
}

delay - это задержка в милисикундах. Если убрать delay, то реле может выйти из строя очень быстро, поскольку команды на включение и выключение будут поступать несколько сот тысяч раз в секунду.

Логика получается такая.
1. Включаем реле
2. Ждем 5 секунд
3. Выключаем реле
4. Ждем 5 секунд
.. начинаем всё заново.

Заметим, delay - полностью останавливает программу! Никакие вычисления не ведутся.
Я бы написал слегка измененный код. Он немного сложнее. Добавим статус пина, в разделе
setup укажем микроконтроллеру, что 7 пин - это выход.

unsigned long last_delay;
boolean status_pin;

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

void loop() {
if (millis() - last_delay > 5000)
{
!status_pin;
pinMode (7, status_pin);
last_delay = millis();
}
}

Логика такая. Объявляем переменные логический status_pin и большую переменную last_delay (последняя задержка). Говорим микроконтроллеру, что 7 пин это выход. И тело программы:

1. Если прошло 5 секунд
2. Меняем статус пина на противоположный (с 0 на 1)
3. В логике программы статус 7 пина приравнивается к
status_pin и свет либо включается, либо выключается.
4. Запоминаем время, откуда считать 5 секунд.

С виду код кажется страшнее, логика программы другая, но выполняет ту же функцию. В дальнейшем, если захочется модернизировать программу, добавить новые функции, то задержка delay не будет нам мешать этому. И status_pin можно будет менять в любом месте нашего кода. Программа будет выполняться, грубо говоря, в месте с другими функциями. Хотя на ардуино многозадачности нет.