Азбука Ардуино

Модератор: Gnat

Аватара пользователя
SmartAvit
Сообщения: 707
Зарегистрирован: Пн мар 25, 2019 12:10 am
Откуда: Москва

Азбука Ардуино

Сообщение SmartAvit » Сб фев 08, 2020 8:53 am

Перед следующим уроком попробуйте самостоятельно написать скетч, чтобы светодиод 20 раз мигнул с частотой 1 сек, а затем была пауза 5 секунд и далее по циклу 20 миганий 5 сек пауза.
С уважением Владимир.

Аватара пользователя
SmartAvit
Сообщения: 707
Зарегистрирован: Пн мар 25, 2019 12:10 am
Откуда: Москва

Азбука Ардуино

Сообщение SmartAvit » Вс фев 09, 2020 6:25 pm

Похоже желающих изучать 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 баллов!!!
С уважением Владимир.

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Вс фев 09, 2020 9:40 pm

SmartAvit писал(а):
Вс фев 09, 2020 6:25 pm
Похоже желающих изучать Arduino становится все меньше и меньше (
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 » Вс фев 09, 2020 10:40 pm

SmartAvit писал(а):
Вс фев 09, 2020 6:25 pm
Задача на 5 баллов!!!
:Yahoo!:
int ledPin_1 = 13;
int ledPin_2 = 12;
int ledPin_3 = 10;
int delayPeriod = 1000;

void setup()
{
pinMode(ledPin_1, OUTPUT);
pinMode(ledPin_2, OUTPUT);
pinMode(ledPin_3, OUTPUT);
}

void loop()
{
for (int i = 0; i < 5; i ++)
{
digitalWrite(ledPin_1, HIGH);
delay(delayPeriod);
digitalWrite(ledPin_1, LOW);
delay(delayPeriod);
}

for (int q = 0; q < 10; q ++)
{
digitalWrite(ledPin_2, HIGH);
delay(delayPeriod);
digitalWrite(ledPin_2, LOW);
delay(delayPeriod);
}
for (int w= 0; w < 15; w ++)
{
digitalWrite(ledPin_3, HIGH);
delay(delayPeriod);
digitalWrite(ledPin_3, LOW);
delay(delayPeriod);
}
}
Не думайте, что это было просто! :)
С уважением, Андрей

Аватара пользователя
BazilVV
Сообщения: 639
Зарегистрирован: Пт сен 15, 2017 11:34 am

Азбука Ардуино

Сообщение BazilVV » Вс фев 09, 2020 10:41 pm

SmartAvit писал(а):
Вс фев 09, 2020 6:25 pm
Похоже желающих изучать Arduino становится все меньше и меньше (
Очень быстро продвигаемся (как для меня), а есть еще работа кроме ардуино, на все нужно время, а его не хватает :( , а все нужно собрать, написать да еще и понять что к чему. Я например отстал, но понемногу двигаюсь вперед, пока все ясно и вопросы не задаю, как только что, то буду в теме, а так не мешаю.
Василий Васильевич. Моя галерея.
ЗЫ: Я сторонник жесткой модерации в тематических ветках.

Аватара пользователя
SmartAvit
Сообщения: 707
Зарегистрирован: Пн мар 25, 2019 12:10 am
Откуда: Москва

Азбука Ардуино

Сообщение SmartAvit » Вс фев 09, 2020 11:53 pm

Andrey.I, Отличный результат, делаете хорошие успехи.
С if даже обгоняете программу, буду только на следующем уроке объяснять дополнительные возможности if :good:
С уважением Владимир.

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Пн фев 10, 2020 12:38 am

SmartAvit,
Владимир, вроде как, всё на основе того, что давали. :oops: Основная сложность, для меня, правильно записать. Правлю по несколько раз пока ошибки IDE не перестанет показывать, а потом ещё, пока правильно не заработает. :)
На самом деле, мне просто очень интересно. Спасибо!
С уважением, Андрей

Аватара пользователя
SmartAvit
Сообщения: 707
Зарегистрирован: Пн мар 25, 2019 12:10 am
Откуда: Москва

Азбука Ардуино

Сообщение SmartAvit » Пн фев 10, 2020 11:06 am

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 и видоизменив скетч не только создать световой эффект но и писать буквы или даже слова. :good:
С уважением Владимир.

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Вт фев 11, 2020 1:29 am

SmartAvit писал(а):
Пн фев 10, 2020 11:06 am
А теперь попробуйте сделать программу световых эффектов на шести (десяти) светодиодах и самостоятельно придумайте интересную световую композицию.
Тему для скетча навеяло недавнее обсуждение на форуме эффекта Доплера. Светодиоды по цвету размешены в порядке убывания длин волн света. Начинается выполнение программы с красного светодиода, как будто ардуинка уносится с бешенной скоростью куда :то на окраину вселенной. :)



Скетч
int ledRed = 13; // Каждый
int ledOrange = 12; // Охотник
int ledYellow = 11; // Желает
int ledGren = 10; // Знать
int ledBlue = 9; // Где
int ledIndigo = 8; // Сидит Фазан,спектр очень условно:)
int delayPeriod = 300; //

void setup()
{
pinMode(ledRed, OUTPUT);
pinMode(ledOrange, OUTPUT);
pinMode(ledYellow, OUTPUT);
pinMode(ledGren, OUTPUT);
pinMode(ledBlue, OUTPUT);
pinMode(ledIndigo, OUTPUT);
}

void loop()
{
for (int i = 0; i < 3; i ++)
{
digitalWrite(ledRed, HIGH);
delay(delayPeriod*3);
digitalWrite(ledRed, LOW);
delay(delayPeriod);
digitalWrite(ledOrange, HIGH);
delay(delayPeriod*2);
digitalWrite(ledOrange, LOW);
delay(delayPeriod);
digitalWrite(ledYellow, HIGH);
delay(delayPeriod);
digitalWrite(ledYellow, LOW);
delay(delayPeriod);
digitalWrite(ledGren, HIGH);
delay(delayPeriod/2);
digitalWrite(ledGren, LOW);
delay(delayPeriod);
digitalWrite(ledBlue, HIGH);
delay(delayPeriod/3);
digitalWrite(ledBlue, LOW);
delay(delayPeriod);
digitalWrite(ledIndigo, HIGH);
delay(delayPeriod/4);
digitalWrite(ledIndigo, LOW);
delay(delayPeriod);
}

digitalWrite(ledRed, HIGH);
digitalWrite(ledOrange, HIGH);
digitalWrite(ledYellow, HIGH);
digitalWrite(ledGren, HIGH);
digitalWrite(ledBlue, HIGH);
digitalWrite(ledIndigo, HIGH);
delay(delayPeriod*6);
digitalWrite(ledRed, LOW);
digitalWrite(ledOrange, LOW);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGren, LOW);
digitalWrite(ledBlue, LOW);
digitalWrite(ledIndigo, LOW);
delay(delayPeriod);

for (int i = 0; i < 5; i ++)
{
digitalWrite(ledRed, LOW);
digitalWrite(ledIndigo, LOW);
delay(delayPeriod);
digitalWrite(ledOrange, LOW);
digitalWrite(ledBlue, LOW);
delay(delayPeriod);
digitalWrite(ledYellow, LOW);
digitalWrite(ledGren, LOW);
delay(delayPeriod);

digitalWrite(ledYellow, HIGH);
digitalWrite(ledGren, HIGH);
delay(delayPeriod);
digitalWrite(ledOrange, HIGH);
digitalWrite(ledBlue, HIGH);
delay(delayPeriod);
digitalWrite(ledRed, HIGH);
digitalWrite(ledIndigo, HIGH);
delay(delayPeriod);


}
}
С уважением, Андрей

Аватара пользователя
SmartAvit
Сообщения: 707
Зарегистрирован: Пн мар 25, 2019 12:10 am
Откуда: Москва

Азбука Ардуино

Сообщение SmartAvit » Вт фев 11, 2020 10:05 am

Andrey.I, Отличная идея. Если ее реализовать на всех портах Ардуино используя 20 светодиодов и расположив их равномерно внутри конуса (воронки) можно сделать очень интересные эффекты и законченный проект.
Есть светодиоды с линзой фокусирующие свет, на базе этих светодиодов можно сделать интересный ночник с проекцией световых эффектов на потолок.
С уважением Владимир.

Аватара пользователя
Vlad.ai
Сообщения: 1568
Зарегистрирован: Чт апр 18, 2013 8:44 am
Откуда: EX8AI - Kyrgyzstan-Bishkek

Азбука Ардуино

Сообщение Vlad.ai » Вт фев 11, 2020 3:47 pm

Спецы - вопрос возможно из Хекс файла сделать скетч для ардуино ?
Владимир Иванович

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Вт фев 11, 2020 11:05 pm

SmartAvit писал(а):
Вт фев 11, 2020 10:05 am
Andrey.I, Отличная идея. Если ее реализовать на всех портах Ардуино используя 20 светодиодов и расположив их равномерно внутри конуса (воронки) можно сделать очень интересные эффекты и законченный проект.
Владимир, спасибо, с вашего позволения, пока отложу в копилку будущих проектов.
С уважением, Андрей

Аватара пользователя
SmartAvit
Сообщения: 707
Зарегистрирован: Пн мар 25, 2019 12:10 am
Откуда: Москва

Азбука Ардуино

Сообщение SmartAvit » Ср фев 12, 2020 11:29 am

Давайте рассмотрим еще несколько способов организации цикла, мигаем 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.

Немного усложняю уроки для перехода к новой более сложной теме.
С уважением Владимир.

araya
Сообщения: 412
Зарегистрирован: Ср фев 03, 2016 6:55 pm
Откуда: Усть-Лабинск

Азбука Ардуино

Сообщение araya » Ср фев 12, 2020 2:52 pm

Приветствую всех.Тема не глохнет) Именно с вашей помощью я и начал заниматся этим.Так что не бросайте нас)Я не очень прилежный ученик но я применяю знания которые здесь получаю.Вот развитие моего учебного проекта.https://yadi.sk/i/87FGlcGsARCmDg
Александр

Аватара пользователя
Andrey.I
Сообщения: 1734
Зарегистрирован: Вт июл 02, 2013 1:21 pm
Откуда: Москва
Контактная информация:

Азбука Ардуино

Сообщение Andrey.I » Чт фев 13, 2020 12:08 am

SmartAvit писал(а):
Ср фев 12, 2020 11:29 am
Попробуйте самостоятельно написать скетч цикла мигания тремя светодиодами при помощи команды while.
Решение, как всегда прячу под сопйлер. :)
int ledPin_1 = 13;
int ledPin_2 = 12;
int ledPin_3 = 10;
int delayPeriod = 500;

void setup()
{
pinMode(ledPin_1, OUTPUT); // Назначаем выходы
pinMode(ledPin_2, OUTPUT);
pinMode(ledPin_3, OUTPUT);
}

void loop()
{
int i = 0; // Обьявляем переменную счетчика цикла
while (i < 5) // До тех пор пока переменная i меньше пяти выполняеться цикл
// в фигурных скобках
{
digitalWrite(ledPin_1, HIGH);
delay(delayPeriod);
digitalWrite(ledPin_1, LOW);
delay(delayPeriod);
i++;
}
i = 0; // обнуляем переменную i и переходим к следующему действию
while ( i < 5)
{
digitalWrite(ledPin_2, HIGH);
delay(delayPeriod);
digitalWrite(ledPin_2, LOW);
delay(delayPeriod);
i++;
}
i = 0;
while ( i < 5)
{
digitalWrite(ledPin_3, HIGH);
delay(delayPeriod);
digitalWrite(ledPin_3, LOW);
delay(delayPeriod);
i++;
} // после последнего цикла обнулять не надо,
//так как переменная обнуляется в начале программы
}
С уважением, Андрей

Ответить

Вернуться в «Усилители»