В котором мы рассмотрим применение алгоритмической конструкции цикл «For» и поработаем с ChipKit Basic I/O Shield.
Нам понадобятся:
- ChipKit Uno32
- ChipKit Basic I/O Shield.
Можно работать и без ChipKit Basic I/O Shield, собрав на монтажной плате примерно такую схему:
У нас же есть ChipKit Basic I/O Shield, на котором уже есть замечательный ряд из 8 диодов, «сидящих» на 26-33 пине.
Наша задача:
реализовать различные движения огоньков диодов с помощью цикла.
Зачем вообще цикл, если мы уже делали огонёк без всяких циклов? (если не считать, что у нас вообще всё находится в цикле loop()
Ну, давайте начнём писать программу, как обычно с инициализации портов:
void setup () {
pinMode (26, OUTPUT);
pinMode (27, OUTPUT);
pinMode (28, OUTPUT);
pinMode (29, OUTPUT);
pinMode (30, OUTPUT);
pinMode (31, OUTPUT);
pinMode (32, OUTPUT);
pinMode (33, OUTPUT);
}
Ужас! Куча одинаковых команд. Почти одинаковых.
К счастью, мы можем написать команду pinMode один раз и заставить её
повторяться многократно для различных значений некоторой переменной
величины.
Обозначим эту переменную буквой i.
Ту же процедуру перепишем, используя цикл:
void setup () {
for (int i=26; i<=33; i++) {
pinMode (i, OUTPUT);
}
}
По русски это можно прочитать так: к целочисленной переменной i, которая
вначале равна 26 прибавлять 1 (i++), пока её значение меньше либо равно
33. При каждом значении переменной i будут выполняться операции,
записанные в фигурных скобках (тело цикла).
Таким образом обе написанные процедуры выполняют одни и те же команды, но вторая более компактна и профессиональна.
Да, кстати, если Вы работаете без ChipKit Basic I/O Shield, то заголовок цикла будет таким: for (int i=6; i<=13; i++)
Идём далее. Реализуем простой огонёк, бегущий от диода на 26 пине, до
диода на 33. Будем называть диоды по номеру их пина: 26, 27, 28 диод…
void loop() {
for (int i=26; i<=33; i++) {
digitalWrite(i,HIGH);
delay(50);
digitalWrite(i,LOW);
}
}
Программа целиком:
void setup () {
for (int i=26; i<=33; i++) {
pinMode (i, OUTPUT);
}
}
void loop() {
for (int i=26; i<=33; i++) {
digitalWrite(i,HIGH);
delay(50);
digitalWrite(i,LOW);
}
}
Прошиваем, получается так: видео или так без ChipKit Basic I/O Sheld видео
Теперь пусть у нас последовательно зажгутся все диоды, а потом последовательно погаснут (видео):
void setup () {
for (int i=26; i<=33; i++) {
pinMode (i, OUTPUT);
}
}
void loop() {
//Последовательно включаем диоды
for (int i=26; i<=33; i++) {
digitalWrite(i,HIGH);
delay(50);
}
// И последовательно их выключаем
for (int i=26; i<=33; i++) {
digitalWrite(i,LOW);
delay(50);
}
}
А может, пусть огонёк бегает туда-сюда (видео)?
void setup () {
for (int i=26; i<=33; i++) {
pinMode (i, OUTPUT);
}
}
void loop() {
//В одну сторону
for (int i=26; i<=33; i++) {
digitalWrite(i,HIGH);
delay(50);
digitalWrite(i,LOW);
}
// И в другую (изменён заголовок цикла):
for (int i=33; i>=26; i--) {
digitalWrite(i,HIGH);
delay(50);
digitalWrite(i,LOW);
}
}
Можно придумать и другие способы движения огонька. Например так:
Или так для варианта без ChipKit Basic I/O Shield, для 5 диодов на 8-12 пинах (здесь используется вложенный цикл, т.е. цикл, выполняемый циклом).
void setup () {
for (int i=8; i<=12; i++) {
pinMode (i, OUTPUT);
}
}
void loop() {
for (int i=12; i>=8; i--) {
for (int k=8; k<=i; k++){
digitalWrite(k,HIGH);
delay(100);
digitalWrite(k,LOW);
}
digitalWrite(i,HIGH);
}
}
А вот так этот выглядит если использовать обычную монтажную плату: видео
Задание.
Попробуйте с помощью цикла for построить различные схемы движения огонька.
На этом пока всё.
КОНЕЦ ЗАНЯТИЯ.
Удачных экспериментов!
На нашем сайте доступна подборка инструкций и учебных пособий по ардуино. Ознакомиться и скачать можно в этом разделе: Скачать инструкции - книги по ардуино.