Начинаем создавать простое приложение “Светофор” в котором будет три лампочки на экране в виде серых квадратов и одна кнопка, при нажатии на которую лампочки начнут поочередно загораться каждая своим цветом : Зеленый,желтый, красный. При нажатии еще раз на кнопку весь процесс будет останавливаться. Начнем с создания экрана приложения и элементов экрана.
Для начало нам нужно создать ресурсы цветов которые будем использовать. Для этого в структуре проекта ( левая часть экрана где находятся все папки) открываем файл “res/values/colors.xml”. Это означает что в папке “res” открываем папку “values” и в данной папке открываем файл “colors.xml”.
В файле “colors.xml” вставляем следующий код:
xml version=»1.0″ encoding=»utf-8″?>
resources>
color name=»colorPrimary»>#008577color>
color name=»colorPrimaryDark»>#00574Bcolor>
color name=»colorAccent»>#D81B60color>
color name=»grey»>#8A8989color>
Светофор в программе ONI
color name=»green»>#34FA07color>
color name=»yellow»>#FDD203color>
color name=»red»>#FF0000color>
resources>
Далее приступаем к созданию экрана. Открываем файл “res/layout/activity_main.xml” и пишем код как на видео уроке или удаляем все и заменяем на этот код (для ленивых):
Источник: neco-desarrollo.es
Урок 7 — Светофор на Arduino своими руками. Пишем скетч используя функции
В данном уроке сделаем самый простой светофор из трех светодиодов . Работать он должен вот по такой схеме.
1. Светит только красный цвет нашего будущего светофора.
2. Не выключая красный сигнал светофора включаем желтый .
3. Выключаем красный и желтый включаем зеленый.
4. Выключаем зеленый сигнал светофора включаем желтый.
После чего цикл повторяем с красного сигнала светофора.
Для урока нам понадобится:
- Arduino UNO или Arduino Nano
- Плата макетная беспаечная
- Резисторы 220 ОМ
- Соединительные провода папа-папа
- Светодиоды 3 или 5 мм.
Подключим три LED к плате Arduino UNO . У нас получиться вот такая схема.
Скетч выглядит так
int led_red = 2; // пин подключения 2 int led_yellow = 3; // пин подключения 3 int led_green = 4; // пин подключения 4 void setup() < pinMode(led_red, OUTPUT); pinMode(led_yellow, OUTPUT); pinMode(led_green, OUTPUT); >void loop() < digitalWrite(led_red, HIGH); delay(10000); // Ждем digitalWrite(led_yellow, HIGH); delay(2000);// Ждем digitalWrite(led_green, HIGH); digitalWrite(led_red, LOW); digitalWrite(led_yellow, LOW); delay(10000);// Ждем digitalWrite(led_yellow, HIGH); digitalWrite(led_green, LOW); delay(2000);// Ждем digitalWrite(led_yellow, LOW); >
Для управления светодиодами используем функции digitalWrite().
Давайте заменим стандартную функции digitalWrite() на свою функцию Led().
void Led (uint8_t pin, byte status)
Функция принимает две переменные pin — пин светодиода и status — состояние светодиода HIGH или LOW.
В итоге получим вот такой скетч
int led_red = 2; // пин подключения 2 int led_yellow = 3; // пин подключения 3 int led_green = 4; // пин подключения 4 void setup() < pinMode(led_red, OUTPUT); pinMode(led_yellow, OUTPUT); pinMode(led_green, OUTPUT); >void loop() < Led (led_red, HIGH); delay(10000); // Ждем Led (led_yellow, HIGH); delay(2000);// Ждем Led (led_green, HIGH); Led (led_red, LOW); Led (led_yellow, LOW); delay(10000);// Ждем Led (led_yellow, HIGH); Led (led_green, LOW); delay(2000);// Ждем Led (led_yellow, LOW); >void Led (uint8_t pin, byte status)
Как видно по скетчу код стал больше, а функции используют для уменьшения объема кода и упрощения логики. Но мы на этом простом примере посмотрели что такое функция и как передавать переменные в функции в среде разработки arduino IDE.
Понятие что такое функции и как их объявлять пригодиться нам в следующем уроке.
Ест вопросы смотрите видео там подробно описываю программу светофора на Arduino.
Следующий урок: Светофор из 3 светодиодов для машин и 2 для пешеходов на Arduino
Если у вас чего то нет для выполнения данного урока, Вы можете посмотреть в каталоге. Там собранные комплектующими от проверенных продавцов по самым низким ценам.
Понравилась статья? Поделитесь ею с друзьями:
Источник: portal-pk.ru
Эксперимент № 4. Светофор на Ардуино
Становится уже интереснее. Давайте соберем модель светофора!
В этом эксперименте не будет новых знаний по Ардуино, зато мы изучим пару новых фишек программирования.
Давайте решим как должен работать наш светофор:
- Предположим, сначала горит зеленый.
- Затем, когда его время истекает, он начинает мигать; предположим, что с интервалом в 1 сек. 3 раза.
- Потом ненадолго зажигается желтый (1сек).
- И включается красный.
- Спустя несколько секунд цикл повторяется
Необходимые компоненты
- 3 LED M5: красный, зеленый и желтый
- 3 резистора на 220R
Схема
Соберем вот эту схему:
Сборка аналогична опыту 2, но тут у нас уже 3 светодиода, и мы задействуем 3 цифровых порта. Каждый светодиод должен быть защищен своим резистором 220 Ом.
Обратите внимание на полярность светодиода: длинная ножка – это плюс, который подключается к цифрому порту, а короткая ножка соединяется с массой (GND).
Сопротивление ставится в разрыв цепи, все равно с какой стороны светодиода – плюса или земли. На схеме сопротивление поставлено со стороны земли (GND).
Вы можете использовать любые цифровые пины ардуино от 2 до 12. Сделайте это как вам удобней, но не забудьте скорректировать номера пинов в скетче.
Скетч
Наш первый скетч выглядит вот так:
[post-content >Светофор горит как задумано:
Объяснение
В скетче даны подробные комментария.
Обратите внимание, что, согласно лучших практик, все параметры приложения, сразу вынесены в глобальные константы в начале скетча. Всегда старайтесь выносить все параметры в глобальные константы в начале скетча. Это облегчит модернизацию и настройку и в дальнейшем.
Для простоты настройки и тестирования светофора, введен мультипликатор, коэффициент, с помощью которого можно изменять скорость работы светофора:
const float delayMultiply = 0.1; // число миганий
Цикл for
В скетче мы встретили новое ключевое слово языка C/С++ – for, с помощью которого нужная подпрограмма выполняется циклически заданное число раз. Рассмотрим ее пример:
for ( i = 0; i < 5; ++i) < // …. Повторяемый код >
i – это переменная, которая хранит номер текущего цикла. Назовем ее счетчиком. Счетчик может начинаться с любого числа. В данном случае он равен 0.
++ – это инкремент, т.е. увеличение значения на 1. Вместо этого инкремента может быть и другое выражение, которое изменяет счетчик циклов, например декремент –i. Также значения счетчика может быть изменено и внутри самой подпрограммы цикла.
Если мы хотим выйти из цикла, по условию, не выполняя все циклы, можно использовать оператор break («прерывать»), вот так:
for (i = 0; i
В данном случае, цикл будет выполнено всего 1 раз, поскольку в конце подпрограммы стоит принудительное завершение цикла с помощью оператора break.
Функции
Обратите внимание на большое число повторяющихся похожих блоков кода. Блоки отличаются лишь номером пина, и временем задержки.
Согласитесь, что повторять код – не очень рационально. Ведь в случае если нам понадобится внести в работу светофора какое-то изменение или усовершенствование, нам придется его проделать сразу во многих местах программы.
Более правильным здесь будет написать пару функций.
Функция – это именованная подпрограмма, которая принимает входные параметры (обычно есть хотя бы один параметр), использует их внутри себя (в теле функции) и может возвращать выходные параметры.
Давайте сделаем две функции:
- lightUp – зажигает заданный светодиод на заданное время.
- blink – мигает заданным светодиодом заданное число раз с заданным интервалом.
Каждая из этих функций будет иметь входные параметры:
- lightUp:
- pinLed – пин светодиода
- nDelay – продолжительность свечения светодиода
- pinLed – пин светодиода
- nDelay – продолжительность свечения светодиода и, одновременно, продолжительность паузы до следующего включения.
- nTimes – число циклов мигания
Все параметры будут целыми (int) константами (const). Запомните: если параметр функции или иная переменная не должна изменяться в ходе работы программы, настоятельно рекомендуется объявлять их как контенту, используя ключевое слово const. Это сократит число возможных ошибок в программе.
Для определения функции используется следующий шаблон:
Список параметров – это перечисление через запятую объявление переменных, которые одновременно будут параметрами данной функции.
О возвращаемых параметрах мы расскажем в следующих экспериментах. Наши функции не будут возвращать никакие параметры. В этом случае в качестве типа возвращаемого параметра надо указывать тип void.
Вот так будет выглядеть наша первая функция, зажигающая светодиод на заданное время:
// Функция зажигает заданный светодиод на заданное время и гасит его. void lightUp(const int pinLed, const int nDelay) < digitalWrite(pinLed, HIGH); //// turn on green LED delay(nDelay); digitalWrite(pinLed, LOW); // turn off green LED >
Вот так мы ее используем:
lightUp(pinGrenLed, lightDelay); // зажечь светодиод, подключенный к пину pinGrenLed на lightDelay мсек.
Посмотрите как изменился наш скетч после введения функций:
/** * (C) jarduino.ru 2019 * Изучение ардуино через опыты. * * Опыт №4.2 Светофор, продолжение * * Использование функций для минимизации повторяющихся фрагментов */ // Глобальные константы const int pinRedLed = 12; // красный подключен к порту 12 const int pinYellowLed = 9; // желтый подклчен к порту 9 const int pinGrenLed = 6; // зеленый подключен к порту 6 const int lightDelay = 5000; // продолжительность свечения зеленого и крассного const int blinkDelay = 500; // полупериод мигания const int yelloDelay = 1000; // полупериод мигания const int blinkTimes = 3; // число миганий const float delayMultiply = 0.1; // число миганий // настройка платы void setup() < // инициализировть цифровые порты светофора на вывод: pinMode(pinRedLed, OUTPUT); pinMode(pinYellowLed, OUTPUT); pinMode(pinGrenLed, OUTPUT); >// Функция зажигает заданный светодиод на заданное время и гасит его. void lightUp(const int pinLed, const int nDelay) < digitalWrite(pinLed, HIGH); //// turn on green LED delay(nDelay); digitalWrite(pinLed, LOW); // turn off green LED >// Функция мигает светодиодом с заданным полупериодом заданное число раз void blink( const int pinLed, // пин светодиода const int nDelay, // полупериод мигания const int nTimes // число миганий ) < for (int i = 0; i < nTimes; ++i) // blinks for 3 times < delay(nDelay); lightUp(pinLed, nDelay); >> // Главный цикл программы void loop() < // Зажечь зеленый lightUp(pinGrenLed, lightDelay * delayMultiply); // Помигать зеленым blink(pinGrenLed, blinkDelay * delayMultiply, blinkTimes); // Ненадолго зажечь желтый lightUp(pinYellowLed, yelloDelay * delayMultiply); // Зажечь красный lightUp(pinRedLed, lightDelay * delayMultiply); >
Стало не сколь прямолинейно, но зато гораздо гибче.
Заключение
Наша программа стала уже сложнее, а результат – интереснее.
Конечно, в реальной жизни светофор работает намного сложнее. Используя описанные здесь принципы, можно смоделировать работу любого светофора и применить его в дорожных симуляторах, в играх и при обучении детей правилам дорожного движения.
Здесь мы познакомились с такими концепциями программирования как циклы и функции и подготовились для создания чего-то более интересного.
Главная мысль этого урока: старайтесь минимизировать повторяющийся код. Это поможет в дальнейшей модернизации программы и в повторном использовании кода.
Помните, что основновной процесс написания программы – это именно непрерывный рефакторинг, т.е. постоянное улучшение программы. Модульность программы и устранение повторений – это первичные условия успешного рефакторинга в дальнейшем.
Posted in Эксперименты с Ардуино | Tagged светодиод | Leave a reply