На прошлом уроке мы научились загружать программу blink в Arduino.
Следует заметить, что эта программа очень удобный тест, если возникают
какие-то проблемы с загрузкой скетча - откройте Blink, и загрузите его,
если скетч загрузился и светодиод на плате Ardiono начал мигать, значит
все нормально и проблема в вашем скетче. Если не загрузился - проверьте,
правильно ли выбраны в программе плата Arduino и последовательный порт.
Моделировать схему управления светодиодами м помощью контроллера Arduino
мы будем в среде Wokwi, Если у вас есть контроллер
Ардуино и желание работать с "железом", то такая работа приветствуется.
Итак, начнем с одного светодиода. Подключить его напрямую к выходу контроллера
нельзя, так как светодиод может сгореть, поэтому последовательно со светодиодом
поставим ограничительный резистор номиналом 1 кОм. Анод светодиода подключим
к 13 выводу (к этому же выводу уже подключен светодиод, который установлен на
плате). Катод, через токоограничительный резистор к общему проводу GND.
Скопируйте в поле "sketch.ino" скетч Blink из прошлого урока и нажмите
кнопку "Начать эмуляцию".В Wokwi, в контроллер по умолчанию загружен
скетч Blink, поэтому после нажатия кнопки "Начать моделирование" -
мы увидим что оба светодиода, и тот что на плате, и тот, который мы
подключили - будут мигать:
oid setup()
{
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(10, HIGH); // Устанавливаем высокий уровень на выводе 10
delay(200); // Ждем 200 миллисекунд
digitalWrite(10, LOW); // Устанавливаем низкий уровень на выводе 10
delay(200); // Ждем 200 миллисекунд
digitalWrite(11, HIGH); // Устанавливаем высокий уровень на выводе 11
delay(200); // Ждем 200 миллисекунд
digitalWrite(11, LOW); // Устанавливаем низкий уровень на выводе 11
delay(200); // Ждем 200 миллисекунд
digitalWrite(12, HIGH); // Устанавливаем высокий уровень на выводе 12
delay(200); // Ждем 200 миллисекунд
digitalWrite(12, LOW); // Устанавливаем низкий уровень на выводе 12
delay(200); // Ждем 200 миллисекунд
digitalWrite(13, HIGH); // Устанавливаем высокий уровень на выводе 13
delay(200); // Ждем 200 миллисекунд
digitalWrite(13, LOW); // Устанавливаем низкий уровень на выводе 13
delay(200); // Ждем 200 миллисекунд
}
int pin;
void setup()
{
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
}
void loop()
{
pin = 10;
while(pin < 14)
{
digitalWrite(pin, 1);
delay(200);
digitalWrite(pin, 0);
delay(200);
pin = pin + 1;
}
}
Разберем как это работает. В нашей программе появилась переменная pin.
Переменная - это место хранения данных. Она имеет имя, значение и тип.
Например, данное объявление (называется декларацией):
int pin;создает переменную с именем pin, и типом int (от англ. integer - целое число), один их наиболее часто используемых типов данных для хранения чисел. int занимает 2 байта памяти, и может хранить числа от -32 768 до 32 767 (от -2^15 до 2^15-1).
pin = 10;изменяет значение переменной pin, присваивая ей значение 10.
while(pin < 14)
while - это цикл и в данном случае все что находится после него в фигурных скобках, будет повторяться, пока условие pin < 14 истинно. Как только переменная пин примет значение больше или равное 14 программа выйдет из этого цикла и вернется к первой строке цикла loop(). В нашей программе эта конструкция работает следующим образом. Вначале бесконечного цикла loop() мы присваиваем переменной pin значение 10, и далее переходим к циклу while так как 10 < 14 выполняются команды, которые находятся в фигурных скобках внутри while.
{
digitalWrite(pin, 1);
delay(200);
digitalWrite(pin, 0);
delay(200);
pin = pin + 1;
}
Так как текущее значение переменной pin = 10, командой digitalWrite(pin, 1); устанавливается высокий уровень на 10 выходе. Светодиод подключенный к выводу 10 загорится. Затем, уже знакомой командой delay(200); в течении 200 миллисекунд ничего не делается, светодиод продолжает светиться, после чего командой digitalWrite(pin, 0); устанавливается низкий уровень на 10 выходе, светодиод гаснет и далее опять ожидание в течении 200 миллисекунд. Затем следует команда
pin = pin + 1;
это операция присвоения, переменной pin присваивается значение больше её самой
на единицу. Таким образом, значение переменной pin изменяется, и теперь
pin = 11. После этого, программа вернется в начало цикла while, и так как
условие 11 < 14 по прежнему выполняется - снова выполнится набор команд по
зажиганию светодиода, теперь уже подключенного на вывод 11, после чего
переменная pin опять увеличится на единицу и примет значение 12 и так будет
повторяться пока значение переменной pin не станет равным 14. Так как
условие 14 < 14 является ложным, произойдет выход из цикла while,
программа вернется в начало цикла loop(), где переменной pin снова
будет присвоено значение 10 и дальше программа опять перейдет к циклу
while.
Загрузив этот скетч, можно убедиться, что светодиоды мигают также, как они
мигали до этого. Программа работает, но её код стал значительно меньше и
эта разница в объеме кода будет еще более существенной, при увеличении
количества светодиодов.