В интернете полно просто информации по оператору millis для Arduino . Первоначально, когда я обращался к этому материалу для изучения millis, то почему-то мне трудно было соотнести,  что и как делается. Подсознательно я понимал, что должно происходить, но описание меня не удовлетворяло. Оно не позволяло все разложить по полочкам в моем сознании и наслаждаться неким перфекционизмом в моей черепной коробке. В итоге после полного осознания как и что происходит, я решил накатать свою версию происходящего, с исчерпывающим описанием указывающим на точный характер происходящих вещей по факту происходящего…

 Итак, прежде всего о том, как же бывает в жизни и чем по сути delay отличается от millis. Сто раз уже каждый из нас читал, что одна функция позволяет не нагружать микроконтроллер, то есть выполнять какие-то другие задачи, а вторая (delay) ждет, пока выполнится программа ожидания, а лишь потом продолжает работать по написанному алгоритму.

 Здесь есть доля вранья, так как даже millis немного притормаживает процесс, но несоизмеримо по сравнению с delay. В целом это можно представить так! Скажем, вы поставили в духовку курицу и знаете, что через полчаса она будет готова. Так вот, если это delay, то считайте вы взяли табуретку и сели напротив духовки, чтобы смотреть на часы над духовкой и на то, как жарится курица, пока окончательно не приготовиться. Теперь,  вы не можете пойти и посмотреть телевизор, если он у вас в другой комнате.
 А что же такое millis? Это все равно, что вы дали себе установку, что курица у вас там жарится, но пойду делать что-то другое, при этом время от времени присматривая за часами. И вот раз в 5 минут вы заходите и смотрите на таймер на духовке, при этом параллельно выполняя что-то другой. Вот также и программа.  То есть какое-то ну совсем незначительное время вы все же тратите на проверку времени, как и оператор millis, но это пустяк по сравнению с delay.

Из-за этой особенности при использовании millis, надо сказать о неизбежном. Само по себе millis - это какое-то прошедшее время с начала включения нашего микроконтроллера. Оно так и расшифровывается как миллисекунды, а бывает micros (микросекунды). При этом дополнительно всегда вводиться переменная времени, которая как раз и будет сравниваться прошедшее время с начала запуска микроконтроллера, со временем для «приготовления курицы». Как только критерии сравнения одного времени с другим станут актуальными для нас, мы сможем выполнить нужное действие «достать курицу из духовки». Вот эти мысли мне хотелось бы довести до вас и может когда-нибудь вернуться к ним снова, чтобы прочитать и поразмыслить над жизненностью ситуаций, который проходят все с той же аналогией не важно, будь то кухня или алгоритм работы программы в микроконтроллере.

Теперь же обязательно скетч с пояснениями работы.

Скетч с примером мигания светодиодом millis

Возможные проблемы

В старых Ардуинках, по крайней мере с корпусом DIP, у меня наблюдалось следующее, - этот скетч не работал. Светодиод просто будто разгорался и постоянно горел. Возможно это было связано с контроллером 16u2 на самой плате. Ведь через него заливается скетч в микроконтроллер 328. А вот в новой стоял CH340 и таких проблем не было!