Азбука Ардуино
Модератор: Gnat
Азбука Ардуино
Перед следующим уроком попробуйте самостоятельно написать скетч, чтобы светодиод 20 раз мигнул с частотой 1 сек, а затем была пауза 5 секунд и далее по циклу 20 миганий 5 сек пауза.
С уважением Владимир.
Азбука Ардуино
Похоже желающих изучать Arduino становится все меньше и меньше (
Существует еще одна форма использование команды if (если) , позволяющая выполнять одни действия если условие выполняется (истинна (1)) или другие если условие не выполняется (ложь (0))
Давайте рассмотрим случай когда нам нужно выполнить некоторую последовательность команд несколько раз. Один из способов реализации, это использование функции loop.
Напишем с использованием функции loop, скетч мигания светодиодом на pin13, с частотой 1 сек. 20 раз после чего пауза 5 сек
int ledPin = 13;
int delayPeriod = 1000;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
delay(5000);
}
Получился довольно длинный код а представьте что нужно не 20 а 100 импульсов.
Давайте посмотрим как это же можно реализовать при помощи операции цикл for.
int ledPin = 13;
int delayPeriod = 1000;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
for (int i = 0; i < 20; i ++)
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
}
delay(5000);
}
Отличие от предыдущих скетчей это блок скетча с циклом for, рассмотрим его подробнее
for (int i = 0; i < 20; i ++)
Сначала вводится переменная int i и ей присваивается значение 0, далее идет проверки значение переменной i если она меньше 20, то к значению прибавляется 1 (выражение i=i+1 равнозначно выражению i ++)
Далее идет выполнение строк скетча в фигурных скобках
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
}
Если на первом круге цикла for (до) значение переменной было сначала 0 (int i = 0;) после (i ++) 0+1=1 стало равно 1, то на втором круге цикла for (до) значение переменной i было сначала 1 после (i ++) 1+1=2 стало равно 2, и так цикл for (до) продолжает крутится и выполнять строки скетча в фигурных скобках
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
}
до тех пор пока значение переменной i < 20; меньше 20 как только значение i станет равно 20, цикл прервется и выполнится строка
delay(5000);
и работа функции void loop() начнется сначала
Это можно рассматривать как цикл for внутри цикла void loop
Задача на 5 баллов!!!
Попробуйте на данном примере сделать скетч на трех светодиодах по следующему алгоритму
Сначала 5 раз мигает первый светодиод, потом 10 раз второй светодиод, потом 15 раз третий светодиод.
Задача на 5 баллов!!!
Существует еще одна форма использование команды if (если) , позволяющая выполнять одни действия если условие выполняется (истинна (1)) или другие если условие не выполняется (ложь (0))
Давайте рассмотрим случай когда нам нужно выполнить некоторую последовательность команд несколько раз. Один из способов реализации, это использование функции loop.
Напишем с использованием функции loop, скетч мигания светодиодом на pin13, с частотой 1 сек. 20 раз после чего пауза 5 сек
int ledPin = 13;
int delayPeriod = 1000;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
delay(5000);
}
Получился довольно длинный код а представьте что нужно не 20 а 100 импульсов.
Давайте посмотрим как это же можно реализовать при помощи операции цикл for.
int ledPin = 13;
int delayPeriod = 1000;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
for (int i = 0; i < 20; i ++)
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
}
delay(5000);
}
Отличие от предыдущих скетчей это блок скетча с циклом for, рассмотрим его подробнее
for (int i = 0; i < 20; i ++)
Сначала вводится переменная int i и ей присваивается значение 0, далее идет проверки значение переменной i если она меньше 20, то к значению прибавляется 1 (выражение i=i+1 равнозначно выражению i ++)
Далее идет выполнение строк скетча в фигурных скобках
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
}
Если на первом круге цикла for (до) значение переменной было сначала 0 (int i = 0;) после (i ++) 0+1=1 стало равно 1, то на втором круге цикла for (до) значение переменной i было сначала 1 после (i ++) 1+1=2 стало равно 2, и так цикл for (до) продолжает крутится и выполнять строки скетча в фигурных скобках
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
}
до тех пор пока значение переменной i < 20; меньше 20 как только значение i станет равно 20, цикл прервется и выполнится строка
delay(5000);
и работа функции void loop() начнется сначала
Это можно рассматривать как цикл for внутри цикла void loop
Задача на 5 баллов!!!
Попробуйте на данном примере сделать скетч на трех светодиодах по следующему алгоритму
Сначала 5 раз мигает первый светодиод, потом 10 раз второй светодиод, потом 15 раз третий светодиод.
Задача на 5 баллов!!!
С уважением Владимир.
- Andrey.I
- Сообщения: 1734
- Зарегистрирован: Вт июл 02, 2013 1:21 pm
- Откуда: Москва
- Контактная информация:
Азбука Ардуино
C if то же получилось
int Led = 13;
int Period = 1000;
int Shetchec = 0;
void setup()
{
pinMode(Led, OUTPUT);
}
void loop()
{
digitalWrite(Led, HIGH);
delay(Period);
digitalWrite(Led, LOW);
delay(Period);
Shetchec = Shetchec +1;
if (Shetchec == 20)
{
delay (5000);
Shetchec = 0;
}
}
Сейчас про Фор почитаю, может решу сегодня.
С уважением, Андрей
- Andrey.I
- Сообщения: 1734
- Зарегистрирован: Вт июл 02, 2013 1:21 pm
- Откуда: Москва
- Контактная информация:
Азбука Ардуино
Очень быстро продвигаемся (как для меня), а есть еще работа кроме ардуино, на все нужно время, а его не хватает , а все нужно собрать, написать да еще и понять что к чему. Я например отстал, но понемногу двигаюсь вперед, пока все ясно и вопросы не задаю, как только что, то буду в теме, а так не мешаю.
Василий Васильевич. Моя галерея.
ЗЫ: Я сторонник жесткой модерации в тематических ветках.
ЗЫ: Я сторонник жесткой модерации в тематических ветках.
Азбука Ардуино
Andrey.I, Отличный результат, делаете хорошие успехи.
С if даже обгоняете программу, буду только на следующем уроке объяснять дополнительные возможности if
С if даже обгоняете программу, буду только на следующем уроке объяснять дополнительные возможности if
С уважением Владимир.
- Andrey.I
- Сообщения: 1734
- Зарегистрирован: Вт июл 02, 2013 1:21 pm
- Откуда: Москва
- Контактная информация:
Азбука Ардуино
SmartAvit,
Владимир, вроде как, всё на основе того, что давали. Основная сложность, для меня, правильно записать. Правлю по несколько раз пока ошибки IDE не перестанет показывать, а потом ещё, пока правильно не заработает.
На самом деле, мне просто очень интересно. Спасибо!
Владимир, вроде как, всё на основе того, что давали. Основная сложность, для меня, правильно записать. Правлю по несколько раз пока ошибки IDE не перестанет показывать, а потом ещё, пока правильно не заработает.
На самом деле, мне просто очень интересно. Спасибо!
С уважением, Андрей
Азбука Ардуино
Andrey.I, Андрей у вас отлично все получается, а эксперименты только улучшают усвоение материала.
Попробуйте этот скетч, три светодиода на 9, 11, 13 pin
int ledGren = 13;
int ledYellow = 11;
int ledRed = 9;
int delayPeriod = 250;
void setup()
{
pinMode(ledGren, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledRed, OUTPUT);
}
void loop()
{
for (int i = 0; i < 5; i ++)
{
digitalWrite(ledGren, HIGH);
delay(delayPeriod);
digitalWrite(ledRed, HIGH);
delay(delayPeriod);
digitalWrite(ledGren, LOW);
delay(delayPeriod);
digitalWrite(ledRed, LOW);
delay(delayPeriod);
}
for (int i = 0; i <10; i ++)
{
digitalWrite(ledGren, HIGH);
delay(delayPeriod);
digitalWrite(ledRed, HIGH);
delay(delayPeriod);
digitalWrite(ledYellow, HIGH);
delay(delayPeriod);
digitalWrite(ledGren, LOW);
delay(delayPeriod);
digitalWrite(ledRed, LOW);
delay(delayPeriod);
digitalWrite(ledYellow, LOW);
delay(delayPeriod);
}
for (int i = 0; i <15; i ++)
{
digitalWrite(ledGren, HIGH);
delay(delayPeriod/2);
digitalWrite(ledGren, LOW);
delay(delayPeriod/2);
digitalWrite(ledRed, HIGH);
delay(delayPeriod/2);
digitalWrite(ledRed, LOW);
delay(delayPeriod/2);
digitalWrite(ledYellow, HIGH);
delay(delayPeriod/2);
digitalWrite(ledYellow, LOW);
delay(delayPeriod/2);
}
delay(300);
}
А теперь попробуйте сделать программу световых эффектов на шести (десяти) светодиодах и самостоятельно придумайте интересную световую композицию.
Из двадцати светодиодов можно сделать светодиодную матрицу 5х4 и видоизменив скетч не только создать световой эффект но и писать буквы или даже слова.
Попробуйте этот скетч, три светодиода на 9, 11, 13 pin
int ledGren = 13;
int ledYellow = 11;
int ledRed = 9;
int delayPeriod = 250;
void setup()
{
pinMode(ledGren, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledRed, OUTPUT);
}
void loop()
{
for (int i = 0; i < 5; i ++)
{
digitalWrite(ledGren, HIGH);
delay(delayPeriod);
digitalWrite(ledRed, HIGH);
delay(delayPeriod);
digitalWrite(ledGren, LOW);
delay(delayPeriod);
digitalWrite(ledRed, LOW);
delay(delayPeriod);
}
for (int i = 0; i <10; i ++)
{
digitalWrite(ledGren, HIGH);
delay(delayPeriod);
digitalWrite(ledRed, HIGH);
delay(delayPeriod);
digitalWrite(ledYellow, HIGH);
delay(delayPeriod);
digitalWrite(ledGren, LOW);
delay(delayPeriod);
digitalWrite(ledRed, LOW);
delay(delayPeriod);
digitalWrite(ledYellow, LOW);
delay(delayPeriod);
}
for (int i = 0; i <15; i ++)
{
digitalWrite(ledGren, HIGH);
delay(delayPeriod/2);
digitalWrite(ledGren, LOW);
delay(delayPeriod/2);
digitalWrite(ledRed, HIGH);
delay(delayPeriod/2);
digitalWrite(ledRed, LOW);
delay(delayPeriod/2);
digitalWrite(ledYellow, HIGH);
delay(delayPeriod/2);
digitalWrite(ledYellow, LOW);
delay(delayPeriod/2);
}
delay(300);
}
А теперь попробуйте сделать программу световых эффектов на шести (десяти) светодиодах и самостоятельно придумайте интересную световую композицию.
Из двадцати светодиодов можно сделать светодиодную матрицу 5х4 и видоизменив скетч не только создать световой эффект но и писать буквы или даже слова.
С уважением Владимир.
- Andrey.I
- Сообщения: 1734
- Зарегистрирован: Вт июл 02, 2013 1:21 pm
- Откуда: Москва
- Контактная информация:
Азбука Ардуино
Тему для скетча навеяло недавнее обсуждение на форуме эффекта Доплера. Светодиоды по цвету размешены в порядке убывания длин волн света. Начинается выполнение программы с красного светодиода, как будто ардуинка уносится с бешенной скоростью куда :то на окраину вселенной.
Скетч
С уважением, Андрей
Азбука Ардуино
Andrey.I, Отличная идея. Если ее реализовать на всех портах Ардуино используя 20 светодиодов и расположив их равномерно внутри конуса (воронки) можно сделать очень интересные эффекты и законченный проект.
Есть светодиоды с линзой фокусирующие свет, на базе этих светодиодов можно сделать интересный ночник с проекцией световых эффектов на потолок.
Есть светодиоды с линзой фокусирующие свет, на базе этих светодиодов можно сделать интересный ночник с проекцией световых эффектов на потолок.
С уважением Владимир.
- Andrey.I
- Сообщения: 1734
- Зарегистрирован: Вт июл 02, 2013 1:21 pm
- Откуда: Москва
- Контактная информация:
Азбука Ардуино
Владимир, спасибо, с вашего позволения, пока отложу в копилку будущих проектов.
С уважением, Андрей
Азбука Ардуино
Давайте рассмотрим еще несколько способов организации цикла, мигаем 13 pin светодиодом, 20 раз потом пауза 3 секунды
При помощи команды if
int ledPin = 13;
int delayPeriod = 100;
int count = 0;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
count ++;
if (count == 20)
{
count = 0;
delay(3000);
}
}
Обратите внимание на строку count ++; это сокращенная форма записи count = count +1;
Как только переменная count станет равна 20 - if (count == 20), будут выполнены строки
{
count = 0;
delay(3000);
}
Надеюсь эта часть урока понятна.
Еще одна команда которая позволяет сделать цикл это while
Синтаксис записи такой
int i = 0;
while (i < 20)
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
i ++;
}
Цикл внутри фигурных скобок выполняется до тех пор пока переменная i < 20 - while (i < 20)
Попробуйте самостоятельно написать скетч цикла мигания тремя светодиодами при помощи команды while.
Немного усложняю уроки для перехода к новой более сложной теме.
При помощи команды if
int ledPin = 13;
int delayPeriod = 100;
int count = 0;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
count ++;
if (count == 20)
{
count = 0;
delay(3000);
}
}
Обратите внимание на строку count ++; это сокращенная форма записи count = count +1;
Как только переменная count станет равна 20 - if (count == 20), будут выполнены строки
{
count = 0;
delay(3000);
}
Надеюсь эта часть урока понятна.
Еще одна команда которая позволяет сделать цикл это while
Синтаксис записи такой
int i = 0;
while (i < 20)
{
digitalWrite(ledPin, HIGH);
delay(delayPeriod);
digitalWrite(ledPin, LOW);
delay(delayPeriod);
i ++;
}
Цикл внутри фигурных скобок выполняется до тех пор пока переменная i < 20 - while (i < 20)
Попробуйте самостоятельно написать скетч цикла мигания тремя светодиодами при помощи команды while.
Немного усложняю уроки для перехода к новой более сложной теме.
С уважением Владимир.
Азбука Ардуино
Приветствую всех.Тема не глохнет) Именно с вашей помощью я и начал заниматся этим.Так что не бросайте нас)Я не очень прилежный ученик но я применяю знания которые здесь получаю.Вот развитие моего учебного проекта.https://yadi.sk/i/87FGlcGsARCmDg
Александр
- Andrey.I
- Сообщения: 1734
- Зарегистрирован: Вт июл 02, 2013 1:21 pm
- Откуда: Москва
- Контактная информация: