Мигание светодиода в Ардуино, что может быть проще и бесполезнее. На самом деле практическую пользу от этой простой функции можно найти.
Бывает при программирование какого-нибудь устройства не хватает портов ввода-вывода микроконтроллера. Или из экономических соображений, а может нехватки места в корпусе, не хочется устанавливать дисплей, а как то сигнализировать о режимах работы устройства очень хотелось бы. Часто достаточно сигнализировать о этих режимах горением или миганием светодиода. А если режимов много?
На мысль меня навела автомобильная сигнализация, в которой я как то программировал режим автозапуска. Там, чтобы установить, например, 14-й бит определенного регистра нужно было после входа в режим программирования этого регистра 14 раз нажать на определенную кнопку брелка, а потом дождаться 14-ти коротких сигналов (или мигания поворотников).
Затем нажать кнопку в подтверждения и услышать длинный сигнал. Гениально! Никаких дисплеев и экранных меню. Правда, одновременно, и жутко неудобно.
4. Как написать программу для включения светодиодов, подключенных к PIC16F84A (Урок 4. Теория)
Но если внутренних режимов немного, то использовать количество морганий светодиодом вполне функционально.
Начнем с простого.
Пример мигания светодиодом для Ардуино
Это первая программа которую осваивают при изучении Ардуино. Во многих контроллерах, которые мне попадались в последнее время, эта программа зашита на заводе, видимо для тех кто не осилил и это.
Простейший пример мигания светодиодом
void setup() < pinMode(13, OUTPUT); digitalWrite(13, LOW); >void loop()
Казалась бы задавай различные интервалы между высокими и низкими уровнями порта и будет нужное. Но при этом контроллер больше ничего не делает (ну почти ничего, прерывания он все таки обрабатывает). Делать что-то еще он конечно может, но не в основном цикле loop().
Поэтому отказываемся от delay() и переходим на события с использованием millis()
Использование событий с использованием millis()
Код мигания светодиодом с использованием millis()
void setup() < pinMode(13, OUTPUT); digitalWrite(13, LOW); >uint32_t ms, ms1 = 0; bool led_stat = true; void loop() < ms = millis(); // Событие срабатывающее каждые 500 мс if( ( ms — ms1 ) >500 || ms < ms1 )< ms1 = ms; // Инвертируем светодиод digitalWrite(13, led_stat); led_stat = !led_stat; >>
Ну вот. Цель достигнута. Светодиод мигает, а процессорное время в цикле loop() практически полностью доступно для других функций.
Правда в таком коде использование требуемых режимов мигания реализуется довольно сложно — несколько событий с разными интервалами, много условий по необходимому режиму и предыдущему состоянию. Слишком сложно.
Обработка битовой матрицы состояния светодиода
Уменьшаем время срабатывания события до 1/8 секунды и в 1 байте кодируем 8 бит состояний, отображаемых последовательно.
Уроки Arduino #7 — подключение светодиода
Код мигания светодиода с битовой матрицей состояний
// Массив режимов работы светодиода byte modes[] = < 0B00000000, //Светодиод выключен 0B11111111, //Горит постоянно 0B00001111, //Мигание по 0.5 сек 0B00000001, //Короткая вспышка раз в секунду 0B00000101, //Две короткие вспышки раз в секунду 0B00010101, //Три короткие вспышки раз в секунду 0B01010101 //Частые короткие вспышки (4 раза в секунду) >; uint32_t ms, ms1 = 0, ms2 = 0; uint8_t blink_loop = 0; uint8_t blink_mode = 0; uint8_t modes_count = 0; void setup() < pinMode(13, OUTPUT); digitalWrite(13, LOW); modes_count = 1; blink_mode = modes[modes_count]; >void loop() < ms = millis(); // Событие срабатывающее каждые 125 мс if( ( ms — ms1 ) >125|| ms < ms1 )< ms1 = ms; // Режим светодиода ищем по битовой маске if( blink_mode 5000|| ms < ms2 )< ms2 = ms; blink_mode = modes[modes_count++]; if( modes_count >= 7 )modes_count = 1; > >
Первые три режима работы светодиода простые. А вот остальные уже можно использовать для демонстрации режима микроконтроллера:
Короткая вспышка 1 раз в секунду
Две вспышки в секунду
Три вспышки
И постоянные вспышки четыре раза в секунду
В принципе, на этом можно было и остановиться, так как для большинства проектов этого бы хватило. Но если этого мало и вам нужно будет разрабатывать программирование автосигнализации )))
Что если 8 бит состояний светодиодов мало?
Использование 4-х байт для определения состояния светодиода
Код сигнала SOS азбукой Морзе
byte bytes[] = ; uint32_t ms, ms1 = 0; uint8_t blink_loop = 0; void setup() < pinMode(13, OUTPUT); digitalWrite(13, LOW); >void loop() < ms = millis(); // Событие срабатывающее каждые 125 мс if( ( ms — ms1 ) >125|| ms < ms1 )< ms1 = ms; // Выделяем сдвиг светодиода (3 бита) uint8_t n_shift = blink_loop&0x07; // Выделяем номер байта в массиве (2 байта со здвигом 3 ) uint8_t b_count = (blink_loop>>3)&0x3; if( bytes[b_count]
Получаем циклический сигнал SOS — три коротких, три длинных и снова три коротких сигнала светодиодом, повторяемый каждые 4 секунды
Очень много людей критиковали Ардуино за ужасный стиль программирования микроконтроллеров без использования прерываний
Только хардкор. Только прерывания!
Берем 16-ти битный Таймер 1. Устанавливаем прерывание на переполнение за 125мс
Код многорежимного мигания светодиода с использованием прерываний по таймеру
uint8_t blink_loop = 0; uint8_t blink_mode = 0; uint8_t modes_count = 0; // Начальное значение таймера uint16_t n = 63583; // Обработчик прерывания по переполнению таймера ISR( TIMER1_OVF_vect ) < if( blink_mode pinMode(13,OUTPUT); blink_mode = 0B00000000; // А вот и хардкор — установка регистров таймера TCCR1A = 0; // Устанавливаем делитель 1024 к тактовой частоте 16МГц TCCR1B = 1> void loop() < blink_mode = 0B00001111; //Мигание по 0.5 сек delay(5000); blink_mode = 0B00000001; //Короткая вспышка раз в секунду delay(5000); blink_mode = 0B00000101; //Две короткие вспышки раз в секунду delay(5000); blink_mode = 0B00010101; //Три короткие вспышки раз в секунду delay(5000); blink_mode = 0B01010101; //Частые короткие вспышки (4 раза в секунду) delay(5000); >
Подробно по программированию таймера можно почитать здесь. При этом delay() на 5 секунд в Loop() совершенно не мешают управлению нашим светодиодом.
Недостаток такого метода в том, что не будут работать некоторые функции и библиотеки, использующие таймер 1. Например, ШИМ.
Если с программированием регистров таймера сложно, а прерывание по таймеру использовать интересно —
Прерывание по таймеру с «человеческим лицом»
Добрые люди написали программный интерфейс к таймеру в виде библиотеки TimerOne
Код многорежимного мигания светодиодом с использованием TimerOne
#include «TimerOne.h» uint8_t blink_loop = 0; uint8_t blink_mode = 0; uint8_t modes_count = 0; // Callback функция по таймеру void timerIsr() < if( blink_mode pinMode(13,OUTPUT); blink_mode = 0B00000000; Timer1.initialize(125000); Timer1.attachInterrupt( timerIsr ); >void loop() < blink_mode = 0B00001111; //Мигание по 0.5 сек delay(5000); blink_mode = 0B00000001; //Короткая вспышка раз в секунду delay(5000); blink_mode = 0B00000101; //Две короткие вспышки раз в секунду delay(5000); blink_mode = 0B00010101; //Три короткие вспышки раз в секунду delay(5000); blink_mode = 0B01010101; //Частые короткие вспышки (4 раза в секунду) delay(5000); >
Ну, и напоследок, код для тех, кто как и я «грызет» программирование WiFi модулей ESP8266 в среде Arduino IDE.
Прерывание по таймеру в ESP8266
Там другие добрые люди прямо в ядро ESP для Arduino встроили библиотеку Ticker
Код многорежимного мигания светодиода по таймеру в ESP8266
#include uint8_t blink_loop = 0; uint8_t blink_mode = 0; uint8_t modes_count = 0; Ticker blinker; void timerIsr() < if( blink_mode pinMode(13,OUTPUT); blink_mode = 0B00000000; blinker.attach(0.125, timerIsr); >void loop() < blink_mode = 0B00001111; //Мигание по 0.5 сек delay(5000); blink_mode = 0B00000001; //Короткая вспышка раз в секунду delay(5000); blink_mode = 0B00000101; //Две короткие вспышки раз в секунду delay(5000); blink_mode = 0B00010101; //Три короткие вспышки раз в секунду delay(5000); blink_mode = 0B01010101; //Частые короткие вспышки (4 раза в секунду) delay(5000); >
Использовать прерывания в ESP следует осторожно, так как очень часто это вызывает срабатывание злобного сторожевого таймера WDT, который считает, что на обработку встроенных WiFi функций выделяется слишком мало времени.
Надеюсь, эта статья будет немного полезной для всех любителей мигать светодиодами в Ардуино и не только им.
Источник: habr.com
Мигание светодиодом Ардуино
Мигание светодиодом Ардуино, встроенного в плату — один из первых примеров скетчей, для начинающих изучать программирование микроконтроллера Arduino Uno или Arduino Nano. Разберем несколько примеров — мигание встроенным светодиодом, мигание без delay, мигание несколькими светодиодами. Прочитав статью до конца, вы поймете, как управлять миганием светодиодов, подключенных к Ардуино.
Мигание светодиодом на Ардуино Уно, Нано
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- светодиоды и резисторы;
- макетная плата;
- провода «папа-папа».
Платы данного семейства имеют встроенный светодиод на плате, подключенный к пину 13 через резистор. Этот светодиод мигает при включении или перезагрузке микроконтроллера. Можно с помощью программы управлять включением и выключением (миганием) светодиодом, который «висит» на 13 пине Arduino Uno и Nano. При этом не потребуется даже собирать на макетной плате электрическую схему.
Мигание встроенным светодиодом на плате
Для первого примера не потребуется собирать принципиальную схему. Код программы, используется из примера «Подключение светодиода к Ардуино». Встроенный светодиод подключается через резистор, поэтому к 13 пину можно подключать внешний светодиод без резистора. Это самый простой скетч, с которого начинают знакомство с Ардуино, скопируйте код и загрузите его в микроконтроллер через Arduino IDE.
Скетч. Мигание светодиодом Ардуино на плате
void setup() < pinMode(13, OUTPUT); // объявляем пин 13 как выход > void loop() < digitalWrite(13, HIGH); // зажигаем светодиод delay(1000); // ждем 1 секунду digitalWrite(13, LOW); // выключаем светодиод delay(1000); // ждем 1 секунду >
Пояснения к коду:
- delay(); останавливает программу на заданное количество микросекунд;
- данный код подойдет к плате Arduino Nano и Arduino Mega.
Мигание светодиода на Ардуино без delay
В коде используется функция millis, которая возвращает количество миллисекунд с момента начала программы. Благодаря этой функции можно организовать многозадачность микроконтроллера. В отличии от функции delay(); , программа не останавливает выполнение команд в скетче, а считает когда пройдет заданное количество миллисекунд и может выполнять параллельные задачи.
Скетч. Мигающий светодиод Ардуино без delay
unsigned long currentTime; // переменная времени boolean ledState = 0; // переменная состояния светодиода void setup() < pinMode(10, OUTPUT); // объявляем пин 10, как выход > void loop() < if (millis() — currentTime > 500) // проверяем сколько прошло миллисекунд < currentTime = millis(); ledState=!ledState; // меняем состояние светодиода на противоположное digitalWrite(10, ledState); > >
Пояснения к коду:
- каждые 500 миллисекунд состояние переменной boolean меняется на противоположное с помощью команды ledState=!ledState .
Мигание двух светодиодов на Ардуино
Для следующего примера потребуется собрать схему на макетной плате из двух светодиодов, как изображено на картинке ниже. Более сложная программа с мигающими светодиодами — это светофор на Ардуино, где уже необходимо регулировать включение и выключение трех светодиодов и больше. После сборки электрической схемы загрузите следующий код в микроконтроллер.
Скетч. Мигание несколькими светодиодами одновременно
void setup() < pinMode(12, OUTPUT); // объявляем пин 12 как выход pinMode(10, OUTPUT); // объявляем пин 10 как выход > void loop() < digitalWrite(12, HIGH); // зажигаем светодиод digitalWrite(10, LOW); // выключаем светодиод delay(1000); // ждем 1 секунду digitalWrite(12, LOW); // выключаем светодиод digitalWrite(10, HIGH); // зажигаем светодиод delay(1000); // ждем 1 секунду >
Пояснения к коду:
- включение/выключение светодиодов происходит поочередно;
- одновременное включение можно сделать, поменяв местами строчки в коде.
Заключение. В этом обзоре мы рассмотрели, как сделать мигающий светодиод на Arduino Nano или Uno. Заставить светодиод мигать можно с помощью задержки delay или через millis. Если у вас остались вопросы по данной теме, то можете их смело оставлять в комментариях к этой записи. Мы постараемся ответить на все вопросы по мере поступления. Желаем успехов в освоении программирования Arduino.
Источник: xn--18-6kcdusowgbt1a4b.xn--p1ai
Устройство светодиода
Как известно, первая программа, которую человек пишет при изучении программирования называется «Hello World!». Суть этой программы сводится к тому, чтобы после запуска на экране появилась указанная простая фраза.
В мире микроэлектроники, симметричной задачей смело можно назвать мигание светодиодом Другими словами, нам необходимо управлять включением и выключением светодиода при помощи микроконтроллера. В нашем случае, таким контроллером станет Ардуино. Приступим!
Устройство светодиода
Светодиод — это устройство, которое представляет собой полупроводниковый прибор, способный излучать свет при пропускании через него электрического тока в прямом направлении (от анода к катоду). Ниже приведена схема типичного светодиода с линзой.
Для того чтобы правильно включить светодиод в электрическую цепь, необходимо отличать катод от анода. Сделать это можно по двум признакам:
1) Анод светодиода имеет более длинный проводник
2) Со стороны катода, корпус светодиода немного срезан
А вот так выглядят светодиоды «в живую».
Это обычные одноцветные светодиоды. А бывают еще двух, и даже трехцветные. Вот так, например, выглядит трехцветный (RGB) светодиод:
У этого светодиода сразу четыре ноги. Одна — катод, а три другие — аноды для трех разных цветов.
В современной микроэлектронике применяются миниатюрные светодиоды для поверхностного монтажа. Такие индикаторы, например, имеются на Ардуино Уно для информирования пользователя о состоянии системы. Вот он светит зелененьким цветом:
Источник: robotclass.ru