vivaos

vivaos

Пикабушник
поставил 1938 плюсов и 64 минуса
отредактировал 0 постов
проголосовал за 0 редактирований
Награды:
10 лет на Пикабу самый сохраняемый пост недели За космическую внимательность более 1000 подписчиков лучший авторский пост недели
20К рейтинг 1617 подписчиков 24 подписки 80 постов 36 в горячем

Совершенно новая посудомойка отказывалась набирать воду, вскрытие показало..

..показало, что дело в этой треснутой пластмассовой емкости, которая, при подаче воды, полностью заполнила поплавковую камеру снизу и сработал датчик протечки :(

Совершенно новая посудомойка отказывалась набирать воду, вскрытие показало.. Ремонт техники, Посудомоечная машина, Hansa, Длиннопост

Вид со стороны трещины:

Совершенно новая посудомойка отказывалась набирать воду, вскрытие показало.. Ремонт техники, Посудомоечная машина, Hansa, Длиннопост

Отсюда возникло пару вопросов к знающим ремонтерам: как называется сия емкость? Есть ли смысл заказывать и ставить ее самому, и в какую сумму это примерно обойдется?


Заранее благодарю всех откликнувшихся! Комментарий для минусов внутри.

Показать полностью 2

#8 Функции и их применение. Основы Arduino для начинающих

Привет начинающим ардуинщикам! :)


После небольшого перерыва, наконец-то готова 8-я видео-статья из цикла «Основы Arduino для начинающих» и сегодня мы поговорим о таком важном инструменте в арсенале программиста, как функции. Научимся с ними работать и использовать их в своем коде.


Предыдущие выпуски вы найдете здесь: 0,1,2,3,4,5,6,7


Видеоверсия поста:

Прежде чем переходить к изучению синтаксиса и построения функций, давайте сделаем для себя обоснование их использования. Представьте, что вы работаете над проектом, например, «умного дома», где каждый из датчиков выполняет свою роль, а ваш код связывает эти датчики в единую систему. Допустим, что у нас есть датчики освещенности, движения, температуры, влажности и LCD дисплей, куда мы выводим какую-либо информацию. Каждому из этих отдельных устройств соответствует некоторая часть кода, где происходит считывание, обработка и сохранение показаний с наших датчиков, а так же вывод каких-либо показателей на дисплей.


Если мы пойдем по пути написания программы, как мы это делали раньше, то у нас получится очень длинная вереница строк кода, где будет трудно найти начало кода для обработки полученной информации, с какого-либо нужного нам датчика.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Гораздо удобнее будет разбить нашу систему и её код на отдельные выполняемые ими функции. Например, датчику освещенности сопоставить функцию измерения освещенности, датчику температуры – измерение температуры и так далее. В результате мы получим некоторый список функций, с которыми уже будет гораздо проще работать и осуществлять различные манипуляции.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Удобство функций также заключается в том, что мы можем передавать и получать от них какую-либо информацию. К примеру, у нас есть функция вывода информации на дисплей, которую мы можем настроить на прием каких-либо символов. Тогда в основном коде вам останется только указать имя функции и необходимый текст, который вы желаете вывести на экран, а дальше уже не отвлекаться на не нужную часть кода по выводу этого текста на дисплей.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Еще одним, обязательным применением функций, являются повторяющиеся в вашей программе фрагменты кода. Зачем писать один и тот же код всякий раз, когда он понадобится, если можно написать на этом месте короткое имя функции, которая будет содержать в себе этот код? Таким образом, нам снова удастся разгрузить основной цикл от лишнего кода и сделать вашу программу более простой и, что самое важное, лучше читаемой.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

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


Итак, думаю, я достаточно убедил вас в том, что использовать функции это удобно и необходимо, давайте же посмотрим на примерах как создавать свои функции и работать с ними.


Для начала возьмем очень простую задачу. Допустим, что в вашей программе часто (а говоря часто, я имею в виду 2 и более раза), приходится использовать один и тот же фрагмент кода - например, зажигать несколько светодиодов и подавать сигнал в зависимости от состояния какого-либо пина. Можно пойти по сложному пути и всякий раз писать лишние строки в те места кода, где это понадобится, а можно всего один раз написать функцию и затем вызывать ее в нужных местах – что мы сейчас и сделаем.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Простейшая функция выглядит следующим образом:

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Она записывается вне основной функции loop и имеет такую же конструкцию. Помните, я говорил, что функция может, как принимать какую либо информацию, так и возвращать результат своей работы. Так вот, ключевое слово void означает, что наша функция не будет возвращать никаких данных в результате своей работы, поскольку в ней мы не будем производить какие-либо вычисления или считывания и нам не нужна обратная связь с этой функцией. Так как функция не только не возвращает результат, но и не принимает информацию, то ее скобки мы оставляем пустыми, что эквивалентно тому, если бы мы написали в них void.


Итак, заготовка простейшей функции готова и в ней уже написан необходимый нам код.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Давайте посмотрим, как же вызывать эту функцию в основном цикле программы. На самом деле, все так же просто – вам нужно указать имя этой функции и обязательно не забыть про круглые скобки и точку с запятой. Так как функция ничего не принимает, то мы так же оставляем скобки пустыми.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Теперь, если представить что мы программа, то алгоритм работы будет такой: сначала, как и обычно, происходит запуск микроконтроллера и его настройка в функции setup, затем мы переходим в функцию loop и затем, попадая на строчку вызова нашей функции, переходим в эту функцию. В ней так же строка за строкой выполняется каждая команда и, по окончанию функции, осуществляется выход из нее обратно на то место, откуда был осуществлен вызов.


Мы можем объявить еще одну функцию и так же сделать ссылку на нее – как видите, основная программа теперь не загромождена лишними строками кода, а мы видим лишь названия функций, прочитав которые понимаем, что происходит в этой функции.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Названия функциям желательно давать исходя из того, какую задачу эта функция выполняет. Это поможет вам в будущем, да и другому человеку, читающему ваш код, понять, что делает эта функция без необходимости разбираться в ее коде.


Итак, с простейшими функциями мы разобрались. Давайте немного усложним нашу задачу. Допустим, что нам необходимо сделать считывание не всегда одного и того же пина, как мы это делали раньше, а каждый раз разного. В этом случае нам и пригодится способность функций принимать какие-то входные данные для работы.


Что бы использовать эту возможность, теперь в пустых скобках мы должны указать тип и имя переменной, которая будет отвечать за номер пина. Назовем её, например, numberPin и дадим ей тип byte, который может нести в себе число от 0 до 255.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Теперь, обращаясь к функции, мы так же обязаны указать в круглых скобках число от 0 до 255 и если этого не сделать, то компилятор выдаст вам ошибку, так как функция теперь обязана принимать какое-либо значение. В нашем случае мы будем указывать номер пина, с которым хотим работать, поставим, например, цифру 4.


Чтобы код, написанный внутри нашей функции, стал таким же универсальным, на том месте, где до этого мы писали конкретный номер пина для считывания, теперь необходимо указать переменную nomberPin, которая подставит сюда такое число, какое мы передали при обращении к функции – в нашем случае это цифра 4, то есть 4-й пин.


Давайте еще раз повторим, что теперь у нас будет происходить при таком объявлении функции. Программа, попадая на строку вызова функции, запоминает число, указанное в скобках, и передает это число функции, где значение этого числа присваивается указанной нами переменной numberPin. Теперь, как и в обычном коде, на всех местах, где встретится эта переменная будет подставляться наше число, которое мы передали функции. Таким образом, в основном коде программы мы можем вызывать одну и ту же функцию несколько раз, при этом указывая необходимый нам пин в ее круглых скобках.


Если мы хотим передать нашей функции не одно, а несколько значений, то мы просто указываем тип и имя переменной через запятую, и затем уже используем эти переменные в коде. При вызове функции нам так же необходимо указывать значения через запятую, так как теперь функция будет ждать от нас столько значений, сколько указано в её круглых скобках. Мы можем передавать в нее всё, что угодно, будь то показания с датчиков или текстовые сообщения, которые необходимо вывести на дисплей. Все зависит от кода, который вы укажете в теле функции.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Кстати, находясь внутри самой функции, мы можем вызывать еще сколько угодно функций, если это необходимо для упрощения и разгрузки кода. Еще одним, очень важным плюсом функции является то, что если нам нужно изменить какой-либо фрагмент кода, то, в случае функции это нужно сделать всего лишь однажды, изменив что-то внутри нее. Если бы мы копировали один и тот же код без использования функций, то нам бы пришлось вносить поправки во все места, где встречается этот код в программе.


Итак, мы научились сообщать функции какие-либо данные для работы. Давайте посмотрим, каким образом осуществляется возврат результата вычисления функцией.


При определении функции мы указали, что возвращаемый ею тип является void, то есть она ничего не возвращает. Изменим void, например, на тип byte и теперь в функции мы обязаны указать возврат какого-либо результата ее вычисления. Для того, что бы функция вернула какое-то значение, существует оператор return, и запись, например, return 5 означает, что наша программа, дойдя до этого момента, сделает выход из функции, при этом запомнив результат равный 5.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Вместо конкретного числа вы можете подставлять значения различных переменных, которые использовались в функции, например, это может быть считанное состояние цифрового или аналогового пина микроконтроллера. Что бы в дальнейшем работать с этим значением, мы должны присвоить его какой-либо переменной в коде, а саму запись функции вы можете представлять себе как преображение в то число, которое она возвращает. Например, можно объявить переменную result, то есть результат, и написать, что result присвоить значение нашей функции.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Тогда программа, дойдя до этого момента, будет поступать так – она переходит в указанную нами функцию, выполняется там, доходит до оператора return и запоминает значение, которое мы указали. Это значение она записывает по адресу переменной result. Теперь result равен тому числу, которое возвращает наша функция.

Что бы закрепить сегодняшний материал, попробуйте реализовать самостоятельно такой пример – пусть это будет своеобразная система для контроля бдительности машиниста поезда. Если машинист видит мигание лампочки, то он должен нажать на кнопку, что бы подтвердить что он бодрствует, если же этого не происходит, система начинает издавать звуковой сигнал, дабы разбудить нашего машиниста.

Чтобы вам было проще, разберем, что же должна делать наша программа: запуская алгоритм, через какой-то интервал времени происходит сигнализация, например, двойным миганием светодиода, после которой, спустя задержку в одну секунду, необходимо нажать на кнопку, то есть осуществить считывание сигнала с цифрового порта микроконтроллера. Затем, если состояние порта равно единице, то есть кнопка не нажата, происходит уведомление об этом звуковым сигналом и система будит машиниста, если сигнал порта равен нулю, то кнопка нажата, оповещения не происходит и через некоторое время можно повторить проверку бдительности.

#8 Функции и их применение. Основы Arduino для начинающих Arduino, Функция, Программирование, Видео, Длиннопост

Обязательно поделитесь своими успехами или вопросами в комментариях, ну а на этом про функции все, спасибо за то, что дочитали до конца и до встречи в 9-м выпуске! ;)

Показать полностью 14

Дорогие друзья, с Новым, 2017 Годом вас!

От лица администратора сообщества "Arduino&Pi" хочу поздравить всех ардуинщиков, программистов, а так же других пикабушников с наступающими праздниками! Пусть в новом году исполнятся все ваши самые заветные желания, проекты удачно компилируются, а интересные идеи никогда не покидают вашу голову :)

С праздником, друзья!

P.S.: В комментариях к этому посту, как и обычно, можно задавать свои вопросы и помогать другим

Дорогие друзья, с Новым, 2017 Годом вас! Arduino, Raspberry pi, Новый Год, Поздравление, 2017

Рубрика "Вопросы и ответы" вновь к вашим услугам :)

Совсем забылась наша традиционная рубрика "ВиО", нужно это исправлять.. Надеюсь, за это время у вас накопилось много вопросов, а так же большое желание помочь другим ;)

Тем, у кого возникает вопрос по поводу картинки, сюда. А у вас была какая-то тактика с самого начала? :)

Рубрика "Вопросы и ответы" вновь к вашим услугам :) Вопрос, Вио, Помощь, Arduino, Raspberry pi, Тактика
Показать полностью 1

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих

И снова здравствуйте! :)


Это седьмая видео-статья из цикла «Основы Arduino для начинающих» и сегодня мы поговорим о таком важном понятии, как логические операции, без которых не обойтись при решении практически любой задачи.


Предыдущие выпуски вы найдете здесь: 0,1,2,3,4,5,6


Видеоверсия поста:

Начнем с определения в википедии – логическая операция в программировании, это операция над выражениями логического (булевского) типа, соответствующая некоторой операции над высказываниями в алгебре логики. На первый взгляд – ничего не понятно, давайте подробнее разберемся, что такое логический или булевский тип, а так же алгебра логики.


Фраза логический (он же булевский) тип выражения означает, что это выражение может принимать только два значения – ложь или истина, 0 или 1. Если мы укажем переменной, что она имеет тип bool (boolean), то, как ни крути, значения, которые она сможет в себе нести, будут либо 0, либо 1. Помните, в предыдущих выпусках мы составляли условия, в зависимости от истинности или ложности которых происходили какие-либо действия – как раз тогда мы уже работали с булевыми выражениями.


Итак, кажется, теперь становится более понятной первая строчка определения – логическая операция, это операция над выражениями логического (булевского) типа. Теперь со второй частью об операциях алгебры логики.


Каждый из вас помнит уроки математики в школе, где мы работали с числами в привычной для нас, десятичной системе счисления – то есть с цифрами от 0 до 9. Но мир логики, если так можно сказать, отличается от нашего, ведь там все значения имеют только два состояния - 0 или 1, отсюда и возникает потребность в специальной математике для работы с логическими выражениями. Эта математика носит название «алгебра логики».


В этой алгебре есть три основных операции – сложение, умножение и отрицание, позволяющих реализовать любые логические функции. Давайте разберемся на примерах для микроконтроллера, где нам может понадобиться каждая из этих операций.


Операция сложения, она же операция дизъюнкции либо логическое ИЛИ. Многие из вас помнят, что в прошлом выпуске, при изучении циклов и условий, мы брали примеры с автобусами и остановкой, давайте снова разберем такой пример – наверное, вы замечали, что в относительно новых автобусах по салону распределены кнопки требования остановки. При нажатии на такую кнопку у водителя на приборной панели загорается лампочка и звучит сигнал требования остановки.

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Давайте попробуем реализовать такую же систему на Arduino – возьмем, например, три кнопки и подключим их к микроконтроллеру, а так же добавим в схему светодиод и, при наличии, пьезо-извещатель.

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Алгоритм работы такой системы достаточно прост и схож с тем, что мы писали для одной кнопки и светодиода, но, в данном случае возникает одна проблема - у нас не одна кнопка, для которой можно написать условие, а целых три. И при нажатии любой из кнопок у нас должен звучать сигнал и гореть светодиод. Что же делать? Можно, конечно, написать три отдельных условия для контроля каждой из кнопок, но код в таком случае выглядит нагроможденным и при увеличении количества кнопок становится жутко не удобным.

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Здесь нам на помощь и приходят логические операции, позволяющие составлять не одиночные условия, как мы это делали раньше, а достаточно гибкие и удобные совмещенные.

В нашей задаче необходимо включить оповещение при срабатывании первой или второй или третьей кнопки и, если вы помните, операция сложения так и называлась – логическое ИЛИ.


Давайте создадим три переменных типа boolean, в которые будем сохранять считанный сигнал от каждой из кнопок, и объединим эти переменные в одном условии, поставив между ними логическое ИЛИ. Эта операция записывается в виде двух вертикальных черточек и, что бы понять логику ее работы, давайте взглянем на так называемую таблицу истинности, где указываются операнды, над которыми совершается операция.

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Два первых столбца это возможные значения на входах - например, если бы у нас было две кнопки и между ними мы производили дизъюнкцию. Как видите, при комбинации 00 итогом логического сложения так же будет 0. А вот следующая комбинация - 0 или 1 уже дает на выходе логическую единицу, так же, как и оставшиеся комбинации. Нижняя строка 11 так же выдаст единицу, поскольку мы производим сравнение двух положительных значений.


В итоге мы можем сделать вывод, что логическая операция ИЛИ выдаст единичный результат, если на любом из ее входов появится хоть одна единица. Для нашей системы мы можем составить таблицу из трех колонок и перебрать все возможные нажатия кнопок, логика останется прежней – если существует хоть одна единица – ответ будет равен одному.

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Это отлично подходит к нашей задаче, ведь нам как раз и требовалось при нажатии любой из кнопок запускать оповещение, а при отпущенных кнопках ничего не делать. Давайте взглянем на получившийся программный код..

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Надеюсь, цикл for, находящийся в теле условия, после прошлого выпуска теперь не вызывает у вас трудностей в понимании. Как видите, при нажатии на любую кнопку условие становится истинным и выполняется цикл for, написанный в теле условия.


Переходим к следующей логической операции – это конъюнкция или логическое И, иначе говоря – умножение. Если предыдущая операция делала условие истинным при любой нажатой кнопке, то операция умножения потребует нажатия сразу всех кнопок и только тогда выдаст нам логическую единицу.


Более наглядно это можно увидеть по таблице истинности. Как можно заметить, если в комбинации присутствует хотя бы один ноль, то вся функция становится равной нулю.

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Эта операция записывается в виде двойного амперсанда (&&), и, такой символ - &, по сути, заменяет слово И (от английского and). Таким образом, если вам понадобится сделать условие истинным при одновременно нескольких истинных событиях, то этот оператор то, что нужно.


Это можно увидеть, если заменить в предыдущем коде ИЛИ на И.

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Загрузив код, мы увидим, что нажатие одной кнопки никак не влияет на истинность условия и теперь от нас требуется нажать сразу все кнопки.


Также мы можем комбинировать операции сложения и умножения в одной функции. Например, нам необходимо включать оповещение только при одновременном наличии сигнала с 1-й и 2-й кнопки, или со 2-й и 3-й. Тогда условие примет вот такой вид:

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Скобками осуществляется разграничение между отдельными условиями и, по сути, сейчас у нас два условия в одном: первое – нажатие 1-й и 2-й кнопки, второе – нажатие 2-й и 3-й кнопки, что бы учесть выполнение одного из этих двух условий мы ставим между ними логическое ИЛИ.


И, наконец, нам осталось разобраться с третьей логической операцией, пожалуй, самой простой из всех – это логическое отрицание или логическое НЕ. Единственная его задача - менять значение переменной или функции на противоположное.


Обозначается операция восклицательным знаком, который ставится впереди переменной или функции. Например, первая переменная кнопки при считывании значения с порта микроконтроллера стала равна нулю, но, добавив впереди нее восклицательный знак, это значение становится обратным – то есть теперь эта связка равна единице.

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Когда может понадобиться отрицание? Например, когда в условии нужно проверить не истинность какой-либо функции или переменной, а, наоборот, ее ложность. Но, как вы помните, например, оператор if разрешит нам попасть в тело условия, только если условие в его круглых скобках будет истинно, а не ложно, для ложного значения мы использовали else.


Так вот, что бы условие выполнилось при нормально-ложном значении чего-либо и пригодится отрицание. Допустим, мы хотим выполнить тело условия только если кнопка отпущена, то есть в переменной находится ноль, поэтому к переменной, указанной в условии, мы добавляем восклицательный знак. Теперь при отпущенной кнопке связка переменной и отрицания равна единице и условие выполняется.

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Модернизировать наш прошлый алгоритм можно добавив условие, что, одна из кнопок должна быть обязательно отпущена. Иначе условие срабатывает при, например, нажатых первой и второй кнопках, но при этом не учитывает в каком положении находится третья. Указав, что третья кнопка должна быть равна нулю, мы задаем более точное условие срабатывания алгоритма.

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Как и в обычной математике, у алгебры логики есть свои законы, советую самостоятельно подробно с ними ознакомиться.

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Ну а в качестве домашнего задания, попробуйте добавить к нашей схеме еще пару кнопок и применить свои условия срабатывания оповещения - здесь важно отточить навык использования сразу всех операторов – сложения, умножения и отрицания.

Для тех, кому трудно придумать свои условия, я составил небольшую таблицу зависимостей выходного сигнала от состояния 4 кнопок. Попробуйте реализовать каждое из этих условий:

Выпуск 7. Логические операции И, ИЛИ, НЕ. Основы Arduino для начинающих Arduino, Программирование, Начинающий, Логические операции, Видео, Длиннопост

Так же, для тех, кто не состоит в нашем сообществе Вконтакте, сообщаю, что теперь после каждого выпуска с задержкой в один-два дня будет выкладываться небольшой тест, в котором вы сможете проверить свои остаточные знания по изученному материалу и восполнить возможные пробелы. Тест к предыдущему выпуску можно найти здесь.


Ну а на этом про логические операции, пожалуй, все, не забывайте оценивать материал и писать свои пожелания и замечания, надеюсь, что вам было интересно :) Всем добра!

Показать полностью 14

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих

Привет начинающим ардуинщикам! :)


Прошу прощения за возникшую задержку в выпусках - болело горло и не мог записывать видео. Сегодня мы разберемся с такими понятиями как условные операторы и циклы, поговорим о том, как ими пользоваться и разберем несколько примеров их применения.


Предыдущие выпуски вы найдете здесь: 0,1,2,3,4,5


Видеоверсия поста:

Предлагаю начать наш разговор с условных операторов, или, как их еще называют, операторов выбора. Данные операторы всегда имеют какое-то условие, и это условие в процессе работы проверяется на истину или ложь.

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Если условие верно, то есть истинно, то выполняется специально указанный для этого случая фрагмент кода. Если же условие не верно, то есть ложно, то выполняется либо другая специально указанная часть кода, либо не выполняется ничего и работа микроконтроллера продолжается дальше по коду.


Если взять за пример человека, то мы с вами каждый день выполняем огромное множество подобных условий на подсознательном уровне, не замечая этого. Допустим, вы решили попить чаю и пришли на кухню что бы поставить чайник. Перед тем, как его включить или зажечь газ, вы проверяете, есть ли в чайнике вода. Если воды достаточно, то можно включать чайник, если нет, то необходимо её долить. Как раз условием в данном случае и является проверка вашего чайника на достаточное количество воды. И при истинности либо ложности этого условия вы выполняете определенные действия. Тоже самое делает и микроконтроллер, если вы задаете ему какое-то условие. Например, в прошлом выпуске мы рассматривали условие нажатия кнопки и зажигали в зависимости от этого светодиод.


Такой условный оператор носит название if, что в переводе означает «если». И частично его конструкция вам уже должна быть знакома – это непосредственное указание оператора, затем необходимое условие в круглых скобках и какой-либо код, выполняющийся при истинности этого условия. Но, в случаях, когда важно учитывать не только истинность, но и ложность, то есть не выполнение заданного вами условия, после фигурных скобок пишется слово else, что в переводе означает «иначе», и ставятся такие же фигурные скобки, только уже код в них будет выполняться при ложности заданного условия.

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Например, к нашему прошлому коду можно добавить условие, что при нулевом сигнале, то есть отпущенной кнопке, подать на пин 13 постоянный сигнал высокого уровня. И тогда, если кнопка не нажата, наш светодиод будет постоянно гореть, а при нажатии, мигать с указанной частотой.

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Так как микроконтроллер работает с числами и различными значениями, то в условии мы можем проверять не только абсолютное равенство двух значений, но так же делать различные выводы о том, больше ли это значение чем заданное, больше или равно, меньше, меньше или равно либо просто не равно.

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Согласитесь, оператор if очень прост и удобен в использовании, но здесь стоит оговориться, ведь удобно с ним работать, только если нам необходимо проверить какое-либо одно условие. А что если их будет несколько? Представьте, что вам дали задание, например, разложить научные статьи по году их публикации, и вы, проверяя год каждой статьи, кладете их в соответствующую папку.


Но как этот процесс будет выглядеть с точки зрения алгоритма для микроконтроллера и оператора if? Давайте запишем. Очевидно, что вам потребуется сделать такое количество алгоритмов, какое количество годов будет у ваших статей. Ведь каждый раз мы должны проверить год на соответствие и в случае совпадения, положить документ в папку, либо же отправить его на проверку другому алгоритму.  

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Такой каскад из условий со стороны микроконтроллера не создаст для него никаких проблем, но с точки зрения восприятия человеком такого большого количества однотипных условных операторов – это крайне неудобно.


И здесь нам на помощь приходит еще один оператор выбора, имеющий название switch, что в переводе означает коммутатор или переключатель. Его удобство заключается в том, что нам не нужно теперь создавать каждый раз новое условие, чтобы проверить одно и тоже значение, а всего лишь необходимо указать в круглых скобках оператора переменную, которая будет принимать это значение, а сам оператор осуществит поиск из возможных вариантов нужного нам значения, и выполнит соответствующий ему код.

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Что бы стало понятно, вернемся к нашей задаче распределения статей. В качестве постоянно изменяющейся переменной мы можем указать оператору значение года публикации статьи, а в возможных вариантах существующие года публикации. И, таким образом, получив очередное значение года, оператор выберет необходимый год из вариантов и выполнит действия, указанные в пределах от оператора case до оператора break, а затем выйдет из оператора switch. Break в нашем случае переводится как выход, а case - это возможный случай или вариант. Если же необходимый год в списке не найдется, то в конце оператора возможно указание значения ключевого слова default, то есть по умолчанию, и в таком случае мы не просто выйдем из оператора, а сначала выполним код, указанный после default.

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Объясняя принцип работы этого оператора, я упомянул такое слово как переменная, которой присваивалось какое-то значение года публикации. Переменной называется область памяти микроконтроллера, имеющая определенное имя. В переменные можно сохранять какие-либо значения и использовать эти значения в дальнейшем. В зависимости от типа переменной, она может хранить числа или символы, а так же быть или не быть знаковой, то есть отрицательной. Чтобы не затягивать статью, я советую вам изучить какие бывают переменные и их типы по этой ссылке или любой другой из поиска.


В дальнейшем, научившись сообщать микроконтроллеру различные данные и значения, мы обязательно опробуем оператор switch в действии, ну а пока вам важно изучить и понять логику его работы.


Итак, подводя итог, можно сказать, что существует два условных оператора, или оператора выбора – это if и switch. Оператор if больше подходит для одиночных проверок условия, а switch подойдет для случаев с большим количеством возможных вариантов и одним проверяемым значением.


Идем дальше. Теперь у нас на очереди операторы циклов. Любой цикл представляет собой повторяющееся несколько раз действие. Операторы циклов бывают трех видов: for, while и do while - давайте остановимся поподробнее на каждом из них.


Оператор цикла while.

Представим себе простую ситуацию: вы стоите на остановке и ждете автобус под номером 25. В данный момент вы задаетесь условием проверки каждого номера автобуса на совпадение с цифрой 25. Если номер не подходит, то вы продолжаете стоять и ждать нужный - именно так и действует цикл while, который проверяет условие, указанное в его круглых скобках.


Цикл while переводится как «пока» и до тех пор, пока его условие выполняется, он бесконечно долго выполняет код, указанный в его фигурных скобках. Например, на каком-либо этапе работы микроконтроллера, нам важно получить сигнал с какого-нибудь пина Arduino, и, пока сигнала нет, программа не должна ничего выполнять. Как раз в этом случае нам и поможет while, если в условии мы укажем считывание пина и его проверку на равенство нулю.

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Важно еще раз отметить, что while будет выполняться до тех пор, пока условие будет истинным, и как только оно станет ложным, при очередной проверке условия произойдет выход из цикла.


Оператор цикла do while.

Оператор цикла do while называется оператором цикла с постусловием и работает практически по тому же принципу, но с одной лишь разницей: сперва происходит выполнение тела цикла, а уже затем проверка условия. Этот цикл используется, когда необходимо хотя-бы один раз выполнить код, указанный в фигурных скобках независимо от истинности или ложности условия, указанного ниже. В случае с обычным циклом while при изначально ложном условии микроконтроллер переходит сразу же к выполнению кода, написанного после фигурных скобок цикла и, таким образом, минует код, указанный в теле цикла.

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Прошу обратить ваше внимание на синтаксис оператора do while – возможно, кто-то уже заметил, что после условия в круглых скобках ставится точка с запятой, поскольку тело цикла уже было описано в фигурных скобках выше.


Оператор цикла for.

И, наконец, нам осталось познакомиться с еще одним, не менее важным оператором цикла под названием for. Давайте вернемся к нашей остановке и автобусу. Допустим, что мы дождались нужный нам автобус, зашли внутрь и теперь нам необходимо заплатить за проезд. Билет стоит 22 рубля, рассчитываться мы будем наличными, поэтому достаем кошелек и начинаем отсчитывать монетки, пока не достигнем нужной нам суммы. Как только нужная сумма будет набрана - можно расплачиваться за проезд. Как вы могли догадаться, цикл for действует по тому же принципу: в условии мы указываем действие, которое выполнится в начале цикла, затем само условие работы и действие, выполняемое в конце каждого прохода цикла.

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Давайте возьмем конкретный пример для микроконтроллера и посмотрим, как работает этот цикл. Не за горами наступление нового года, поэтому предлагаю сделать с помощью нашей Arduino упрощенную гирлянду. Подключим со 2-го по 11-й пин 10 светодиодов и напишем цикл их включения.  

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Если описывать алгоритм работы словесно, то у нас получится следующая последовательность: сперва назначаем переменную, которая будет отвечать за номер пина, и затем говорим микроконтроллеру, что нужно изменять эту переменную от 2 до 11 с небольшой задержкой, последовательно подавая высокий потенциал на каждый пин. В итоге мы получим поочередное зажигание всех светодиодов по нарастающей.

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Теперь опишем это с помощью программы.

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

Сперва укажем имя оператора – for. Затем, в открывающейся скобке, указываем действие в начале цикла - в нашем случае это инициализация переменной pin и присваивание ей значения 2, так как ко второму пину подключен первый светодиод. Кстати, если мы не укажем чему изначально равна переменная pin, то компилятор по умолчанию присвоит ей нулевое значение. Затем ставим точку с запятой и указываем условие, при котором цикл должен выполняться - в нашем случае это работа цикла пока переменная pin меньше или равна 11. После чего мы снова ставим точку с запятой и указываем шаг увеличения или уменьшения значения pin. Запись pin++ означает увеличение переменной pin на единицу, такая операция носит название инкремент и равносильна записи pin = pin+1. А запись pin--наоборот, уменьшит значение pin на один, эта операция называется декрементом.

После указания циклу, что ему делать перед каждым новым проходом, ставится закрывающая скобка – обратите внимание, точка с запятой здесь не нужна. Затем по традиции мы открываем фигурные скобки и пишем знакомые нам строки: digitalWrite(pin, HIGH); и delay(100);

Прошу не забывать, что функция задержки рассматривается нами как простейшая, и через несколько выпусков мы поговорим о том, как ее можно заменить, чтобы не замораживать работу микроконтроллера. Данный пример ориентирован на понимание работы алгоритма, поэтому на этапе обучения мы можем себе позволить такие допущения.


На этом наш код готов. Как он работает? Опишем по пунктам:

1. Объявление переменной pin и присваивание ей значения 2

2. Проверка условия, что 2 меньше или равно 11

3. Выполнение тела цикла: зажигаем светодиод на 2-м пине и ждем 100 мс.

4. Инкремент переменной pin, теперь она будет содержать в себе цифру 3, то есть 3-й пин

5. Снова проверяем условие, что 3 меньше или равно 11

6. И выполняем подачу высокого потенциала на пин 3 с задержкой


Аналогично зажигаются остальные светодиоды. Когда значение pin будет равно 12, условие 12 меньше или равно 11 не выполнится, и будет осуществлен выход из цикла. Таким образом, мы зажжем последовательно все 10 светодиодов.


Загрузив наш код в микроконтроллер, мы увидим, что нам придется постоянно нажимать кнопку сброса, что бы погасить все светодиоды и зажечь их вновь. Если мы можем сделать цикл, который будет последовательно зажигать светодиоды, то, что нам мешает сделать такой же цикл, который будет эти светодиоды последовательно гасить? Давайте добавим еще один цикл в наш код, только теперь в теле цикла мы будем не подавать высокий потенциал на выход, а наоборот, снимать его. Исправляем HIGH на LOW, снова компилируем код и загружаем его..

Выпуск 6. Условные операторы и циклы. Основы Arduino для начинающих Arduino, Начинающий, Цикл, Условия, Программирование, Урок, Видео, Длиннопост

После загрузки наши светодиоды будут постоянно включаться и выключаться, что выглядит гораздо интереснее :) Код примера, а так же схему подключения, вы найдете здесь - это ссылка на проект в симуляторе circuits, в нем можно сразу же посмотреть на работу кода.


В качестве домашнего задания попробуйте настроить циклы таким образом, что бы светодиоды загорались не со 2-го по 11-й, а, наоборот, с 11-го по 2-й. Подумайте, как можно включать светодиоды не подряд, а через один, или через два, а так же запускать работу кода по нажатию кнопки, как мы это делали в прошлом видео. Обязательно напишите о своих успехах и возникших вопросах в комментарии.


Ну а на этом я прощаюсь с вами до следующего выпуска, в котором мы поговорим о логических операциях и их применении. Надеюсь, что сегодня вы узнали для себя что-то новое, спасибо, что дочитали до конца, успехов и добра вам! :)

Показать полностью 14

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino

Всем привет!  :)


Очередной выпуск из серии Arduino для начинающих, в котором мы впервые познакомимся со структурой программ на Arduino, а так же разберем пару примеров по работе со светодиодом и кнопкой и их подключением.


Предыдущие выпуски вы найдете здесь: 0,1,2,3,4

Прежде чем начать работу с программами, еще раз напомню, зачем они нужны. Любая программа для микроконтроллера представляет собой набор определенных команд, которые этот микроконтроллер и будет выполнять. А специальным средством для общения человека с микроконтроллером являются языки программирования. На сегодняшний день их существует огромное количество, и каждый из них является отдельным инструментом со своими отличительными особенностями. Стоит отметить, что эти языки делятся по так называемым уровням. Уровень языка показывает, насколько язык близок к естественной для человека записи. Немного позднее я поясню эту разницу.


Ну а сейчас давайте запустим среду Arduino IDE и откроем пример BareMinimum (Файл - Примеры - Basic). Он представляет собой некоторый шаблон для написания программ.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Открыв его, мы с вами видим две записи, void setup и void loop – это так называемые функции, первая выполняется единоразово, при подаче питания на Arduino, а вторая выполняется циклически до тех пор, пока присутствует питание микроконтроллера. В функцию setup записываются различные настройки микроконтроллера для дальнейшей работы - например, это может быть конфигурация портов ввода/вывода, о которых мы говорили ранее, либо инициализация подключенного вами дисплея или датчика. Главное, что нужно запомнить, с этой функции начинается работа микроконтроллера и все, что в ней написано, выполняется только один раз.

Чего не скажешь о функции loop – эта функция выполняется сразу же после функции setup, и после этого микроконтроллер постоянно работает в ней.


Перед тем, как разобрать работу функций на конкретном примере, я хочу показать вам разницу в уровнях языка программирования, о которой говорил ранее.


Выше вы видели программный код на высокоуровневом языке программирования Wiring, который является языком платформы Arduino по умолчанию. Давайте посмотрим, как же подобная структура будет выглядеть на языках более низкого уровня.


Смотрите, в какую запись превратилась наша программа, когда мы опустились до уровня языка программирования Си. Вы можете заметить добавление некоторых деталей и новых строчек кода, которые скрываются за простыми двумя функциями в случае языка Wiring.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

А вот еще более низкоуровневый язык программирования Ассемблер, на нем запись нашего шаблона выглядела бы примерно так. Этот язык, можно сказать, позволяет общаться с микроконтроллером «на ты», и контролировать каждый шаг его работы.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Именно поэтому, работая с более простым, высокоуровневым языком Wiring, вы должны всегда иметь ввиду, что за простой записью скрывается несколько строк, так сказать, универсального кода, за который приходится платить бОльшими размерами готовой программы и отсутствием тонкой настройки работы микроконтроллера.


А теперь настало время запустить пример из прошлого выпуска, на котором мы остановились – это пример мигания светодиодом под названием Blink.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Итак, прежде чем разбирать этот код, давайте подумаем, каким образом мы можем заставить наш микроконтроллер мигать светодиодом с нужной нам частотой?

Составим для себя некоторый, обобщенный алгоритм, по которому должна работать программа.


Что мы имеем? Микроконтроллер с портами ввода/вывода, к одному из которых подключен светодиод.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Нужно запомнить, что каждый вывод микроконтроллера может настраиваться как на вход, то есть прием сигнала, так и на выход, то есть подачу сигнала на этот вывод. В нашем случае необходимо зажигать светодиод, то есть подавать на него сигнал, поэтому, первым делом, мы должны указать микроконтроллеру, что один из его выводов должен работать как выход.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

В нашем случае, на плате Arduino уже есть подключенный светодиод к 13-му пину (pin – вывод микроконтроллера). Поэтому, настроив 13-й пин как выход, можно посылать команды на подачу высокого и низкого уровня на этот пин, тем самым зажигая и гася светодиод. Укажем подачу высокого уровня на 13-й пин в нашем алгоритме.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Раз у нас стоит задача мигать светодиодом, то необходимо сделать некоторую задержку перед его выключением и включением, поэтому, после подачи высокого уровня, мы добавляем в наш алгоритм блок задержки на, допустим, 1 секунду.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

После чего посылаем на 13-й пин сигнал низкого уровня, то есть гасим светодиод, и снова делаем задержку. Далее, нам нужно повторять это действие бесконечно, поэтому направим стрелку обратно к тому месту, где мы подавали высокий уровень. Ну что ж, с точки зрения алгоритма теперь все должно работать, давайте перенесем это на язык программного кода.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

В первом блоке мы указали настройку 13-го пина как выхода, посмотрим на наш код - строчка pinMode(LED_BUILTIN, OUTPUT); как раз и отвечает за эту настройку.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Функция pinMode специально реализована для того, что бы указывать в ней какой пин мы хотим настроить, и в какой режим. В данном случае указано, что мы настраиваем константу LED_BUILTIN как выход, то есть - OUTPUT. За константой LED_BUILTIN как раз и скрывается наша цифра 13, то есть номер пина, к которому подключен светодиод, поэтому, заменив эту запись на цифру 13, ничего не изменится, просто разработчики сделали это для упрощения понимания кода начинающими. Итак, повторим, функцией pinMode мы можем настроить нужный нам пин на вход – INPUT или выход – OUTPUT, указав при этом номер пина. Эта команда не зря записана в первую функцию Setup, поскольку настройку пинов микроконтроллера нужно осуществлять всего один раз, при старте программы.


Также я прошу обратить ваше внимание на синтаксис языка программирования, то есть правила написания команд и комментариев. Это схоже с правилами в русском языке, где, например, после каждого предложения необходимо ставить точку. У языка Wiring после каждой команды, не имеющей своих фигурных скобок, необходимо ставить точку с запятой - ; Иначе строчки, подобно предложениям, сольются в одну, и компилятор выдаст вам синтаксическую ошибку.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Так же, как вы могли заметить, кроме команд для микроконтроллера, существуют некоторые серые пометки для самого программиста – они называются комментариями.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Что бы добавить комментарий к какой-либо, одной строке, необходимо поставить двойной слеш и затем писать все необходимое. Такой комментарий может размещаться только на одной строке, и двойной слеш не будет действовать на следующие. Если же вам необходимо добавить комментарий в несколько строк, как это сделал автор примера blink в самом начале, то сперва ставится один слеш, за ним звездочка, дальше ваш комментарий любой длины, а затем, что бы обозначить конец комментария, ставятся звездочка и слеш.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Комментарии могут быть полезными для пояснения другим людям или самому себе каких-либо фрагментов кода, способных вызвать затруднения в будущем. Так же, с помощью комментариев, можно выключать определенные фрагменты кода, которые пока не должны учитываться компилятором. Для компилятора, все то, что вы укажете в комментариях, становится просто невидимым.


Итак, идем дальше - функция loop, задача которой бесконечно повторять код, написанный внутри нее.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Границы функции определяются фигурными скобками, где, после записи функции, сперва идет открывающая скобка, а после всех необходимых команд – закрывающая. Вы должны всегда внимательно следить за этими скобками, поскольку зачастую в одной функции у вас будут другие команды, имеющие свои фигурные скобки, и запутаться в их расположении будет очень легко. Подробно об этом мы поговорим в одном из следующих выпусков.

Ну а пока посмотрим, что внутри нашей функции - я думаю, вы уже заметили аналогию написанных команд с нашим алгоритмом.


В алгоритме мы указали необходимость подачи на наш 13-й пин сигнала высокого уровня, посмотрим на код – так и есть, функция digitalWrite как раз и делает это. В ее скобках мы опять же указываем номер пина и уровень сигнала, низкий – LOW или высокий – HIGH, так же, аналогом низкого либо высокого уровня являются цифры 0 и 1 соответственно.


Далее нам необходимо осуществить задержку – для таких простых случаев можно прописать её обычной функцией Delay, где в скобках указывается количество миллисекунд. Запись delay(1000); означает задержку работы микроконтроллера на одну секунду. Стоит заметить, что использование в своих проектах функции delay крайне не желательно, поскольку эта функция полностью останавливает работу микроконтроллера, не позволяя выполнять каких-либо других задач. О том, как реализовать более правильный вариант задержки мы поговорим в следующих выпусках, ну а пока, на этапе первого знакомства с программой и простоты поставленной задачи, нам подойдет и такая, упрощенная реализация.


Надеюсь, что вы уже догадываетесь о назначении следующей команды нашей программы. Всё верно - на сей раз, эта команда гасит наш светодиод, подавая на 13-й пин сигнал низкого уровня. Кстати, об уровнях – высокий уровень сигнала в нашем случае равен 5 вольтам, а низкий, соответственно, нулю.


После того, как светодиод погас, программа снова замирает на одну секунду и, дойдя до конца содержимого функции, или, как еще говорят – тела функции, переходит вновь на верхнюю строчку, зажигая наш светодиод повторно. Весь этот процесс будет продолжаться до тех пор, пока мы будем подавать напряжение на микроконтроллер.


Ну что же, думаю, с этим примером всё понятно, и настало время немножко усложнить нашу задачу, а именно – добавить к нашему светодиоду небольшую кнопку, при нажатии на которую светодиод начнет мигать.


Давайте модернизируем наш алгоритм, и добавим в него необходимые блоки.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Наша кнопка умеет замыкать и размыкать какую-либо линию, а это значит, что с ее помощью мы можем либо подавать напряжение на порт, либо снимать его.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

По аналогии со светодиодом, один из пинов нашей Arduino нужно настроить на прием сигнала, и, считывая состояние этого пина, делать вывод о том, нажата кнопка или нет. Поэтому в функции настройки микроконтроллера мы прописываем команду pinMode(pin, INPUT); где вместо pin необходимо указать номер пина, к которому подключена кнопка - в моем случае это 3-й пин.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Итак, пины для светодиода и кнопки настроены, теперь необходимо указать условие, при котором наш светодиод должен мигать. А мигать он должен при появлении на 3-м пине положительного сигнала, подаваемого кнопкой. Поэтому, сперва мы считываем состояние этого пина, и затем, если оно равно единице или высокому уровню, выполняем тело условия, в котором прописано мигание нашим светодиодом.


В коде тем временем добавляется новая запись, представляющая собой условный оператор if, что в переводе означает «если».

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

После написания оператора if в скобках указывается условие, при истинности которого будет выполняться тело оператора, которое ограничивается уже знакомыми нам фигурными скобками. В нашем случае в условии мы должны проверить, равно ли считанное с 3-го пина значение единице или нет, поэтому в скобках мы указываем такую запись: digitalRead(3) == 1. Функция digitalRead, по последнему слову в наименовании, означает чтение – read, и при ее выполнении возвращает результат в виде единицы или нуля – в зависимости от состояния пина, указанного в скобках. Таким образом, мы получили проверку условия: «равен-ли 3-й пин единице?», и, если равен, выполнить указанные действия в фигурных скобках. Дословно это можно читать так: «если считанное значение с пина 3 равно одному, выполнить команды в скобках». Более подробно об условных операторах и циклах мы поговорим в следующем выпуске, ну а пока, чтобы не перегружать вас информацией, остановимся на таком простом варианте.


На всякий случай я оставил подробные комментарии к каждой строке программного кода, файл которого вы найдете здесь.


Ну что же, кажется наш код готов к загрузке, но мы с вами не учли еще один нюанс – он касается подключения кнопок к микроконтроллеру. Все дело в том, что пины Arduino, или выводы микроконтроллера, когда мы считываем с них значение, реагируют на малейшие изменения электромагнитной обстановки окружающей среды, и, оставляя их незащищенными, мы рискуем получить ложные срабатывания нашего условия, что приведет к ошибочным включениям светодиода. Я могу просто касаться пальцем 3-го пина, а микроконтроллер зафиксирует это как подачу высокого потенциала на свой вход и разрешит мигать светодиоду.


Чтобы не было таких неприятных ситуаций, нам необходимо, когда кнопка выключена, постоянно и уверенно подавать на вход микроконтроллера отрицательный потенциал, который не будет давать различным наводкам обмануть наш микроконтроллер. И, в качестве такой защиты при подключении кнопок, используют подтягивающие резисторы на 10-20кОм.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Подтягивающим резистором называется такой резистор, который, при выключенной кнопке, как-бы подтягивает наш вывод к земле, не давая образоваться лишним сигналам на входе микроконтроллера, но при этом, за счет своего большого сопротивления, при нажатии кнопки, свободно разрешает управляющему сигналу попасть на этот вход. Я постарался упрощенно изобразить это на двух картинках – при нажатой, и при отпущенной кнопке.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост
Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

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

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Такие резисторы, кстати, встроены внутрь самого микроконтроллера Atmega и их легко можно включить в программе – достаточно дописать в функции настройки команду digitalWrite(pin, HIGH); которая подключит к нашему входу подтягивающий к плюсу питания внутренний резистор на 20кОм. В таком случае внешний резистор нам не понадобится, но и в коде необходимо будет заменить условие срабатывания с единицы на ноль.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Еще одним нюансом подключения кнопок является их дребезг, то есть незаметная и очень быстрая коммутация кнопки несколько раз за момент нажатия, из-за механических свойств её контактов.

Выпуск 5. Первая программа - работаем со светодиодом и кнопкой. Основы программирования Arduino Arduino, Начинающий, Программа, Микроконтроллеры, Видео, Длиннопост

Но, об этом мы поговорим в следующих выпусках, так как в нашем примере это не является критичным моментом.


Ну что же, теперь, осуществив подключение по схеме, мы готовы загрузить наш код в микроконтроллер и проверить правильность его работы. Нажимаем кнопку «Загрузить» и ждем, пока наш код пройдет компиляцию и загрузится в микроконтроллер.

Загрузив код вы увидите, что светодиод не мигает сразу же, как это было раньше, так как микроконтроллер ждет, когда мы нажмем на кнопку и подадим на 3-й пин сигнал высокого уровня. Если сделать это, то при нажатии на кнопку светодиод начинает мигать с частотой один раз в две секунды. Мы можем изменить значение частоты на любое другое, просто поменяв число, указанное в скобках функции delay();


В качестве домашнего задания попробуйте настроить программу и схему подключения на срабатывание от минусового полюса питания, а так же самостоятельно подключить светодиод к любому другому пину, только не забудьте про токоограничивающий резистор, о назначении которого я рассказывал в первом выпуске.


Ну а на этом, пожалуй, всё, в конце я хотел бы пригласить всех желающих в наше скромное сообщество ВКонтакте, где периодически выходит рубрика «Nano за 60 минут» и мы разыгрываем в течение часа бесплатную Arduino Nano. Не забывайте делиться своим мнением о выходящих выпусках и пишите свои вопросы, всем большое спасибо за внимание и до встречи в новом выпуске!

Показать полностью 24

Выпуск 4, господа :) Arduino IDE - установка, настройка и интерфейс. Проверка соединения с платой Arduino.

Привет начинающим ардуинщикам!)


Это четвертое видео-статья из серии "основы Arduino для начинающих" и с этого момента мы наконец-то переходим от теории к практике использования Arduino. Сегодня мы установим необходимые компоненты для работы с платформой, а так же впервые взглянем на программную среду Arduino IDE и попробуем с ее помощью загрузить тестовую программу в микроконтроллер.

Для начала работы с Arduino нам нужно установить на свой компьютер непосредственно среду разработки Arduino IDE, в которой мы и будем писать программы. Переходим на сайт Arduino и скачиваем свежую версию Arduino IDE, сейчас это версия 1.6.12.

После скачивания открываем файл установки и следуем стандартным инструкциям, в принципе тут не должно возникнуть каких-либо трудностей. Единственное, практически в конце установки необходимо согласиться с установкой USB-драйверов.


Как только среда установится, пробуем ее запустить, если этого не происходит, то, вероятно, на вашем компьютере некорректно установлена Java Runtime Environment и вам необходимо вновь запустить файл установки Arduino IDE, который исправит ошибки, либо скачать Java с официального сайта.


Следующий шаг необходимо проделать тем, у кого оказалась плата Arduino более старой версии, использующая для связи микроконтроллера с компьютером не Atmega16u2, а чип CH341, он выглядит следующим образом.

Выпуск 4, господа :) Arduino IDE - установка, настройка и интерфейс. Проверка соединения с платой Arduino. Arduino, Начинающий, IDE, Настройки, Интерфейс, Видео, Длиннопост

В этом случае необходимо установить драйвер CH340G для работы с этим чипом.


Итак, кажется, все готово, что бы начать работу с Arduino. Давайте сперва познакомимся со средой Arduino IDE. Эта программа позволяет компьютеру взаимодействовать с Arduino как для передачи данных, так и для прошивки кода в микроконтроллер.


Интерфейс среды содержит следующие основные элементы: текстовый редактор для написания кода [1], область для вывода сообщений [2], текстовая консоль [3], панель инструментов с традиционными кнопками [4] и главное меню [5].

Выпуск 4, господа :) Arduino IDE - установка, настройка и интерфейс. Проверка соединения с платой Arduino. Arduino, Начинающий, IDE, Настройки, Интерфейс, Видео, Длиннопост

Разберем их всех по порядку.

Программы, создаваемые в среде разработки Arduino, иногда еще называют скетчами. Скетчи пишутся в текстовом редакторе и сохраняются в файлах с расширением .ino. Встроенный текстовый редактор имеет стандартные инструменты копирования, вставки, поиска, замены текста и т.д.


Область сообщений в окне программы является, своего рода, обратной связью для пользователя и информирует его о событиях (в том числе и об ошибках), возникающих в процессе записи или экспорта написанного кода.


Консоль отображает в виде текста поток выходных данных среды Ардуино, указывает на размер созданного нами файла, выводит сообщения об ошибках и прочую генерируемую ею информацию.


В нижнем правом углу окна программы показывается модель текущей платы и последовательный порт, к которому она подключена. Немного позже мы посмотрим, как это настраивать.

Выпуск 4, господа :) Arduino IDE - установка, настройка и интерфейс. Проверка соединения с платой Arduino. Arduino, Начинающий, IDE, Настройки, Интерфейс, Видео, Длиннопост

Первая кнопка на панели инструментов предназначена для проверки написанного нами кода на предмет различных ошибок, вторая, так же производит проверку кода, но с последующей загрузкой этого кода в микроконтроллер. Следующими идут стандартные кнопки создания, открытия и сохранения проекта. Отдельная кнопка, расположенная справа и имеющая иконку лупы, запускает программу SerialMonitor, работу с которой мы разберем в одном из следующих выпусков.

Выпуск 4, господа :) Arduino IDE - установка, настройка и интерфейс. Проверка соединения с платой Arduino. Arduino, Начинающий, IDE, Настройки, Интерфейс, Видео, Длиннопост

Теперь кратко пройдемся по главному меню. Вкладка Файл имеет стандартные пункты меню и здесь особо интересным для нас является пункт «Примеры», содержащий в себе различные примеры проектов для Arduino. Давайте сразу же перейдем в пункт Basics и выберем пример Blink, который представляет собой простую программу мигания стандартным светодиодом на плате Arduino. Немного позднее мы загрузим этот код в микроконтроллер.

Выпуск 4, господа :) Arduino IDE - установка, настройка и интерфейс. Проверка соединения с платой Arduino. Arduino, Начинающий, IDE, Настройки, Интерфейс, Видео, Длиннопост

Вкладка «Правка» является стандартной, поэтому не будем на ней останавливаться и перейдем к вкладке «Скетч». В ней уже есть знакомые нам команды загрузки и проверки, а так же имеется возможность просмотра папки скетча, то есть его месторасположения на вашем компьютере и подключения различных библиотек, представляющих собой файлы для упрощенной работы с какими-либо датчиками, модулями и прочими компонентами. Более подробно о библиотеках мы поговорим в одном из следующих выпусков.

Выпуск 4, господа :) Arduino IDE - установка, настройка и интерфейс. Проверка соединения с платой Arduino. Arduino, Начинающий, IDE, Настройки, Интерфейс, Видео, Длиннопост

«Инструменты» - в этой вкладке нас сейчас интересуют пункты выбора платы и порта подключения. При нажатии на первый, перед нами открывается список плат, поддерживаемых средой разработки, который, кстати, можно дополнять самостоятельно. Выберем в зависимости от подключаемой вами платы соответствующее наименование в этом списке. В моем случае это Arduino Uno.

Выпуск 4, господа :) Arduino IDE - установка, настройка и интерфейс. Проверка соединения с платой Arduino. Arduino, Начинающий, IDE, Настройки, Интерфейс, Видео, Длиннопост

Теперь снова откроем вкладку «Инструменты» и перейдем к пункту «Порт», как видите, он сейчас неактивен, потому что мы еще не подключили плату Arduino к компьютеру. Давайте сделаем это.


При подключении Arduino загорится светодиод питания платы и, если производитель тестировал плату, запустится программа мигания светодиодом. Теперь, при удачном подключении, пункт «Порт» должен стать активным и у нас появится возможность выбрать COM-порт компьютера, к которому подключена плата.

Выпуск 4, господа :) Arduino IDE - установка, настройка и интерфейс. Проверка соединения с платой Arduino. Arduino, Начинающий, IDE, Настройки, Интерфейс, Видео, Длиннопост

Бывают такие случаи, когда в писке появляется несколько COM-портов и понять к какому именно порту подключена Arduino достаточно сложно. Определить нужный COM-порт поможет диспетчер устройств, в котором необходимо выбрать пункт «Порты (COM и LPT)» и найти нашу Arduino, в скобках будет указан COM-порт который мы и выберем в среде разработки.

Выпуск 4, господа :) Arduino IDE - установка, настройка и интерфейс. Проверка соединения с платой Arduino. Arduino, Начинающий, IDE, Настройки, Интерфейс, Видео, Длиннопост

Если так получилось, что плата Arduino не определяется в диспетчере устройств или вместо Arduino Uno у вас появляется Atmega16u2, то прошу перейти по этой ссылке, где содержится информация по устранению этой проблемы.


Ну что же, кажется все готово, чтобы произвести первую тестовую загрузку нашего примера в микроконтроллер. Перед загрузкой убедитесь, что вы выбрали правильное название платы и COM-порт, если вдруг COM-порт окажется ошибочным, то Arduino сообщит вам об этом и предложит выбрать другой.


Давайте теперь нажмем на кнопку «Загрузка» и посмотрим, что будет происходить. Строка сообщений уведомляет нас о начале компиляции, то есть переводе нашей программы на язык, понятный микроконтроллеру и затем происходит загрузка этого кода на плату Arduino.

Выпуск 4, господа :) Arduino IDE - установка, настройка и интерфейс. Проверка соединения с платой Arduino. Arduino, Начинающий, IDE, Настройки, Интерфейс, Видео, Длиннопост

Помните, в прошлом выпуске мы говорили о линиях Rx и Tx? Как раз сейчас они активно используются и судить об этом можно по очень быстрому миганию соответствующих светодиодов. Как только программа загрузится, наш светодиод должен начать мигать с задержкой в одну секунду. Это и будет свидетельством того, что у нас с вами все готово для дальнейшей работы с платой и создания новых проектов.


Кстати, в качестве домашнего задания, попробуйте найти в программном коде места, отвечающие за задержку включения и выключения светодиода каждую секунду или тысячу миллисекунд, поменяйте эти значения на какие-нибудь другие и посмотрите, что из этого получится. Следующий выпуск мы как раз начнем с подробного анализа этой программы и дополнительно поработаем с кнопкой. Если вы еще не заказали необходимые компоненты, то самое время это сделать самостоятельно, либо из моей небольшой подборки.


Ну а на этом все, не бойтесь экспериментировать, всем добра и до встречи в новом выпуске! :)

Показать полностью 10
Отличная работа, все прочитано!