Напишем более сложный алгоритм работы и изменим программу таким образом, чтобы поведение светодиодов было похоже на настоящий светофор
· включить красный светодиод
· подождать три секунды
· помигать красным светодиодом 4 раза
· включить желтый светодиод
· подождать три секунды
· выключить желтый светодиод
· включить зеленый светодиод
· подождать три секунды
· помигать зеленым светодиодом 4 раза
В этом случае задачу «помигать красным светодиодом 4 раза» можно решить «в лоб» таким способом:
digitalWrite(led_ red, HIGH); // включить светодиод
delay(500); // подождать полсекунды
digitalWrite(led_ red, LOW); // выключить светодиод
delay(500); // подождать полсекунды
digitalWrite(led_ red, HIGH); // включить светодиод
delay(500); // подождать полсекунды
digitalWrite(led_ red, LOW); // выключить светодиод
delay(500); // подождать полсекунды
digitalWrite(led_ red, HIGH); // включить светодиод
delay(500); // подождать полсекунды
digitalWrite(led_ red, LOW); // выключить светодиод
delay(500); // подождать полсекунды
digitalWrite(led_ red, HIGH); // включить светодиод
delay(500); // подождать полсекунды
digitalWrite(led_ red, LOW); // выключить светодиод
delay(500); // подождать полсекунды
|
Но такой вариант трудоемок, приводит к большому объему написанного кода и вследствие этого к трудности чтения программы и последующего изменения. Для многократных повторений одной и той же части кода можно использовать цикл for:
for (начальное значение переменной счетчика, конечное значение переменной счетчика, прибавление счетчика){
код, который нужно повторить несколько раз
}
|
С использованием цикла for код, выполняющий задачу «помигать красным светодиодом 4 раза» будет выглядеть так:
for(int i = 1; i <= 4; i = i + 1) { // начать цикл: от 1 до 4 – т.е. блок между
// фигурными скобками { } повторится 4 раза, при i=1, i=2, i=3 и i=4
digitalWrite(led_red, HIGH); // включить красный светодиод
delay(500); // подождать полсекунды
digitalWrite(led_red, LOW); // погасить красный светодиод
delay(500); // подождать полсекунды
}
|
С использованием цикла for программа, реализующая написанный для светофора алгоритм, будет выглядеть так:
int led_red = 11; // красный светодиод подключен к пину 11
int led_yellow = 7; // желтый светодиод подключен к пину 7
int led_green = 2; // зеленый светодиод подключен к пину 2
void setup() {
// прописываем пины, к которым подключены светодиоды, как выходные
pinMode(led_red, OUTPUT);
pinMode(led_yellow, OUTPUT);
pinMode(led_green, OUTPUT);
}
void loop() {
digitalWrite(led_red, HIGH); // включить красный светодиод
delay(3000); // подождать три секунды
for(int i = 1; i <= 4; i = i + 1) { // повторить 4 раза
digitalWrite(led_red, HIGH); // включить красный светодиод
delay(500); // подождать полсекунды
digitalWrite(led_red, LOW); // погасить красный светодиод
delay(500); // подождать полсекунды
}
digitalWrite(led_yellow, HIGH); // включить желтый светодиод
delay(3000); // подождать три секунды
digitalWrite(led_yellow, LOW); // выключить желтый светодиод
digitalWrite(led_green, HIGH); // включить зеленый светодиод
delay(3000); // подождать три секунды
for(int i = 1; i <= 4; i = i + 1) { // повторить 4 раза
digitalWrite(led_ green, HIGH); // включить зеленый светодиод
delay(500); // подождать полсекунды
digitalWrite(led_ green, LOW); // погасить зеленый светодиод
delay(500); // подождать полсекунды
}
} // начать цикл loop снова
|
6. Напишите в среде Arduino программу, приведенную выше (выделенный полужирным текст, комментарии писать не обязательно). Для ускорения работы можно скопировать текст программы из файла занятия в электронном виде
7. Загрузите написанную программу в контроллер и убедитесь, что светодиоды зажигаются в соответствии с написанным алгоритмом
8. Сохраните программу в папку Learning / Ваша фамилия под именем Svetofor_Blink
3.3. Управление уровнем напряжения. Аналоговый выход – команда analogWrite
Команда analogWrite (номер пина, уровень) позволяет подать на определенный пин Arduino (поддерживающих данную функцию – 3, 5, 6, 9, 10, 11 – на Arduino Uno отмечены штрихом) значение от 0 до 255, что соответствует напряжению от 0 В до +5 В на контакте. Примеры:
analogWrite (6, 200); – напряжение на пине 6 станет равным 5·200/255= 3,9 В
analogWrite (11, 50); – напряжение на пине 11 станет равным 5·50/255= 1 В
Таким образом, постепенно увеличивая/уменьшая переданное в analogWrite значение можно добиться плавного роста/падения напряжения на выходе.
Теперь, подключив к одному из PWM-портов Arduino (3, 5, 6, 9, 10, 11) светодиод будет плавно загораться и затухать (fading).
Примечание: используя данную команду, можно плавно регулировать скорость вращения моторов, яркость освещения, скорость подачи воды при поливе и т.д.