Arduino и ЧПУ на Portal-PK.ru http://portal-pk.ru/ Arduino проекты, уроки, а также самоделки и самодельные ЧПУ станки на Portal-PK.ru ru 6 частых ошибок начинающих предпринимателей, и способы их избежать http://portal-pk.ru/news/268-6-chastyh-oshibok-nachinayushchih-predprinimatelei-i-sposoby.html Константин Portal-PK 2020-09-16T07:38:59+03:00

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


1.Использование чужой интеллектуальной собственности

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

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


2. Переоценка собственных возможностей

Предприниматели, даже начинающие, как правило, много знают и еще больше умеют. Они часто думают: «В этом нет ничего сложного, я, наверняка, сам смогу…». В четырех случаях из пяти это оказывается правдой. Но когда вы запускаете собственный бизнес, повторяйте, как мантру следующие слова: «Я не могу делать все, и не должен/не должна этого делать». Ваше время и энергия должны быть посвящены задачам, которые можете выполнять только вы как владелец бизнеса.

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


3. Упущение момента

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

Как избежать? Дайте себе время принять решение, но установите жесткие рамки. Например, два дня или одну неделю. А затем смело принимайте одну из сторон, - в конце концов, решитесь купить офис в Рязани (регион приведен в качестве примера) - и открывайтесь.



4. Работать non-stop

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

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


5. Сокращение неоправданных затрат

Какие статьи расходов сокращают предприниматели в первую очередь в кризис? Рекламу? Юридический отдел? В регионах многие компании оставили сотрудников на удалёнке. Но будьте осторожны, урезая бюджеты. Независимо от того, сколько денег это поможет сэкономить вам прямо сейчас, в конечном итоге вы можете заплатить намного больше. Если бизнес только развивается, вам более чем нужны и маркетологи, и юристы, не говоря уже о самом насущном вопросе - аренде офиса в Рязани (город опять же упомянут в качестве примера) или в другом актуальном для вас регионе.

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


6. Стремление быть всем для всех

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

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

]]>
Резистор http://portal-pk.ru/news/267-rezistor.html Константин Portal-PK 2020-07-26T15:28:54+03:00 Резистор — искусственное «препятствие» для тока. Сопротивление в чистом виде. Резистор ограничивает силу тока, переводя часть электроэнергии в тепло. Сегодня невозможно изготовить ни одно, сколько-нибудь функционального, электронного устройства без резисторов. Они используются везде: от компьютеров, до небольших проектов на Arduino.

Резистор — искусственное «препятствие» для тока. Сопротивление в чистом виде.

Сопротивление резистора — его основная характеристика. Основной единицей электрического сопротивления является Ом. На практике используются также производные единицы — килоом (кОм), мегаом (МОм), гигаом (ГОм), которые связаны с основной единицей следующими соотношениями:

1 кОм = 1000 Ом,
1 МОм = 1000 кОм,
1 ГОм = 1000 Мом

Купить набор резисторов для проектов на Arduino можно тут.

Ниже на рисунке видна маркировка резисторов на схемах:

Ниже на рисунке видна маркировка резисторов на схемах:

Наклонные линии обозначают мощность резистора до 1 Вт. Вертикальные линии и знаки V и X (римские цифры), указывают на мощность резистора в несколько Ватт, в соответствии со значением римской цифры.

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

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


Последовательное соединение резисторов.

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

Rобщ = R1 + R2

Это справедливо и для большего количества соединённых последовательно резисторов:

Rобщ = R1 + R2 + R3 + … + Rn

Цепь из последовательно соединённых резисторов будет всегда иметь сопротивление большее, чем у любого резистора из этой цепи.

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

Мощность при последовательном соединении.

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

R = 200 + 100 + 51 + 39 = 390 Ом

Мощность при последовательном соединении

Учитывая напряжение в цепи, равное 100 В, по закону Ома сила тока будет составлять

I = U/R = 100 В/390 Ом = 0,256 A

На основании полученных данных можно рассчитать мощность резисторов при последовательном соединении по следующей формуле:

P = I2 x R = 0,2562 x 390 = 25,55 Вт

Таким же образом можно рассчитать мощность каждого отдельно взятого резистора:

P1 = I2 x R1 = 0,2562 x 200 = 13,11 Вт;
P2 = I2 x R2 = 0,2562 x 100 = 6,55
Вт;
P3 = I2 x R3 = 0,2562 x 51 = 3,34
Вт;
P4 = I2 x R4 = 0,2562 x 39 = 2,55
Вт
.

Если сложить полученные мощности, то общая Р составит:

Робщ = 13,11 + 6,55 + 3,34 + 2,55 = 25,55 Вт

Параллельное соединение резисторов.


Параллельное соединение резисторов

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

Расчет параллельного сопротивления двух параллельно соединённых резисторов R1 и R2 производится по следующей формуле:

Rобщ = (R1 × R2) / (R1 + R2)

Параллельное соединение трёх и более резисторов требует более сложной формулы для вычисления общего сопротивления:

1 / Rобщ = 1 / R1 + 1 / R2 + … + 1 / Rn

Сопротивление параллельно соединённых резисторов будет всегда меньше, чем у любого из этих резисторов.

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

Мощность при параллельном соединении.

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

1/R = 1/200 + 1/100 + 1/51 + 1/39 ≈ 0,06024 Ом
R = 1 / 0,06024 ≈ 16,6 Ом

Мощность при параллельном соединении

Используя значение напряжения 100 В, по закону Ома рассчитывается сила тока

I = U/R = 100 В x 0,06024 Ом = 6,024 A

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

P = I2 x R = 6,0242 x 16,6 = 602,3 Вт

Расчет силы тока для каждого резистора выполняется по формулам:

I1 = U/R1 = 100/200 = 0,5 A;
I2 = U/R2 = 100/100 = 1 A;
I3 = U/R3 = 100/51 = 1,96 A;
I4 = U/R4 = 100/39 = 2,56 A

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

Существует еще одна формула, позволяющая рассчитать мощность при параллельном подключении резисторов:

P1 = U2/R1 = 1002/200 = 50 Вт;
P2 = U2/R2 = 1002/100 = 100 Вт;
P3 = U22/R3 = 1002/51 = 195,9 Вт;
P4 = U22/R4 = 1002/39 = 256,4 Вт

Если сложить полученные мощности, то общая Р составит:

Робщ = 50 + 100 + 195,9 + 256,4 = 602,3 Вт

Цветовая маркировка резисторов.

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

Цветовая маркировка резисторов

Все полученные знания в данной статье необходимы при изучении уроков на Arduino. А также при созданиипроектов на Arduino, ESP8266, ESP32 и прочих микроконтроллерах.

Если же вы увлекаетесь ЧПУ станками, данные знания тоже будет не лишними.

Понравилась статья? Не забудь поделиться с друзьями в соц. сетях. А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

До встречи в следующем уроке. Спасибо за внимание!

Технологии начинаются с простого!

]]>
Лазерный станок с ЧПУ с АлиЭкспресс http://portal-pk.ru/news/266-lazernyi-stanok-s-chpu-s-aliekspress.html Константин Portal-PK 2020-07-19T08:56:35+03:00 Мое увлечение ЧПУ станками началось больше 3 лет. Все это время я собирал самодельные ЧПУ станки. Сегодня я буду собирать заводской лазерный станок с ЧПУ, купленный на АлиЭкспресс. У вас, наверное, возник вопрос что случилось? Почему заводской, а не самодельный станок с ЧПУ?

Все просто: сочетание прагматичности, логики и немного лени.

Более подробное описание смотрите на моем втором сайте X-TEX.

Дело обстояло так. Попался на сайте АлиЭкспресс автономный лазерно-гравировальный ЧПУ станок с рамой из алюминиевых профилей.

Дело обстояло так. Попался на сайте АлиЭкспресс автономный лазерно-гравировальный ЧПУ станок с рамой из алюминиевых профилей. Посчитал, если покупать все комплектующие, то стоимость будет не многим меньше. А времени потрачу на сборку достаточно много.Вы считает, что собрать такую раму не сложно? Но спешу вас огорчить. Кроме того чтобы нарезать профиль нужно еще сделать резьбу. Также нужен чертёж всех деталей, которые сделаны из акрила. А затем это все вырезать. Но тут тоже нужен подходящий материал. Я заказывал станок в начале карантина. А в начале купить комплектующие для сборки самодельного ЧПУ станка было проблематично. Это было еще одним фактором, который повлиял на покупку заводского станка.

Сборка Лазерного станка с ЧПУ с АлиЭкспресс.

Сборку произвожу по инструкции, которая идет в комплекте со станком. Кстати, инструкцию перевел и немного доработал:Инструкция по сборке лазерно-гравировального станка CNC2-6550.

Сборку произвожу по инструкции

Собираем раму.

Собираем раму.Собираем каретки станка.

Собираем каретки станка.

Ставлю все на место.

Ставлю все на место.

Натягиваем ремни.

Натягиваем ремни.

Подключаем двигателя и пульт управления к плате управления.

Подключаем двигателя и пульт управления к плате управления.

Можно запускать.

Запуск Лазерного станка с ЧПУ с АлиЭкспресс.

Благодаря пульту управления станком можно управлять и без компьютера. В комплекте идет карта памяти, которая устанавливается в пульт станка с ЧПУ.

Благодаря пульту управления станком можно управлять и без компьютера

Центральная кнопка пульта включает лазер для настройки и определения положения заготовки.

Возможности пульта управления Лазерного станка с ЧПУ с АлиЭкспресс.

  • Перемещение по осям.
  • Включение и выключение лазера при нажатии кнопки.
  • Выбор файла с карты памяти и автономная работа.


Минусом пульта является невозможность перехода из перемещения осями в выбор файла.

Минусом пульта является невозможность перехода из перемещения осями в выбор файла.

Пример гравирования на Лазерном станке с ЧПУ.

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

Пример гравирования на Лазерном станке с ЧПУ.

Но для проверки работоспособности достаточно.

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

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

И всем пока-пока.

До встречи в новом проекте.

]]>
Что такое макетная плата и как ей пользоваться? http://portal-pk.ru/news/265-chto-takoe-maketnaya-plata-i-kak-ei-polzovatsya.html Константин Portal-PK 2020-07-13T19:25:05+03:00 Для чего нужна макетная плата?

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

Прототип — это работающая модель устройства. Именно для прототипированя нам и понадобится макетная плата.

Прототип — это работающая модель устройства. Именно для прототипированя нам и понадобится макетная плата.

Беспаечные макетные платы (breadboard).

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

Беспаечные макетные платы (breadboard).

На рисунке ниже показан breadboard, на котором снято основание на нижней части. Как вы видите, на плате установлены ряды металлических пластин.

На рисунке ниже показан breadboard, на котором снято основание на нижней части. Как вы видите, на плате установлены ряды металлических пластин.

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

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

Обратите внимание, что на одной рельсе пять клипс. Это общепринятый стандарт. Большинство беспаечных макетных плат реализуются именно таким образом. То есть, вы можете подключить до пяти компонентов включительно к отдельной рельсе на breadboard’е и они будут связаны между собой. Но ведь на плате десять отверстий в ряду! Почему мы ограничены пятью контактами? Вы, наверное, обратили внимание, что по центру монтажной платы есть отдельная рельса без пинов? Эта рельса изолирует пластины друг от друга.

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

 светодиод, установленный на беспаечную макетную плату.

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

\Теперь рассмотрим макетные платы.

Эти рельсы аналогичны по исполнению с горизонтальными, но при этом соединены друг с другом по всей длине. При разработке проекта вам часто необходимо питание для многих компонентов. Именно эти рельсы используются для питания. Обычно их отмечают «+» и «-» и двумя разными цветами — красным и голубым. Как правило, рельсы соединяют между собой, чтобы получить одинаковое питание по обеим сторонам макетной платы (смотрите на рисунке ниже). Кстати, нет необходимости подключать плюс именно к рельсе с обозначением «+», это исключительно подсказка, которая поможет вам структурировать ваш проект.

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


Центральная рельса без контактов изолирует две стороны беспаечной монтажной платы. Помимо изоляции, эта рельса выполняет вторую важную функцию. Большинство микросхем (ICs), изготавливаются в стандартных размерах. Для того, чтобы они занимали минимум места на монтажной плате, используется специальный форм-фактор под названием Dual in-line Package, или сокращенно – DIP.

У DIP-микросхем контакты расположены по двум сторонам и отлично садятся на две рельсы по центру макетной платы. Именно в этом случае изоляция контактов – отличный вариант, который позволяет сделать разводку каждого контакта микросхемы на отдельную рельсу с пятью контактами.

На рисунке ниже показана установка двух DIP микросхем. Сверху – LM358, ниже – микроконтроллер ATMega328, который используется во многих платах Arduino.

установка двух DIP микросхем. Сверху – LM358, ниже – микроконтроллер ATMega328

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

Breadboard также не заменив при изучении Arduino.

Breadboard также не заменив при изучении Arduino. В моих уроках устанавливаю на маетную плату Arduino NANO и устанавливаю на макетную плату все необходимые элементы. Затем все соединяю соединительными проводами.


Понравилась статья? Не забудь поделиться с друзьями в соц. сетях. А также подписаться на наш канал на YouTube, вступить в группу Вконтакте, в группу на Facebook.

До встречи в следующем уроке. Спасибо за внимание!

Технологии начинаются с простого!

]]>
Самодельные динамики для монитора с регулировкой громкости. http://portal-pk.ru/news/264-samodelnye-dinamiki-dlya-monitora-s-regulirovkoi.html Константин Portal-PK 2020-07-01T04:00:54+03:00 В период самоизоляции, когда все было достаточно строго, у меня сломались колонки для компьютера. Заказал новые, но доставят через неделю, работать надо сейчас. Решил сделать себе самодельные динамики для монитора. Благо все комплектующие были в наличии.

Если у вас все в порядке с компьютерными колонками но, нужен сервер, дедик или VPS. Купить сервер, дедик, VPS можно на сайте vpserver.pro.

Что понадобилось для создания самодельных колонок для монитора.

В наличии были 2 усилителя PAM8403 DC 5v 2 канала. Один с регулятором громкости, второй пассивный. Использовать решил плату с регулировкой громкости, постоянно регулировать громкость на компьютере неудобно.

2 усилителя PAM8403 DC 5v 2

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

Питание подавать через USB провод

Динами взял от старого нерабочего ноутбука. Я их часто использую в своих проектах со звуком, например при создании MP3-плеера на DFPlayer Mini и Arduino.

Для сборки понадобится клеевой пистолет, паяльник.

К сборке все готово, можно приступать к работе.

Сборка самодельных колонок для монитора.

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

Сборка самодельных колонок для монитора.

Собирал все по схеме.

Собирал все по схеме.

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

Все работает! Звук регулируется, но конечно желает лучшего. Но на несколько дней работы достаточно.

Установка динамиков на монитор.

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

Установка динамиков на монитор.

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

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

Мое мнение об усилители PAM8403.

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

Мое мнение об усилители PAM8403.

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

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

И всем пока-пока.

До встречи в новом проекте.

]]>
Изучаем Arduino без Arduino c помощью Tinkercad и его сервиса Схемы. http://portal-pk.ru/news/263-izuchaem-arduino-bez-arduino-c-pomoshchyu-tinkercad-i-ego-servisov.html Константин Portal-PK 2020-06-04T15:48:14+03:00 С каждым годом робототехника становиться популярнее. Для разработки роботов и простых проектов используется платформа Arduinо, но для изучения данной платформы нужно купить Arduino UNO или NANO, резисторы, светодиоды, соединительные провода, макетную плату, сервоприводы, двигателя, дисплей, реле, датчики и сенсоры. Начальное вложение от 2 т. руб. при покупке минимального Arduino набора на Aliexpress. Если покупать в наших магазинах стоимость может быть в 2-3 раза больше. Стоит ли покупать железки для изучения робототехники? На данный вопрос можно ответить, попробовав свои силы в сборке схем и программировании Arduino в Tinkercadи его сервисе Circuits.

 сборке схем и программировании Arduino в Tinkercad и его сервисе Circuits.

Что такое Tinkercad?

Tinkercad - графический редактор, предназначенный для создания и печати трехмерных моделей.

Tinkercad - графический редактор, предназначенный для создания и печати трехмерных моделей.

Главным преимуществом программы, по сравнению с другими CAD-редакторами, является то, что она представлена в виде онлайн-приложения, и не требует установки на компьютер. Сервисом можно пользоваться прямо в веб-браузере благодаря технологии WebGL, позволяющей отображать трехмерную графику в интернет-обозревателях.

Онлайн-сервис Tinkercad полностью бесплатный, русифицирован, имеет простой интерфейс, понятный даже новичкам, не требует установки дополнительных плагинов и поддерживает работу со всеми основными браузерами (Chrome, Firefox, Opera и другие). CAD-редактор позволяет сохранять готовые проекты на сервере разработчика или на жестком диске компьютера в виде OBJ и STL-файлов, а также обладает возможностью печати моделей.

Tinkercad позиционирует себя как сервис робототехники для начинающих. Изучать схемотехнику и программирование Arduino помогает раздел Схемы.

Tinkercad Arduino

Tinkercad Arduino

Тинкеркад (Tinkercad Circuits Arduino) – бесплатный, удивительно простой и одновременно мощный эмулятор Arduino, с которого можно начинать обучение электронике и робототехнике. Он предоставляет очень удобную среду для написания своих проектов. Не нужно ни чего покупать, ни чего качать — все доступно онлайн. Единственное, что от вас потребуется — зарегистрироваться.

Возможности симулятора Tinkercad для разработчика Arduino.

Возможности симулятора Tinkercad для разработчика Arduino.

  • Онлайн платформа, для работы не нужно ничего кроме браузера и устойчивого интернета.
  • Удобный графический редактор для визуального построения электронных схем.
  • Предустановленный набор моделей большинства популярных электронных компонентов, отсортированный по типам компонентов.
  • Симулятор электронных схем, с помощью которого можно подключить созданное виртуальное устройство к виртуальному источнику питания и проследить, как оно будет работать.
  • Симуляторы датчиков и инструментов внешнего воздействия. Вы можете менять показания датчиков, следя за тем, как на них реагирует система.
  • Встроенный редактор Arduino с монитором порта и возможностью пошаговой отладки.
  • Готовые для развертывания проекты Arduino со схемами и кодом.
  • Визуальный редактор кода Arduino.
  • Возможность интеграции с остальной функциональностью Tinkercad и быстрого создания для вашего устройства корпуса и других конструктивных элементов – отрисованная модель может быть сразу же сброшена на 3D-принтер.
  • Встроенные учебники и огромное сообщество с коллекцией готовых проектов

Начало работы в Tinkercad Arduino.

Начало работы в Tinkercad Arduino.

Найти Tinkercad достаточно просто. Для этого в поисковой системе указываем Тинкеркад. Заходим на сайт с доменом tinkercad.com. Для того, чтобы начать пользоваться сервисом нужно авторизоваться или зарегистрироваться.

авторизоваться или зарегистрироваться

Регистрация в Tinkercad.

Для того, чтобы зарегистрироваться нажимаем кнопку Присоединиться. Регистрация доступна по E-mail или с помощью учтённой записи Google или Apple.

Регистрация в Tinkercad.

При регистрации с использованием E-mail нужно указать вашу страну, дату рождения, свой E-mail и пароль.

При регистрации с использованием E-mail нужно указать вашу страну

При входе с помощью учтённой записи Google или Apple достаточно разрешить использование сервисом Tinkercad данных для авторизации. Но не забывайте, что у вас должен быть создан аккаунт в данной системе и вы должны быть авторизованы.

Создание первой схемы в Circuits.

Создание первой схемы в Circuits.

После авторизации в сервисе вы попадете в раздел 3D-проектирования. Для создания схем нам нужно перейти в раздел Circuits. Чтобы создать электрическую цепь нужно нажать на кнопку Создать цепь.

Для создания схем нам нужно перейти в раздел Circuits.

После чего нам откроется рабочая область в которой:

  • Название проекта;
  • Меню управления;
  • Панель компонентов;
  • Рабочее поле.

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

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

Программирование Arduino в Tinkercad.

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

Программирование Arduinoв Tinkercad.

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

Встроенный светодиодподключен к 13 пину Арудино.

Давайте подключим внешний светодиод. Для этого установим светодиод и резистор на макетную плату. Подключим все по схеме. Встроенный светодиодподключен к 13 пину Арудино. Подключим внешний светодиод к тому же пинуи увидим синхронное мигание встроенного и внешнего светодиода.

Примеры реализации проектов на Arduino.

Для новичков подготовлены несколько готовых схем использования Arduino. Достаточно выбрать схему и вытащить на рабочее поле и начать моделирование.

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

Кроме моделирования данный сервис поможет не сделать ошибки новичку и испортить элементы цепи или спалить Arduino.

Защита от ошибок новичка.

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

Защита от ошибок новичка.

При сборе схем в Tinkercad Circuits вы защищены от основных ошибок новичка. Например, если вы подключите светодиод без резистора, то вы увидите предупреждение о том, что ток превышен, что может привести к быстрому выходу из строя светодиода.

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

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

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

Понравилась статья? Не забудь поделиться с друзьями в соц. сетях. А также подписаться на наш канал на YouTube, вступать в группу Вконтакте, в группу на Facebook.

До встречи в следующем уроке. Спасибо за внимание!

Технологии начинаются с простого!

]]>
Инструкция по сборке лазерного гравировального станка CNC2-6550. http://portal-pk.ru/news/262-instrukciya-po-sborke-lazernogo-gravirovalnogo.html Константин Portal-PK 2020-06-02T07:19:41+03:00

CNC2-6550

Part A: Инструкция по сборке лазерного гравировального станка.

Инструкция по сборке лазерного гравировального станка.

Подключение станка к компьютеру и автономное использование с внешним дисплеем.

Краткая инструкция по использованию программы LaserGRBL.

Видео по сборке и запуску станка будет доступно в ближайшее время!

Купить станок с автономным управлением можно тут CNC2-6550.

CNC 6550 Machine Desktop DIY Big Laser 65x50cm CNC 6550 Machine Desktop DIY Big Laser 65x50cm

Переведено и дополнено проектом Portal-PK. Сайт проекта Portal-PK.ru

Технологии начинаются с простого!

Инструкция по сборке лазерного гравировального станка.

2. Направляющие для портала.

2. Направляющие для портала.

3. Направляющие для портала, и установка двигателя для перемещения по оси Y.


Направляющие для портала, и установка двигателя для перемещения по оси Y.

4. Сборка каретки и установка лазера.

Сборка каретки и установка лазера.

5. Сборка портала лазерного гравировального станка.

Сборка портала лазерного гравировального станка.

6. Установка ножек станка.

 Установка ножек станка.

7. Установка 4-ой ножки станка с платой управления.

Установка 4-ой ножки станка с платой управления.


8.Y-ось: длина ремня: 765 мм x2 шт.

X-ось: длина ремня: 790 мм x1 шт

Y-ось: длина ремня



Подключение станка к компьютеру и автономное использование с внешним дисплеем

Подключение станка к компьютеру и автономное использование с внешним дисплеем.

Управлять станком CNC2-6550 можно через компьютер или с дисплея. В комплекте идет карта памяти на 1 Гб, что позволяет управлять станком без использования ПК.

Купить станок с автономным управлением можно тут CNC2-6550.

CNC 6550 Machine Desktop DIY Big Laser 65x50cm CNC 6550 Machine Desktop DIY Big Laser 65x50cm

Переведено и дополнено проектом Portal-PK. Сайт проекта Portal-PK.ru

Технологии начинаются с простого!

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

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

Если вы работаете без подключения к компьютеру, подключать USB провод не нужно!

CH340SER2. Установка драйвера. Вместе с инструкцией на флешке есть файл CH340SER.exe

Кликаем по нему 2 раза. И устанавливаем.


Кликаем по нему 2 раза. И устанавливаем.


3. Чтобы определить COM-порт вашего станка нужно:

• Windows XP: щелкните правой кнопкой мыши «Мой компьютер», выберите «Свойства», выберите «Диспетчер устройств».

• Windows 7: нажмите «Пуск» -> щелкните правой кнопкой мыши «Компьютер» -> выберите «Диспетчер устройств» -> «Порты (COM и LPT)»

• Вашим устройством будет последовательный порт USB (COMX), где «X» представляет номер COM, например COM5.

• Если имеется несколько последовательных USB-портов, щелкните каждый из них правой кнопкой мыши и проверьте производителя, выбрать нужно «CH340».

Чтобы определить COM-порт вашего станка нужно

4.0. Использование вместе с программой LaserGRBL (есть на USB флешке)

 Использование вместе с программой LaserGRBL

4.1. Используйте USB-кабель для подключения к компьютеру. (Не подключайте при автономной работе!)


Используйте USB-кабель для подключения к компьютеру. (Не подключайте при автономной работе!)

  • Если все удачно подключилось, то вы увидите надпись ” Grbl 1.1f ['$' for help]”.
  • Если выбран неверный порт, то данное сообщение вы не увидите.

4.2. Фокусировка лазера.

Фокусировка лазера.

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

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


4.3. ИМПОРТ РАСТРОВЫХ ИЗОБРАЖЕНИЙ

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

Его можно вызвать из меню "Файл, Открыть файл", выбрав изображение типа jpg, png или bmp.

4.3. ИМПОРТ РАСТРОВЫХ ИЗОБРАЖЕНИЙ

Его можно вызвать из меню "Файл, Открыть файл", выбрав изображение типа jpg, png или bmp.

Растровый импорт позволяет загружать изображение любого вида в LaserGRBL

Обратите внимание: скорость и значение S отличаются для разных материалов.

Обратите внимание: скорость и значение S отличаются для разных материалов.

4.5. Сохраните программу в файл "NC", если вы используете автономный контроллер.


Сохраните программу в файл "NC", если вы используете автономный контроллер.


Автономный контроллер можно использовать в качестве считывателя карт через USB-кабель.

  • Автономный контроллер можно использовать в качестве считывателя карт через USB-кабель.
  • Затем подключите автономный контроллер к плате управления. (Не подключайте USB-кабель к компьютеру)

 Затем подключите автономный контроллер к плате управления. (Не подключайте USB-кабель к компьютеру)

  • Затем. См. ”руководство пользователя автономного контроллера", чтобы начать работу.

ЭКСПЕРТНЫЙ РЕЖИМ

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

1. Режим Постоянной Мощности Лазера М3.(режим по умолчанию)

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

ПРИМЕЧАНИЕ: M3 можно использовать, чтобы держать лазер включенным для фокусировки.

2. Динамический режим мощности лазера M4

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

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

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

Откройте «Режим динамической мощности лазера M4» в программном обеспечении LaserGRBL.

Примечание. Лазер включается только при движении машины.

Режим Постоянной Мощности Лазера М3.

3. Пользовательская кнопка

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

Пользовательская кнопка

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

Существует 3 типа пользовательских кнопок:

  • Button
  • TwoStateButton
  • PushButton

Пользовательская кнопка типа «Button» содержит блок кода GCode, который будет выполнен при нажатии. Это можно использовать для запуска серии инструкций gcode, то есть для трассировки кадра вокруг изображения или установки новой нулевой позиции.

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

«TwoStateButton» содержит два блока GCode. Первое действие выполняется при первом щелчке, затем второе действие выполняется при втором щелчке. Это очень полезно для таких действий, как включение / выключение лазера, чтобы увидеть его положение Включить / выключить лазер.

«TwoStateButton» содержит два блока GCode.«PushButton» похож на «TwoStateButton», но первое действие выполняется при наведении мыши, второе - при нажатии мыши. Пользовательские кнопки поддерживают ряд переменных, которые можно использовать в выражениях. Вот полный набор поддерживаемых переменных:

«PushButton» похож на «TwoStateButton», но первое действие выполняется при наведении мыши

4. Конфигурация по умолчанию


Конфигурация по умолчанию


Видео по сборке и запуску станка будет доступно в ближайшее время!

Купить станок с автономным управлением можно тут CNC2-6550.

CNC 6550 Machine Desktop DIY Big Laser 65x50cm CNC 6550 Machine Desktop DIY Big Laser 65x50cm

Скачать инструкцию в формате PDF можно по ссылке внизу статьи: инструкция для лазерного гравировального станка CNC2-6550 на русском.

Переведено и дополнено проектом Portal-PK. Сайт проекта Portal-PK.ru

Технологии начинаются с простого!

Подписывайтесь на наш Youtube и вступайте в группы в Вконтакте и Facebook.

]]>
Что такое светодиод? Как подключить к Arduino? http://portal-pk.ru/news/261-chto-takoe-svetodiod-kak-podklyuchit-k-arduino.html Константин Portal-PK 2020-05-19T10:53:51+03:00 Для реализации многих проектов на Arduino используются светодиоды. А для изучения Ардуино светодиод является не заменимым инструментом. Для изучения основ Arduino на сайте есть целый блок уроков, который так и называться: Уроки Arduino: Светодиоды, Резисторы, Arduino.

Что такое резистор рассмотрим в следующий раз.

Что же такое светодиод и как он работает?

Светодиод — вид диода, представляет собой полупроводниковый прибор, способный излучать свет при пропускании через него электрического тока в прямом направлении, от анода (+) к катоду (-).

Что же такое светодиод и как он работает?

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

  1. анод (+) светодиода имеет более длинную ножку;
  2. со стороны катода, корпус светодиода немного срезан.

В современной микроэлектронике применяются миниатюрные светодиоды для поверхностного монтажа (SMD). Такие индикаторы, например, имеются на Arduino Uno для информирования пользователя о состоянии системы.

Такие индикаторы, например, имеются на Arduino Uno для информирования пользователя о состоянии системы.


Подключение Светодиода к Arduino.

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

Подключение Светодиода

Подключение Светодиода к Arduino.

Подключим например к пину 3 платы Arduino. Наша программа примет вот такой вид.

/*
  Зажигаем светодиод на одну секунду, затем выключаем его на  
  одну  секунду в цикле.
 */
void setup() {               
  // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(3, OUTPUT);   
}
void loop() {
  digitalWrite(3, HIGH);   // зажигаем светодиод
  delay(1000);              // ждем 3 секунды
  digitalWrite(3, LOW);    // выключаем светодиод
  delay(1000);              // ждем секунду
}

Подробнее: Урок 2 – Мигаем светодиодом на Arduino

Расчеты для выбора резистора и мощности светодиода.

Рассмотрим основные расчеты схемы подключения светодиода к Arduino. Возьмём светодиод, круглый 5 мм, – полупроводниковый источник света с рабочим напряжением от 1.9в до 3.4в и силой тока в 20мА.

Рассчитаем, какой резистор R в приведённой схеме нам нужно взять, чтобы получить оптимальный результат. Предположим, что у нас такой светодиод имеет рабочее напряжения 3.3 В и источник питания Arduino 5в:

VF = 3.3 В
I = 20 мА
Vcc = 5 В

Найдём оптимальное сопротивление R и минимально допустимую мощность резистора PR.

Сначала рассчитаем, какое напряжение должен взять на себя резистор:

UR = Vcc – VF = 5 В – 3.3 В = 1.7 В

По закону Ома найдём значение сопротивления, которое обеспечит такое падение:

R = UR / I = 1.7 В / 0.02 А = 85 Ом

Таким образом:

  • при сопротивлении более 85 Ом яркость будет ниже заявленной;
  • при сопротивлении менее 85 Ом срок жизни светодиода будет меньше.

Далее рассчитаем мощность, которую при этом резистору придётся рассеивать:

PR = I2 × R = (0.02 А)2 × 85 Ом = 0.034 Вт

Это означает, что при мощности резистора менее 34 мВт резистор перегорит.

Данные расчеты проводить не обязательно, есть онлайн калькуляторы. Также при разработке проектов используют стандартные наборы резисторов от 100 Ом до 220 Ом. Чтобы продлить срок службы резистора, чаще всего, используют 220 Ом.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Вторая модернизация (доработка) 3D принтера Anet A8. http://portal-pk.ru/news/260-vtoraya-modernizaciya-dorabotka-3d-printera-anet-a8.html Константин Portal-PK 2020-05-14T08:05:36+03:00 При разработке самоделок и проектов на Arduino не обойтись без 3D принтера. Купил я себе недорогой 3D принтер Anet A8. Принтер бюджетный, поэтому есть недочёты, чтобы устранить основные, сделал первую модернизацию. Ее было необходимо сделать для увеличения скорости печати, иначе печатать на данном принтере можно только на очень низкой скорости 30-40 мм/сек. А сегодня буду проводить вторую модернизацию. Данная модернизация нужна в основном для комфортной работы.

Купил я на Aliexpress следующие комплектующие:

Купил я на Aliexpress следующие комплектующие:

В связи с тем, что у меня сломался кулер обдува хотенда

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

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

Дальше приступил к устранению еще одной досадной ситуации.

Термодатчик крепиться только с помощью клейкой ленты

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

Пока однажды термодатчик не выпал из отверстия, где он стоял.

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

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

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

Чтобы наклейка не мешала винтам с пружинками, которые держат стол, подрезал уголки на наклейке

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

После чего стол нужно установить на место и откалибровать.

И напоследок, установил силиконовый чехол на хотенд.

И напоследок, установил силиконовый чехол на хотенд.


Данная модернизация 3D принтер Anet A8 ускорит нагрев стола и хотенда, а при печати ABS и PETG пластиком это занимает достаточно долгое время. Также уменьшит рассеивание тепла, что снизит расход электроэнергии. Ещё снизит вероятность отклеивания от стола детали при печати ABS пластиком.

После модернизации и калибровки решил проверить печать. Мне нужно было напечатать пару крупных деталей соплом 0,6 мм. Вот результат.

После модернизации и калибровки решил проверить печать. Мне нужно было напечатать пару крупных деталей соплом 0,6 мм.

А так, Anet A8 сам по себе работает достаточно шумно.


Вывод следующий: нагрев стола стал быстрее; работает тише, но это благодаря замене сломанного кулера. А так, Anet A8 сам по себе работает достаточно шумно.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
Ночник с сенсорной кнопкой из Киндер Сюрприз - diy. http://portal-pk.ru/news/259-nochnik-s-sensornoi-knopkoi-iz-kinder-syurpriz---diy.html Константин Portal-PK 2020-04-30T12:00:21+03:00 Пару лет назад я делал ночник из Kinder Sorpresa. Не смотря на свою простоту исполнения и небольшой размер, данный ночник светит ярко и пользуется популярностью. Один знакомый, увидев ночник, заинтересовался и подсказал очень интересное решение: «Вот бы еще сделать сенсорное включение, чтобы пошел у меня ребенок ночью в туалет, бац рукой по нему и ночник включился. Пошел обратно, бац рукой и свет выключился. И при этом чтобы не было сильно ярко». Приступил я к реализации, что у меня получилось, смотрите ниже.

Для данного DIY понадобится:

Для данного DIY понадобится

Как видим для ночника из Киндер Сюрприза нужно немного элементов. И практически все доступные. Только нужно купить сенсорную кнопку, но стоит она недорого.


Схема подключения электронных компонентов.

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

Схема подключения электронных компонентов.

Для проверки работоспособности собрал все на макетной плате. Тестирование показало, что все работает. У вас, наверное, появился вопрос, что за провод припаян к сенсорной кнопке? Это выносной сенсор, он остался от предыдущего проекта, и в нашем проекте использоваться не будет. На работу сенсорной кнопки это ни как не повлияет. Вы можете не тестировать схему, я проверил и все работает. Подключал к зарядному устройству и к внешнему Power Bank, все работает как нужно.

Подключал к зарядному устройству и к внешнему Power Bank, все работает как нужно.


Этапы сборки сенсорного ночника из Киндер Сюрприза.

Приступим к сборке.

Сперва нам нужно подготовить USB провод. Отрезаем провод, оставив небольшой кусок длиной 10 см.

Сперва нам нужно подготовить USB провод. Отрезаем провод, оставив небольшой кусок длиной 10 см. и зачищаем его. Дальше нужно определить какие провода подают питание 5в. Чаше всего это провода красного и черного цвета, у меня коричневый и черный. Если у вас есть мультиметр, можно прозвонить и найти нужный провод.

В USB разъёме это самые длинные контакты и располагаются они по кроям.

В USB разъёме это самые длинные контакты и располагаются они по кроям. Центральные контакты информационные, нам они не пригодятся, поэтому синий и белый провода я отрезал.

В нижней части капсулы из Kinder Sorpresa сделал отверстие и установил в него подготовленный USB разъем.

В нижней части капсулы из Kinder Sorpresa сделал отверстие и установил в него подготовленный USB разъем.

Дальше нам понадобится паяльник. ВНИМАНИЕ! Детям нельзя пользоваться паяльником без присмотра взрослых.

Спаиваем все элементы по схеме, которая представлена выше.

Спаиваем все элементы по схеме, которая представлена выше.

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

Затем на двухсторонний скотч приклеиваем светодиоды, предварительно отогнув их так чтобы, они светили в центр капсулы из-под Kinder Sorpresa

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

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

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


Проверка и тестирование diy из Kinder Sorpresa.

Для проверки работоспособности ночника достаточно его подключить к источнику 5в. Это может быть зарядное устройство от телефона или Power Bank.

Проверка и тестирование diy из Kinder Sorpresa.

Для тестирования я использовал недорогой Power Bank. Все работает отлично. И в связи с тем, что источник питания автономный данный ночник можно поставить где угодно. А при необходимости приклеить или закрепить в нужном месте, например, на кухне. Если вдруг к вам придёт «Ночная жрица», чтобы ни кого не разбудить!


Подведём итог.

Ночник делается из простых и достаточно дешевых элементов. А универсальность изделия позволяет пользоваться данным ночником не только дома, но и в походе, и на даче. Отличная самоделка и повторить ее достаточно просто.

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

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

И всем пока-пока.

До встречи в новом проекте.

]]>
Автоматический дозатор мыла и антисептика своими руками. http://portal-pk.ru/news/258-avtomaticheskii-dozator-myla-i-antiseptika-svoimi.html Константин Portal-PK 2020-04-21T12:27:30+03:00 В школе робототехники, где я работаю преподавателем, попросили сделать автоматический дозатор мыла на Arduino. Начал я разрабатывать данный проект и тут закрыли всех на карантин. Проект автоматического сенсорного дозатора для жидкого мыла так и стоял недоделанным. Решил я исправить данную ситуацию и вот что получилось.

Проект автоматического сенсорного дозатора для жидкого мыла так и стоял недоделанным.

Дозатор работает от батарейки крона 9v, что обеспечивает автономность и безопасность работы, но есть и минусы. Но обо всем по порядку.

Что понадобиться для того чтобы сделать самодельный дозатор.

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

Что понадобиться для того чтобы сделать самодельный дозатор.

Для того, чтобы собрать автоматический дозатор мыла понадобится:


Схема подключения самодельного автоматического дозатора мыла.

Для программирования и отладки сенсорного дозатора мыла собираем все элементы на макетной плате по схеме.

Схема подключения самодельного автоматического дозатора мыла.

При сборке схемы для автономной работы от батарейки крона изменим схему подключения. Плюсовой контакт Servo подключим в пину vin, так как данный пин соединен напрямую с источником питания, в нашем случае это батарейка крона 9v. Соответственно питание на Servo будет 9 в.

Плюсовой контакт Servo подключим в пину vin, так как данный пин соединен напрямую с источником питания,


Программа для управления автоматическим дозатором.

В связи с тем, что инфракрасный модуль препятствия устроен так, что при появлении препятствия на выходе датчика будет 5 в. При отсутствии препятствия соответственно 0. Поэтому код будет аналогичен работе изменения положения сервопривода при нажатии кнопки. Урок можно посмотреть тут: Подключает servo-привод к arduino. Сервопривод + кнопка

Поэтому подробно останавливаться на разборке кода не будем.


Сборка самодельного дозатора.

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

Сперва устанавливаем сервопривод

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

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

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

С помощью соединительных проводов соединил все элементы как показано на схеме выше.

С помощью соединительных проводов соединил все элементы как показано на схеме выше.

Закрепил под крышкой одну сторону нитки, перекинул через носик дозатора, а второй край прикрепил к рычажку сервопривода.

Закрепил под крышкой одну сторону нитки, перекинул через носик дозатора, а второй край прикрепил к рычажку сервопривода.


Обзор автоматического сенсорного дозатора для жидкого мыла.

Обзор автоматического сенсорного дозатора для жидкого мыла.

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

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

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


Вывод можно сделать следующий.

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


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

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

И всем пока-пока.

До встречи в новом проекте.

]]>
Что такое Arduino? http://portal-pk.ru/news/257-chto-takoe-arduino.html Константин Portal-PK 2020-04-17T13:12:41+03:00 Программная часть состоит из бесплатной программной оболочки (Arduino IDE) для написания программ, их компиляции и программирования аппаратуры. Аппаратная часть представляет собой набор смонтированных печатных плат, продающихся как официальным производителем, так и сторонними производителями. Полностью открытая архитектура системы позволяет свободно копировать или дополнять линейку продукции Arduino.

Полностью открытая архитектура системы позволяет свободно копировать или дополнять линейку продукции Arduino.

Больше информации читайте на сайте разработчика и в Википедии. А сейчас на простом примере рассмотрим, как Arduino можно использовать в робототехнике и при разработке самодельных ЧПУ станков и 3D принтеров.

Arduino — это огромный конструктор, в котором нет ограничений в разнообразии того, что можно собрать. Всё ограничено лишь вашей фантазией и возможностью электроники.

Arduino — это огромный конструктор,

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

Arduino представляет собой небольшую плату с собственным процессором и памятью

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

В процессор Arduino можно загрузить программу, которая будет управлять всеми этими устройствами по заданному алгоритму.


В чем преимущество Arduino?

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

В чем преимущество Arduino?

Сложно ли начать изучение?

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

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

Для удобства работы с Arduino существует бесплатная официальная среда программирования «Arduino IDE», работающая под Windows, Mac OS и Linux. С помощью неё загрузка новой программы в Arduino становится делом одного клика, только лишь подключите плату к компьютеру через USB.

Arduino IDE

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

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


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

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

И всем пока-пока.

До встречи в новой статье.

]]>
Самодельные часы - плеер на Arduino с сенсорным дисплеем Nextion. http://portal-pk.ru/news/256-samodelnye-chasy---pleer-na-arduino-s-sensornym-displeem.html Константин Portal-PK 2020-04-13T15:24:34+03:00 Разработка часов на Arduino достаточно увлекательная и интересная тема. На моём сайте вы найдете большое количество различных проектов часов, в том числе и проект часов на Arduino с дисплеем Nextion.

В данном проекте будем дорабатывать часы на Arduino с сенсорным дисплеем Nextion. Напечатаем новый корпус на 3D принтере и добавим возможность воспроизведения MP3 файлов с карты памяти.

В данном проекте будем дорабатывать часы на Arduino с сенсорным дисплеем Nextion. Напечатаем новый корпус на 3D принтере

Первая версия часов с сенсорным дисплеем.

Предыдущая версия часов получилась неплохой, но были недостатки. Один из недостатков заключался в том, что часы обладали минимальным набором функций: вывод даты и времени, температуры, влажности в помещении. Но больше всего не понравился моим подписчикам на YouTube корпус. Он был сделан из банки из-под чипсов и имел ряд недочетов. Подписчики на канале предложили переделать корпус, и напечатать его на 3D принтере, что я и сделал.

Для того, чтобы собрать часы на Arduino с дисплеем Nextion нам понадобится:

1. Arduino Nano V3.0 (ATmega328). Версия Arduino Nano V2.0 (ATmega168) не подойдет, так как для текущего функционала недостаточно памяти.

2. Дисплей Nextion 2,8 дюйма. Можно и другого размера.

3. Датчик температуры и влажности SHT3x (SHT31) .

4. Часы реального времени (RTC) DS3231, я использовал версию mini.

5. Разъем 5.5 мм, для подключения питания часов.

6. MP3-плеер DFPlayer Mini.

7. Динамик 3Вт. 4Ом.

8. Провода для соединения элементов.

9. Пластик для печати корпуса.

10. Винты, гайки и шайбы М3.

11. Краска для покраски корпуса. Можно и не красить.

Эти комплектующие пригодятся при сборе часов с сенсорным дисплеем

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


Схема подключения самодельных часов и плеера.

С комплектующими определились. Сейчас можно все собрать. Для тестирования работы часов я собрал электронику на макетной плате вот по такой схеме.

Схема подключения самодельных часов и плеера.

Перед тем, как установить все в корпус, необходимо запрограммировать Arduino. Это связано с тем, что мы будем использовать аппаратные пины RX TX. На плате это pin 0 и 1. Если мы подключим к ним дисплей, то прошить Ардуино не получится, будет выводить ошибку. Вот почему так важно перед сборкой загрузить скетч в Arduino NANO.


Скетч часов на Arduino с дисплеем Nextion.

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

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

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

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


Корпус для часов Nextion.

После того, как забраковали мой первый корпус для часов, я решил не расстраиваться, а сделать 3D Model в программе Fusion 360.

3D Model в программе Fusion 360

Модель, к сожалению, утеряна, так как у меня сломался жёсткий диск. Остался только код для печати на 3D принтере пластиком PLA, соплом 0,4 мм.Код можно скачать в разделе материалы для скачивания.

Корпус удался не с первого раза.

Первая модель получилась достаточно маленькая и компактная, но устанавливать элементы было бы достаточно сложно.

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

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

Долго мучиться я не стал с подгонкой всех элементов и сделал вторую версию.

Третий вариант получился более удачный. Я решил его зачистить и покрасить. В итоге получился вот такой красивый белый корпус.

Третий вариант получился более удачный. Я решил его зачистить и покрасить. В итоге получился вот такой красивый белый корпус.


Сборка часов с сенсорным дисплеем.

Сборка часов с сенсорным дисплеем.

После того, как Arduino запрограммирована, можно приступить к установке электроники в корпус. Поэтапно устанавливаем все элементы: датчик температуры и влажности, модуль MP3 плеера, динамик, его устанавливаю на заднюю крышку с помощью крепежного кольца.

крышку с помощью крепежного кольца.

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

Часы готовы и теперь их можно проверить.

Часы готовы и теперь их можно проверить.


Обзор готовых часов плеера на Ардуино с дисплеем.

Часы готовы и пора проверить их работоспособность. Предлагаю рассмотреть, что уже умеет данная самоделка?

Функции и возможности самодельных часов на Ардуино

Функции и возможности самодельных часов на Ардуино:

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

Более наглядно о возможностях данной самоделки вы сможете посмотреть в видео.

Вывод.

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

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

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

И всем пока-пока.

До встречи в новом проекте.

]]>
Arduino урок 24. Анимация на семисегментный индикатор TM1637. http://portal-pk.ru/news/255-animaciya-na-semisegmentnyi-indikator-tm1637.html Константин Portal-PK 2020-04-02T15:14:46+03:00 Сегодня в Arduino уроке научимся выводить анимацию и бегущую строку на семисегментный индикатор TM1637. Если вы не знаете, что такое семисегментный индикатор TM1637, или у вас возникли сложности с данным уроком, вы можете посмотреть предыдущий урок:Урок 23. Подключение сегментного дисплея TM1637 к Arduino. В нём уже рассматривали модуль TM1637, с простыми примерами использования данного модуля.

Сегодня в Arduino уроке научимся выводить анимацию и бегущую строку на семисегментный индикатор TM1637

Установка и настройка библиотеки TM1637.h.

Для данного урока будем использовать другую библиотеку, которая обладает рядом преимуществ:

  • Вывод символов происходит простым написанием этого символа в коде;
  • Есть готовая функция скроллинга текста, просто указываем массив символов. Таким способом удобно выводить дату и год;
  • Функции анимации вывода символов на дисплей;

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

Установка и настройка библиотеки TM1637.h.

Выбираем архив. После установки, библиотека появиться в списке библиотек.

После установки, библиотека появиться в списке библиотек.

Внимание! Если вы ставили другие библиотеки для работы с дисплеем TM1637, их необходимо удалить. В противном случае возможен конфликт. Удалить библиотеку можно из менеджера библиотек, конечно если вы ставили через менеджер библиотек. Или напрямую из папки libraries, которая располагается: C:\Users\(Пользователь)\Documents\Arduino\libraries в операционной системе Windows.

 Если вы ставили другие библиотеки для работы с дисплеем TM1637, их необходимо удалить.

Описание функций библиотеки TM1637

init() - инициализация
set(n) - яркость сегментов от 0 до 7
clearDisplay() - очистить экран
point(True) - выключить/включить разделитель (две вертикальные точки)
displayInt(value) - вывести на экран четырёхзначное число
displayIntZero(value) - вывести на экран четырёхзначное число с нулями слева
display(posit, Byte) - вывести на экран символ Byte (0-9) в одну из четырёх позиций posit(0-3)
display(array) - вывести на экран массив array из четырёх символов
displayByte(posit, Byte) - вывести на экран символ Byte в одну из четырёх позиций posit(0-3)
displayByte(ARRAY_BYTE) - RRAY_BYTE - массив ( 0x7d, 0x7d, 0x7d, 0x7d )
displayByte(Byte1, Byte2, Byte3, Byte4) - вывести на экран четыре знака
runningString(buf, sizeof(buf), delay) - бегущая строка из массива (массив, размер массива, задержка в мс)
scroll(BitAddr, DispData, delayms) - обновить значение пролистыванием (адрес, символ, задержка в мс)
scroll(DispData[], delayms) - обновить значение пролистыванием (массив символов, задержка в мс)
scrollByte(BitAddr, DispData, delayms) - обновить значение пролистыванием (адрес, БАЙТ, задержка в мс)
scrollByte(DispData[], delayms) - обновить значение пролистыванием (массив, задержка в мс)
twist(BitAddr, DispData, delayms) - обновить значение вращением (адрес, символ, задержка в мс)
twist(DispData[], delayms) - обновить значение вращением (массив символов, задержка в мс)
twistByte(BitAddr, DispData, delayms) - обновить значение вращением (адрес, БАЙТ, задержка в мс)
twistByte(DispData[], delayms) - обновить значение вращением (массив, задержка в мс)
displayClock(hrs, mins) - выводит часы, минуты
displayClockScroll(hrs, mins, delayms) - выводит часы, минуты с эффектом пролистывания экрана вниз
displayClockTwist(hrs, mins, delayms) - выводит часы, минуты с эффектом вращения знакоместа

Сейчас можно приступить к подключению сегментного дисплея TM1637 к Arduino.

Подключение дисплея TM1637 к Arduino

Подключить дисплей можно к любым цифровым пинам Ардуино. В нашем случае будем подключать к Arduino NANO по схеме.

Подключить дисплей можно к любым цифровым пинам Ардуино. В нашем случае будем подключать к Arduino NANO по схеме.

  • Arduino Nano [PIN 5V] - TM1637 Module[PIN 5V]
  • Arduino Nano [PIN GND] - TM1637 Module[PIN GND]
  • Arduino Nano [PIN 2] - TM1637 Module[PIN DIO]
  • Arduino Nano [PIN 3] - TM1637 Module[PIN CLK]

Подключить TM1637 к Arduino UNO можно по аналогичной схеме.

Подключить TM1637 к Arduino UNO можно по аналогичной схеме.

Пример кода для вывода анимации и бегущей строки на семисегментный индикатор с драйвером TM1637.

Пример 1. Анимация пузыри на TM1637.

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

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
void setup()
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop()
{
  running_text(); // пузыри
}
void running_text() // пузыри
{
  byte buf[] = {_degree, _o, _degree, _o, _degree, _o, _degree, _o, _degree, _o, _degree, _o};
  disp.runningString(buf, sizeof(buf), 300);  // время в мс
}

Код получается в несколько строк. Используя функцию скроллинга текста. Выводим поочерёдно нужные символы и получаем данный эффект.

Пример 2. Вывод символов со скроллингом текста вниз.

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
static byte buff[4] = {_L, _E, _G, _O};
void setup()
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop()
{
  scrolling_text();// скролинг текста вниз
}
void scrolling_text() // скролинг текста вниз
{
  disp.clear();
  disp.scrollByte(buff, 100);
  delay(1000);
}

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

Пример 3. Анимация вращения символов на дисплее TM1637.

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
static byte buff[4] = {_S, _t, _O, _P};
void setup()
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop()
{
  rotation_all_sign(); // вращение по часовой стрелке всех символов
  rotation_one_sign(); // вращение символов по очереди слева на право
}
void rotation_all_sign()  // вращение по часовой стрелке всех символов
{
  disp.clear();
  disp.twistByte(buff, 100);
  delay(1000);
}
void rotation_one_sign()  // вращение символов по очереди слева на право
{
  for (uint8_t i = 0; i < 4; i++)
  {
    disp.twistByte(i, buff[i], 70);
    delay(100);
  }
}

Информация на дисплее появляется с эффектом вращения символов. Первая функция вращает все символы и выводит их на дисплей. Вторая функция вращает по одному символу и выводит их на дисплей по очереди.

Пример 4. Обычные часы и изменения яркости.

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
uint32_t Now;
boolean flag;
void setup() 
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop() 
{
  normClock(); //обычные часы
  blinking_text(); //изменяем яркость
}
void normClock() //обычные часы
{
  byte hrs = 19, mins = 55;
  uint32_t tmr;
  Now = millis();
  while (millis () - Now < 10000) {   // каждые 10 секунд
    if (millis() - tmr > 500) {       // каждые полсекунды
      tmr = millis();
      flag = !flag;
      disp.point(flag);   //выкл/выкл разделитель:
     if (flag) 
      {
        // ***** часы! ****
        mins ++;
        if (mins > 59) 
        {
          mins = 0;
          hrs++;
          if (hrs > 24) hrs = 0;
        }
      // ***** выводим часы! ****
      disp.displayClock(hrs, mins);   // выводим время функцией часов
      }
    }
  }
  disp.point(0);   // выкл точки
}
void blinking_text() //изменяем яркость
{
   disp.brightness(0);
   delay(500);
    for (uint8_t i = 0; i < 5; i++) 
    {
      disp.brightness(2);
      delay(200);
      disp.brightness(7);
      delay(200);
      disp.brightness(0);
      delay(500);
    }
 disp.brightness(7);
}

Кроме анимации можно вывести и обычные часы. Что и делает функция в данном примере. Вторая функция изменяет яркость, её можно использовать для автоматического регулирования яркости, например, используя показания, полученные с фоторезистора.

Пример 5. Часы с вращающимися символами на TM1637 и Arduino.

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
uint32_t Now;
boolean flag;
void setup() 
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop() 
{
  twistClock(); //часы с вращающимися цифрам
}
void twistClock()  //часы с вращающимися цифрам
{
  byte hrs = 19, mins = 53;
  uint32_t tmr;
  Now = millis();
  while (millis () - Now < 10000) {   // каждые 10 секунд
    if (millis() - tmr > 500) {       // каждые полсекунды
      tmr = millis();
      flag = !flag;
      disp.point(flag);   // выкл/выкл точки
      if (flag) 
      {
        // ***** часы! ****
        mins ++;
        if (mins > 59) 
        {
          mins = 0;
          hrs++;
          if (hrs > 24) hrs = 0;
        }
        // ***** часы! ****
        disp.displayClockTwist(hrs, mins, 35);    // показываем часы
      }
    }
  }
  disp.point(0);   // выключить разделитель :
}

В данном примере сделаем имитацию работы часов с выводом символов с анимацией вращения. Пример подойдёт для реализации часов с красивым выводом значений даты и времени на TM1637 и Arduino.

Пример 6. Часы со скроллингом текста сверху вниз на TM1637 и Arduino.

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
uint32_t Now;
boolean flag;
void setup() 
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop() 
{
  scrollClock(); //часы со скролингом цифр
}
void scrollClock() //часы со скролингом цифр
{
  byte hrs = 19, mins = 54;
  uint32_t tmr;
  Now = millis();
  while (millis () - Now < 10000) {   // каждые 10 секунд
    if (millis() - tmr > 500) {       // каждые полсекунды
      tmr = millis();
      flag = !flag;
      disp.point(flag);   // выкл/выкл разделитель:
      if (flag) 
      {
        mins ++;
        if (mins > 59) 
        {
          mins = 0;
          hrs++;
          if (hrs > 24) hrs = 0;
        }
        // ***** выводим часы! ****
        disp.displayClockScroll(hrs, mins, 70);    // показываем часы
      }
    }
  }
  disp.point(0);   // выкл точки
}

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

Пример 7. Бегущая строка на TM1637 и Arduino.

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

#define CLK 3
#define DIO 2
#include "TM1637.h"
TM1637 disp(CLK, DIO);
void setup() 
{
  disp.clear();
  disp.brightness(7);  // яркость минимум =0, стандарт=2,  максимум=7)
}
void loop() 
{
  running_text();
}
void running_text()
{
  byte buf[] = { _A,_r,_d,_u,_i,_n,_o,0,0,_N,_A,0,0,_P,_o,_r,_t,_A,_L,0,_P,_C,0,0,_A,_r,_d,_u,_i,_n,_o,0,0,_S,_E,_N,_S,_O,_r,_S,0,0,_A,_L,_L,0,0,_F,_o,_r,0,0,\
  _A,_r,_d,_u,_i,_n,_o,0,0,_b,_o,_A,_r,_d,_S,0,0};
  disp.runningString(buf, sizeof(buf), 200);  // время в мс
}

Для примера вывел надпись: _A,_r,_d,_u,_i,_n,_o,0,0,_N,_A,0,0,_P,_o,_r,_t,_A,_L,0,_P,_C,

Как вы догадываетесь это: Arduino na Portal PC. Почему PC? Дисплей не поддерживает символ К.

Вывод: Использование данной библиотеки позволяет по-другому взглянуть на возможности семисегментного индикатор на TM1637. Скучные символы становятся анимированными и более красивыми.

Планирую сделать часы на TM1637 и Arduino с использованием анимации.

Планирую сделать часы на TM1637 и Arduino с использованием анимации.

Появились вопросы или предложения, не стесняйся, пиши в комментарии!

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке

]]>
Проекты ночников и светильников на Arduino. http://portal-pk.ru/news/254-proekty-nochnikov-i-svetilnikov-na-arduino.html Константин Portal-PK 2020-03-31T15:38:35+03:00

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

6. Космический ночник со стеклянными шарами своими руками.

Сегодня расскажу про светильник, который сделал своими руками на Arduino (DigiSpark).Очень красивый светильник со стеклянными шарами. Знакомые сказали, что его можно использовать вместо свечек для создания романтичной обстановки. И я с ними согласен. Светильник достаточно яркий и красивый. Стеклянные шары выглядят просто сногсшибательно. Пузырьки воздуха внутри шарика похоже на звезды в небе. А переливающий свет придает дополнительный антураж.

Ночник со стеклянными шарами на Arduino своими руками.

5. Сенсорный светильник с большой площадью срабатывания на Arduino (Digispark).

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

Управляет всем небольшой микроконтроллер Arduino (Digispark). Для обеспечения 5 режимов работы использовал светодиодную ленту ws2812b.

Cамодельный сенсорный светильник на Arduino (Digispark).

4. Ночник в виде куба с несколькими режимами работы на Arduino и светодиодах WS2812.

Ночник в виде куба с несколькими режимами работы на Arduino и светодиодах WS2812.При изучении 3D моделирования, и осваивая печать на 3D принтере, сделал вот такой ночник в виде куба. Не смотря на свою простоту и небольшой размер данный ночник нравится многим знакомым. Управляет ночником Ардино (DigiSpark) в качестве светодиодов отлично подошли светодиоды ws2812b.

Светодиодный ночник в виде куба.

3. Два варианта ночника «светофор» на Arduino иадресных светодиодах WS2812.

Два варианта ночника «светофор» на Arduino иадресных светодиодах WS2812.

Сделал уже два варианта светофора на Arduino и адресных светодиодах WS2812. Достаточно удобные ночники и нравиться детям. У меня ребенок играл месяца 2 с данным светильником. Также использовал как ночник. В связи с тем, что он работает на батарейках, его можно поставить в любое место. Ребенок включает его и ставит на тумбочку около кровати. Время работы от 7 до 9 ночей.

Ардуино светофор на digispark и ws2812b

Светофор на Digispark и адресных светодиодах WS2812 — Ардуино светофор

2. Светильник, сделанный на ЧПУ станке с 5 режимами работы и регулировкой яркости.

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

Это один из самых популярных светильников, которые я делал. Спустя пару лет после первого светильника, уже сделал несколько десятков светильников, в подарок и на заказ.

Первый светильник до сих пор стоит у меня. Ребенок года полтора пользовался им как ночником. Но сейчас он любит включать подсветку на окне. И светильник используется реже.

Очередной проект на Digispark и адресных светодиодах WS2812. Работа ЧПУ

1. Ночник из банки из-под витаминов на Arduino и адресных светодиодах WS2812.

Ночник из банки из-под витаминов на Arduino и адресных светодиодах WS2812.

Это первый проект, который я сделал на адресных светодиодов WS2812. Рассеиватель сделал из банки из-под витаминов для детей.

Через некоторое время переделал данный светильник, добавил режимы работы и вместо Arduino NANO установил Digispark.

Меняем Arduino на Digispark в светильнике на ws2812. digispark проекты.

Умный ночник на Arduino и адресных светодиодах WS2811

]]>
Урок 23. Подключение сегментного дисплея TM1637 к Arduino. http://portal-pk.ru/news/253-podklyuchenie-segmentnogo-displeya-tm1637-k-arduino.html Константин Portal-PK 2020-03-24T12:24:49+03:00 Сегодня в уроке подключим семисегментный индикатор TM1637 к Arduino. Установим библиотеку TM1637.h и научимся выводить на дисплей цифры и некоторые символы.

Как устроен и из чего состоит модуль TM1637.

Характеристики Индикатора на TM1637:
• Напряжение питание: 5,5В
• Потребляемый ток 0.2 — 80мА (в зависимости от горящих сегментов)
• Градаций яркости индикаторов — 8
• Размеры платы: 42x24мм
• Двух проводной последовательный интерфейс (CLK, DIO).

Фото модуля от магазина RobotDyn фронтальный вид.

Фото модуля от магазина RobotDyn, фронтальный вид

Фото модуля от магазина RobotDyn вид с тыльной стороны.

Фото модуля от магазина RobotDyn вид с тыльной стороны.

Этот модуль собран на драйвере TM1637.
• Есть модули красного, синего, зелёного, белого цвета.
• Размеры 0,36” и 0,56”

В уроке будем использовать модуль TM1637 0,56”, зеленого цвета.


Возможности модуля TM1637:
• Зажигать сразу все знаки или по одному сегменту или символу,
• Выводить цифры от 0 до 9 и некоторые буквы. Смотри ниже.
• Цифры могут выводиться как с нулями слева, так и без них,
• 8 градаций изменения яркости.
• Вывод символа в определённую позицию (ячейку).

Отличие модуля индикатора на TM1637 от других – это его компактность, он не дорогой, и управление всего по двум проводам.

Отличие модуля индикатора на TM1637 от других – это его компактность, он не дорогой, и управление всего по двум проводам.

Подключение дисплея TM1637 к Arduino

Подключить дисплей можно к любым цифровым пинам Ардуино. В нашем случае будем подключать к Arduino NANO по схеме.

Подключение дисплея TM1637 к Arduino

Arduino Nano [PIN 5V] - TM1637 Module[PIN 5V]

Arduino Nano [PIN GND] - TM1637 Module[PIN GND]

Arduino Nano [PIN 2] - TM1637 Module[PIN DIO]

Arduino Nano [PIN 3] - TM1637 Module[PIN CLK]

Подключение дисплея TM1637 к Arduino UNO

Установка и настройка библиотеки TM1637.h.

Установить библиотеку TM1637.h можно из менеджера библиотек. Для этого откроем Arduino IDE, перейдем в раздел Скетч-> Подключить библиотеку -> Управление библиотеками.

Установить библиотеку TM1637.h

Затем в строке поиска наберем TM1637. И установим библиотеку Grove 4-Digit Display.

 Затем в строке поиска наберем TM1637. И установим библиотеку Grove 4-Digit Display.

Вы также можете скачать библиотеку TM1637 внизу урока, в разделе «материалы для скачивания».


Настройка библиотеки TM1637 для вывода дополнительных символов.

Библиотека позволяет вывести цифры и некоторые символы на дисплей.

Библиотека позволяет вывести цифры и некоторые символы на дисплей.

Для реализации простых проектов, таких как часы, индикаторы и счетчики, этого набора символов достаточно. Я реализовывал часы с выводом температуры и влажности: Arduino часы. Видео 2. Подключаем к Arduino TM1637 и датчик DHT11.

Для отображения температуры использовал символ «С» номер для вывода на индикатор 12и для отображения влажности использовал символ «F» номер для вывода на дисплей 15.

Но для некоторых проектов на Arduino не достаточно

Но для некоторых проектов на Arduino не достаточно данного набора символов. Расширить его достаточно легко, для этого в файле TM1637.cpp библиотеки находим массив TubeTab[] и добавляем нужные коды символов.

TM1637.cpp библиотеки

Список добавленных символов в файле TM1637.cpp, библиотеки TM1637.

Список добавленных символов в файле TM1637.cpp, библиотеки TM1637.

После чего данные символы можно использовать в своих проектах.

После чего данные символы можно использовать в своих проектах.

После чего данные символы можно использовать в своих проектах.

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

После кодирования сегментов, установив нужные биты в байте,

После кодирования сегментов, установив нужные биты в байте, для сокращения записи можно перевести байт из двоичного в шестнадцатиричный формат, как - b00011110 -> 0x1E.


Пример кода для вывода информации на семисегментный индикатор с драйвером TM1637.

Пример 1. Вывод времени с мигающим двоеточием.

Пример 1. Вывод времени с мигающим двоеточием.

В данном примере выведем 4 цифры на индикатор TM1637, и научимся мигать двоеточием каждую секунду. Данный пример поможет вывести любую цифровую информацию: время, счётчики, показания с датчиков.

В данном примере выведем 4 цифры на индикатор TM1637,

Пример 2. Вывод слов на модуль TM1637.

Пример 2. Вывод слов на модуль TM1637.

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

Дополнительные символы добавили в библиотеку, сейчас осталось научиться их выводить.

Пример 3. Выводданных с датчиком с символами.

Пример 3. Выводданных с датчиком с символами.

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

Тут поможет нам посимвольный вывод данных на дисплей. Например, запись tm1637.display(0, 5) выводит первый символ на дисплей 5. Аналогично выводятся остальные 3 символа.

Тут поможет нам посимвольный вывод данных на дисплей. Например, запись tm1637.display(0, 5)

Для разделения числа на десятки и единицы, для нахождения единиц нужно найти остаток от деления на 10, и для получения десяток нужно число делить на 10.

Для разделения числа на десятки и единицы

И после числового значения выведем символ, например, для температуры символ «С».

И после числового значения выведем символ, например, для температуры символ «С».


Пример применим при выводе даты, времени и показаний с датчиков.


Появились вопросы или предложения не стесняйся, пиши в комментарии!

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке

]]>
Работа со встроенной EEPROM в микроконтроллерах на Arduino http://portal-pk.ru/news/252-rabota-so-vstroennoi-eeprom-v-mikrokontrollerah-na-arduino.html Константин Portal-PK 2020-03-21T10:19:57+03:00 Микроконтроллеры AVR, на основе которых создаются платы Arduino и Genuino, обладают встроенной EEPROM: памятью, которая хранит значения переменных, пока плата выключена (подобно крошечному жесткому диску). Описываемая в данной статье библиотека позволяет считывать и записывать данные в EEPROM.

Поддерживаемые микроконтроллеры на различных платах Arduino и Genuino обладают разным размером EEPROM: 1024 байта в ATmega328, 512 байт в ATmega168 и ATmega8, 4 KB (4096 байт) в ATmega1280 и ATmega2560. Платы Arduino и Genuino 101 обладают эмуляцией EEPROM пространства размером 1024 байт.

Функции для работы с EEPROM:

read()

Описание
Считывает байт из EEPROM. Ячейки, которые никогда не были записаны, содержат значение 255.
Синтаксис
EEPROM.read(address)
Параметры
address: адрес ячейки для считывания, начинается с 0 (int).
Возвращаемое значение
Значение, записанное в ячейку (byte).
Пример
/*
 * EEPROM Read
 *
 * Считывает значение каждого байта в EEPROM и выводит его
 * на компьютер.
 */

#include <EEPROM.h>

// начать чтение с первого байта (адрес 0) в EEPROM
int address = 0;
byte value;

void setup() {
  // инициализировать последовательный порт и ждать,
  // пока порт не будет открыт:
  Serial.begin(9600);
  while (!Serial) {
    ; // ждать подключения последовательного порта. Необходимо только для встроенного USB порта.
  }
}

void loop() {
  // прочитать байт из текущего адреса EEPROM
  value = EEPROM.read(address);

  Serial.print(address);
  Serial.print("\t");
  Serial.print(value, DEC);
  Serial.println();

  /***
    Перейти к следующему адресу, или, если находимся в конце, вернуться в начало.

    Большие AVR контроллеры обладают большим размером EEPROM, например:
    - Arduno Duemilanove: 512b EEPROM;
    - Arduino Uno:        1kb EEPROM;
    - Arduino Mega:       4kb EEPROM;

    Вместо жесткого прописывания размера EEPROM, лучше использовать предусмотренную 
    функцию определения размера.
    Это сделает ваш код портируемым на все микроконтроллеры AVR.
  ***/
  address = address + 1;
  if (address == EEPROM.length()) {
    address = 0;
  }

  /***
    Поскольку размеры EEPROM являются степенями двойки, то возврат к началу EEPROM
    можно было бы реализовать с помощью операции побитового И со значением (размер - 1).

    ++address &= EEPROM.length() - 1;
  ***/

  delay(500);
}

write()

Описание
Записывает байт в EEPROM.
Синтаксис
EEPROM.write(address, value)
Параметры
address: адрес ячейки для записи, начинается с 0 (int).
value: значение для записи, от 0 до 255 (byte).
Возвращаемое значение
Ничего не возвращается.
Примечание
Запись в EEPROM занимает 3,3 мс. Память EEPROM обладает жизненным циклом 100 000 операций записи/стирания, поэтому, возможно, вам придется быть осторожными с тем, как часто записываете её.
Пример
/*
 * EEPROM Write
 *
 * Записывает значения, считанные с аналогового входа 0, в EEPROM.
 * Эти значения будут оставаться в EEPROM, когда плата будет
 * выключена, и могут быть извлечены позже при следующем запуске.
 */

#include <EEPROM.h>

/** текущий адрес в EEPROM (т.е. какой байт мы собираемся записать следующим) **/
int addr = 0;

void setup() {
  /** Нет никаких начальных настроек. **/
}

void loop() {
  /***
    Необходимо делить на 4, так как диапазон значений на аналоговых входах
    составляет от 0 до 1023, а каждый байт EEPROM может хранить значения
    только от 0 до 255.
  ***/

  int val = analogRead(0) / 4;

  /***
    Записать значение в соответствующий байт EEPROM.
    Эти значения останутся там, когда плата будет выключена.
  ***/

  EEPROM.write(addr, val);

  /***
    Перейти к следующему адресу, или, если находимся в конце, вернуться в начало.

    Большие AVR контроллеры обладают большим размером EEPROM, например:
    - Arduno Duemilanove: 512b EEPROM;
    - Arduino Uno:        1kb EEPROM;
    - Arduino Mega:       4kb EEPROM;

    Вместо жесткого прописывания размера EEPROM, лучше использовать предусмотренную 
    функцию определения размера.
    Это сделает ваш код портируемым на все микроконтроллеры AVR.
  ***/
  addr = addr + 1;
  if (addr == EEPROM.length()) {
    addr = 0;
  }

  /***
    Поскольку размеры EEPROM являются степенями двойки, то возврат к началу EEPROM
    можно было бы реализовать с помощью операции побитового И со значением (размер - 1).

    ++addr &= EEPROM.length() - 1;
  ***/
  delay(100);
}

update()

Описание
Записывает байт в EEPROM. Значение записывается, только если оно отличается от значения уже записанного по этому адресу.
Синтаксис
EEPROM.update(address, value)
Параметры
address: адрес ячейки для записи, начинается с 0 (int).
value: значение для записи, от 0 до 255 (byte).
Возвращаемое значение
Ничего не возвращается.
Примечание
Запись в EEPROM занимает 3,3 мс. Память EEPROM обладает жизненным циклом 100 000 операций записи/стирания, поэтому данная функция, в отличие от write(), может сохранить время, если записываемые данные часто не меняются.
Пример
/***
   EEPROM Update

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

   Если значение не изменилось, то EEPROM не перезаписывается,
   что поможет без необходимости не сокращать срок службы EEPROM.
 ***/

#include <EEPROM.h>

/** текущий адрес в EEPROM (т.е. какой байт мы собираемся записать следующим) **/
int address = 0;

void setup() {
  /** EMpty setup **/
}

void loop() {
  /***
    Необходимо делить на 4, так как диапазон значений на аналоговых входах
    составляет от 0 до 1023, а каждый байт EEPROM может хранить значения
    только от 0 до 255.
  ***/
  int val = analogRead(0) / 4;

  /***
    Обновить конкретную ячейку EEPROM.
    Эти значения останутся там при выключении платы.
  ***/
  EEPROM.update(address, val);

  /***
    Функция EEPROM.update(address, val) эквивалентна следующему:

    if( EEPROM.read(address) != val ){
      EEPROM.write(address, val);
    }
  ***/

  /***
    Перейти к следующему адресу, или, если находимся в конце, вернуться в начало.

    Большие AVR контроллеры обладают большим размером EEPROM, например:
    - Arduno Duemilanove: 512b EEPROM;
    - Arduino Uno:        1kb EEPROM;
    - Arduino Mega:       4kb EEPROM;

    Вместо жесткого прописывания размера EEPROM, лучше использовать предусмотренную 
    функцию определения размера.
    Это сделает ваш код портируемым на все микроконтроллеры AVR.
  ***/
  address = address + 1;
  if (address == EEPROM.length()) {
    address = 0;
  }

  /***
    Поскольку размеры EEPROM являются степенями двойки, то возврат к началу EEPROM
    можно было бы реализовать с помощью операции побитового И со значением (размер - 1).

    ++addr &= EEPROM.length() - 1;
  ***/

  delay(100);
}

get()

Описание
Считывает любой тип данных или объект из EEPROM.
Синтаксис
EEPROM.get(address, data)
Параметры
address: адрес для чтения, начинается с 0 (int).
data: данные для чтения, могут быть примитивным типом (например, float) или пользовательской структурой struct.
Возвращаемое значение
Ссылка на переданные данные.
Пример
/***
    Чтобы предварительно записать данные в EEPROM, используйте 
    пример для функции put().
    Можно обойтись и без этого, но значения, выводимые этим скетчем,
    зависят от того, что содержится в EEPROM. Это может заставить
    объект последовательного порта вывести на печать длинную строку
    мусора, если в загруженной строке не будет найден нулевой символ.
***/

#include <EEPROM.h>

void setup() {

  float f = 0.00f;   // Переменная для хранения данных, прочитанных из EEPROM.
  int eeAddress = 0; // Адрес EEPROM, откуда следует начать чтение.

  Serial.begin(9600);
  while (!Serial) {
    ; // ждать подключения последовательного порта. Необходимо только для встроенного USB порта.
  }
  Serial.print("Read float from EEPROM: ");

  // Получить данные типа float из EEPROM в месте 'eeAddress'
  EEPROM.get(eeAddress, f);
  Serial.println(f, 3);    // Это может напечатать 'ovf, nan', если данные в EEPROM 
                           // не корректны для float.

  /***
    Так как get возвращает ссылку на 'f', вы можете использовать ее в качестве аргумента
    То есть: Serial.print( EEPROM.get( eeAddress, f ) );
  ***/

  /***
    Get может использоваться и с пользовательскими структурами.
    Пример с ними выделен в отдельную функцию.
  ***/

  secondTest(); // Запустить следующий тест.
}

struct MyObject {
  float field1;
  byte field2;
  char name[10];
};

void secondTest() {
  int eeAddress = sizeof(float); // Переместить адрес к байту, следующему после float 'f'.

  MyObject customVar; // Переменная для хранения данных, прочитанных из EEPROM.
  EEPROM.get(eeAddress, customVar);

  Serial.println("Read custom object from EEPROM: ");
  Serial.println(customVar.field1);
  Serial.println(customVar.field2);
  Serial.println(customVar.name);
}

void loop() {
  /* Пустой цикл */
}

put()

Описание
Записывает любой тип данных или объект из EEPROM.
Синтаксис
EEPROM.put(address, data)
Параметры
address: адрес для записи, начинается с 0 (int).
data: данные для записи, могут быть примитивным типом (например, float) или пользовательской структурой struct.
Возвращаемое значение
Ссылка на переданные данные.
Примечание
Функция использует EEPROM.update() для реализации записи, поэтому она не перезаписывает значение, если оно не изменилось.
Пример
/***
    Этот скетч также можно использовать для предварительной
    записи в EEPROM данных, используемых в примере для функции get().

    Обратите внимание, что, в отличие от однобайтной версии EEPROM.write(),
    функция put использует обновление. То есть байт будет записан, только
    если он отличается от записанных в EEPROM данных. 
***/

#include <EEPROM.h>

struct MyObject {
  float field1;
  byte field2;
  char name[10];
};

void setup() {

  Serial.begin(9600);
  while (!Serial) {
    ; // ждать подключения последовательного порта. Необходимо только для встроенного USB порта.
  }

  float f = 123.456f;  // Переменная для записи в EEPROM.
  int eeAddress = 0;   // Место, куда мы хотим положить данные.
  // Простой вызов с адресом и переменной в качестве аргументов.
  EEPROM.put(eeAddress, f);

  Serial.println("Written float data type!");

  /** Put поддерживает и пользовательские структуры. **/

  //Data to store.
  MyObject customVar = {
    3.14f,
    65,
    "Working!"
  };

  eeAddress += sizeof(float); // Переместить адрес к байту, следующему после float 'f'.

  EEPROM.put(eeAddress, customVar);
  Serial.print("Written custom data type! \n\nView the example sketch eeprom_get to see how you can retrieve the values!");
}

void loop() {
  /* Пустой цикл */
}

EEPROM[]

Описание
Данный оператор позволяет использовать идентификатор 'EEPROM', как массив. Ячейки EEPROM могут быть прочитаны и записаны непосредственно с помощью этого оператора.
Синтаксис
EEPROM[address]
Параметры
address: адрес для чтения/записи, начинается с 0 (int).
Возвращаемое значение
Ссылка на ячейку EEPROM.
Пример
#include <EEPROM.h>

void setup(){

  unsigned char val;

  // Прочитать первую ячейку EEPROM.
  val = EEPROM[ 0 ];

  // Записать первую ячейку EEPROM.
  EEPROM[ 0 ] = val;

  // Сравнить содержимое
  if( val == EEPROM[ 0 ] ){
    // Сделать что-то...
  }
}

void loop(){ /* Пустой цикл */ }
]]>
#22. Подключаем к Arduino джойстик. Управление servo сервоприводом. http://portal-pk.ru/news/251-podklyuchaem-k-arduino-dzhoistik-upravlenie-servo.html Константин Portal-PK 2020-03-18T14:15:57+03:00 Сегодня в уроке подключим джойстик к Arduino UNO. И рассмотрим пару примеров использования джойстика в робототехнике:

  1. Вывод данных о положении стика джойстика в монитор порта.
  2. Управление свечением двух светодиодов с помощью джойстика.
  3. Подключить джойстик и сервопривод к Arduino. Научимся управлять сервоприводами с помощью джойстика.

А для начала рассмотрим, что такое джойстик, из чего он состоит и как устроен.

Устройство аналогово джойстика и принцип работы.

Устройство аналогово джойстика и принцип работы.

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

Устройство аналогово джойстика и принцип работы.

Управляет всем стик. При изменении положения стика по оси X - вращается потенциометр, выход которого outX, а при перемещении по оси Y - меняется значение потенциометра с выводом outY. По сути, это 2 потенциометра, с которых снимаем показания. Стик устроен таким образом, что он возвращается самостоятельно в центральное положение. Что обеспечивает центрование потенциометров. В данном состоянии джойстика на выходах outX, outY будет 511.

Управляет всем стик. При изменении положения стика по оси X

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

На плате установлена тактовая кнопка. Использовать ее или нет решать вам. При создании пульта для радиоуправляемой машинки я использовал данную кнопку для переключения режима работы: с джойстика или с акселерометра. Если интересно читайте на странице проекта: Машинка на радиоуправлении. Arduino + nrf24l01 + пульт.


Вывод данных о положении стика джойстика в монитор порта.

Вывод данных о положении стика джойстика в монитор порта.

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

подключим джойстик к Arduino UNO по схеме.

После чего нужно загрузить код в Arduino UNO.

После чего нужно загрузить код в Arduino UNO.

В мониторе порта будут вот такие данные.

В мониторе порта будут вот такие данные.

Как видите, они отличаются от 511. Показание отличаются на разных осях X=507, Y=510. Эти данные нам пригодятся в следующем примере.

Если мы подвигаем стик джойстика, то увидим изменение значений от 0 до 1023 по каждой оси.

Если мы подвигаем стик джойстика, то увидим изменение значений от 0 до 1023 по каждой оси.

На выходе мы получаем значение до 1023. Данный диапазон значений практически не применим в проектах на Ардуино, поэтому давайте приведем это значение к диапазону от 0 до 255, для этого воспользуемся функцией map().

 Данный диапазон значений практически не применим в проектах на Ардуино

После чего в мониторе порта мы получим вот такие значения.

После чего на мониторе порта мы получим вот такие значения.


Управление свечением двух светодиодов с помощью джойстика.

Управление свечением двух светодиодов с помощью джойстика.

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

Подключим джойстик и светодиоды к Ардуино по схеме

Так как мы знаем значение при центральном положении стика, для оси Х это 507, а для оси Y 510, используя функцию map(), приведем к необходимому диапазону, например для оси Х от 507 до 1023 к диапазону от 0 до 255. Код будет вот таким.

Так как мы знаем значение при центральном положении стика

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


Подключить джойстик и сервопривод к Arduino. Научимся управлять сервоприводами с помощью джойстика.

Подключить джойстик и сервопривод к Arduino. Научимся управлять сервоприводами с помощью джойстика.

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

 двух servo подключённых к Arduino UNO по схеме

Для данного примера устанавливать дополнительные библиотеки не нужно, так как библиотека servo устанавливается вместе с Arduino IDE.

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

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

Итог: Как видим из примеров, применение джойстика достаточно большое в разработке проектов на Arduino и в робототехнике.

 двух servo подключённых к Arduino UNO

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке

]]>
#21. Подключаем к Arduino Шаговый двигатель 28BYJ-48 на драйвере ULN2003 http://portal-pk.ru/news/250-podklyuchaem-k-arduino-shagovyi-dvigatel-28byj-48-s-pomoshchyu.html Константин Portal-PK 2020-03-06T13:02:07+03:00 Сегодня в уроке подключим шаговый двигатель 28BYJ-48 к Arduino и научимся вращать вал двигателя в разные стороны и изменять скорость вращения с помощью потенциометра и энкодера KY-040.

Кратко, что такое шаговый двигатель (ШД) - это двигатель, который способен осуществлять вращение на 1 шаг. Шаг — это угол, который обусловлен устройством каждого конкретного шагового двигателя.

Характеристики шагового двигателя 28BYJ-48:

Характеристики шагового двигателя 28BYJ-48:

Размера шагового двигателя 28BYJ-48. Необходимы при проектировании деталей для 3D печати.

Размера шагового двигателя 28BYJ-48. Необходимы при проектировании деталей для 3D печати.

Вот так выглядит схема шагового двигателя 28BYJ-48

Вот так выглядит схема шагового двигателя 28BYJ-48

Подавая сигналы в определённом порядке на выводы двигателя, двигатель можно вращать по часовой стрелке.

Для шагового режима.

Для шагового режима.

Для полушагового режима.

Для полушагового режима.

Прямое подключение шагового двигателя 28BYJ-48 к Arduino.

В связи с тем, что двигатель 28BYJ-48 работает от 5в и при небольших токах, его можно подключить на прямую к Arduino.

Схема подключения к Arduino UNO будет следующая.

В связи с тем, что двигатель 28BYJ-48 работает от 5в и при небольших токах, его можно подключить на прямую к Arduino.

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

Для этого можно сделать массив подачи сигнала на пины микроконтроллера.

Для этого можно сделать массив подачи сигнала на пины микроконтроллера.

И в цикле выполнять каждую строчку массива. Но есть решение с более компактным кодом. Нашел я данный пример на канале Дмитрия Осипова. За что ему отельное спасибо!

Код для вращения в одну и в другую сторону будет вот таким.

ВНИМАНИЕ! Материалы для скачивания находятся внизу статьи!

Пример подключения шагового двигателя 28BYJ-48 (5V)с использованием драйвер ULN2003.

Также у Дмитрия Осипова есть код для изменения скорости вращения с помощью потенциометра. Я его немного доработал, сделал обработку нажатия кнопки без задержки в 500 мс. Сейчас двигатель стал вращаться в обратную сторону без видимой задержки.

Для подключения буду использовать модуль SBT0811 на драйвере ULN2003.

Для подключения буду использовать модуль SBT0811 на драйвере ULN2003.

Драйвер устроен вот таким образом.

Драйвер устроен вот таким образом.

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

Подключим все по схеме и загрузим код в Arduino NANO.

Подключим все по схеме и загрузим код в Arduino NANO.

Схема подключения для Arduino UNO будет аналогичной.

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

ВНИМАНИЕ! Материалы для скачивания находятся внизу статьи!

Пример управления шаговым двигателем 28BYJ-48 с помощью Энкодера.

Для уменьшения количества элементов в схеме решил заменить потенциометр и тактовую кнопку на энкодер вращения KY-040. Как подключить энкодер вращения к Arduino рассказывал в предыдущем уроке.

Подключаем шаговый двигатель 28BYJ-48 и энкодер к Arduino по схеме.

Подключаем шаговый двигатель 28BYJ-48 и энкодер к Arduino по схеме.

Проводим небольшую доработку кода и получим вот такой результат.

Если нажать на энкодер, меняется направление вращения. А при вращении энкодера по часовой стрелке - скорость увеличивается. Если вращать против часовой стрелки - скорость снижается.

Если нажать на энкодер, меняется направление вращения. А при вращении энкодера по часовой стрелке - скорость увеличивается. Если вращать против часовой стрелки - скорость снижается.

ВНИМАНИЕ! Материалы для скачивания находятся внизу статьи!

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

стандартной библиотеки Stepper

А вот сам пример вращения в одну сторону, а затем в другую с использованием библиотеки Stepper.

А вот сам пример вращения в одну сторону, а затем в другую с использованием библиотеки Stepper.

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

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке

]]>
#20 Плейлисты, воспроизводим случайную композицию DFPlayer Mini и Arduino. http://portal-pk.ru/news/249-pleilisty-vosproizvodim-sluchainuyu-kompoziciyu-dfplayer-mini.html Константин Portal-PK 2020-03-04T13:18:26+03:00 В продолжение урока: Делаем MP3-плеер на DFPlayer Mini и Arduino. Рассмотрим, как можно создавать плейлисты для воспроизведения композиции с автоматическим определением количества плейлистов и количества треков в каждом плейлисте. А также сделаем воспроизведение случайного трека и зациклим воспроизведение композиции в одной папке.

В продолжение урока:Делаем MP3-плеер на DFPlayer Mini и Arduino. Рассмотрим, как можно создавать плейлисты

После того, как я сделал урок с использованием MP3-плеера написал мне подписчик: «познавательное видео! а можешь рассказать как сделать, например, 10 папок с музыкой и в них 10 музыкальных фрагментов, как подключаются кнопки выбора по папкам, и оставить громкость + - , воспроизведение и стоп? Я видел схему с множеством резисторов, для определения, например, каждой кнопки - музыкальному отрывку, но не нашел как подключить кнопки выбора папок - буду признателен за помощь!»

После того, как я сделал урок с использованием MP3-плеера написал мне подписчик

Решил я помочь подписчику и сделать урок с использованием DFPlayer и Arduino. Реализовать выбор папки и включение нужного mp3 файла. Но как сделать так, чтобы не нужно было каждый раз прописывать в коде, сколько у нас папок и сколько треков в каждой папке. А чтобы Arduino проделывала роботу по определению количества папок и треков. Ограничение DFPlayer Mini - максимум плейлистов 99, и треков в плейлисте 999, - и этого достаточно для решения, практически, любой задачи.

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

Для урока MP3-плеера на Arduino нам понадобится:

1. Arduino UNO или Arduino NANO

2. DFPlayer Mini.

3. Беспаечная макетная плата .

4. Соединительные провода .

5. Динамик. Я использую от ноутбука.

6. 2 резистора на 10 кОм.

Подключаем MP3-плеера DFPlayer к Arduino по схеме.

Подключаем MP3-плеера DFPlayer к Arduino по схеме.

Пример работы с выбором папок, и композиции в них на DFPlayer.

Приступим к реализации просьбы подписчика. На карте памяти сделаем несколько папок с порядковыми номерами 01, 02, 03, 04 .. 11. В моем случае 11 папок, вы можете сделать любое количество.

На карте памяти сделаем несколько папок с порядковыми номерами 01, 02, 03, 04 .. 11.

Загрузим в каждую папку треки от 10 до 14. Вот так это будет выглядеть на карте памяти.

Загрузим в каждую папку треки от 10 до 14. Вот так это будет выглядеть на карте памяти.

За основу возьмем код из предыдущего урока и немного его доработаем. Добавим переменные, которые будут отвечать за папки и треки.

 Добавим переменные, которые будут отвечать за папки и треки.

В блоке Setup добавим код, который будет считать, сколько у нас папок на карте памяти. И сохраним это значение в переменную folders.

В блоке Setup добавим код, который будет считать, сколько у нас папок на карте памяти. И сохраним это значение в переменную folders.


Переменная folders получается на 1 больше, чем на карте. Сейчас мы можем, без проблем, добавлять папки на нашу карту памяти и MP3-плеер автоматически определит сколько их. Папок может быть не больше 99, и название должно состоять из 2 цифр.

Посчитаем сколько треков в первом каталоге.

Посчитаем сколько треков в первом каталоге.

Включим воспроизведение нашего первого файла в первой папке и выводим информацию об этом в монитор порта.

Включим воспроизведение нашего первого файла в первой папке и выводим информацию об этом в монитор порта.


Кнопка buttonNext будет переключать папки, а buttonPrevious – будет переключать по трекам в выбранной папке.

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

Рассмотрим код переключения по папкам:

Рассмотрим код переключения по папкам:

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

 Почему нужно вычитать 1 рассказывал выше.

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

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

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

включаем первый трек из данной папки

Если вы планируете воспроизводить с первого трека при переключении между папками, нужно убрать условие и оставить j = 1;. Осталось воспроизвести трек и вывести информацию в монитор порта номер трека и номер папки, в которой находится трек.


Осталось воспроизвести трек и вывести информацию в монитор порта номер трека и номер папки, в которой находится трек.

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

Приступим к переключению треков в выбранной папке.

Приступим к переключению треков в выбранной папке.

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

В мониторе порта это будет выглядеть вот так:

В мониторе порта это будет выглядеть вот так:

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

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

Если трек последний, то при следующем нажатии на кнопку, переключаемся на первый трек в текущей папке.

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

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


Зациклить воспроизведение композиций в папке, и случайное воспроизведение всех треков на DFPlayer и Arduino.

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

Схема подключения будет аналогично предыдущему примеру.

Схема подключения будет аналогично предыдущему примеру.

Код тоже возьмём из предыдущего примера и немного его изменим. Переменных нам нужно будет меньше:

Код тоже возьмём из предыдущего примера и немного его изменим. Переменных нам нужно будет меньше:

Кнопка buttonNext будет переключать воспроизведение папок.

Кнопка buttonNext будет переключать воспроизведение папок.

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

На кнопку buttonPrevious помешаем случайное воспроизведение трека из всех доступных на карте памяти.

На кнопку buttonPrevious помешаем случайное воспроизведение трека из всех доступных на карте памяти.

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

Используя предоставленные примеры можно реализовать различные проекты на DFPlayer и Arduino, которые позволяют воспроизводить музыку по расписанию, в заданном порядке и определенными сборками.

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке

]]>
Проекты часов на Arduino. От часов на светодиодах до часов на дисплее Nextion. http://portal-pk.ru/news/248-proekty-chasov-na-arduino-ot-chasov-na-svetodiodah-do-chasov.html Константин Portal-PK 2020-03-03T18:24:51+03:00 Разрабатываю часы на Arduino уже несколько лет подряд. Решил поместить все свои проекты часов на Arduino на одну страницу, чтобы самому знать, сколько часов сделано, и, при необходимости, показать заинтересованным читателям, знакомым и родственникам.

Это я решил сделать в связи с тем, что часто спрашивают:

  • А что ты можешь сделать?
  • Например, часы - отвечаю я.
  • А покажи примеры!

И тут я начинаю искать по сайту, что показать. А в конце вопрос: это ты сделал 5 различных часов на Arduino? Или больше? И тут начинаем листать обратно, считая сколько часов я сделал.

Поэтому решил все часы выложить тут:

6. Часы на OLED дисплее SSD1306 и Arduino.

Oled часы с выводом температуры на Arduino своими руками. Еще один интересный проект часов на OLED дисплее SSD1306 и Arduino. Данные часы небольшого размера, но обладают функциями полноценных часов. Часы выводят температур, дату и время. Благодаря двум тактовым кнопкам можно настроить дату и время.

5. Часы без кнопок с сенсорным дисплеем Nextion и Arduino.

Часы на Arduino и дисплее Nextion с выводом температуры и влажности.

Вам не нравятся часы с вечно чикающими кнопками? Представляю вашему вниманию часы с сенсорным экраном Nextion, и Arduino.

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

Часы будут доработаны, и ожидается новая версия часов на Arduino с дисплеем Nextion с еще большим функционалом.

4. Часы матрица на Arduino и адресных светодиодах WS2812.

Светодиодные часы своими руками на ардуино (Arduino) WS2812 управляемых (адресных)

После того, как я купил себе 3D принтер, стал активно делать проекты с использованием 3D печати. Одним их проектов стали часы-матрица с выводом времени и даты на матрицу 16х5 пикселей. Получились отличные часы с возможностью настраивать время и дату. Но в связи с тем, что печатал решётку для светодиодов пластиком PLA, то на внешних контурах он потрескался уже через полгода. Нужно перепечатать внешнюю решётку ABS пластиком. Но пока не доходят руки.

3. LEGO часы на Arduino.

Часы-будильник на Arduino. Корпус сделан из конструктора LEGO.  LEGO Arduino

Задали ребёнку сделать «умный проект в доме». После недолгих размышлений решили сделать Arduino часы из LEGO. Добавили в часы спикер, и кнопку для отключения будильника. Часы не только работали и показывали текущее время, но и в них был запрограммирован будильник, который срабатывал в 07:00. Все отлично, но работал будильник каждое утро, и даже в выходные дни. Не смотря на то, что часы нравились ребенку, они проработали недолго. Ребенок разобрал корпус для своего строения из LEGO.

2. Светодиодные часы на адресных светодиодах WS2812 и Arduino.

Классные самодельные настенные светодиодные часы на arduino

Часы состоят из 3 круглых контуров, по которым располагаются светодиоды. Внешний контур показывает минуты с кратностью 5. Если светиться 1 светодиод, значит 5 мин, 2 – 10 мин и т.д. По аналогии работы стрелочных часов. Средний контур, с выфрезерованными цифрами 3,6,9,12, – это часовой индикатор, который показывает сколько часов. И маленький контур с 4 светодиодами указывает сколько минут нужно добавить к минутам, которые получаются на внешнем контуре, т.е если на внешнем контуре светиться 3 светодиода, а на маленьком 2 то значит сейчас 17 минут (15+2). Заполняем минуты, которые нельзя показать на внешнем контуре.

Часы сделал 2 года, и они до сих пор работают и висят у меня в коридоре, удивляя гостей своей необычной формой.

1.Arduino часы на сдвиговых регистрах и 28 светодиодах. С выводом температуры и влажности на семисегментный индикатор TM1637.

Arduino часы - Видео 4. Делаем корпус и собираем Arduino часы

Часы состоят из 28 светодиодов, которые показывают тегирующее время. Также время дублируется на семисегментный индикатор TM1637. Также на TM1637 выводится влажности и температура в помещении. Время настраивается с помощью пульта дистанционного управления.

]]>
Урок 19. Делаем MP3-плеер на DFPlayer Mini и Arduino. http://portal-pk.ru/news/247-delaem-mp3-pleer-na-dfplayer-mini-i-arduino.html Константин Portal-PK 2020-02-28T14:05:54+03:00 Как воспроизвести аудиофайлы в формате wav я уже рассказывал в уроке: Arduino SD карта. Воспроизводим звуки и музыку в wav формате. Данный способ подходит, когда нужно воспроизвести файлы не очень высокого качества, например, уведомления, оповещение и пр. Если же надо воспроизводить файлы в формате mp3, нам поможет модуль DFPlayer Mini.

модуль DFPlayer Mini

MP3-плеер DFPlayer Mini позволяет воспроизводить аудиофайлы, записанные на карту памяти формата microSD. С помощью этого плеера можно управлять музыкой: приостановка и возобновление воспроизведения аудиофайла. А также можно установить громкость из 30-ти уровней громкости и одни из 6-ти режимов эквалайзера.

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

Характеристики DFPlayer MP3 mini:

Характеристики DFPlayer MP3 mini:

  • Напряжение питания: 3,3–5 В
  • Количество каналов: 1 моно, 3 Вт + 2 стерео, без усилителя
  • Поддерживаемые частоты дискретизации: 8, 11, 12, 16, 22, 24, 32, 44,1, 48 кГц
  • Разрядность ЦАП: 24 бита
  • Поддерживаемые файловые системы: FAT16, FAT32
  • Максимальный объём SD-карты: 32 ГБ
  • Количество каталогов композиций: до 100
  • Количество композиций в каталоге: до 255
  • Форматы аудиофайлов: MP3, WAV, WMA
  • Кол-во уровней громкости: 30
  • Режимов эквалайзера: 6 (Normal/Pop/Rock/Jazz/Classic/Base)

Для реализации самого простого плеера не нужно подключать DFPlayer к Arduino. Достаточно подключить несколько кнопок вот по такой схеме.

Для реализации самого простого плеера не нужно подключать DFPlayer к Arduino.

Но у нас уроки про Arduino, поэтому рассмотрим простой пример подключения MP3-плеер к Arduino, который подключается по аппаратному или программному UART порту (пины RX и TX) Ардуино.

Код с выводом отладочной информацией будет вот таким. Данный код взят с сайта библиотеки DFRobotDFPlayerMini. Также нам понадобится библиотека для работы спрограммным UART портом SoftwareSerial.Скачать библиотеки можно внизу статьи, в разделе материалы для скачивания.

Для воспроизведения аудиофайла необходимо поместить на карту памяти microSD один трек. Файлы рекомендуется помещать в папку mp3 и называть порядковыми номерами вот в таком формате 0001.mp3. Мой опыт показывает, что можно скидывать файлы с любым названием и помещать в корень флешки, но воспроизводиться файлы будут в том порядке, в каком их загрузилина карту памяти. При пакетной загрузке одни файлы загружаются быстрее, а другие медленнее, из-за чего воспроизведение треков идет в хаотичном порядке.

Пример MP3-плеера на DFPlayer Mini и Arduino с возможностью выбора трека и изменением громкости.

Давайте сделаем полноценный MP3-плеера на Arduino. Для этого нам понадобится:

1. Arduino UNO или Arduino NANO

2. DFPlayer Mini.

3. Беспаечная макетная плата .

4. Соединительные провода .

5. Динамик. Я использую от ноутбука.

6. 2 резистора на 10 кОм.

Все компоненты нашего будущего MP3-плеера на DFPlayer соединяем по схеме.

Все компоненты нашего будущего MP3-плеера на DFPlayer соединяем по схеме.


Загрузим файлы с треками на карту памяти microSD, я использую 3 трека с YouTube, чтобы можно было воспроизводить музыку в видеоролике и не получить бан. Архив с треками можно скачать внизу статьи, в разделе материалы для скачивания.

Загрузим файлы с треками на карту памяти microSD, я использую 3 трека с YouTube

Код для MP3-плеера на DFPlayer Mini и Arduino с возможностью выбора трека и изменением громкости будет вот такой.

#include "DFRobotDFPlayerMini.h"
// библиотека для эмуляции Serial порта
#include <SoftwareSerial.h>
// создаём объект mySoftwareSerial и передаём номера управляющих пинов RX и TX
// RX - цифровой вывод 10, необходимо соединить с выводом TX дисплея
// TX - цифровой вывод 11, необходимо соединить с выводом RX дисплея
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX для плеера DFPlayer Mini 
DFRobotDFPlayerMini myDFPlayer;
int buttonNext = 2;   // кнопка следующий трек
int buttonPause = 3;  // кнопка пауза/ пуск
int buttonPrevious = 4; // кнопка предыдущий трек 
int buttonVolumeUp = 5; // кнопка увеличение громкости
int buttonVolumeDown = 6; // кнопка уменьшение громкости
boolean isPlaying = false; // статус воспроизведения/пауза
void setup() {
  pinMode(buttonPause, INPUT_PULLUP); 
  pinMode(buttonNext, INPUT_PULLUP);
  pinMode(buttonPrevious, INPUT_PULLUP);
  pinMode(buttonVolumeUp, INPUT_PULLUP);
  pinMode(buttonVolumeDown, INPUT_PULLUP);
  mySoftwareSerial.begin(9600); 
  Serial.begin(9600);
  delay(1000);
  Serial.println();
  Serial.println("DFPlayer Mini Demo");
  Serial.println("Initializing DFPlayer...");
  if (!myDFPlayer.begin(mySoftwareSerial)) {
    Serial.println("Unable to begin:");
    Serial.println("1.Please recheck the connection!");
    Serial.println("2.Please insert the SD card!");
    while (true);
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.setTimeOut(300);
  //----Set volume----
  myDFPlayer.volume(15); //Set volume value (0~30).
  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
  myDFPlayer.play(1); //Воспроизведение первого mp3
  isPlaying = true; // воспроизводим
  Serial.println("Playing..");
  //----Читать информацию----
  Serial.println(myDFPlayer.readState()); //читать состояние mp3
  Serial.println(myDFPlayer.readVolume()); //Текущая громкость 
  Serial.println(myDFPlayer.readEQ()); // читаем настройку эквалайзера
  Serial.println(myDFPlayer.readFileCounts()); // читать все файлы на SD-карте
  Serial.println(myDFPlayer.readCurrentFileNumber()); // текущий номер файла воспроизведения
}
void loop() {
  if (digitalRead(buttonPause) == LOW) {
    if (isPlaying) { // если было воспроизведение трека
      myDFPlayer.pause(); // пауза
      isPlaying = false; // пауза
      Serial.println("Paused..");
    } else {        // иначе
      isPlaying = true; // воспроизводим
      myDFPlayer.start(); //запускаем mp3 с паузы
    }
    delay(500);
  }
  if (digitalRead(buttonNext) == LOW) {
    if (isPlaying) {
      myDFPlayer.next(); //Next Song
      Serial.println("Next Song..");
    }
    delay(500);
  }
  if (digitalRead(buttonPrevious) == LOW) {
    if (isPlaying) {
      myDFPlayer.previous(); //Previous Song
      Serial.println("Previous Song..");
    }
    delay(500);
  }
  if (digitalRead(buttonVolumeUp) == LOW) {
    if (isPlaying) {
      myDFPlayer.volumeUp(); //Volume Up
      Serial.println("Volume Up..");
    }
    delay(500);
  }
  if (digitalRead(buttonVolumeDown) == LOW) {
    if (isPlaying) {
      myDFPlayer.volumeDown(); //Volume Down
      Serial.println("Volume Down..");
    }
    delay(500);
  }
}

У платы Arduino NANO всего один аппаратный Serial Port, поэтому будем использовать программный порт. Для этого нужно установить и подключить библиотеку SoftwareSerial.h.

подключить библиотеку SoftwareSerial.h.

Чтоб проверить, подключен или нет DFPlayer используется условие:

Чтоб проверить, подключен или нет DFPlayer используется условие:

Если в мониторе порта мы видим надпись «DFPlayer Mini online.» все подключено правильно и работает.

Данные строки кода

Включают первый трек. И выводят в монитор порта информацию об этом.

Включают первый трек. И выводят в монитор порта информацию об этом.

Строки ниже выводят в монитор порта полезную информацию о статусе работы.

Строки ниже выводят в монитор порта полезную информацию о статусе работы.

Первая строчка выводит статус: цифра с кодом.

Вторая строчка выводить уровень текущей громкости от 0 до 30

Третья выводит настройки эквалайзера, также в цифровом значении.

Четвертая выводит, сколько треков найдено на карте памяти.

Последняя стока выводит, какой трек воспроизводится сейчас.

В мониторе порта это будет выглядеть вот так:

В мониторе порта это будет выглядеть вот так:

В основном цикле loop выводим условия проверки нажатия той или иной кнопки. И выполняем нужную команду.

  if (digitalRead(buttonNext) == LOW) {
    if (isPlaying) {
      myDFPlayer.next(); //Next Song
      Serial.println("Next Song..");
    }
    delay(500);
  }

Это одно условие для примера, остальные устроены аналогично, их рассматривать не будем. Список команд для работы с DFPlayer Mini myDFPlayer.next(); // Воспроизвести следующий mp3

  myDFPlayer.previous();  // Воспроизвести предыдущий mp3
  myDFPlayer.play(1);  //Воспроизведение первого mp3
  myDFPlayer.loop(1);  //зациклить первый mp3
  myDFPlayer.pause();  //приостановить mp3
  myDFPlayer.start();  //запускаем mp3 с паузы
  myDFPlayer.playFolder(15, 4);  //воспроизводить определенный mp3 в SD: /15/004.mp3; Имя папки (1 ~ 99);
  myDFPlayer.enableLoopAll(); //зациклить все mp3 файлы.
  myDFPlayer.disableLoopAll(); //остановить цикл всех mp3 файлов.
  myDFPlayer.playMp3Folder(4); //воспроизводить конкретный mp3 в SD: /MP3/0004.mp3; Имя файла (0 ~ 65535)
  myDFPlayer.advertise(3); //рекламируем конкретный mp3 в SD: /ADVERT/0003.mp3; Имя файла (0 ~ 65535
  myDFPlayer.playLargeFolder(2, 999); //воспроизводить конкретный mp3 в SD: /02/004.mp3; Имя папки (1 ~ 10); Имя файла (1 ~ 1000)    
  myDFPlayer.loopFolder(5); //зациклить все mp3 файлы в папке SD: / 05.
  myDFPlayer.randomAll(); //Произвольное воспроизведение всех mp3.  
  myDFPlayer.enableLoop(); //включить цикл.
  myDFPlayer.disableLoop(); //отключить цикл

Как видите, не так много кода и алгоритм работы достаточно несложный. Планирую реализовать пару проектов с использованием модуля DFPlayer Mini и Arduino, ESP8266, ESP32 для публикации на сайте. Благо, опыт работы с этим модулем и данными платформами есть.

ару проектов с использованием модуля DFPlayer Mini и Arduino, ESP8266, ESP32 для публикации на сайте.

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
Ночник со стеклянными шарами на Arduino своими руками. http://portal-pk.ru/news/246-nochnik-so-steklyannymi-sharami-na-arduino-svoimi-rukami.html Константин Portal-PK 2020-02-27T15:06:47+03:00 Сегодня расскажу про светильник, который сделал своими руками на Arduino (DigiSpark). В качестве рассеивателя установил стеклянные шарики, которые фиксируются с помощью оргстекла молочного цвета.

Заготовки для светильника вырезал на своем самодельном фрезерном ЧПУ станке больше года назад. После склейки корпуса установил электронику и протестировал работу. Но меня не устроили некоторые моменты и проект отложил. И вот, дошли руки его доработать. Изначально стеклянные шарики прижимались куском фанеры, и свет плохо рассеивался. Чтобы устранить данный конструктивный изъян заменил верхнюю часть на 2 детали. Стеклянные шарики зажимаются оргстеклом и для того, чтобы стекло сильно не прогибалось, фиксирую его куском фанеры. Такая конструкция позволяет надежно зафиксировать шарики без прогиба оргстекла.

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

К сожалению, раскроя фанеры нет, так как у меня сломался жёсткий диск, и часть информации было утеряно, в том числе и раскрой фанеры для данного светильника. Но возможно, осталась копия на рабочем компьютере, который стоит для управления самодельным ЧПУ станком на Arduino. Если найду, то обязательно выложу внизу стати в разделе материалы для скачивания.

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

Покрасил все заготовки в белый цвет и собрал. Вот что получилось.

Покрасил все заготовки в белый цвет и собрал. Вот что получилось.

Электроника и схема подключения самодельного светильника на Arduino (DigiSpark).

Для проекта нам понадобится:

  • Digispark
  • Адресные светодиоды WS2812
  • Резистор 10 кОм
  • Бокс под батарейки 4 x AA
  • Кнопка без фиксации
  • Кнопка с фиксацие

Подключаем все компоненты светильника на Arduino по вот такой схеме.

Подключаем все компоненты светильника на Arduino по вот такой схеме.

Вместо DigiSpark можно использовать Arduino NANO. Подключить кнопку и адресные светодиоды можно к любому цифровому пину Arduino.

Данный проект, по электронным комплектующим и схеме подключения, схож с проектом светофора на адресных светодиодах WS2812.

Прошивка для самодельного светильника на Arduino.

#include <Adafruit_NeoPixel.h>
#define PIN 0
#define STRIPSIZE 3
byte button_rejim = 1;  // кнопка режим
int rejim = 0;       // текущий режим
int yarkast = 250;       // текущая яркасть
boolean lastButten = LOW;     // предыдущее состояние кнопки
boolean currentButten = LOW;  // текущее состояние кнопки
int wait = 15;
uint16_t j = 0;
uint16_t i = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(STRIPSIZE, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
  pinMode(button_rejim, INPUT); // настроить пин кнопки
  strip.begin();
}
boolean debvance (boolean last) //убираем дребизг 2
{
  boolean current = digitalRead (button_rejim); // считываем данные с кнопки
  if (last != current) // Если текущее состояни еотличететься от предыдущего
  {
    delay (5);   // Ждем 5 милисек.
    current = digitalRead (button_rejim); // Присваеваем текущее состояние кнопки
    return current;
  }
}
void loop() {
  currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW
  if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
  {
    rejim++; // изменяем режим
    i = 0;
    if (rejim == 3)
      rejim = 0;
  }
  lastButten =  currentButten;  // Переприсваеваем прошлое состояние кнопки
  if (rejim == 0)
  {
    if (j < 256) {
      for (i = 0; i < strip.numPixels(); i++) {
        strip.setPixelColor(i, Wheel((i + j) & 255));
      }
      delay(wait);
      j++ ;
    }
    if (j == 255)
      j = 0;
  }
  else if (rejim == 1)
  {
    if (j < 256 * 5) { // 5 cycles of all colors on wheel
      for (i = 0; i < strip.numPixels(); i++) {
        strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
      }
      delay(wait);
      j++;
    }
    if (j == 255)
      j = 0;
  }
  else if (rejim == 2) // радуга из центра
  {
    for (i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, strip.Color(255, 255, 255));
      delay(wait);
    }
  }
  strip.setBrightness(yarkast);  // Lower brightness and save eyeballs!
  strip.show(); // Initialize all pixels to 'off'
}
uint32_t Wheel(byte WheelPos) {
  if (WheelPos < 85) {
    return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if (WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
    WheelPos -= 170;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}
void colorWipes(uint32_t c, int num) {
  for (i = 0; i < strip.numPixels(); i++) {
    if (i == num)
      strip.setPixelColor(i, c);
    else
      strip.setPixelColor(i, strip.Color(0, 0, 0));
  }
  strip.setPixelColor(num, c);
  strip.show();
  delay(1);
}

Перед установкой электроники нужно запрограммировать DigiSpark или Arduino.

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

Как запрограммировать Arduino смотрите тут. Загрузка скетча в DigiSpark происходит немногого по-другому. Сначала нажимаете кнопку загрузить код, после того как код скомпилируется и выйдет надпись, у вас будет 60 секунд для подключения DigiSpark к компьютеру.

Загрузка скетча в DigiSpark происходит немногого по-другому.

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

Кнопка с фиксацией включает и выключает питание. Тактовая кнопка переключает режимы.

У светильника есть 3 режима роботы:

  • Плавная смена цвета всех светодиодов одновременно.
  • Смена цветов у каждого светодиода свой цвет.
  • Белый цвет свечения всех светодиодов.

Светильник запрограммирован и собран. Можно приступить к тестированию.

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

Батареек самых дешевых хватит примерно на 5-7 ночей. Это достаточно неплохой результат.

Батареек самых дешевых хватит примерно на 5-7 ночей. Это достаточно неплохой результат.

И еще немного фото самодельного светильника на Arduino (DigiSpark).

И еще немного фото самодельного светильника на Arduino (DigiSpark).

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

На этом всё. Не забывайте подписываться на мой YouTube канал, вступать в группу Вконтакте, в группу на Facebook.

И всем пока-пока.

До встречи в новом проекте.

]]>
ESP32-CAM сохраняем фотографии на флешку при движении http://portal-pk.ru/news/245-esp32-cam--sohranyaem--fotografii-na-fleshku-pri-dvizhenii.html Константин Portal-PK 2020-02-20T12:33:42+03:00 Сегодня в проекте на ESP32 научим ESP32-CAM модуль делать фотографии при движении объекта и сохранять фотографии на флешку. Название кадра будет содержать дату и время, когда было сделано фото.

научим ESP32-CAM модуль делать фотографии при движении объекта и сохранять фотографии на флешку

У PIR датчика HC-SR501 на выходе 3,3в, что позволяет нам подключить датчик движения к ESP32 без дополнительных преобразователей и пр.

Спонсор видео NextPCB. 0$ первый пробный заказ печатных плат от NextPCB.

Корпус для esp32 cam ov2640.

Корпус самостоятельно делать не пришлось, так как готовые варианты есть в интернете. Скачал я пару моделей и напечатал на 3D принтере. Вот что получилось.

 Скачал я пару моделей и напечатал на 3D принтере. Вот что получилось.

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

Кроме модуля можно установить разъем micro-USB, что позволит подключать ESP32-CAM wifi к телефонному зарядному устройству или power bank.

Кроме модуля можно установить разъем micro-USB

Для проекта нам понадобиться:

Для проекта нам понадобиться: ESP32-CAM модуль ov2640.

Приступим к установке, настройке необходимого ПО и прошивке ESP32. Для удобства я разделил всё на несколько этапов:

1. Установка дополнения ESP32
В этом примере будем использовать Arduino IDE для программирования платы ESP32-CAM. Установите Arduino IDE, и настройте работу с ESP32. Если этого у вас не сделано, воспользуетесь следующей инструкцией:

Установка, прошивка платы ESP32 в Arduino IDE (Windows, Mac OS X, Linux)

2. Код проекта. Меняем все необходимые параметры.
В среде Arduino IDE открываем код:

В среде Arduino IDE открываем код:

Перед загрузкой прошивки в модуль ESP32 CAM необходимо указать ваши данные для подключения к Wi-Fi сети.

String _ssid= "Имя_точки_wi-fi "; // Для хранения SSID
String _password = "пароль_от_wi-fi // Для хранения пароля сети

Больше настраивать не нужно, код готов к загрузке в ESP32.

3. Прошивка ESP32-CAM

Для прошивки я использую самый недорогой TTL программатор. И всё прошивается и работает отлично.

Подключаю всё вот по такой схеме:

 Прошивка ESP32-CAM

Важно! GPIO 0 должен быть подключен к GND, чтобы вы смогли загрузить код.

Чтобы загрузить код, выполните следующие действия:

  • Перейдите в меню Инструменты > Плата и выберите модуль Al Thinker ESP32-CAM
  • Перейдите в меню Инструменты > порт и выберите COM-порт, к которому подключен ESP32
  • Нажмите кнопку ESP32-CAM on-board RESET
  • Затем нажмите кнопку Загрузка, чтобы загрузить код

Перейдите в меню Инструменты выберите модуль Al Thinker ESP32-CAM

Важно! Если вы не можете загрузить код, то еще раз проверьте, что GPIO 0 подключен к GND и, что вы выбрали правильные настройки в меню Инструменты. Вы также должны нажать кнопку сброса на борту, чтобы перезагрузить ESP32 в режиме программирования.

Код загружен, сейчас нужно все собрать в корпус.


ESP32-CAM схема подключения.

Для проверки работы собираем все элементы на макетной плате по схеме.

Для проверки работы собираем все элементы на макетной плате по схеме.

Вот так это выглядит в живую.

Вот так это выглядит в живую.

При движении получаются вот такие фото.

Котэ попал в кадр. Модуль работает.

Котэ попал в кадр. Модуль работает.

Для подключения к micro usb dip 5 pin нужно припаять 4 провода. Как-то вот так.

Для подключения к micro usb dip 5 pin

Укладываем все в корпус. В задней крышке сделал отверстия для проводов, которые подключаются к PIR датчику HC-SR501. Датчик приклеил на двухсторонний скотч сверху, так чтобы был доступ к подстроечным резисторам.

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

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

Установил ESP32-CAM sending photo на техническую полку выше холодильника.

Установил ESP32-CAM sending photo на техническую полку выше холодильника.

Настроил время срабатывания и дистанцию PIR датчика HC-SR501. Смотрел вот по такому примеру.

Настроил время срабатывания и дистанцию PIR датчика HC-SR501.

К сожалению, у меня время срабатывания максимум секунд 30, но этого достаточно для данного проекта. Если время срабатывания датчика настроить 5 сек или меньше, то у модуля esp32 cam получается очередь, так как время на фотографирование и сохранение в память занимает больше 5 секунд. И пока не закончиться очередь, он будет фотографировать, если даже в поле срабатывания ни кто не двигается.

В итоге получаются вот такие фото.

В итоге получаются вот такие фото.

Качество не очень, так как в коридоре освещение, как правило, делают не яркое. У меня не исключение. Да и модуль камеры ov2640 снимает с качеством 2МРх. Что от него ожидать?

Без освещения камера включает свою подсветку, и результат получается вот такой.

Без освещения камера включает свою подсветку, и результат получается вот такой.

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

Второй минус - это запрет на многие символы в названии файлов, поэтому время и дата выводятся не совсем в привычном формате, но все равно понятном.

Второй минус - это запрет на многие символы в названии файлов, поэтому время и дата выводятся не совсем в привычном формате, но все равно понятном.

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

На этом всё. Не забывайте подписываться на мой YouTube канал, вступать в группу Вконтакте, в группу на Facebook.

И всем пока-пока.

До встречи в новом проекте.

]]>
#18. Урок Nextion дисплей на русском, анимация на дисплее без Arduino. http://portal-pk.ru/news/244-urok-nextion-displei-na-russkom-animaciya-na-displee-bez.html Константин Portal-PK 2020-02-18T14:08:47+03:00 Сегодня в уроке научимся делать анимацию и выводить ее на дисплей Nextion. Вся программная часть будет реализована с использованием возможностей Nextion Editor, без использования Arduino.

Подготавливаем картинки для вывода анимации на экран Nextion.

Nextion display не умеет выводить gif анимацию или видео на экран. Это касается старых моделей. Новые модели, скорее всего, умеют воспроизводить видео и звук, так как в Nextion Editor появились инструменты позволяющие добавлять элементы медиа. Но у меня нет таких дисплеев, поэтому будем делать анимацию по старинке. То есть покадрово. Для того, чтобы разбить gif анимацию на кадры я использую онлайн сервис picasion.

разбить gif анимацию на кадры я использую онлайн сервис picasion

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

Анимация процесса загрузки.

Самая простая анимация, но при этом одна из самых распространенных - это анимация загрузки. Для начала создадим новый проект в Nextion Editor, если вы не знаете, как это сделать, смотрите урок: Nextion Editor урок 1. Скачиваем и первый пример hmi.

Анимация процесса загрузки.

Затем загрузим картинки для анимации. Для этого в панели Picture 1- нажмем на кнопку в виде плюса. В отрывшемся окне 2 выберем нужные картинки и нажмем на копку «Открыть» – 3.

панели Picture У нас получиться список картинок с порядковыми номерами от 0 до 51, которые мы и будем использовать.

 список картинок с порядковыми номерами

В панели инструментов «Toolbox» выбираем элемент «Timer», этот элемент невидимый и он появиться в панели элементов данного типа.


Выбираем элемент «Timer», его название - tm0

Выбираем элемент «Timer», его название - tm0. Установим значение 50 в параметре tim, это интервал срабатывания в миллисекундах, то есть картинка будет меняться каждые 50 мс. Теперь нам нужно написать код, который будет обновлять картинки, это будет небольшое условие.

На поле экрана нужно добавить картинкус номером 0. Это будет первый кадр.

На поле экрана нужно добавить картинкус номером 0. Это будет первый кадр.

Можно проверять Nextion пример анимации.

Можно проверять Nextion пример анимации.

Две кнопки по краям это просто перенаправление на другие страницы урока. Nextion hmi и tft nextion можно скачать внизу статьи, в разделе материалы для скачивания.


Эквалайзер при воспроизведении музыки.

Второй пример основан на первом. Загружаем nextion картинки и добавляем таймер.

Загружаем nextion картинки и добавляем таймер.

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

Давайте загрузим картинки для кнопок.

Давайте загрузим картинки для кнопок.

Давайте загрузим картинки для кнопок.

И добавим нужные элементы в проект.

И добавим нужные элементы в проект.

Напишем

следующий код для нажатия кнопки.


Напишем следующий код для нажатия кнопки.


Будем включать и выключать таймер 0, а также менять картинку кнопки.

Еще один nextion пример готов.Осталось запустить и проверить.

Nextion hmi и tft nextion можно скачать внизу статьи, в разделе материалы для скачивания.

Анимация по времени.

В проектах часто приходится делать вывод времени и обработку событий по определённому расписанию или через определённый интервал. В следующем примере будем производить отсчет времени на дисплее nextion без использования Ардуино. Для этого разместим элементы на экране.

 отсчет времени на дисплее nextion без использования Ардуино

Загрузим картинки для кнопок и для анимации.

Анимация тут будет без повтора, поэтому код будет видоизменен.

Загрузим картинки для кнопок и для анимации.

Также добавим второй таймер и переменную. На панели невидимых элементов это будет выглядеть вот так.

Также добавим второй таймер и переменную.Переменная va0 остается без изменений, а параметр val должен быть равен 0.

Переменная va0 остается без изменений, а параметр val должен быть равен 0.

Для второго

таймера пропишем вот такой код.


Для второго таймера пропишем вот такой код.

Интервал tim для второго счетчика устанавливаем 500 мс. Рассмотрим код подробнее.


if(p1.pic==96)
{
  p1.pic=97
  p2.pic=97
}else
{
  p1.pic=96
  p2.pic=96
n0.val++
}

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

n0.val++ - добавляет ежесекундно «1» к числу в данном поле. И мы видим секунды на наших импровизированных часах.

va0.val=n0.val%10
  if(n0.val>=60)
  {
    n0.val=10
  }
  if(va0.val==0)
  {
    p0.pic=79
  }
  if(va0.val==2)
  {
    p0.pic=102
  }

va0.val=n0.val%10 получаем остаток от деления на 10 и сохраняем в переменнуюva0.val.

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

if(va0.val==0)
  {
    p0.pic=79
  }
  if(va0.val==2)
  {
    p0.pic=102
  }

Тут мы проверяем, какое значение в нашей переменной. Если остаток от деления равен 0, тогда задаём начальную картинку анимации, что автоматически запустит анимацию. Это прописано в нашем первом таймере. Если остаток от деления равен 2, то выводим белую картинку. Это закрывает последний кадр анимации.

По данному алгоритму анимация повторяется каждые 10 секунд. «Интервал», «время» и прочие параметры можно настроить и дописать для решения вашей задачи.

Чтобы запустить анимацию с использованием Arduino достаточно отправит на nextion display

значения для включения таймера.Как это сделать смотрите в nextion уроке: Дисплей Nextion урок 2. Подключаем и передаем данные на Arduino.

Если вам интересна эта тема, смотрите мой проект часов: Часы на Arduino и дисплее Nextion с выводом температуры и влажности. В данном проекте нашел пару недочётов, скоро будет доработанная версия с еще большим функционалом.

Пишите ваши предложения и пожелания в комментариях. Чем больше будет откликов, тем чаше будут выходить проекты и уроки с использованием дисплея Nextion.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
Урок 17. Подключаем энкодер к Arduino. http://portal-pk.ru/news/243-podklyuchaem-enkoder-k-arduino.html Константин Portal-PK 2020-02-12T11:05:53+03:00 В данном уроке рассмотрим энкодер вращения и подключим его к Arduino.

Модуль KY-040 является энкодером вращения. Из названия понятно, что принцип его работы это вращение. А именно преобразование угла поворота в сигнал. Сигнал может быть цифровым и аналоговым. Более подробную информацию о видах энкодеров и принципе их действия можно почитать в интернете. Цель нашего урока подключить конкретный модуль к Arduino и научиться управлять внешними устройствами с помощью энкодера.

В данном уроке рассмотрим энкодер вращения и подключим его к Arduino.

Характеристики Энкодера KY-040:
Функция нажатия: Да
Количество импульсов на 360 гр. : 20
Число рабочих циклов: 30000
Вес: 5 грамм

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

Подключаем энкодер KY-040 к Arduino.

 Энкодер KY-040

Модуль имеет 5 контактов, это:

  • + и GND - линии питания и земли. Данный энкодер является механическим, питание для него не требуется, линии нужны для цепи с подтягивающими резисторами.
  • SW - вывод кнопки имеет потягивающий резистор, существует модули у которых при нажатии вывод замыкается на землю;
  • CLK и DT - выводы энкодера, они подтянуты к линии питания резисторами 10кОм;

Подключаем Энкодер KY-040 к Arduino UNO по схеме.

Подключаем Энкодер KY-040 к Arduino UNO по схеме.

Пример кода вывода информации о положении энкодера в монитор порта.

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

#define pin_CLK 2
#define pin_DT  4
#define pin_Btn 3
unsigned long CurrentTime, LastTime;
enum eEncoderState {eNone, eLeft, eRight, eButton};
uint8_t EncoderA, EncoderB, EncoderAPrev;
int16_t counter;
bool ButtonPrev;
eEncoderState GetEncoderState() {
  // Считываем состояние энкодера
  eEncoderState Result = eNone;
  CurrentTime = millis();
  if (CurrentTime - LastTime >= 5) {
    // Считываем не чаще 1 раза в 5 мс для уменьшения ложных срабатываний
    LastTime = CurrentTime;
    if (digitalRead(pin_Btn) == LOW ) {
      if (ButtonPrev) {
        Result = eButton; // Нажата кнопка
        ButtonPrev = 0;
      }
    }
    else {
      ButtonPrev = 1;
      EncoderA = digitalRead(pin_CLK);
      EncoderB = digitalRead(pin_DT);
      if ((!EncoderA) && (EncoderAPrev)) { // Сигнал A изменился с 1 на 0
        if (EncoderB) Result = eRight;     // B=1 => энкодер вращается по часовой
        else          Result = eLeft;      // B=0 => энкодер вращается против часовой
      }
      EncoderAPrev = EncoderA; // запомним текущее состояние
    }
  }
  return Result;
}
void setup() {
  pinMode(pin_DT,  INPUT);
  pinMode(pin_CLK, INPUT);
  pinMode(pin_Btn, INPUT); // Кнопка не подтянута к +5 поэтому задействуем внутренний pull-up резистор
  Serial.begin(9600);
  counter = 0;
}
void loop() {
  switch (GetEncoderState()) {
    case eNone: return;
    case eLeft: {   // Энкодер вращается влево
        counter--;
        break;
      }
    case eRight: {  // Энкодер вращается вправо
        counter++;
        break;
      }
    case eButton: { // Нажали кнопку
        counter = 0;
        break;
      }
  }
  Serial.println(counter);

Для удобства роботы создадим отдельную функцию опроса энкодера. С дребезгом контактов боремся задержкой опроса 1 раз в 5 мс.

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

Если у вас получается противоположное значение, т.е. при вощении против часовой стрелки получаете положительное значение. Исправьте 2 строчки:

      EncoderA = digitalRead(pin_CLK);
      EncoderB = digitalRead(pin_DT);

На вот такие.

       EncoderA = digitalRead(pin_DT);
       EncoderB = digitalRead(pin_CLK);

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


Пример управления яркостью светодиодов с помощью энкодера.

Для примера давайте подключаем к схеме выше еще 2 светодиода. В итоге схема подключения управления яркостью двух светодиодов с помощью энкодера и Arduino NANO будет вот такой.

схема подключения управления яркостью двух светодиодов с помощью энкодера и Arduino NANO

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

#define pin_CLK 2
#define pin_DT  4
#define pin_Btn 3
#define pin_led1 5 // пин подключения
#define pin_led2 6 // пин подключения


unsigned long CurrentTime, LastTime;
enum eEncoderState {eNone, eLeft, eRight, eButton};
uint8_t EncoderA, EncoderB, EncoderAPrev;
int8_t counter, brightness1, brightness2;
bool ButtonPrev;

eEncoderState GetEncoderState() {
  // Считываем состояние энкодера
  eEncoderState Result = eNone;
  CurrentTime = millis();
  if (CurrentTime - LastTime >= 5) {
    // Считываем не чаще 1 раза в 5 мс для уменьшения ложных срабатываний
    LastTime = CurrentTime;
    if (digitalRead(pin_Btn) == LOW ) {
      if (ButtonPrev) {
        Result = eButton; // Нажата кнопка
        ButtonPrev = 0;
      }
    }
    else {
      ButtonPrev = 1;
      // EncoderA = digitalRead(pin_DT);
      // EncoderB = digitalRead(pin_CLK);
      EncoderA = digitalRead(pin_CLK);
      EncoderB = digitalRead(pin_DT);
      if ((!EncoderA) && (EncoderAPrev)) { // Сигнал A изменился с 1 на 0
        if (EncoderB) Result = eRight;     // B=1 => энкодер вращается по часовой
        else          Result = eLeft;      // B=0 => энкодер вращается против часовой
      }
      EncoderAPrev = EncoderA; // запомним текущее состояние
    }
  }
  return Result;
}

void setup() {
  pinMode(pin_DT,  INPUT);
  pinMode(pin_CLK, INPUT);
  pinMode(pin_Btn, INPUT); // Кнопка подтянута к GND Иначе используем INPUT_PULLUP

  Serial.begin(9600);
  counter = 0;
}

void loop() {
  switch (GetEncoderState()) {
    case eNone: return;
    case eLeft: {   // Энкодер вращается влево
        counter--;
        break;
      }
    case eRight: {  // Энкодер вращается вправо
        counter++;
        break;
      }
    case eButton: { // Нажали кнопку
        counter = 0;
        break;
      }
  }
  Serial.println(counter);
  if (counter < 0)
  {
    brightness2 = -counter;
    brightness1 = 0;
  }
  else if (counter > 0)
  {
    brightness1 = counter;
    brightness2 = 0;
  }
  else
    brightness1 = 0, brightness2 = 0;
  analogWrite(pin_led1, brightness1);    // устанавливаем значение
  analogWrite(pin_led2, brightness2);    // устанавливаем значен
}

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

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

Энкодер широко используется в проектах на Arduino. Например, для управления работы 3D принтером используется как раз энкодер аналогичный KY-040. При разработке панели управления самодельным ЧПУ станком используется также энкодер. И это только малая доля использования энкодера. Большинство проектов, где используется потенциометр его можно заменить на энкодер. Пишите в комментариях, как вы используете энкодер.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
Oled часы с выводом температуры на Arduino своими руками. http://portal-pk.ru/news/242-oled-chasy-s-vyvodom-temperatury-na-arduino-svoimi-rukami.html Константин Portal-PK 2020-02-06T12:38:50+03:00 Я люблю разрабатывать различные часы на Arduino . Свои первые часы делал на сдвиговых регистрах, светодиодах и Arduino. Вторая версия светодиодных часов уже была сделана на адресных светодиодах (данные часы до сих пор работают и висят у меня в коридоре). С ребёнком делали часы из Лего, семисегментного индикатора и digispark. Последние, четвёртые, реализованы на Arduino и дисплее Nextion. Подписчики написали мне, что часы получаются достаточно дорогие и собирать их нецелесообразно. Согласен, что дисплей Nextion дорогой, поэтому решил собрать часы на OLED дисплее и Arduino.

Для реализации данного проекта нам понадобится:

Электронную часть OLED часов собрал на макетной плате вот по такой схеме.

Электронную часть OLED часов собрал на макетной плате вот по такой схеме.

Описание работы часов OLED часы на Arduino.

Часы имеют стандартный функционал. Вывод текущего дня недели, даты, времени и температуры. Две тактовые кнопки помогают нам настраивать дату и время.

Часы имеют стандартный функционал

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

Устанавливаем и настраиваем библиотеки.

1. Установить библиотеки Adafruit : библиотеку Adafruit_SSD1306 и библиотеку Adafruit_GFX . Как их установить, я рассматривал в уроке.

2. Скачать файл glcdfont.c и заменить его в библиотеке Adafruit-GFX. Библиотека находится C:\Users\USER\Documents\Arduino\libraries\Adafruit_GFX_Library. У вас путь до библиотеки может отличаться. Вы можете скачать, библиотеку подготовленную для вывода русского текста, внизу статьи в разделе материалы для скачивания.

3. В скетч нужно добавить функцию перекодировки русских букв из UTF-8 в Win-1251 . Добавить функцию можно внизу кода.

/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

4. Добавить в блок void setup() {} следующую строчку кода.

display.cp437(true);

5. При выводе русского текста использовать функцию utf8rus() .

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


Код OLED часы на Arduino.

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

void draw_text(byte x_pos, byte y_pos, char *text, byte text_size) {
  display.setCursor(x_pos, y_pos);
  display.setTextSize(text_size);
  display.print(utf8rus(text));
  display.display();
}

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

void display_day() { // вывод дня недели
  switch (day) {
    case 1:  draw_text(30, 0, "ВОСКРЕСЕНЬЕ", 1); break;
    case 2:  draw_text(30, 0, "ПОНЕДЕЛЬНИК", 1); break;
    case 3:  draw_text(30, 0, "  ВТОРНИК  ", 1); break;
    case 4:  draw_text(30, 0, "   СРЕДА   ", 1); break;
    case 5:  draw_text(30, 0, "  ЧЕТВЕРГ  ", 1); break;
    case 6:  draw_text(30, 0, "  ПЯТНИЦА  ", 1); break;
    default: draw_text(30, 0, "  СУББОТА  ", 1);
  }
}

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

/*
   Arduino часы с выводом температуры на DS3231 и SSD1306 OLED
   Сайт https://portal-pk.ru/
   Проекты на Arduino https://portal-pk.ru/page-17/proekty-na-arduino.html
   Проекты на ESP https://portal-pk.ru/page-18/proekty-na-nodemcu-esp8266-esp-01.html
*/
#include <Wire.h>                        // I2C 
#include <Adafruit_GFX.h>                // Включить графическую библиотеку Adafruit
#include <Adafruit_SSD1306.h>            // Включить драйвер OLED Adafruit SSD1306
#define SCREEN_WIDTH 128 // Ширина OLED-дисплея, в пикселях
#define SCREEN_HEIGHT 64 // Высота OLED-дисплея в пикселях
// SSD1306, подключенного к I2C (выводы SDA, SCL)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
#define button1    9                       // Кнопка B1 подключена к контакту Arduino 9
#define button2    8                       // Кнопка B2 подключена к контакту Arduino 8
void setup(void) {
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  delay(1000);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // инициализировать с помощью I2C адресс 0x3C (для 128x64)
  // Очистить дисплей.
  display.clearDisplay();
  display.display();
  display.cp437(true);
  display.setTextColor(WHITE, BLACK);
  display.drawRect(117, 56, 3, 3, WHITE);     // Поставить символ степени ( ° )
  draw_text(0, 56, "ТЕМПЕРАТУРА =", 1);
  draw_text(122, 56, "C", 1);
}
char Time[]     = "  :  ";
char Calendar[] = "  /  /20  ";
char temperature[] = " 00.00";
char temperature_msb;
byte i, second, minute, hour, day, date, month, year, temperature_lsb;
void display_day() { // вывод дня недели
  switch (day) {
    case 1:  draw_text(30, 0, "ВОСКРЕСЕНЬЕ", 1); break;
    case 2:  draw_text(30, 0, "ПОНЕДЕЛЬНИК", 1); break;
    case 3:  draw_text(30, 0, "  ВТОРНИК  ", 1); break;
    case 4:  draw_text(30, 0, "   СРЕДА   ", 1); break;
    case 5:  draw_text(30, 0, "  ЧЕТВЕРГ  ", 1); break;
    case 6:  draw_text(30, 0, "  ПЯТНИЦА  ", 1); break;
    default: draw_text(30, 0, "  СУББОТА  ", 1);
  }
}
void DS3231_display() {
  // Преобразовать в десятичную
  minute = (minute >> 4) * 10 + (minute & 0x0F);
  hour   = (hour >> 4)   * 10 + (hour & 0x0F);
  date   = (date >> 4)   * 10 + (date & 0x0F);
  month  = (month >> 4)  * 10 + (month & 0x0F);
  year   = (year >> 4)   * 10 + (year & 0x0F);
  Time[4]     = minute % 10 + 48;
  Time[3]     = minute / 10 + 48;
  if (second % 2)
    Time[2]   = 32;
  else
    Time[2]   = 58;
  Time[1]     = hour   % 10 + 48;
  Time[0]     = hour   / 10 + 48;
  Calendar[9] = year   % 10 + 48;
  Calendar[8] = year   / 10 + 48;
  Calendar[4] = month  % 10 + 48;
  Calendar[3] = month  / 10 + 48;
  Calendar[1] = date   % 10 + 48;
  Calendar[0] = date   / 10 + 48;
  if (temperature_msb < 0) {
    temperature_msb = abs(temperature_msb);
    temperature[0] = '-';
  }
  else
    temperature[0] = ' ';
  temperature_lsb >>= 6;
  temperature[2] = temperature_msb % 10  + 48;
  temperature[1] = temperature_msb / 10  + 48;
  if (temperature_lsb == 0 || temperature_lsb == 2) {
    temperature[5] = '0';
    if (temperature_lsb == 0) temperature[4] = '0';
    else                     temperature[4] = '5';
  }
  if (temperature_lsb == 1 || temperature_lsb == 3) {
    temperature[5] = '5';
    if (temperature_lsb == 1) temperature[4] = '2';
    else                     temperature[4] = '7';
  }
  draw_text(4,  12, Calendar, 2);                     // Показать дату (формат: дд / мм / гггг)
  draw_text(20, 30, Time, 3);                         // Показать время
  draw_text(80, 56, temperature, 1);                  // Показать температуру
}
void blink_parameter() {
  byte j = 0;
  while (j < 10 && digitalRead(button1) && digitalRead(button2)) {
    j++;
    delay(25);
  }
}
byte edit(byte x_pos, byte y_pos, byte parameter, byte text_size) {
  char text[3];
  sprintf(text, "%02u", parameter);
  while (!digitalRead(button1));                     // Подождите, пока кнопка B1 отпущена
  while (true) {
    while (!digitalRead(button2)) {                  // Если кнопка B2 нажата
      parameter++;
      if (i == 0 && parameter > 31)                  // Если date > 31 ==> date = 1
        parameter = 1;
      if (i == 1 && parameter > 12)                  // Если  month > 12 ==> month = 1
        parameter = 1;
      if (i == 2 && parameter > 99)                  // Если year > 99 ==> year = 0
        parameter = 0;
      if (i == 3 && parameter > 23)                  // Если hours > 23 ==> hours = 0
        parameter = 0;
      if (i == 4 && parameter > 59)                  // Если minutes > 59 ==> minutes = 0
        parameter = 0;
      sprintf(text, "%02u", parameter);
      draw_text(x_pos, y_pos, text, text_size);
      delay(200);                                    // Ждем 200ms
    }
    draw_text(x_pos, y_pos, "  ", text_size);
    blink_parameter();
    draw_text(x_pos, y_pos, text, text_size);
    blink_parameter();
    if (!digitalRead(button1)) {                     // Если кнопка B1 нажата
      i++;                                           // Увеличение «i» для следующего параметра
      return parameter;                              // Вернуть значение параметра и выйти
    }
  }
}
void draw_text(byte x_pos, byte y_pos, char *text, byte text_size) {
  display.setCursor(x_pos, y_pos);
  display.setTextSize(text_size);
  display.print(utf8rus(text));
  display.display();
}
void loop() {
  if (!digitalRead(button1)) {                       // Если кнопка B1 нажата
    i = 0;
    while (!digitalRead(button1));                   // Дождитесь отпускания кнопки B1
    while (true) {
      while (!digitalRead(button2)) {                // Пока кнопка B2 нажата
        day++;                                       // Инкремент для деня
        if (day > 7) day = 1;
        display_day();                               // Вызовите функцию display_day
        delay(200);                                  // Ждем 200 ms
      }
      draw_text(30, 0, "           ", 1);
      blink_parameter();                             // Вызов функции blink_parameter
      display_day();                                 // Вызовите функцию display_day
      blink_parameter();                             // Вызов функции blink_parameter
      if (!digitalRead(button1))                     // Если кнопка B1 нажата
        break;
    }
    date   = edit(4, 12, date, 2);                      // Изменить дату
    month  = edit(40, 12, month, 2);                    // Изменить month
    year   = edit(100, 12, year, 2);                    // Изменить year
    hour   = edit(20, 30, hour, 3);                     // Изменить hours
    minute = edit(74, 30, minute, 3);                   // Изменить minutes
    // Преобразовать десятичную в BCD
    minute = ((minute / 10) << 4) + (minute % 10);
    hour = ((hour / 10) << 4) + (hour % 10);
    date = ((date / 10) << 4) + (date % 10);
    month = ((month / 10) << 4) + (month % 10);
    year = ((year / 10) << 4) + (year % 10);
    // End conversion
    // Записать данные в DS3231 RTC
    Wire.beginTransmission(0x68);               // Запустите протокол I2C с адресом DS3231
    Wire.write(0);                              // Отправить адрес регистрации
    Wire.write(0);                              // Сбросьте sesonds и запустите генератор
    Wire.write(minute);                         // Запишем минуту
    Wire.write(hour);                           // Запишем  hour
    Wire.write(day);                            // Запишем  day
    Wire.write(date);                           // Запишем  date
    Wire.write(month);                          // Запишем  month
    Wire.write(year);                           // Запишем  year
    Wire.endTransmission();                     // Остановите передачу и отпустите шину I2C
    delay(200);                                 // Ждем 200ms
  }
  Wire.beginTransmission(0x68);                 // Запустите протокол I2C с адресом DS3231
  Wire.write(0);                                // Отправить адрес регистрации
  Wire.endTransmission(false);                  // Перезапуск I2C
  Wire.requestFrom(0x68, 7);                    // Запросите 7 байтов от DS3231 и освободите шину I2C
  second = Wire.read();                         // Считать секунды из регистра 0
  minute = Wire.read();                         // Считать minuts из регистра 1
  hour   = Wire.read();                         // Считать hour из регистра 2
  day    = Wire.read();                         // Считать day из регистра 3
  date   = Wire.read();                         // Считать date из регистра 4
  month  = Wire.read();                         // Считать month из регистра 5
  year   = Wire.read();                         // Считать year из регистра 6
  Wire.beginTransmission(0x68);                 // Запустите протокол I2C с адресом DS3231
  Wire.write(0x11);                             // Отправить адрес регистрации
  Wire.endTransmission(false);                  // Перезапуск I2C
  Wire.requestFrom(0x68, 2);                    // Запрос 2 байта от DS3231 и освобождение шины I2C
  temperature_msb = Wire.read();                // Чтение температуры MSB
  temperature_lsb = Wire.read();                // Считать температуру LSB
  display_day();
  DS3231_display();                             // Время и календарь
  delay(50);                                    // Ждем 50ms
}
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB8;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
            break;
          }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}

Пишите в комментариях, какие проекты на данном дисплее вы бы хотели видеть.


Возможности OLED часов на arduino.

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

Возможности OLED часов на arduino.

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

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

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


На этом всё. Не забывайте подписываться на мой YouTube канал, вступать в группу Вконтакте, в группу на Facebook.

И всем пока-пока. До встречи в новом проекте.


]]>
Обзор USB адаптера (программатора) для ESP-01 на CH340G http://portal-pk.ru/news/241-obzor-usb-adaptera-programmatora-dlya-esp-01-na-ch340g.html Константин Portal-PK 2020-02-04T13:07:38+03:00 Сегодня я расскажу про USB адаптер для ESP-01 на чипе CH340G. И поделюсь своим опытом, как можно переделать данный адаптере в программатор для esp-01.

Описание адаптера для ESP-01.

Адаптер представляет из себя плату чёрного цвета, на которой установлены: микросхема CH340G; разъем с шагом 2,5 мм для установки модуля ESP-01; стабилизатор LM62063; USB разъем для подключения к компьютеру.

Описание адаптера для ESP-01.

Приобрел я на AliExpress USB адаптер для программирования esp-01. Из названия понятно, что это просто адаптер, а не программатор. В интернете достаточно много примеров переделки USB адаптера в программатор, что я и сделал, припаяв вот такую гребенку.

припаяв вот такую гребенку

Чтобы адаптер переходил в режим программирования необходимо GPIO0 замыкать на GND. А во втором положении перемычки, чтобы не замыкала данные контакты.

переделки USB адаптера в программатор

Это решение достаточно удобное. После прошивки микроконтроллера мы можем проверить какую информацию он вводит в монитор порта. Достаточно только поменять положение перемычки.

 поменять положение перемычки

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

Для проверки работоспособности программатора можно загрузить скетч мониторинга WiFi сетей

Для проверки работоспособности программатора можно загрузить скетч мониторинга WiFi сетей.

 загрузить скетч мониторинга WiFi сетей

Данный скетч есть в стандартных примерах Arduino IDE в разделе ESP8266WiFi, точнее он ставится вместе с установкой поддержки семейства ESP8266.

 Данный скетч есть в стандартных примерах Arduino IDE в разделе ESP8266WiFi, точнее он ставится вместе с установкой поддержки семейства ESP8266.

Как настроить Arduino IDE для работы с ESP8266

Как настроить Arduino IDE для работы с ESP8266 смотрите тут.

Для прошивки микроконтроллера esp-01 устанавливаем джампер так, чтобы он замыкал GPIO0 на GND. После прошивки переставляем джампер, что позволяет вывести информацию в монитор порта и мы увидим список доступных WiFi сетей.

 увидим список доступных WiFi сетей

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

Недавно нашел на AliExpress уже готовый программатор с переключателем на плате

Он тоже сделан на микросхеме ch340g, и его принцип работы ничем не отличается от переделанного адаптера. А самое обидное то, что этот программатор стоит всего на 50-60 руб дороже, чем адаптер. Оставлю вам ссылку на программатор, чтобы вы не тратили лишнее время на переделку адаптера.

Надеюсь, что моя статья кому-нибудь помогла. Пишите своё мнение про адаптер, программатор и общее впечатление про ESP-01.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Cамодельный сенсорный светильник на Arduino (Digispark). http://portal-pk.ru/news/240-camodelnyi-sensornyi-svetilnik-na-arduino.html Константин Portal-PK 2020-01-30T11:22:11+03:00 На рынке достаточно много светильников с различными сенсорными кнопками . Что бы включить такой светильник необходимо прикоснуться к определённой области на корпусе прибора. Подобное управление я уже реализовывал, и меня не удивить таким управлением. Недавно делал елочную гирлянду, в которой управление сенсорной кнопкой выступало как альтернативное, основное управление реализовано по Wi-fi.

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

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

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

Теперь необходимо сделать основание корпуса, куда будет уложена электроника. Изначально я планировал начертить свое основание в программе Fusion 360, но на просторах интернета наткнулся вот на такой готовый вариант. Все элементы отлично подошли для моего проекта, пришлось только увеличить отверстие для установки разъёма 5,5 на 2,5 мм.

Теперь необходимо сделать основание корпуса,

Корпус готов. Переходим к электронной части проекта.

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

Для проекта понадобиться:

- digispark

- сенсорная кнопка ttp223

- разъем 5,5 на 2,5 мм

- алюминиевый профиль для светодиодных лент

- немного пластика для 3D принтера

В связи с тем, что в основании не так и много места, управлять всем будет Digispark

Электронику светильника с сенсорным управлением на Arduino (Digispark) собираю вот по такой схеме.

Электронику светильника с сенсорным управлением на Arduino (Digispark) собираю вот по такой схеме.

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

У сенсорной кнопки ttp223

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

Укладываем электронику в основание и закрываем заднюю крышку.

Укладываем электронику в основание и закрываем заднюю крышку.


Переходим к программной части.

Чтобы Digispark работал в среде Arduino IDE необходимо настроить поддержку данной платы.

Для этого в Arduino IDE зайдём во вкладку «файл», «настройки» и в открывшемся окне настроек, в поле « Дополнительные ссылки для менеджера плат » указываем вот такую ссылку. Нажимаем кнопку « OK».

Для этого в Arduino IDE зайдём во вкладку

Дополнительные ссылки для менеджера плат

Дальше переходим в меню «инструменты», выбираем пункт «менеджер плат» и в открывшемся окне в строке поиска указываем слово: «Digispark». Производим установку.

Дальше переходим в меню «инструменты»

«Digispark». Производим установку.

После чего переходим в пункт меню «инструменты» и в пункте «платы» выбираем Digispark.

После чего переходим в пункт меню «инструменты» и в пункте «платы» выбираем Digispark.

Для операционной системы Windows необходимо установить дополнительные драйвера, которые вы можете скачать по ссылке или из раздела « материалы для скачивания» в конце статьи.

Прошивка Digispark немного отличается от прошивки Arduino.

Прошивка Digispark немного отличается от прошивки Arduino. Сперва нажимаем кнопку «загрузить», после чего появляется надпись о том, что ожидается подключение устройства. Далее мы подключаем к USB Digispark. Если вы увидели бегущие проценты до 100 и в конце надпись « Thank you!». Значит ваш плата успешно прошита.

 Далее мы подключаем к USB Digispark. Если вы увидели бегущие проценты до 100 и в конце надпись «Thank you!».


Код для светильника сенсорным управлением.

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

#include <Adafruit_NeoPixel.h>
#define PIN 0               // пин подключения ленты
#define STRIPSIZE 20        // количество светодиодов в ленте
byte button_rejim = 1;      // кнопка режим
byte rejim = 0;             // текущий режим
byte yarkast = 150;         // текущая яркасть 
boolean lastButten = LOW;   // предыдущее состояние кнопки
boolean currentButten = LOW;// текущее состояние кнопки

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

С остальным, я думаю, можно разобраться, тут ничего сложного нет.

В итоге вот такой красивый стильный светильник получается.

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

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

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

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

Планирую доработать данную версию светильника. Есть идея сделать управление через Bluetooth, wi-fi с помощью мобильного приложения. Пишите в комментариях, и на форуме какую версию проекта вы бы хотели видеть. И что вас интересует, возможно даже не в рамках данного проекта.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем проекте.

]]>
Урок 16.1. Бегущая строка на русском языке. Arduino и MAX7221. http://portal-pk.ru/news/239-begushchaya-stroka-na-russkom-yazyke-arduino-i-max7221.html Константин Portal-PK 2020-01-28T12:40:35+03:00 Сегодня в уроке научимся выводить текст на русском языке на матрицу MAX7221. Для более быстрой смены текста в бегущей строке «научим» Arduino выводить на матрицу полученный текст из монитора порта . Как подключать матрицу MAX7221 к Arduino, рассказывал в предыдущем уроке: Подключаемматрицу Max72xx (MAX7219) к Arduino. Простая анимация.

Подключение светодиодной матрицы 8×8 на MAX7219 к Arduino.

Для выполнения Arduino урока нам понадобится:

Для подключения необходимо пять проводов, которые чаше всего идут в комплекте с матрицей. Подключаем вывод CLK (MAX7219 ) к выводу 13 (Arduino), вывод CS подключаем к выводу 9, вывод DIN подключаем к выводу 11. Питание подключается VCC к +5В и GND к GND.

Схема подключения модуля с 4 матрицами к Arduino UNO .

Схема подключения модуля с 4 матрицами к Arduino UNO.

Схема подключения модуля с 4 матрицамиMAX7219 к Arduino NANO будет вот такой.

Схема подключения модуля с 4 матрицамиMAX7219 к Arduino NANO
Установка библиотек Adafruit_GFX и Max72xxPanel. И настройка для вывода русского текста.

Существует несколько библиотек, доступных для управления матрицей на драйвере MAX7219 . В этом уроке я буду использовать две библиотеки: Adafruit_GFX и Max72xxPanel .

Для установки этих библиотек выполните следующие действия.
1. Откройте Arduino IDE и перейдите в раздел Скетч > Подключить библиотеку > управление библиотеками .

Должен открыться менеджер библиотек.

2. Укажите “ GFX” в поле поиска, выберете из списка и установите библиотеку от Adafruit GFX.

Аналогично установите вторую библиотеку, для этого в поле поиска укажите “GFX”

3. Библиотеку Max72xxPanel можно установить из zip архива. Для этого скачайте архив с библиотекой отсюда или внизу урока из раздела «Файлы для скачивания». В Arduino IDE перейдите в раздел Скетч > Подключить библиотеку > Добавить .ZIP библиотеку . Выбираете архив с библиотекой.

 Библиотеку Max72xxPanel можно установить из zip архива

4. Скачать файл glcdfont.c и заменить его в библиотеке Adafruit-GFX. Библиотека находится C:\Users\USER\Documents\Arduino\libraries\Adafruit_GFX_Library. У вас путь до библиотеки может отличаться. Вы также можете скачать библиотеку Adafruit-GFX подготовленную для работы с русским текстом внизу статье есть раздел с материалами для урока.

5. В скетч нужно добавить функцию перекодировки русских букв из UTF-8 в Win-1251 . Добавить функцию можно в самом низу кода.

/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

6. После установки библиотек перезагрузите среду разработки Arduino.


Пример вывода русского текста на матрицу MAX7221.

Пример вывода русского текста на матрицу MAX7221.

Пример 1. Выводим русский текст на матрицу. Текст хранится в переменной. Для смены текста нужно постоянно загружать скетч в Arduino.

В скетч нужно добавить функцию перекодировки русских букв из UTF-8 в Win-1251 . Добавить функцию можно в самом низу кода.

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

String tape = "";
int wait = 100;                             // интервал, чем меньше тем бытрее бежит строка
int spacer = 1;                             // Промежуток между символами (кол-во точек)
int width = 5 + spacer;                     // Ширина шрифта составляет 5 пикселей

void setup() {
  Serial.begin(9600);
  tape = utf8rus("Привет мир! Портал ПК");
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                     // Направление текста 1,2,3,4
}

void loop() {

  for ( int i = 0 ; i < width * tape.length() + matrix.width() - spacer; i++ )
  {
    matrix.fillScreen(LOW);

    int letter = i / width;                   // номер символа выводимого на матрицу

    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2;         // отцентрировать текст по вертикали

    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
      }
      letter--;
      x -= width;
    }
    matrix.write();                       // выведим значения на матрицу
    delay(wait);
  }
}

/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB7;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
            break;
          }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}

При выводе русского текста использовать функцию utf8rus() .

Как видно, вывод на матрицу не сильно отличается от вывода русского текста на SSD1306 OLED-диспл ей: SSD1306OLED-дисплей, вывод текста на русскомязыке в Arduino IDE


Пример 2. Выводим на матрицу русский текст, полученный из монитора порта.

Выводим на матрицу русский текст, полученный из монитора порта.

За основу возьмем первый пример. Добавим в него функцию, которая посимвольно считывает значения с монитора порта. Сохраним полученный результат в переменную для вывода значения на MAX7221. А остальная часть кода остается без изменений.

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
String tape = "";
int wait = 100;                             // интервал, чем меньше тем бытрее бежит строка
int spacer = 1;                             // Промежуток между символами (кол-во точек)
int width = 5 + spacer;                     // Ширина шрифта составляет 5 пикселей
void setup() {
  Serial.begin(9600);
  tape = utf8rus("Привет мир! Портал ПК");
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                     // Направление текста 1,2,3,4
}
void loop() {
  if (Serial.available()) {                  // получили данные
    tape = utf8rus(Serial_Read());           // Считываем и сохроняе в переменную
  }
  for ( int i = 0 ; i < width * tape.length() + matrix.width() - spacer; i++ )
  {
    matrix.fillScreen(LOW);
    int letter = i / width;                   // номер символа выводимого на матрицу
    int x = (matrix.width() - 1) - i % width;
    int y = (matrix.height() - 8) / 2;         // отцентрировать текст по вертикали
    while ( x + width - spacer >= 0 && letter >= 0 ) {
      if ( letter < tape.length() ) {
        matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
      }
      letter--;
      x -= width;
    }
    matrix.write();                       // выведим значения на матрицу
    delay(wait);
  }
}
String Serial_Read() {
  unsigned char c;                        // переменная для чтения сериал порта
  String Serial_string = "";              // Формируемая из символов строка
  while (Serial.available() > 0) {        // Если в сериал порту есть символы
    c = Serial.read();                    // Читаем символ
    if (c == '\n') {                      // Если это конец строки
      return Serial_string;               // Возвращаем строку
    }
    Serial_string = Serial_string + String(char(c)); //Добавить символ в строку
  }
  return Serial_string;
}
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x2F;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB7;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
            break;
          }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}

Для проверки работы откроем монитор порта в Arduino IDE. И напишем нужный текст.

Для проверки работы откроем монитор порта в Arduino IDE. И напишем нужный текст.

После чего нужно нажать кнопку « Отправить». Вот, что получается.

Для проверки работы откроем монитор порта в Arduino IDE. И напишем нужный текст.

Один минус. Пока не закончится показ предыдущего текста, новый не будет выводиться на матрицу. Это особенности работы матрицы MAX7221.

Матрицу можно сделать гораздо больше , и на нее выводить текст с анимацией из предыдущего урока. Пишите в комментарии, какой проект на Arduino вы бы хотели увидеть с использованием матриц MAX7221 и Arduino.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
Вездеход на гусеницах с радиоуправлением http://portal-pk.ru/news/238-vezdehod-na-gusenicah-s-radioupravleniem.html Константин Portal-PK 2020-01-18T18:26:24+03:00 На подарок купил ребенку конструктор вездеход на гусеницах с радиоуправлением . Ребенок давно хотел радиоуправляемую машинку или танк на гусеничном ходу . А тут еще и конструктор, который можно собрать самому.


Комплектация конструктора с радиоуправлением.

Конструктор имеет базу - это модуль, которым можно управлять с пульта или приложения. База имеет кнопку включения и гнездо для зарядки. На базу собираются все детали, она, как рама у машины. В комплекте есть: пульт управления, для него нужны две батарейки ААА; отвертка, которая нужна только для установки батареек в пульт; зарядное устройство , которое подключается к зарядке телефона.

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

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

Все детали разделены по пакетикам

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

список всех элементов конструктора

На первой странице список пронумерованных пакетов с деталями. А также QR код для установки приложения на телефон с OS Android или ISO.

 На первой странице список пронумерованных пакетов с деталями. А также QR код

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

Сборка машинки на гусеничном ходу.

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

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

Устанавливаем основные элементы на основание машинки. Дальше делается корпус машины.

Устанавливаем основные элементы на основание машинки.

И в конце собираются гусеницы, и устанавливаются на машину.

И в конце собираются гусеницы, и устанавливаются на машину.

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

И вот какой красивый вездеход на гусеничном ходу с радиоуправлением получается

Модель достаточно больших размеров.


Установка и использование приложения для управления вездеходом

Для установки приложения нужно сканировать QR код, который находится на первой странице инструкции. Приложение есть для устройств на OS Android и ISO .

Для установки приложения нужно сканировать QR код

При установке приложения на OS Android возникла проблема. Браузер блокирует загрузку приложения. Возможно, есть настройки для устранения данного досадного казуса, но я решил данную ситуацию установкой другого браузера uc browser. После чего приложение скачалось и установилось без проблем. Конечно, пришлось подтвердить, что разрешаю установить приложение, разрешить доступ к фото и пр. функциям.


После установки приложения надо выбрать модель базы, в моем случае это модель 3,0 серии.

После установки приложения надо выбрать модель базы, в моем случае это модель 3,0 серии.

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

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

Нужная для меня модель находиться на 3 странице.

Нужная для меня модель находиться на 3 странице.

После выбора модели в открывшемся меню нажимаем на джойстик.

После выбора модели в открывшемся меню нажимаем на джойстик.

Откроется страница управления в виде джойстика.

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

 Для подключения к внедорожнику нужно нажать на кнопку блютуз.

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

Еще одна интересная функция - это управление наклоном телефона.

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

В приложении есть функция управления по метке

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


С какими сложностями и неудобствами вы можете столкнуться:

1. Еще раз повторюсь. Приложение для управления вездеходом с телефона не скачивается стандартными браузерами с настройками по умолчанию. Для решения этой проблемы можно установить браузер uc browser . Данная проблема актуальна для устройств с операционной системой OS Android . Как обстоят дела с ISO, не проверял.

2. Машинка не соединяется попеременно с пультом и с приложением. Тут может быть несколько причин. Самая банальная заключается в том, что машина не может одновременно подключаться и к пульту и к приложению. Если вы подключены к машине с пульта и решили подключиться с приложения, то нужно сперва выключить пульт и перезагрузить машину, после чего можно подключиться и управлять с приложения. И аналогична обратная ситуация. Если вы управляли с приложения, то нужно отключить приложение и перезагрузить машинку, и после чего подключиться с пульта. Неудобно. Но так устроена работа радиопередачи, нельзя подключиться одновременно по двум каналам. А если дать такую возможность, то как управлять? И получится как в басне И. А. Крылов: «Лебедь, Щука и Рак».

Машинка не соединяется попеременно с пультом и с приложением.

Вывод.

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
#16. Подключаем матрицу Max72xx (MAX7219) к Arduino. Простая анимация. http://portal-pk.ru/news/237-podklyuchaem-matricu-max72xx-max7219-k-arduino-prostaya-animaciya.html Константин Portal-PK 2020-01-13T08:44:48+03:00

Сегодня в уроке покажу как подключить к Arduino светодиодную матрицу на MAX7219. Матрица состоит из 8 рядов и 8 столбцов, всего 64 светодиода, которыми управляет драйвер MAX7219 . В этом Arduino уроке буду использовать модуль из 4 матриц на базе драйвера MAX7219 , но это все те же матрицы, просто установлены в модуль с 4 драйверами. В дальнейшем буду подключать и 16, и 32, и, возможно, 64 матрицы. А пока, в рамках данного урока, научу управлять 1 матрицей и поиграю с 4 матрицами данного модуля.

 В этом Arduino уроке буду использовать модуль из 4 матриц на базе драйвера MAX7219

Технические параметры матрицы 8х8.

  • Драйвер: MAX7219;
  • Количество светодиодов на индикаторе 1088BS: 64;
  • Тип индикаторов 1088BS: общий катод;
  • Цвет светодиодов: красный;
  • Диаметр одного светодиода: 3 мм;
  • Интерфейс подключения матрицы: SPI;
  • Напряжение питания: 5 В;
  • Размер матрицы: 32 х 32 х 14 мм;

Как устроена матрица 8х8

Как указывалось ранее, эта матрица имеет 8 столбцов и 8 строк. Каждый светодиод индексируется от 0 до 7. Вот рисунок для лучшего понимания:

Технические параметры матрицы 8х8 на базе драйвера MAX7219

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

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

Например, если вы хотите отобразить смайлик, на матрицу MAX7219

Подключение светодиодной матрицы 8×8 на MAX7219 к Arduino.

Для выполнения Arduino урока нам понадобится :

Для подключения необходимо пять проводов, которые чаше всего идут в комплекте с матрицей. Подключаем вывод CLK (MAX7219 ) к выводу 13 (Arduino), вывод CS подключаем к выводу 9, вывод DIN подключаем к выводу 11. Питание подключается VCC к +5В и GND к GND.

Подключение матрицы MAX7219 к Arduino

Подключение матрицы MAX7219 к Arduino NANO аналогично.

Подключение матрицы MAX7219 к Arduino NANO

Схема подключения модуля с 4 матрицами ни чем не отличается. Все подключается к тем же пинам Arduino UNO .

Схема подключения модуля с 4 матрицами

Схема подключения модуля с 4 матрицамиMAX7219 к Arduino NANO будет вот такой.

Схема подключения модуля с 4 матрицамиMAX7219 к Arduino NANO

Установка библиотек Adafruit_GFX и Max72xxPanel.

Существует несколько библиотек, доступных для управления матрицей на драйвере MAX7219. В этом уроке я буду использовать две библиотеки: Adafruit_GFX и Max72xxPanel.

Для установки этих библиотек выполните следующие действия.
1. Откройте Arduino IDE и перейдите в раздел Скетч > Подключить библиотеку > управление библиотеками .

Должен открыться менеджер библиотек.

2. Укажите “ GFX” в поле поиска, выберете из списка и установите библиотеку от Adafruit GFX.

Аналогично установите вторую библиотеку, для этого в поле поиска укажите “GFX”

3. Библиотеку Max72xxPanel можно установить из zip архива. Для этого скачайте архив с библиотекой отсюда или внизу урока из раздела «Файлы для скачивания». В Arduino IDE перейдите в раздел Скетч > Подключить библиотеку > Добавить . ZIP библиотеку. Выбираете архив с библиотекой.

 Библиотеку Max72xxPanel можно установить из zip архива

4. После установки библиотеки перезагрузите среду разработки Arduino.


Примеры кода работы с матрицей MAX7219

Пример 1. Вывод двух точек на матрицу MAX7219 в среде Arduino IDE.

Вывод двух точек на матрицу MAX7219 в среде Arduino IDE.

Данный пример достаточно прост и не многим отличается от включения светодиода.

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                      // Направление текста 1,2,3,4
}
void loop() {
  matrix.drawPixel(3, 3, HIGH);            // Включаем светодиод
  matrix.write();                          // Вывод всех пикселей на матрицу
  delay(500);                              // Пауза
  matrix.drawPixel(6, 7, HIGH);            // Включаем светодиод
  matrix.write();                          // Вывод всех пикселей на матрицу
  delay(500);                              // Пауза
  matrix.drawPixel(6, 7, LOW);             // Выключаем светодиод
  matrix.write();                          // Вывод всех пикселей на матрицу
  delay(500);                              // Пауза
  matrix.drawPixel(3, 3, LOW);             // Выключаем светодиод
  matrix.write();                          // Вывод всех пикселей на матрицу
  delay(500);                              // Пауза
  matrix.drawPixel(6, 7, LOW);             // Выключаем светодиод
  matrix.write();                          // Вывод всех пикселей на матрицу
  delay(500);                              // Пауза
}

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

Пример 2 . Построчное заполнение матрицы MAX7219.

Построчное заполнение матрицы MAX7219 в среде Arduino IDE.

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

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
int y = 0;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                      // Направление текста 1,2,3,4
}
void loop() {
  matrix.fillScreen(LOW);                       // Обнуление матрицы
  for (int y = 0; y < 8; y++ ) {
    for (int x = 0; x < 32; x++ ) { // Передача массива
      matrix.drawPixel(x, y, HIGH);
      matrix.write();
      delay(200);
    }
  }
}


Пример 3 . Вывод линий по диагонали матрицы MAX7219.

Вывод линий по диагонали матрицы MAX7219 в среде Arduino IDE.

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

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
int y = 0;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                      // Направление текста 1,2,3,4
}
void loop() {
  matrix.fillScreen(LOW);                       // Обнуление матрицы
    for (int x = 0; x < 32; x++ ) { // Передача массива
      matrix.drawPixel(x, y, HIGH);
      matrix.write();
      delay(200);
      y++;
      if (y>=8)
        y=0;
    }
}

Пример 4 . Рисуем квадрат по контуру матрицы MAX7219.


Рисуем квадрат по контуру матрицы MAX7219 в среде Arduino IDE.

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

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

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
int x = 0;
int y = 0;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                      // Направление текста 1,2,3,4
}
void loop() {
  matrix.fillScreen(LOW);                       // Обнуление матрицы
  y = 0;
  for (int x = 0; x < 32; x++ ) { // Передача массива
    matrix.drawPixel(x, y, HIGH);
    matrix.write();
    delay(50);
  }
  x = 31;
  for (int y = 1; y < 8; y++ ) {
    matrix.drawPixel(x, y, HIGH);
    matrix.write();
    delay(50);
  }
  y = 7;
  for (int x = 31; x > 0; x-- ) { // Передача массива
    matrix.drawPixel(x, y, HIGH);
    matrix.write();
    delay(50);
  }
  x = 0;
  for (int y = 8; y > 0; y-- ) {
    matrix.drawPixel(x, y, HIGH);
    matrix.write();
    delay(50);
  }
  y = 0;
  for (int x = 0; x < 32; x++ ) { // Передача массива
    matrix.drawPixel(x, y, LOW);
    matrix.write();
    delay(50);
  }
  x = 31;
  for (int y = 1; y < 8; y++ ) {
    matrix.drawPixel(x, y, LOW);
    matrix.write();
    delay(50);
  }
  y = 7;
  for (int x = 31; x > 0; x-- ) { // Передача массива
    matrix.drawPixel(x, y, LOW);
    matrix.write();
    delay(50);
  }
  x = 0;
  for (int y = 8; y > 0; y-- ) {
    matrix.drawPixel(x, y, LOW);
    matrix.write();
    delay(50);
  }
}

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


Пример 5 . Мигающий прямоугольник контура матрицы MAX7219.

Мигающий прямоугольник контура матрицы MAX7219 в среде Arduino IDE.

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

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
int x = 0;
int y = 0;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                      // Направление текста 1,2,3,4
}
void loop() {
  matrix.fillScreen(LOW);                       // Обнуление матрицы
  delay(500);
  y = 0;
  for (int x = 0; x < 32; x++ ) { // 
    matrix.drawPixel(x, y, HIGH);
  }
  x = 31;
  for (int y = 1; y < 8; y++ ) {
    matrix.drawPixel(x, y, HIGH);
  }
  y = 7;
  for (int x = 31; x > 0; x-- ) { // 
    matrix.drawPixel(x, y, HIGH);
  }
  x = 0;
  for (int y = 8; y > 0; y-- ) {
    matrix.drawPixel(x, y, HIGH);
  }
  matrix.write();
  delay(500);
}

Пример 6 . Вывод графических элементов на MAX7219 в среде Arduino IDE.

Вывод графических элементов на MAX7219 в среде Arduino IDE.

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

#include <SPI.h>                             // Подключаем библиотеку SPI
#include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
#include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали
int x = 0;
int y = 0;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
void setup() {
  matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
  matrix.setRotation(3);                      // Направление текста 1,2,3,4
}
void loop() {
  const byte hf[8] = {                    // Создаем массив "Смайл"
    0b00111100,                               //    ####
    0b01000010,                               //   #    #
    0b10100101,                               //  # #  # #
    0b10000001,                               //  #      #
    0b10100101,                               //  # #  # #
    0b10011001,                               //  #  ##  #
    0b01000010,                               //   #    #
    0b00111100                                //    ####
  };                                          
  byte nf[8] = {B00111100, B01000010, B10100101, B10000001, B10111101, B10000001, B01000010, B00111100};
  byte sf[8] = {B00111100, B01000010, B10100101, B10000001, B10011001, B10100101, B01000010, B00111100};
  matrix.fillScreen(LOW);                       // Обнуление матрицы
  for (int y = 0; y < 8; y++ ) {            // Передача массива
    for (int x = 0; x < 8; x++ ) {
      matrix.drawPixel(x, y, hf[y] & (1 << x));
    }
  }
  matrix.write();
  delay(1000);
  for (int y = 0; y < 8; y++ ) {            // Передача массива
    for (int x = 0; x < 8; x++ ) {
      matrix.drawPixel(x, y, nf[y] & (1 << x));
    }
  }
  matrix.write();
  delay(1000);
  for (int y = 0; y < 8; y++ ) {            // Передача массива
    for (int x = 0; x < 8; x++ ) {
      matrix.drawPixel(x, y, sf[y] & (1 << x));
    }
  }
  matrix.write();
  delay(1000);
}

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

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

 программу PixelToMatrix

Скачать программу можно внизу урока из раздела « Файлы для скачивания»

Итоги урока.

Как видно из примеров, выводить информацию на матрицу достаточно просто. В следующем уроке покажу как выводит текст на Русском языке на MAX7219 в среде Arduino IDE .

 как выводит текст на Русском языке на MAX7219 в среде Arduino IDE

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


Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
Виды направляющих для станков с ЧПУ. http://portal-pk.ru/news/236-vidy-napravlyayushchih-i-podshipnikov-dlya-stankov-s-chpu.html Константин Portal-PK 2019-12-26T12:05:02+03:00 На протяжении нескольких лет мое хобби - это создание проектов на Arduino. В том числе разработка станков с ЧПУ на базе Arduino. Сделал я уже несколько видов ЧПУ станков, от лазерного гравировального, до фрезерного станка с ЧПУ. Также модернизировал свой 3D принтер Anet A8.

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


Направляющие полированный вал.

Самый распространенный вид направляющих для небольших станков и 3D принтеров.

Направляющие полированный вал.

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

Минус данных направляющих заключается в провисании при использовании длинных направляющих, так как нет дополнительной опоры, только крепление в 2-х точках.

шариковые втулки

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


Шлицевой вал.

Шлицевой вал.

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


Направляющая вал на опоре.

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

Направляющая вал на опоре

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

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


Шариковые профильные рельсовые направляющие.

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

Шариковые профильные рельсовые направляющие.

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

Минусом данных направляющих является высокое требование к поверхности монтажа и качеству крепления.

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

Роликовые профильные направляющие.

Роликовые направляющие являются одним из подвидов рельсовых направляющих. Их отличие в том, что в каретке добавлены ролики и, соответственно, профиль направляющей сделан так, что в нем есть паз под ролики.

Роликовые профильные направляющие.

Это увеличивает грузоподъемность и износоустойчивость.

Роликовые профильные направляющие применяются в станках для обработки черных металлов, камня и стали.


Направляющие ласточкин хвост.

Это увеличивает грузоподъемность и износоустойчивость.

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


Роликовые каретки (ролики) для алюминиевого профиля.

Роликовые каретки (ролики) для алюминиевого профиля.

Для 3D принтеров и для лазерных станков очень распространены роликовые каретки, которые перемещаются по алюминиевому профилю, который в свою очередь выступает рамой станка. Очень экономичное и достаточно эффективное решение.

Ролики бывают пластиковые и нейлоновые.

Профиль для ЧПУ (CNC) - экструзионный, он же станочный, он же openbuilds профиль. Бывает T-slot и V-slot.

Для роликовых направляющих нужно покупать профиль V-slot. Это важную мелочь упускают начинающие разработчики ЧПУ станков.

Профиль для ЧПУ (CNC) - экструзионный, он же станочный, он же openbuilds профиль. Бывает T-slot и V-slot.

Это еще не все виды направляющих для ЧПУ станков. Свои варианты и предложения пишите в комментариях.


Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующей статье.

]]>
Елочная смарт-гирлянда с управлением через мобильное приложение. http://portal-pk.ru/news/235-elochnaya-smart-girlyanda-s-upravleniem-cherez-mobilnoe.html Константин Portal-PK 2019-12-12T13:36:27+03:00 Привет всем. Сегодня расскажу про вторю версию новогодней гирлянды . Управлять данной смарт-гирляндой можно с телефонного приложения , или с помощью сенсорной кнопки .

Интерфейс приложения вот такой:

Интерфейс приложения вот такой

Гирлянда со звездой выглядит вот так:

Гирлянда со звездой выглядит

Основные возможности самодельной смарт-гирлянды:

1. 15 световых эффектов.

2. Возможность изменить набор режимов из предустановленных 55, которые устанавливаются с библиотекой WS2812FX. Достаточно выбрать номер режима и нужный эффект. Список доступных эффектов будет ниже.

3. Авто режим. Автоматически переключает режимы по кругу. Продолжительность одного режима настраивается в прошивке.

4. Настройка скорости эффектов.

5. Настройка яркости.

6. Управление сенсорной кнопкой: переключение режимов и изменение яркости.

7. Выбор цвета по умолчанию. Некоторые режимы используют один цвет, этот цвет и можно изменить. Палитра из 6 цветов.

Более подробное описание программы и приложения читайте ниже.

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


Первая версия новогодней гирлянды с управлением со смартфона.

В прошлом году, перед самым новым годом, спаял из адресных светодиодов новогоднюю гирлянду .

В прошлом году, перед самым новым годом, спаял из адресных светодиодов новогоднюю гирлянду.

И сделал простое приложение для управления.

 простое приложение для управления

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


Доработка гирлянды.

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

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

Звезда на елке у меня уже 2, или даже 3 года, покупал в Фикс прайсе .

Звезда на елке у меня уже 2, или даже 3 года, покупал в Фикс прайсе.

Светит она достаточно тускло и при работе гирлянды такой тусклый свет практически не видно. Поэтому разобрал звезду и спаял 5 адресных светодиодов WS2812 , установил по светодиоду на каждый луч звезды.

спаял 5 адресных светодиодов WS2812, установил по светодиоду на каждый луч звезды.

Вот, что получилось. Светит звезда достаточно ярко .

Светит звезда достаточно ярко

Правда мне сказали, что не хватает еще одного светодиода в центре звезды. Если успею, то добавлю и его.


Доработка электроники

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

Поэтому решил в этом году все спрятать в белую коробку.

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

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

Так как во время праздника телефон не всегда под рукой. Да и ребенку хочется самому поуправлять гирляндой.

Собрал все вот по такой схеме.

Собрал все вот по такой схеме.

Android приложение для управления смарт-гирляндой .

Приложение для Android переписал полностью. Также как и в первом варианте есть 2 страницы.

Основная, на которой производим управление светодиодами. И Страница настроек.

Настройки.

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

 ip адрес нашей гирлянды

Также у нас есть выбор режимов для гирлянды.

Также у нас есть выбор режимов для гирлянды.

Выбираем номер режима и в поле «Название эффекта» покажет какой эффект у вас установлен.

Пишем номер эффекта от 1 до 55 и нажимаем на круглую кнопку со стрелками. После чего название эффекта должно смениться на новое.

И так можно изменить все 15 режимов. Количество режимов можно увеличить или уменьшить. Это делается в прошивке в среде Arduino IDE .

Список доступных эффектов. На английском.

1. Blink - Normal blinking. 50% on/off time.
2. Breath - Does the "standby-breathing" of well known i-Devices. Fixed Speed.
3. Color Wipe - Lights all LEDs after each other up. Then turns them in that order off. Repeat.
4. Color Wipe Inverse - Same as Color Wipe, except swaps on/off colors.
5. Color Wipe Reverse - Lights all LEDs after each other up. Then turns them in reverse order off. Repeat.
6. Color Wipe Reverse Inverse - Same as Color Wipe Reverse, except swaps on/off colors.
7. Color Wipe Random - Turns all LEDs after each other to a random color. Then starts over with another color.
8. Random Color - Lights all LEDs in one random color up. Then switches them to the next random color.
9. Single Dynamic - Lights every LED in a random color. Changes one random LED after the other to a random color.
10. Multi Dynamic - Lights every LED in a random color. Changes all LED at the same time to new random colors.
11. Rainbow - Cycles all LEDs at once through a rainbow.
12. Rainbow Cycle - Cycles a rainbow over the entire string of LEDs.
13. Scan - Runs a single pixel back and forth.
14. Dual Scan - Runs two pixel back and forth in opposite directions.
15. Fade - Fades the LEDs on and (almost) off again.
16. Theater Chase - Theatre-style crawling lights. Inspired by the Adafruit examples.
17. Theater Chase Rainbow - Theatre-style crawling lights with rainbow effect. Inspired by the Adafruit examples.
18. Running Lights - Running lights effect with smooth sine transition.
19. Twinkle - Blink several LEDs on, reset, repeat.
20. Twinkle Random - Blink several LEDs in random colors on, reset, repeat.
21. Twinkle Fade - Blink several LEDs on, fading out.
22. Twinkle Fade Random - Blink several LEDs in random colors on, fading out.
23. Sparkle - Blinks one LED at a time.
24. Flash Sparkle - Lights all LEDs in the selected color. Flashes single white pixels randomly.
25. Hyper Sparkle - Like flash sparkle. With more flash.
26. Strobe - Classic Strobe effect.
27. Strobe Rainbow - Classic Strobe effect. Cycling through the rainbow.
28. Multi Strobe - Strobe effect with different strobe count and pause, controlled by speed setting.
29. Blink Rainbow - Classic Blink effect. Cycling through the rainbow.
30. Chase White - Color running on white.
31. Chase Color - White running on color.
32. Chase Random - White running followed by random color.
33. Chase Rainbow - White running on rainbow.
34. Chase Flash - White flashes running on color.
35. Chase Flash Random - White flashes running, followed by random color.
36. Chase Rainbow White - Rainbow running on white.
37. Chase Blackout - Black running on color.
38. Chase Blackout Rainbow - Black running on rainbow.
39. Color Sweep Random - Random color introduced alternating from start and end of strip.
40. Running Color - Alternating color/white pixels running.
41. Running Red Blue - Alternating red/blue pixels running.
42. Running Random - Random colored pixels running.
43. Larson Scanner - K.I.T.T.
44. Comet - Firing comets from one end.
45.Fireworks - Firework sparks.
46. Fireworks Random - Random colored firework sparks.
47. Merry Christmas - Alternating green/red pixels running.
48. Fire Flicker - Fire flickering effect. Like in harsh wind.
49. Fire Flicker (soft) - Fire flickering effect. Runs slower/softer.
50. Fire Flicker (intense) - Fire flickering effect. More range of color.
51. Circus Combustus - Alternating white/red/black pixels running.
52. Halloween - Alternating orange/purple pixels running.
53. Bicolor Chase - Two LEDs running on a background color (set three colors).
54. Tricolor Chase - Alternating three color pixels running (set three colors).
55. ICU - Two eyes looking around.

Номер и название выводиться при выборе эффекта для режима.

Номер и название выводиться при выборе эффекта для режима.

Если кто-то готов помочь с переводом режимов, буду благодарен.


Основная страница.

Тут, я думаю, все понятно. Стрелочки влево и вправо это выбор режима. Переключатель «Авто» включает или выключает Авто режим.

Переключатель «Авто» включает или выключает Авто режим.

Верхний бегунок - настройка яркости. Второй бегунок - настройка скорости эффектов.

«Цвет по умолчанию» — это выбор цвета для режимов, где используется один цвет.

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


Скетч для NodeMCU

Для того, чтобы загрузить прошивку в NodeMCU Необходимо:

1. Установить Arduino IDE. Как это сделать читайте тут: Программа Arduino IDE бесплатно для Windows, Mac OS, linux. Прошиваем Arduino

2. Настроить Arduino IDE для работы с NodeMCU: Что такое NodeMCU? Программируем в среде Arduino IDE

3. Установить библиотеки: WS2812FX, ESP_EEPROM. Скачать их можно внизу страницы, там же и все исходники.

4. Скачать прошивку, архивы внизу страницы, настроить все необходимые параметры.

Для подключения к вашей Wi-Fi сети нужно заполнить поля:

    String _ssid     = "Wi-Fi"; // Для хранения SSID
    String _password = "1234567"; // Для хранения пароля сети

Указав логин и пароль от вашей Wi-Fi сети.

Если эти поля не заполнять, то NodeMCU поднимет точку доступа с параметрами:

    IPAddress apIP(192, 168, 4, 1);
    String _ssidAP = "PortalPKGarland";   // SSID AP точки доступа
    String _passwordAP = "012345"; // пароль точки доступа

То есть в списке wi-fi сетей появится сеть " PortalPKGarland". Пароль для подключения к которой будет "012345". В таком случае в приложении нужно указать вот такой IP адрес: «192.168.4.1».

Как узнать ip если мы подключились к действующей wi-fi сети?

Для этого откройте монитор порта в Arduino IDE.

монитор порта в Arduino IDE.

И нажмите на кнопку RST на плате NodeMCU. На монитор порта выйдет информация.

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

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

Устанавливайте приложения и пользуйтесь.

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


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

Скоро будет продолжение. не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем проекте.

]]>
#15.2 Дисплей SSD1306. Вывод растрового изображения. http://portal-pk.ru/news/234-displei-ssd1306-vyvod-rastrovogo-izobrazheniya-na-ekrane.html Константин Portal-PK 2019-12-03T11:58:55+03:00 На OLED-дисплее SSD1306 можно отображать одноцветные растровые изображения размером 128×64 пикселя.

Первое, что нужно сделать, это изменить размер фотографии или изображения, и сохранить его в виде монохромного растрового изображения. Если вы находитесь на ПК с Windows, вы можете использовать Paint.

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

изображение водяного знака для сайта

свою фотографию

Как сделать свое изображение.

В сети есть множество инструментов для преобразования изображений в массив байт. Какие-то из них необходимо устанавливать, есть даже те, что работают онлайн. Кстати, такой формат изображений называется X-Bitmap. Я же буду использовать бесплатную программу LCD Image Converter. Данная программа умеет конвертировать картинки в массив данных для вывода изображений на дисплей, например на OLED-дисплей SSD1306. Программа из коробки имеет русский язык , достаточно его выбрать по умолчанию.

бесплатную программу LCDImage Converter

Затем в программе LCD Image Converter выберете «Новое изображение».

Затем в программе LCD Image Converter выберете «Новое изображение».

В открывшемся окне укажите имя, я оставил по умолчанию.

В открывшемся окне укажите имя, я оставил по умолчанию.

Для загрузки изображения нажимаем Изображение → Импортировать .

Для загрузки изображения нажимаем Изображение

Вот так выглядит моя фотография до конвертирования. Нажимаем «Преобразование»

Вот так выглядит моя фотография до конвертирования

Здесь вам нужно произвести настройки программы LCD Image Converter, как показано на картинке ниже.

Здесь вам нужно произвести настройки программы LCD Image Converter

настройки программы LCD Image Converter

Также измените параметры на вкладке «Изображения»

Также измените параметры на вкладке «Изображения»

Настройки программы LCD Image Converter на этом закончились. Сейчас можно преобразовать ваше изображение для вывода на дисплей для Arduino проектов.

преобразовать ваше изображение для вывода на дисплей для Arduino проектов.

Укажите имя файла и тип файла «.с» и сохраните файл.

Укажите имя файла и тип файла «.с» и сохраните файл.


Код Arduino для вывода растрового изображения на SSD1306 дисплей.

Файл, который вы получили содержит массив «C» с изображением. Откройте этот файл в текстовом редакторе и скопируйте массив.

static const uint8_t image_data_Image[1024] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x05, 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3b, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xef, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xf6, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xdf, 0xdb, 0xab, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x22, 0xb4, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x00, 0xaa, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x00, 0x58, 0x01, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x00, 0x78, 0x55, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0x80, 0x7c, 0x02, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x20, 0xbc, 0x01, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xa2, 0xfe, 0x0f, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xd4, 0xff, 0x57, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xd7, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0xaa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfb, 0x90, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0x51, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x50, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x02, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xf5, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x80, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x80, 0xa3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x43, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xbf, 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x49, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xa2, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf7, 0xab, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfe, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xee, 0xbf, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xfe, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xbf, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0d, 0xff, 0xeb, 0xff, 0xe8, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xfe, 0xff, 0xfd, 0x01, 0xf7, 0xef, 0xdf, 0xbf, 
    0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xfe, 0xff, 0x77, 0xff, 0xfa, 0x00, 0x1f, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x4b, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x6b, 0x07, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0x7f, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfc, 0x40, 0x3d, 0x03, 0xff, 0xff, 0xff, 0xf0, 0xfd, 0xef, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfb, 0x80, 0x00, 0x01, 0xff, 0xff, 0xff, 0xe4, 0x18, 0x10, 0x3f, 0xff, 0xff
};

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

Код в среде Arduino IDE будет выглядит вот так.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
static const uint8_t image_data_Image[1024] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x05, 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3b, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xef, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xf6, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xdf, 0xdb, 0xab, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x22, 0xb4, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x00, 0xaa, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x00, 0x58, 0x01, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x00, 0x78, 0x55, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0x80, 0x7c, 0x02, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x20, 0xbc, 0x01, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xa2, 0xfe, 0x0f, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xd4, 0xff, 0x57, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xd7, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0xaa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfb, 0x90, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0x51, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x50, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x02, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xf5, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x80, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x80, 0xa3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x43, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xbf, 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x49, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xa2, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf7, 0xab, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfe, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xee, 0xbf, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xfe, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xbf, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0d, 0xff, 0xeb, 0xff, 0xe8, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xfe, 0xff, 0xfd, 0x01, 0xf7, 0xef, 0xdf, 0xbf, 
    0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xfe, 0xff, 0x77, 0xff, 0xfa, 0x00, 0x1f, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x4b, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x6b, 0x07, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0x7f, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfc, 0x40, 0x3d, 0x03, 0xff, 0xff, 0xff, 0xf0, 0xfd, 0xef, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfb, 0x80, 0x00, 0x01, 0xff, 0xff, 0xff, 0xe4, 0x18, 0x10, 0x3f, 0xff, 0xff
};
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000); // Pause for 2 seconds
  // Clear the buffer.
  display.clearDisplay();
  // Draw bitmap on the screen
  display.drawBitmap(0, 0, image_data_Image3, 128, 64, 1);
  display.display();
}
void loop() { 
}

Но работать он будет только на NodeMCU.

Но работать он будет только на NodeMCU.

Arduino, даже семейство MEGA, не сможет отобразить ваше изображение. Это связано с тем, что нужно добавить PROGMEM, которая дает понять компилятору, что данную переменную необходимо хранить во flash памяти, а не в SRAM. Подробнее про PROGMEM можете прочитать тут.

У нас было:

static const uint8_t image_data_Image[1024]

Должно быть вот так:

static const PROGMEM uint8_t image_data_Image[1024]

Код вывода растровых изображений на дисплей SSD1306 для Arduino будет вот таким.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

static const PROGMEM uint8_t image_data_Image3[1024] = {
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xe3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x0f, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x05, 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3b, 0xdf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xef, 0xff, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0xf6, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xdf, 0xdb, 0xab, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x87, 0x22, 0xb4, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0x00, 0xaa, 0x00, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x00, 0x58, 0x01, 0xc7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x00, 0x78, 0x55, 0x6f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0x80, 0x7c, 0x02, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0x20, 0xbc, 0x01, 0x67, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8d, 0xa2, 0xfe, 0x0f, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xd4, 0xff, 0x57, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8e, 0xfb, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xd7, 0xff, 0xff, 0xe7, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xf7, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xfd, 0xaa, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xfb, 0x90, 0xbf, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xfd, 0x51, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x80, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x50, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe1, 0x02, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0xf5, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x80, 0xd3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xea, 0x80, 0xa3, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xa3, 0x43, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xbf, 0xc5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x49, 0x46, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0xa2, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdc, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x77, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf7, 0xab, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xfe, 0xfd, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xee, 0xbf, 0xfe, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0xfe, 0xfb, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xbf, 0xff, 0xfd, 0xef, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0d, 0xff, 0xeb, 0xff, 0xe8, 0x7f, 0xff, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xfe, 0xff, 0xfd, 0x01, 0xf7, 0xef, 0xdf, 0xbf, 
    0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xfe, 0xff, 0x77, 0xff, 0xfa, 0x00, 0x1f, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xd7, 0xff, 0xff, 0xff, 0xff, 0xa2, 0x4b, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xff, 0x6b, 0x07, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xfe, 0x7f, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfc, 0x40, 0x3d, 0x03, 0xff, 0xff, 0xff, 0xf0, 0xfd, 0xef, 0xff, 0xff, 0xff, 
    0xff, 0xff, 0xff, 0xfb, 0x80, 0x00, 0x01, 0xff, 0xff, 0xff, 0xe4, 0x18, 0x10, 0x3f, 0xff, 0xff
};
 
void setup() {
  Serial.begin(115200);
 
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000); // Pause for 2 seconds
 
  // Clear the buffer.
  display.clearDisplay();
  
  // Draw bitmap on the screen
  display.drawBitmap(0, 0, image_data_Image3, 128, 64, 1);
  display.display();
}
 
void loop() {
  
}

Загрузите в Arduino NANO и получите результат.

Загрузите в Arduino NANO и получите результат.

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

Если вы уменьшите растровое изображение

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

Подправил я картинку, и вот что получилось.

GIMP может конвертировать изображения с расширением .xbm

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


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

Предыдущие уроки по дисплею SSD1306:

#15Дисплей SSD1306 подключаем к Arduino. Выводимтекст, рисуем фигуры.

#15.1SSD1306 OLED-дисплей, вывод текста на русскомязыке в Arduino IDE

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
#15.1 SSD1306 OLED-дисплей, вывод текста на русском языке в Arduino IDE http://portal-pk.ru/news/233-ssd1306-oled-displei-vyvod-teksta-na-russkom-yazyke-v-arduino-ide.html Константин Portal-PK 2019-11-28T09:03:55+03:00 Как и обещал в предыдущем уроке ДисплейSSD1306 подключаем к Arduino. Выводим текст,рисуем фигуры. расскажу, как вывести текст на русском языке на 0,96-дюймовый SSD1306 OLED-дисплей в среде Arduino IDE.

 вывести текст на русском языке на 0,96-дюймовый SSD1306 OLED-дисплей в среде Arduino IDE

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

1. Установить библиотеки Adafruit : библиотеку Adafruit_SSD1306 и библиотеку Adafruit_GFX . Как их установить, я рассматривал в предыдущем уроке.

2. Скачать файл glcdfont.c и заменить его в библиотеке Adafruit-GFX. Библиотека находится C:\Users\USER\Documents\Arduino\libraries\Adafruit_GFX_Library. У вас путь до библиотеки может отличаться.

3. В скетч нужно добавить функцию перекодировки русских букв из UTF-8 в Win-1251 . Добавить функцию можно в самом низу кода.

/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

4. Добавить в блок void setup() {} следующую строчку кода.

display.cp437(true);

5. При выводе русского текста использовать функцию utf8rus().

За основу возьмите скетч из урока 15. вывод “Hello, world!” на OLED-дисплей .

И сделайте все по инструкции выше . Замените строчку

display.println("Hello,world!");

на

display.println(utf8rus("Привет МИР!"));

В итоге. у вас должен получится код:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSerif9pt7b.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println("SSD1306 allocation failed");
    for(;;);
  }
  delay(2000);
  display.cp437(true);
  display.clearDisplay();
  display.setTextSize(1);             
  display.setTextColor(WHITE);        
  display.setCursor(0,20);             
  display.println(utf8rus("Привет МИР!"));
  display.display();
  delay(2000); 
}
void loop() {
}
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

Вы уже умеете работать с выводом теста на дисплей

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

изменить размер текста и расположить по центру дисплея

Скетч данного примера будет вот таким.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000);
  display.cp437(true);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setCursor(27, 0);
  // Display static text
  display.setTextSize(2); // Draw 2X-scale text
  display.println(utf8rus("Привет"));
    display.setCursor(32, 30);
  // Display static text
  display.setTextSize(3); // Draw 3X-scale text
  display.println(utf8rus("МИР!"));
  display.display(); 
}
void loop() {
}
/* Recode russian fonts from UTF-8 to Windows-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

Ниже скетч вывода русского алфавита и вывода некоторых спец символов на 0,96-дюймовый SSD1306 OLED-дисплем в среде Arduino IDE :

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSerif9pt7b.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println("SSD1306 allocation failed");
    for(;;);
  }
  delay(2000);
  display.cp437(true);
  display.clearDisplay();
  display.setTextSize(1);             
  display.setTextColor(WHITE);        
  display.setCursor(0,0);             
  display.println(utf8rus("АБВГДЕЖЗИЙКЛМНОП"));
  display.println(utf8rus("РСТУФХЦЧШЩЪЫЬЭЮЯ"));
  display.println(utf8rus("абвгдежзийклмноп"));
  display.println(utf8rus("рстуфхцчшщъыьэюя"));
  display.println(utf8rus("Ёё123ABCabc!@#\xBC\xBD"));
  display.println(utf8rus("10\x83 10\x8A\x82 10\x81\x80 2\x85"));
  display.display();
  delay(2000); 
}
void loop() {
}
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

вывода русского алфавита и вывода некоторых спец символов на 0,96-дюймовый SSD1306 OLED-дисплем в среде Arduino IDE

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

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
unsigned char i1,i2,c3;
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000);
  display.cp437(true);
  display.clearDisplay();
}
void loop() {
  TEST_display_1();
  delay(10000);
  TEST_display_2();
  delay(10000);
  TEST_display_3();
  delay(8000);
  TEST_display_4();
  delay(4000);
}
void TEST_display_1()
{
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  for(i1=0; i1<8; i1++) {
    for(i2=0; i2<16; i2++) {
      c3=i1*16+i2;
      if(c3 == 0x0A || c3 == 0x0D) display.print(" ");
      else display.write(c3);
    }
    display.println("");
  }
  display.display();
}
void TEST_display_2()
{
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  for(i1=8; i1<16; i1++) {
    for(i2=0; i2<16; i2++)
      display.write(i1*16+i2);
    display.println("");
  }
  display.display();
}
void TEST_display_3()
{
  display.clearDisplay(); 
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.println(utf8rus("АБВГДЕЖЗИЙКЛМНОП"));
  display.println(utf8rus("РСТУФХЦЧШЩЪЫЬЭЮЯ"));
  display.println(utf8rus("абвгдежзийклмноп"));
  display.println(utf8rus("рстуфхцчшщъыьэюя"));
  display.println(utf8rus("Ёё123ABCabc!@#\xBC\xBD"));
  display.println(utf8rus("10\x83 10\x8A\x82 10\x81\x80 2\x85"));
  display.display();  
}
void TEST_display_4()
{
  display.clearDisplay(); 
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.setTextSize(1);
  display.println(utf8rus("Размер шрифта 1"));
  display.setTextSize(2);
  display.println(utf8rus("Размер 2"));
  display.setTextSize(3);
  display.println(utf8rus("Разм 3"));
  display.display();  
}
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

 вывода русского алфавита работает не только с SSD1306, но и с дисплеем Nokia 5110 (PCD8544), и с дисплеем 2.8" TFT Touch Shield 320x240

 вывода русского алфавита работает не только с SSD1306, но и с дисплеем Nokia 5110 (PCD8544), и с дисплеем 2.8" TFT Touch Shield 320x240

Данный метод вывода русского алфавита работает не только с SSD1306, но и с дисплеем Nokia 5110 (PCD8544), и с дисплеем 2.8" TFT Touch Shield 320x240.

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем уроке.

]]>
#15 Дисплей SSD1306 подключаем к Arduino. Выводим текст, рисуем фигуры. http://portal-pk.ru/news/232-displei-ssd1306-podklyuchaem-k-arduino-vyvodim-tekst-risuem.html Константин Portal-PK 2019-11-22T12:05:44+03:00 В этом уроке расскажу, как работать с 0,96-дюймовый SSD1306 OLED-дисплем в среде Arduino IDE . Покажу как вывести текст и нарисовать фигуры . Как выводить текст на русском языке покажу в следующем уроке.

OLED-дисплей, который я буду использовать в этом уроке, - это модель SSD1306: 0,96-дюймовый с разрешением 128×64 пикселя, как показано на фото ниже.

0,96-дюймовый SSD1306 OLED-дисплем

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

Дисплей поможет вам автоматизировать ваше производства, а полиэтиленовый рукав поковать вашу продукцию. Где полиэтиленовый рукав купить ? На сайте МТ-ПАК ТОРГ.

SSD1306 OLED-дисплем в среде Arduino IDE

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

Технические параметры дисплея SSD1306:

  • Технология дисплея: OLED
  • Разрешение дисплея: 128 на 64 точки
  • Диагональ дисплея: 0,96 дюйма
  • Угол обзора: 160°
  • Напряжение питания: 2.8 В ~ 5.5 В
  • Мощность: 0,08 Вт
  • Габариты: 27.3 мм х 27.8 мм х 3.7 мм

Дисплей OLED SSD1306 Описание подключения.
Поскольку OLED-дисплей использует протокол связи I2C, подключение очень простое. Как подключить к Arduino UNO или Arduino NANO смотрите в таблице ниже.

Pin

Arduino UNO или Arduino NANO

Vin

5v

GND

GND

SCL

A5

SDA

A4

Схема подключения SSD1306 к Arduino UNO

Схема подключения SSD1306 к Arduino UNO

Установка библиотеки SSD1306 OLED

Существует несколько библиотек, доступных для управления OLED-дисплеем. В этом уроке я буду использовать две библиотеки Adafruit: библиотеку Adafruit_SSD1306 и библиотеку Adafruit_GFX .

Для установки этих библиотек выполните следующие действия.
1. Откройте Arduino IDE и перейдите в раздел Скетч > Подключить библиотеку > управление библиотеками.

Должен открыться менеджер библиотеки.

2. Укажите “ SSD1306” в поле поиска, выберете из списка и установите библиотеку от Adafruit SSD1306

Должен открыться менеджер библиотеки.

3. Аналогично установите вторую библиотеку, для этого в поле поиска укажите “ GFX

Аналогично установите вторую библиотеку, для этого в поле поиска укажите “GFX”

4. После установки библиотеки перезагрузите среду разработки Arduino.


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

В вашей среде разработки Arduino, выберите Файл > Примеры > Adafruit SSD1306 и выберете тип вашего дисплея. В моем случае это 128х64_i2c.

Вот код примера для моего дисплея SSD1306

Вот код примера для моего дисплея SSD1306

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define NUMFLAKES     10 // Number of snowflakes in the animation example
#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16
static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };
void setup() {
  Serial.begin(9600);
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(2000); // Pause for 2 seconds
  // Clear the buffer
  display.clearDisplay();
  // Draw a single pixel in white
  display.drawPixel(10, 10, SSD1306_WHITE);
  // Show the display buffer on the screen. You MUST call display() after
  // drawing commands to make them visible on screen!
  display.display();
  delay(2000);
  // display.display() is NOT necessary after every single drawing command,
  // unless that's what you want...rather, you can batch up a bunch of
  // drawing operations and then update the screen all at once by calling
  // display.display(). These examples demonstrate both approaches...
  testdrawline();      // Draw many lines
  testdrawrect();      // Draw rectangles (outlines)
  testfillrect();      // Draw rectangles (filled)
  testdrawcircle();    // Draw circles (outlines)
  testfillcircle();    // Draw circles (filled)
  testdrawroundrect(); // Draw rounded rectangles (outlines)
  testfillroundrect(); // Draw rounded rectangles (filled)
  testdrawtriangle();  // Draw triangles (outlines)
  testfilltriangle();  // Draw triangles (filled)
  testdrawchar();      // Draw characters of the default font
  testdrawstyles();    // Draw 'stylized' characters
  testscrolltext();    // Draw scrolling text
  testdrawbitmap();    // Draw a small bitmap image
  // Invert and restore display, pausing in-between
  display.invertDisplay(true);
  delay(1000);
  display.invertDisplay(false);
  delay(1000);
  testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animate bitmaps
}
void loop() {
}
void testdrawline() {
  int16_t i;
  display.clearDisplay(); // Clear display buffer
  for(i=0; i<display.width(); i+=4) {
    display.drawLine(0, 0, i, display.height()-1, SSD1306_WHITE);
    display.display(); // Update screen with each newly-drawn line
    delay(1);
  }
  for(i=0; i<display.height(); i+=4) {
    display.drawLine(0, 0, display.width()-1, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(250);
  display.clearDisplay();
  for(i=0; i<display.width(); i+=4) {
    display.drawLine(0, display.height()-1, i, 0, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  for(i=display.height()-1; i>=0; i-=4) {
    display.drawLine(0, display.height()-1, display.width()-1, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(250);
  display.clearDisplay();
  for(i=display.width()-1; i>=0; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, i, 0, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  for(i=display.height()-1; i>=0; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, 0, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(250);
  display.clearDisplay();
  for(i=0; i<display.height(); i+=4) {
    display.drawLine(display.width()-1, 0, 0, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  for(i=0; i<display.width(); i+=4) {
    display.drawLine(display.width()-1, 0, i, display.height()-1, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(2000); // Pause for 2 seconds
}
void testdrawrect(void) {
  display.clearDisplay();
  for(int16_t i=0; i<display.height()/2; i+=2) {
    display.drawRect(i, i, display.width()-2*i, display.height()-2*i, SSD1306_WHITE);
    display.display(); // Update screen with each newly-drawn rectangle
    delay(1);
  }
  delay(2000);
}
void testfillrect(void) {
  display.clearDisplay();
  for(int16_t i=0; i<display.height()/2; i+=3) {
    // The INVERSE color is used so rectangles alternate white/black
    display.fillRect(i, i, display.width()-i*2, display.height()-i*2, SSD1306_INVERSE);
    display.display(); // Update screen with each newly-drawn rectangle
    delay(1);
  }
  delay(2000);
}
void testdrawcircle(void) {
  display.clearDisplay();
  for(int16_t i=0; i<max(display.width(),display.height())/2; i+=2) {
    display.drawCircle(display.width()/2, display.height()/2, i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(2000);
}
void testfillcircle(void) {
  display.clearDisplay();
  for(int16_t i=max(display.width(),display.height())/2; i>0; i-=3) {
    // The INVERSE color is used so circles alternate white/black
    display.fillCircle(display.width() / 2, display.height() / 2, i, SSD1306_INVERSE);
    display.display(); // Update screen with each newly-drawn circle
    delay(1);
  }
  delay(2000);
}
void testdrawroundrect(void) {
  display.clearDisplay();
  for(int16_t i=0; i<display.height()/2-2; i+=2) {
    display.drawRoundRect(i, i, display.width()-2*i, display.height()-2*i,
      display.height()/4, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(2000);
}
void testfillroundrect(void) {
  display.clearDisplay();
  for(int16_t i=0; i<display.height()/2-2; i+=2) {
    // The INVERSE color is used so round-rects alternate white/black
    display.fillRoundRect(i, i, display.width()-2*i, display.height()-2*i,
      display.height()/4, SSD1306_INVERSE);
    display.display();
    delay(1);
  }
  delay(2000);
}
void testdrawtriangle(void) {
  display.clearDisplay();
  for(int16_t i=0; i<max(display.width(),display.height())/2; i+=5) {
    display.drawTriangle(
      display.width()/2  , display.height()/2-i,
      display.width()/2-i, display.height()/2+i,
      display.width()/2+i, display.height()/2+i, SSD1306_WHITE);
    display.display();
    delay(1);
  }
  delay(2000);
}
void testfilltriangle(void) {
  display.clearDisplay();
  for(int16_t i=max(display.width(),display.height())/2; i>0; i-=5) {
    // The INVERSE color is used so triangles alternate white/black
    display.fillTriangle(
      display.width()/2  , display.height()/2-i,
      display.width()/2-i, display.height()/2+i,
      display.width()/2+i, display.height()/2+i, SSD1306_INVERSE);
    display.display();
    delay(1);
  }
  delay(2000);
}
void testdrawchar(void) {
  display.clearDisplay();
  display.setTextSize(1);      // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE); // Draw white text
  display.setCursor(0, 0);     // Start at top-left corner
  display.cp437(true);         // Use full 256 char 'Code Page 437' font
  // Not all the characters will fit on the display. This is normal.
  // Library will draw what it can and the rest will be clipped.
  for(int16_t i=0; i<256; i++) {
    if(i == '\n') display.write(' ');
    else          display.write(i);
  }
  display.display();
  delay(2000);
}
void testdrawstyles(void) {
  display.clearDisplay();
  display.setTextSize(1);             // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.setCursor(0,0);             // Start at top-left corner
  display.println(F("Hello, world!"));
  display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
  display.println(3.141592);
  display.setTextSize(2);             // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.print(F("0x")); display.println(0xDEADBEEF, HEX);
  display.display();
  delay(2000);
}
void testscrolltext(void) {
  display.clearDisplay();
  display.setTextSize(2); // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10, 0);
  display.println(F("scroll"));
  display.display();      // Show initial text
  delay(100);
  // Scroll in various directions, pausing in-between:
  display.startscrollright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrolldiagright(0x00, 0x07);
  delay(2000);
  display.startscrolldiagleft(0x00, 0x07);
  delay(2000);
  display.stopscroll();
  delay(1000);
}
void testdrawbitmap(void) {
  display.clearDisplay();
  display.drawBitmap(
    (display.width()  - LOGO_WIDTH ) / 2,
    (display.height() - LOGO_HEIGHT) / 2,
    logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
  display.display();
  delay(1000);
}
#define XPOS   0 // Indexes into the 'icons' array in function below
#define YPOS   1
#define DELTAY 2
void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
  int8_t f, icons[NUMFLAKES][3];
  // Initialize 'snowflake' positions
  for(f=0; f< NUMFLAKES; f++) {
    icons[f][XPOS]   = random(1 - LOGO_WIDTH, display.width());
    icons[f][YPOS]   = -LOGO_HEIGHT;
    icons[f][DELTAY] = random(1, 6);
    Serial.print(F("x: "));
    Serial.print(icons[f][XPOS], DEC);
    Serial.print(F(" y: "));
    Serial.print(icons[f][YPOS], DEC);
    Serial.print(F(" dy: "));
    Serial.println(icons[f][DELTAY], DEC);
  }
  for(;;) { // Loop forever...
    display.clearDisplay(); // Clear the display buffer
    // Draw each snowflake:
    for(f=0; f< NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SSD1306_WHITE);
    }
    display.display(); // Show the display buffer on the screen
    delay(200);        // Pause for 1/10 second
    // Then update coordinates of each flake...
    for(f=0; f< NUMFLAKES; f++) {
      icons[f][YPOS] += icons[f][DELTAY];
      // If snowflake is off the bottom of the screen...
      if (icons[f][YPOS] >= display.height()) {
        // Reinitialize to a random position, just off the top
        icons[f][XPOS]   = random(1 - LOGO_WIDTH, display.width());
        icons[f][YPOS]   = -LOGO_HEIGHT;
        icons[f][DELTAY] = random(1, 6);
      }
    }
  }
}

Если ваш OLED дисплей не имеет pin сброса, вы должны установить переменную OLED_RESET в значение -1, как показано ниже.

#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)

Не забудьте выбрать нужную плату и COM порт в меню Инструменты.

Загрузите код в Arduino, после чего вы должны получить серию различных анимаций, как показано на фота ниже.


Если ваш OLED-дисплей ничего не показывает:
Убедитесь, что OLED-дисплей правильно подключен к Ардуино.
Также вы должны изменить OLED-адрес в следующей строке, например на 0x3D, если это необходимо. В моем случае адрес 0x3C.

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {


Вывод текста на дисплей

Библиотека Adafruit для OLED-дисплея поставляется с несколькими функциями для вывода текста. В этом разделе вы узнаете, как писать и прокручивать текст с помощью функций библиотеки.
“Hello, world!” OLED-дисплей
Следующий код отображает Hello, world! сообщение на дисплее.

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSerif9pt7b.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println("SSD1306 allocation failed");
    for(;;);
  }
  delay(2000);
  display.setFont(&FreeSerif9pt7b);
  display.clearDisplay();
  display.setTextSize(1);             
  display.setTextColor(WHITE);        
  display.setCursor(0,20);             
  display.println("Hello, world!");
  display.display();
  delay(2000); 
}
void loop() {
}

После загрузки кода вот, что вы получите в вашем дисплее.

Следующий эскиз отображает Hello, world! сообщение на дисплее.


Рассмотрим скетч подробнее.

Импорт библиотек
Во-первых, вам нужно импортировать необходимые библиотеки. Библиотека для использования I2C и библиотеки Adafruit для вывода информации на дисплей: Adafruit_GFX и Adafruit_SSD1306

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Инициализация OLED-дисплея
Затем, вы определяете свою ширину и высоту дисплея. В этом примере я использую OLED-дисплей 128×64. Если вы используете другие размеры, вы можете изменить это в переменных SCREEN_WIDTH и SCREEN_HEIGHT

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Затем инициализируйте экранный объект, с шириной и высотой, определенными ранее с помощью протокола связи I2C (&Wire).

dafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

Параметр (-1) означает, что ваш OLED-дисплей не имеет pin сброса. Если ваш OLED-дисплей имеет пин сброса, то он должен быть подключен к GPIO. В этом случае вы должны передать номер GPIO.
В setup () инициализируйте последовательный монитор на скорости передачи данных 9600 бод для отладки.

Serial.begin(9600);

Инициализируйте OLED-дисплей с помощью метода begin() следующим образом

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
  Serial.println("SSD1306 allocation failed");
  for(;;); // Don't proceed, loop forever
}

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

Так же, вам может потребоваться изменить адрес OLED. В моем случае адрес 0x3C.

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {

Рассказывал об этом выше.

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

delay(2000);

Очистить дисплей, установить размер шрифта, цвет и написать текст.

После инициализации дисплея очистите буфер дисплея с помощью метода clearDisplay().

 display.clearDisplay();

Перед написанием текста, вам нужно установить размер текста, цвет и где текст будет отображаться в OLED.

Установите размер шрифта с помощью метода setTextSize().

Установите цвет шрифта с помощью метода setTextColor().

display.setTextColor(WHITE);

WHITE устанавливает белый шрифт и черный фон.

Определите позицию, с которой начинается текст, используя метод setCursor(x, y). В этом случае, вы устанавливаете текст, чтобы начать с координат (0,10).

Наконец, можно отправить текст на дисплей с помощью метода println (), как показано ниже.

display.println("Hello, world!");

Затем, вам нужно вызвать метод display (), чтобы фактически отобразить текст на экране.

Наконец, можно отправить текст на дисплей с помощью метода println (), как показано ниже

Библиотека Adafruit OLED предоставляет полезные методы для легкой прокрутки текста.

startscrollright(0x00, 0x0F): прокрутка текста слева направо
startscrollleft(0x00, 0x0F): прокрутка текста справа налево

Следующий скетч реализует методы прокрутки текста:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000);
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  // Display static text
  display.println("Scrolling Hello");
  display.display(); 
  delay(100);
}
void loop() {
  // Scroll in various directions, pausing in-between:
  display.startscrollright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
}


Нарисуйте фигуры на OLED-дисплее

Библиотека Adafruit OLED предоставляет полезные методы для рисования пикселей, линий и фигур. Давайте рассмотрим эти методы.

Чтобы нарисовать пиксель на OLED-дисплее, можно использовать метод drawPixel(x, y, color), который принимает в качестве аргументов координаты x и y, где появляется пиксель, и цвет. Например

display.drawPixel(64, 32, WHITE);

Чтобы нарисовать пиксель на OLED-дисплее

Нарисовать линию

Используйте метод drawLine(x1, y1, x2, y2, color) для создания линии. Координаты (x1, y1) указывают начало линии, а координаты (x2, y2) указывают, где заканчивается линия.

Например

display.drawLine(0, 0, 127, 20, WHITE);

Нарисовать линию

Нарисуйте прямоугольник

DrawRect (x, y, width, height, color) обеспечивает простой способ рисования прямоугольника. Координаты (x, y) указывают на верхний левый угол прямоугольника. Затем вам нужно указать ширину, высоту и цвет.

display.drawRect(10, 10, 50, 30, WHITE);

Вы можете использовать fillRect(x, y, width, height, color) для рисования заполненного прямоугольника. Этот метод принимает те же аргументы, что и drawRect.

Нарисуйте прямоугольник

Библиотека также предоставляет методы для отображения прямоугольников с закругленными углами : drawRoundRect () и fillRoundRect (). Эти методы принимают те же аргументы, что и предыдущие методы, плюс радиус угла. Например

display.drawRoundRect(10, 10, 30, 50, 2, WHITE);

Библиотека также предоставляет методы для отображения прямоугольников с закругленными углами

Или заполненный со скругленными углами прямоугольник:

display.fillRoundRect(10, 10, 30, 50, 2, WHITE);

Чтобы нарисовать круг, используйте метод drawCircle(x, y, radius, color). Координаты (x, y) указывают на центр окружности. Вы также должны передать радиус в качестве аргумента. Например

display.drawCircle(64, 32, 10, WHITE);

Чтобы нарисовать круг

Таким же образом, чтобы построить заполненный круг, используйте метод fillCircle() с теми же аргументами:

display.fillCircle(64, 32, 10, WHITE);

Нарисуйте треугольник

Используйте метод drawTriangle(x1, y1, x2, y2, x3, y3, color) для построения треугольника. Этот метод принимает в качестве аргументов координаты каждого угла и цвет.

display.drawTriangle(10, 10, 55, 20, 5, 40, WHITE);

Нарисуйте треугольник

Используйте метод fillTriangle (), чтобы нарисовать заполненный треугольник:

display.fillTriangle(10, 10, 55, 20, 5, 40, WHITE);

Используйте метод fillTriangle (), чтобы нарисовать заполненный треугольник:

Инвертирование

Библиотека предоставляет дополнительный метод, который можно использовать с фигурами или текстом: метод invertDisplay (). Передайте true в качестве аргумента, чтобы инвертировать цвета экрана, или false, чтобы вернуться к исходным цветам.

Если вы вызываете следующую команду после определения треугольника

display.invertDisplay(true);

Вы получите черный треугольник, а фон будет подсвечен.

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

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

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000); // Pause for 2 seconds
  // Clear the buffer
  display.clearDisplay();
  // Draw a single pixel in white
  display.drawPixel(64, 32, WHITE);
  display.display();
  delay(3000);
  // Draw line
  display.clearDisplay();
  display.drawLine(0, 0, 127, 20, WHITE);
  display.display();
  delay(3000);
  // Draw rectangle
  display.clearDisplay();
  display.drawRect(30, 10, 50, 30, WHITE);
  display.display();
  delay(3000);
  // Fill rectangle
  display.fillRect(30, 10, 50, 30, WHITE);
  display.display();
  delay(3000);
  // Draw round rectangle
  display.clearDisplay();
  display.drawRoundRect(10, 10, 30, 50, 2, WHITE);
  display.display();
  delay(3000);
  // Fill round rectangle
  display.clearDisplay();
  display.fillRoundRect(10, 10, 30, 50, 2, WHITE);
  display.display();
  delay(3000);
  // Draw circle
  display.clearDisplay();
  display.drawCircle(64, 32, 10, WHITE);
  display.display();
  delay(3000);
  // Fill circle
  display.fillCircle(64, 32, 10, WHITE);
  display.display();
  delay(3000);
  // Draw triangle
  display.clearDisplay();
  display.drawTriangle(10, 10, 55, 20, 5, 40, WHITE);
  display.display();
  delay(3000);
  // Fill triangle
  display.fillTriangle(10, 10, 55, 20, 5, 40, WHITE);
  display.display();
  delay(3000);
  // Invert and restore display, pausing in-between
  display.invertDisplay(true);
  delay(3000);
  display.invertDisplay(false);
  delay(3000);
}
void loop() {
}

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем уроке.


]]>
Часы на Arduino и дисплее Nextion с выводом температуры и влажности. http://portal-pk.ru/news/231-chasy-na-arduino-i-displee-nextion-s-vyvodom-temperatury-i.html Константин Portal-PK 2019-11-14T14:07:05+03:00 Медленно, но верно разрабатываю часы на Arduino с дисплеем Nextion, с выводом температуры и влажности. Данные часы не ограничатся функционалом, о котором расскажу в данной статье. Будут еще 2-3 этапа доработки проекта на Arduino и сенсорным дисплеем Nextion. Скетч и прошивку для дисплея можно скачать внизу статьи. Для этого вам нужно зарегистрироваться на сайте Portal-PK.ru.

часы на Arduino с дисплеем Nextion

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

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

Сделав несколько неудачных попыток, в итоге остановились на двух более удачных версиях:

1. Обклеили скотчем.

Обклеили скотчем.

2. Покрасили из баллончика.

Обклеили скотчем.

Опрос в нашей группе «В Контакте» показал, что покрашенный корпус для часов нравится больше , поэтому используем именно его для примера. В качестве ножек использовал болты М6.


Электронные комплектующие , которые я использовал при создании часов на Arduino с дисплеем Nextion:

1. Arduino Nano V3.0 (ATmega328). Версия Arduino Nano V2.0 (ATmega168) не подойдет, так как для текущего функционала недостаточно памяти.

2. Дисплей Nextion 2,8 дюйма. Можно и другого размера.

3. Датчик температуры и влажности SHT3x (SHT31) .

4. Часы реального времени (RTC) DS3231, я использовал версию mini.

5. Разъем 5.5 мм, для подключения питания часов.

Соединяем электронику часов по схеме :

Соединяем электронику часов на Arduino с дисплеем Nextion по схеме

Электроника на макетной плате выглядит так.

Электроника на макетной плате выглядит так.

После чего осталось установить все в корпус. Пару винтов, гаек, термоклей, изолента и часы готовы.

После чего осталось установить все в корпус

Собрать электронику можно без пайки . Для этого я использовал соединительные разъемы 2,54 мм. Правда паяльник все же пришлось взять в руки, так как нужно припаять провода питания к разъему 5,5 мм . А так же Arduino NANO у меня была без ножек.

Правда паяльник все же пришлось взять в руки, так как нужно припаять провода питания к разъему 5,5 мм.

На данный момент часы умеют:

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

2. На основном экране кроме даты и времени выводить температуру и влажность . А также дополнительное меню, в котором, на данный момент, работает только одна кнопка настроек часов.

3. Выводить меню настроек часов . Тут не все так прост. Есть две кнопки, в виде стрелок, вверх и вниз. Если активна стрелка вверх, то при нажатии на любое значение даты или времени, оно будет увеличиваться. А если нажать кнопку вниз, то все значения даты и времени будут уменьшаться. Возможно, не очень удачная реализация. Напишите ваше мнение в комментарии.

Вот такие замечательные часы на Arduino с дисплеем Nextion, с выводом температуры и влажности, получились.

Вот такие замечательные часы на Arduino с дисплеем Nextion, с выводом температуры и влажности , получились.

Скоро будет продолжение. не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем проекте.

]]>
#14 Подключаем к Arduino датчик влажности и температуры серии SHT3x (SHT31) http://portal-pk.ru/news/230-podklyuchaem-k--arduino-datchik-vlazhnosti-i-temperatury.html Константин Portal-PK 2019-11-08T08:45:21+03:00 Существует большое количество датчиков для Arduino, которые измеряют температуру и влажность. Сегодня я хотел бы рассказать про датчик серии SHT3x (SHT31). Данный сенсор достаточно новый и про него мало информации в сети интернет. После его проверки у меня остались положительные впечатления. Датчик достаточно точный и не сильно инерционный.

 датчик серии SHT3x (SHT31)

Точность этого модуля составляет ± 2% RH (для относительной влажности) и ± 0.3 °C (для температуры). Модуль осуществляет связь с последовательной шиной I2C и может работать со скоростью до 1 МГц.

Характеристики модуля температуры и влажности серии SHT3x :
- Входное напряжение (Vcc): 3.3 В или 5 В;
- I/O логический уровень: 3.3 В или 5 В (основывается на Vcc);
- Рабочий ток: 100 мА;
- Рабочая температура: -40...+125 ℃;
- Диапазон измерения температуры: -40...+125 ℃ ±0.3°C;
- Диапазон измерения RH: 0...100% ±2%;
- Сенсор: SHT31;


Уроки про другие датчики температуры и влажности:

Урок 10 - Датчик температуры DS18B20, подключаем к Arduino.

Урок 9 - Подключаем датчик температуры и влажности DHT11 к Arduino


Для данного урока нам понадобятся:

1. Arduino UNO или Arduino NANO .

2. Датчик SHT3x.

3. Беспаечная макетная плата .

4. Соединительные провода .

Подключаем к Arduino датчик влажности и температуры серии SHT3x (SHT31) по схеме:

Подключаем к Arduino датчик влажности и температуры серии SHT3x (SHT31) по схеме

Для работы нам понадобится библиотека Adafruit_SHT31.

Которую можно скачать тут.

После установки библиотеки, выберем пункт в меню Arduino IDE:

Файл > Примеры > Adafruit SHT31 Library > SHT31test

Adafruit SHT31 Library

Откроется вот такой скетч, который загружаем в Arduino.

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"
Adafruit_SHT31 sht31 = Adafruit_SHT31();
void setup() {
  Serial.begin(9600);
  while (!Serial)
    delay(10);     // will pause Zero, Leonardo, etc until serial console opens
  Serial.println("SHT31 test");
  if (! sht31.begin(0x44)) {   // Set to 0x45 for alternate i2c addr
    Serial.println("Couldn't find SHT31");
    while (1) delay(1);
  }
}
void loop() {
  float t = sht31.readTemperature();
  float h = sht31.readHumidity();
  if (! isnan(t)) {  // check if 'is not a number'
    Serial.print("Temp *C = "); Serial.println(t);
  } else { 
    Serial.println("Failed to read temperature");
  }
  if (! isnan(h)) {  // check if 'is not a number'
    Serial.print("Hum. % = "); Serial.println(h);
  } else { 
    Serial.println("Failed to read humidity");
  }
  Serial.println();
  delay(1000);
}

Откроем монитор порта и увидим вот такой результат:

Откроем монитор порта и увидим вот такой результат

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

Мое личное мнение:

Датчик мне понравился. При своих небольших габаритах работает достаточно точно и быстро.

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
#13.4 Считывание данных с SD карты, и сохранение их как «переменные» http://portal-pk.ru/news/229-134-schityvanie-dannyh-s-sd-karty-i-sohranenie-ih-kak.html Константин Portal-PK 2019-11-07T08:36:39+03:00 Объем энергонезависимой памяти EEPROM в Arduino небольшой. И как же хранить больш ой объем данных без потери при перезагрузке? Для решения этой задачи на помощь приходит SD карта .

Arduino без проблем может создавать, удалять файлы, а также записывать данные в файлы. Об этом я рассказывал в предыдущих уроках:

#13.1.Arduino SD карта. Создаем, удаляем файлы.Чтение, запись файлов.

Урок 13.3 Arduino строим графики по данным c sd карты.

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

Для данного урока нам понадоб ятся:

1. Arduino UNO или Arduino NANO

2. Модуль SD карты .

3. Беспаечная макетная плата .

4. Соединительные провода .

Подключаем SD-модуль к Arduino UNO по такой схеме.

Подключаем SD-модуль к Arduino UNO по такой схеме.

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

    7,20;
    7,00;
    7,20;
    6,40;
    7,00;
    9,00;
    9,00;

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

Назовем файл config.txt. Установим карту памяти в SD-модуль.

Назовем файл config.txt. Установим карту памяти в SD-модуль.

Напишем небольшой скетч, который будет считывать данные с SD-карты и сохранять данные в «переменные». И выводить полученное расписание будильника на монитор порта.

#include <SPI.h>
#include <SD.h>
File myFile;
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 8;
//Массив времени будильника. Можем использовать в любой строчке кода
char* names[7][2];
void setup() 
{
  // Открыть последовательное соединение и ждать открытия порта:
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  // вызавим функцию для загрузки расписания будильника.
  configSD();
}
void loop() 
{
  // после завершения настройки ничего не делать.
}
void configSD() // функции чтения конфигурационного файла с SD
{
  // вспомогательные переменные
  int h = 0; 
  int q = 0;       
  int d=7;
  char array[d][10];
  char *buffer;
  char symbol2 = 0;
  File configFile = SD.open("config.txt");
  if (configFile) 
  {
      Serial.println("config.txt open OK");
      // файл существует считываем из него данные 
        while  (configFile.available())   
        {
          // считываем байт входящего файла
          symbol2 = configFile.read();
          if (symbol2==';') // символ конца строки
          {
            array[q][h]='\0'; 
            q++; 
            h=0; 
          }
          else // если еще не конец строки посимвольно добавляем 
          {
            array[q][h] = symbol2; 
            h++;
          }
          delay(2);
        }
      configFile.close(); // закрываем файл
  }
  char *p;
  byte t;
  // разберем полученные строки разделитель запятая
  for (int j=0; j < d; j++) 
  {
    t = 0;
    for( buffer = strtok_r(array[j], ",", &p); buffer; buffer = strtok_r(NULL, ",", &p) )
    {
      names[j][t]=buffer; // запишем в массив часы и мин.
      t++;
    }
  }
  for (byte j = 0; j < d; j++) { // Выведем данные в монитор порта 
// данные из массива names[j][0] можно использовать в коде. 
         Serial.print(names[j][0]); // вывод часов 
         Serial.print(":");         // разделитель
         Serial.print(names[j][1]); // вывод минут
     }
}

Давайте подробнее рассмотрим код.

Считывание файла с SD карты вынесено в отдельную функцию. Вызываем данную функцию в блоке void setup(). Так как нам достаточно 1 раз считать расписание будильника, сохранить в «переменную» и использовать в дальнейшем. При необходимости изменить расписание будильника можно повторно вызвав данную функцию.

// вызавим функцию для загрузки расписания будильника.
  configSD();

Массив char* names[7][2]; находится в разделе «глобальных переменных» не случайно. Так как данную «переменную» мы сможем использовать в любом месте кода, и, соответственно, получить расписание будильника .

// файл существует считываем из него данные 
       while  (configFile.available())   
        {
          // считываем байт входящего файла
          symbol2 = configFile.read();
          if (symbol2==';') // символ конца строки
          {
            array[q][h]='\0'; 
            q++; 
            h=0; 
          }
          else // если еще не конец строки посимвольно добавляем 
          {
            array[q][h] = symbol2; 
            h++;
          }
          delay(2);
        }
      configFile.close(); // закрываем файл

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

// разберем полученные строки разделитель запятая
  for (int j=0; j < d; j++) 
  {
    t = 0;
    for( buffer = strtok_r(array[j], ",", &p); buffer; buffer = strtok_r(NULL, ",", &p) )
    {
      names[j][t]=buffer; // запишем в массив часы и мин.
      t++;
    }
  }

В этом цикле мы разбираем наши строки на элементы разделенные запятой. И сохраняем в наш массив char* names[7][2];

Сейчас мы можем оперировать нашим расписанием.

Для обработки большего количества данных вы можете воспользоваться, например, Arduino MEGA

Давайте выведем в монитор порта наше расписание. Для этого напишем вот такой небольшой цикл:

  for (byte j = 0; j < d; j++) { // Выведем данные в монитор порта 
// данные из массива names[][] можно использовать в коде. 
         Serial.print(names[j][0]); // вывод часов 
         Serial.print(":");         // разделитель
         Serial.print(names[j][1]); // вывод минут
     }

Данный пример можно доработать, чтоб обрабатывать другое количество данных с SD карты средствами Arduino. Но вы должны помнить, что чем больше данных вы будете сохранять в «переменную», тем больше вам понадобится динамической памяти, которой не так и много в Arduino UNO или NANO . Для обработки большего количества данных вы можете воспользоваться, например, Arduino MEGA или другой отладочной платой с большим объемом динамической памяти.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
ESP32-CAM ov2640, потоковое видео в среде Arduino IDE. http://portal-pk.ru/news/228-esp32-cam-ov2640-potokovoe-video-v-srede-arduino-ide.html Константин Portal-PK 2019-11-05T13:26:12+03:00 Эта статья представляет собой краткое руководство по началу работы для платы ESP32-CAM. Я расскажу как настроить веб-сервер потокового видео менее, чем за 5 минут с помощью Arduino IDE.

Примечание: в этой статье я использую пример из библиотеки arduino-esp32, но не рассматриваю как его изменить.

ESP32-камера - это очень маленький модуль камеры с чипом ESP32-S

ESP32-камера - это очень маленький модуль камеры с чипом ESP32-S, который стоит около $ 10. Помимо камеры OV2640 и нескольких GPIO для подключения периферийных устройств, он имеет слот для карт microSD, который может быть полезен для хранения изображений, сделанных с помощью камеры, или хранения файлов.


Основные характеристики ESP32-CAM:

Беспроводной модуль - ESP32-S WiFi 802.11 b/g/n + модуль Bluetooth;

Внешнее хранилище - слот для карт micro- SD ёмкостью до 4 ГБ;

Поддержка камер OV2640 (продаётся с платой) или OV7670;

Формат изображения - JPEG (только OV2640), BMP, оттенки серого;

Светодиодная вспышка.

Контакты – 16 с интерфейсами UART, SPI, I2C, PWM

Напряжение питания - 5 В;

Потребляемая мощность:

  • при выключенной вспышке - 180 мА;
  • при включенной вспышке - 310 мА;
  • глубокий сон - 6 мА;
  • модем-сон - 20 мА;
  • лёгкий сон - 6,7 мА.

Размеры - 40,5 х 27 х 4,5 мм

Температурный диапазон:

  • рабочий: 20 – 85 ℃;
  • хранение: -40 - 90 ℃ при 90% относительной влажности.

Карты памяти на 4 Гб не было под рукой, поэтому проверить не получилось. Ставил на 16 Гб. Не сохраняет.

На следующем рисунке показаны выводы ESP32-CAM.

показаны выводы ESP32-CAM

Есть три вывода GND и два вывода для питания: 3.3 V, либо 5V.

GPIO 1 и GPIO 3 - это последовательные контакты. Вам нужны эти контакты, чтобы загрузить код на вашу плату. Кроме того, GPIO 0 играет важную роль, поскольку он определяет, находится ли ESP32 в режиме программирования или нет. Когда GPIO 0 подключен к GND, ESP32 находится в режиме программирования.


Для программирования ESP32-камеры понадобятся следующие компоненты:


Приступим к установке, настройке необходимого ПО и прошивке ESP32. Разделим вс ё на несколько этапов:

1. Установка дополнения ESP32
В этом примере я использую Arduino IDE для программирования платы ESP32-CAM. Установите Arduino IDE, и настройте работу с ESP32. Если этого у вас не сделано, воспользуетесь следующей инструкцией:

Установка, прошивка платы ESP32 в Arduino IDE (Windows, Mac OS X, Linux)

2. Пример Кода CameraWebServer
В среде Arduino IDE выберите пример для работы с камерой для этого перейдите:

Файл > Примеры > ESP32 > Camera>CameraWebServer

Пример Кода CameraWebServer

Откроется пример скетча работы с камерой ESP32:

Откроется пример скетча работы с камерой ESP32:

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

После загрузки распакуйте папку и откройте файл скетча для esp32 cam ov2640: CameraWebServer.ino.

Перед загрузкой прошивки в модуль ESP32 CAM необходимо указать ваши данные для подключения к Wi-Fi сети.

const char* ssid = "Имя_точки_wi-fi";
const char* password = "пароль_от_wi-fi";

Затем убедитесь, что вы выбрали правильный модуль камеры. В данном случае используйте модель AI-THINKER Model. Для этого закомментируйте все другие модели и раскомментируйте указанную ниже:

 данном случае используйте модель AI-THINKER Model.

#define CAMERA_MODEL_AI_THINKER

Теперь код готов к загрузке на вашу ESP32.

3. Прошивка ESP32-CAM

Для прошивки я использую самый недорогой TTL программатор. И всё прошивается и работает отлично.

Подключаю всё вот по такой схеме:

Прошивка ESP32-CAM

Важно! GPIO 0 должен быть подключен к GND, чтобы вы смогли загрузить код.


Чтобы загрузить код, выполните следующие действия:

  • Перейдите в меню Инструменты > Плата и выберите модуль ESP32 Wrover
  • Перейдите в меню Инструменты > порт и выберите COM-порт, к которому подключен ESP32
  • В меню Инструменты > Partition Scheme , выберите “Huge APP (3MB No OTA)
  • Нажмите кнопку ESP32-CAM on-board RESET
  • Затем нажмите кнопку Загрузка, чтобы загрузить код

Чтобы загрузить код, выполните следующие действия:

Важно! Если вы не можете загрузить код, то еще раз проверьте, что GPIO 0 подключен к GND и, что вы выбрали правильные настройки в меню Инструменты. Вы также должны нажать кнопку сброса на борту, чтобы перезагрузить ESP32 в режиме программирования.

4. Получение IP-адреса и подключение к камере.

После загрузки кода отключите GPIO 0 от GND. Подключите питание на 5 В. На 3,3 В у меня камера не заработала.

Откройте последовательный монитор со скоростью передачи данных 115200. Нажмите кнопку ESP32-CAM on-board Reset.

IP-адрес ESP32 должен быть выведен в последовательном мониторе.

IP-адрес ESP32 должен быть выведен в последовательном мониторе.

Теперь вы можете получить доступ к серверу потоковой передачи камеры в локальной сети. Откройте браузер и введите IP-адрес ESP32-CAM . Нажмите кнопку Start Streaming, чтобы начать потоковую передачу видео.

Нажмите кнопку Start Streaming, чтобы начать потоковую передачу видео.

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

Есть еще несколько настроек камеры, с которыми вы можете поиграть, чтобы настроить параметры изображения.

Есть еще несколько настроек камеры, с которыми вы можете поиграть, чтобы настроить параметры изображения.

Если вы откроете монитор порта во время работы камеры, то вы получите подробную информацию о количестве кадров в секунду, о скорости обработки и пр.

Если вы откроете монитор порта во время работы камеры, то вы получите подробную информацию о количестве кадров в секунду

Чем выше качество потокового вещания, тем меньше кадров. Комфортно работает при разрешении 600х800.

Если вы откроете монитор порта во время работы камеры, то вы получите подробную информацию о количестве кадров в секунду

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

Подписывайтесь на наш канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующей статье.

]]>
Функция strtok_r() – разбиение строки на части по указанному разделителю. Arduino IDE http://portal-pk.ru/news/227-funkciya-strtok_r---razbienie-stroki-na-chasti-po.html Константин Portal-PK 2019-11-05T12:11:59+03:00 Функция strtok_r() – разбиение строки на части по указанному разделителю. Arduino IDE

char *strtok_r(char *str, const char *delim, char **saveptr);

Пример работы функции

void testsChar()
{
  char *str;
  char sz[] = "wills,this,works,40,43";
  char *p = sz;
  while ((str = strtok_r(p, ",", &p)) != NULL) 
    {
     Serial.println(str);
    }
}
]]>
Установка, прошивка платы ESP32 в Arduino IDE (Windows, Mac OS X, Linux) http://portal-pk.ru/news/226-ustanovka-proshivka-platy-esp32-v-arduino-ide-windows-mac-os-x-linux.html Константин Portal-PK 2019-11-03T17:06:22+03:00 Существует надстройка для Arduino IDE, которая позволяет программировать ESP32 с использованием Arduino IDE и его языка программирования. В этой статье мы покажем вам, как установить плату ESP32 в Arduino IDE, не зависимо от используемой вами операционной системы: Windows, Mac OS X или Linux.

Если у вас возникли какие-либо проблемы во время процедуры установки, сообщите об этом на форуме.

esp32 devkit

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


Установка дополнения ESP32 в Arduino IDE

Чтобы установить плату ESP32 в Arduino IDE, выполните следующие действия:
1. В вашем Arduino IDE перейдите в Файл> Настройки

установить плату ESP32 в Arduino IDE

2. Войдите https://dl.espressif.com/dl/package_esp32_index.json. в поле "Дополнительные ссылки для менеджера платы", как показано на рисунке ниже. Затем нажмите кнопку OK.

Дополнительные ссылки для менеджера платы

Внимание: Если вы у вас установлена в Arduino IDE ESP8266 то добавьте 2 строки или через запятую:

    https://dl.espressif.com/dl/package_esp32_index.json

    http://arduino.esp8266.com/stable/package_esp8266com_index.json

3. Откройте Менеджер плат. Перейдите в меню Инструменты > Платы > Менеджер плат

Менеджер плат

4. Ищем ESP32. И нажимаем кнопку Установка.

Ищем ESP32

5. Вот и все. Через пару минут у вас все установиться.


Первая загрузка скетча в ESP32.

Подключите плату ESP32 к компьютеру. Открываем Arduino IDE и выполним следующие действия:

1. Выберите доску в меню Инструменты > Плата (в моем случае это DOIT ESP32 DEVKIT V1 )

Инструменты WiFiScan

Плата (в моем случае это DOIT ESP32 DEVKIT V1)" width="382" height="240" style="display: block; margin: auto; width: 382px; height: 240px;" rel="display: block; margin: auto; width: 382px; height: 240px;">

2. Выберите порт (если вы не видите COM-порт в Arduino IDE, вам необходимо установить драйверы CP210x USB to UART Bridge VCP). В моем случае ком порт отображается по другому. Это связанно с тем что я использую OS Linux.

Выберите порт

3. Открыть в следующем примере в Файл > Примеры > WiFi > WiFiScan

Примеры WiFiScan

4. В вашей среде Arduino IDE откроется новый скетч.

Arduino IDE откроется новый скетч

5. Нажмите кнопку Загрузить в Arduino IDE. Подождите несколько секунд, пока код компилируется и загружается на вашу плату.

 Загрузить в Arduino IDE

Внимание! Если у вас бежит строка с повторяющимися точками и линиями. Нажмите кнопку Boot на плате и удерживайте ее пока не побегут проценты загрузки. После чего кнопку можно отпустить.

Нажмите кнопку Boot

6. Откройте последовательный монитор Arduino IDE со скоростью передачи данных 115200.

 Откройте последовательный монитор Arduino IDE

7. Нажмите кнопку EN на борту ESP32 , и вы увидите список сетей, доступных для вашей ESP32.

Распиновка ESP32 DEVKIT V1

Подведение итогов.
Это краткое руководство, которое иллюстрирует, как подготовить ваш Arduino IDE для ESP32 на компьютере с ОС Windows, Mac OS X или Linux. Если во время установки возникнут какие-либо проблемы, пишите на форум.

Теперь вы можете начать создавать свои собственные проекты IoT с ESP32.

Подписывайтесь на наш канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующей статье.

]]>
Урок 13.3 Arduino строим графики по данным c sd карты. http://portal-pk.ru/news/225-arduino-stroim-grafiki-po-dannym-c-sd-karty.html Константин Portal-PK 2019-10-18T14:59:30+03:00 Сегодня в уроке мы сохраним данные и время считывания данных в файл. Который можно открыть в Excel и построить график.

Как вывести график на смартфон, в режиме реального времени смотрите тут: Arduino SD карта. Воспроизводим звуки и музыку в wav формате.

Arduino строим графики

Для урока нам понадобиться:

1. Arduino UNO или Arduino NANO

2. Модуль SD карты .

3. Беспаечная макетная плата .

4. Соединительныепровода.

5. Модуль реального времени DS3231


Модуль DS3231 выбрал не случайно. В нем есть датчик температуры . И мы можем сохранять значение температуры и время замеров .

Это наглядный пример использования легирование показаний с датчиков . Вы можете использовать другое датчики: DS18B20, DHT11, DHT22 . Также вы можете использовать одновременно несколько датчиков и сохранять показание с них.

Подключаем SD-модуль и модуль реального времени DS3231 к Arduino UNO по схеме.

Подключаем SD-модуль и модуль реального времени DS3231 к Arduino UNO по схеме.

Для работы нам понадобиться библиотека DS3231.h. Скачать ее можно с сайта разработчика или в разделе для скачивания файлов внизу страницы.

Мы уже научились работать с картой, если возникнут сложности посмотрите предыдущий урок: Arduino SD карта. Создаем, удаляем файлы. Чтение, запись файлов.

Перейдем сразу к модулю времени DS3231 . Для его подключения нужно добавить всего пару строк:

#include <DS3231.h> // Библиотека для часов реального времени 
// Подключаем часы реального времени 
DS3231  rtc(SDA, SCL);    //(A4 = SDA, A5 = SCL)
void setup() {
....
rtc.begin(); // инициализируем часы реального времени   
}

Для вывода текущего времени и температуры есть 2 функции.

#include <SD.h>
#include <SPI.h>
#include <DS3231.h> // Библиотека для часов реального времени 
File myFile;
// Подключаем часы реального времени 
DS3231  rtc(SDA, SCL);    //(A4 = SDA, A5 = SCL)
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 4;
void setup() {
 // Открыть последовательное соединение и ждать открытия порта:
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  rtc.begin(); // инициализируем часы реального времени   
}
void loop() {
  // выведим время и черз запятую температуру с дачика модуля DS3231
  Serial.print(rtc.getTimeStr());
  Serial.print(",");
  Serial.println(int(rtc.getTemp()));
 // открываем файл для записи
  myFile = SD.open("test.csv", FILE_WRITE);
  if (myFile) {  /// записываем данные черз запятую  
    myFile.print(rtc.getTimeStr());
    myFile.print(",");    
    myFile.println(int(rtc.getTemp()));
    myFile.close(); // закрываем файл
  }
  // Если не получилось открыть файл для записи выводим ошибку
  else {
    Serial.println("error opening test.txt");
  }
  delay(10000); /// ждем 10 сек. И повторяем запись данных в файл.
}

Для примера работы выведем время и показания в монитор порта.

Для примера работы выведем время и показания в монитор порта.

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

 А можно сохранить в файл TEST.csv.

Можно сохранять в текстовый файл. А можно сохранить в файл TEST.csv.

 Просто я погрел пальцами модуль времянки. И после он постепенно остывал.

Это тоже текстовый файл. Но его можно сразу открыть в Excel.

 TEST.csv. Это тоже текстовый файл. Но его можно сразу открыть в Excel.

Осталось только построить график по полученным данным.

У вас наверное возникнет вопрос, почему у меня так скачет температура? Нет у меня нет резкого изменения температуры в комнате. Просто я погрел пальцами модуль времянки. И после он постепенно остывал.

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

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем уроке.


]]>
Обзор панели управления самодельного ЧПУ. Запуск фрезерования. http://portal-pk.ru/news/224-obzor-paneli-upravleniya-samodelnogo-chpu-zapusk.html Константин Portal-PK 2019-10-15T08:29:31+03:00 Продолжаю обзор самодельного фрезерного ЧПУ станка с дисплеем . И сегодня рассмотрим панель управления. И основные настройки станка. Обзор станка и пример фрезерования смотрите тут: Самодельный ЧПУ фрезерный станок на Arduino с дисплеем

Продолжаю обзор самодельного фрезерного ЧПУ станка с дисплеем.

Немного предыстории. Как-то раз сидел я за компьютером дела модель для своего 3D принтера Annet A8. Про который я уже рассказывал. И делал модернизацию. И вот сижу и думаю. Почему 3Д принтеры так популярны. Даже в нашем небольшом городе их достаточно много.

Да, стоят они недорого. Но это не основной критерий их популярности, по моему мнению. Основной фактор такой большой популярности это относительно простата сборки и использования. У меня отец предпенсионного возраста без проблем печатает на 3Д принтер. Также принтеры имеют небольшой размер, что позволяет их поставить даже в квартире. Возможно добавить дешевый и разнообразный выбор пластика. Но мы живем в России и проблем с разнообразием древесины у нас нет. И стоимость фанеры у нас небольшая. Так что этот фактор рассматривать не буду. А вы как как думаете? Пишите ваше мнение в комментариях.

И тут я задался вопросом. А можно ли сделать более доступный ЧПУ фрезерный станок? Для этого нужно сделать его небольших размеров и с простым управлением. На подобии 3D принтера. Стоимость скорее всего сильно снизить не получиться.

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

Взял за основу одну из распространенных прошивку для 3D принтеров Marlin.

Вот такая панель управления ЧПУ станком в итоге у меня получилась. Боле подробный обзор смотрите в видео.

Есть ряд недочетов.Основная которая бросается в глаза это местами проскакивает слова «печать» и не все перевел на русский язык. Но это дела техники.

Все подправлю. Также есть ряд функций которые хотелось бы добавить. Но всему свое время.

Самодельный фрезерный станок с ЧПУ основную задачу выполняет.

Самодельный фрезерный станок с ЧПУ основную задачу выполняет. На нем можно работать без компьютер . Достаточно скинуть файл на карту памяти . Выбрать и станок все отфрезерует.

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

Всем Пока-Пока.

И до встречи в следующем проекте.

]]>
#13.2 Arduino SD карта. Воспроизводим звуки и музыку в wav формате. http://portal-pk.ru/news/223-arduino-sd-karta-vosproizvodim-zvuki-i-muzyku-v-wav-formate.html Константин Portal-PK 2019-10-14T13:45:40+03:00 Продолжаем работу с SD картой в среде Ardino IDE. И сегодня мы будем воспроизводить мелодии и уведомления с карты памяти .

Качество воспроизводимой музыки не очень хорошее . Смотрите пример в виде. Звук тихий так как мелодии и оповещения воспроизводятся без какого либо усиления. Так звук воспроизводит Arduino. Не забудьте добавить звук при просмотре видео.

Это связанно с вычислительными способностями Arduino. Поэтому требования к аудио файлам будут напрямую зависеть от возможности микроконтроллера данной отладочной платы:

  • частота дискретизации: 16000 Гц;
  • количество каналов: моно;
  • количество бит: 8.

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

Выбираем файл настраиваем параметры и конвертируем. По моему опыту можно использовать достаточно большие файлы в несколько десятков Мб.

 Скачаем нужные нам треки или уведомления и конвертируем их

После чего скачиваем полученный трек и загружаем его на флешку.

После чего скачиваем полученный трек и загружаем его на флешку.

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

Для урока нам понадобиться:

1. Arduino UNO или Arduino NANO

2. Модуль SD карты .

3. Беспаечная макетная плата .

4. Соединительные провода .

5. Динамик. Я использую от ноутбука.

Подключаем SD-модуль и динамик к Arduino UNO по такой схеме.

Подключаем SD-модуль и динамик к Arduino UNO по такой схеме.

Для данного урока нам понадобится библиотека TMRpcm, которая умеет асинхронного воспроизведения PCM/WAV файлов напрямую с SD карты.

Скачать и более подробная документация смотрите на GitHub .

Основные функции библиотеки TMRpcm.


music.play("sound.wav");      // Воспроизвести файл на выходе 0
music.play("sound.wav",30,1); // Воспроизвести файл, начиная с 30-ой секунды, на выходе 1
music.play("sound.wav",0);    // play(имя_файла, выход 0 или 1) определяется speakerpin или speakerpin2
music.stopPlayback(0);     // Может принимать номер выхода 0 или 1
music.volume(0,1);         // Уменьшить громкость на выходе 1

Давайте сделаем на основе предыдущего урока небольшую программу воспроизведения 6 файлов.


#include <SD.h>             // необходимо включить SD библиотеку
#include <TMRpcm.h>         // также необходимо включить данную библиотеку...
#include <SPI.h>
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 4;
TMRpcm music;   // создать объект для использования в данном скетче
void setup()
{
  // Открыть последовательное соединение и ждать открытия порта:
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
  music.setVolume(5);    //   от 0 до 7. Установка уровня громкости
  music.quality(1);        //  1 для 2x передескритезации, 0 for для нормального режима
}
void loop()
{  
  music.play("sounds/2.wav");
    Serial.println("Play 2.wav");
    delay(30000);
  music.play("sounds/1.wav");
    Serial.println("Play 1.wav");
    delay(10000);
  music.play("sounds/3.wav");
    Serial.println("Play 3.wav");
    delay(10000);
  music.play("sounds/4.wav");
    Serial.println("Play 4.wav");
    delay(3000);
  music.play("sounds/5.wav");
    Serial.println("Play 5.wav");
    delay(3000);
  music.play("sounds/6.wav");
    Serial.println("Play 6.wav");
    delay(3000);
}

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

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

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

Управлять будем через Монитор порта.

Команды:

1 - воспроизводим трек

2 - воспроизвести трек, начиная с 30-ой секунды

3 - поставить воспроизведение на паузу / продолжить воспроизводить

4 - устанавливает уровень громкости 0 — выключаем.

5 - устанавливает уровень громкости 5 -включаем (макс. 7).

0 - выключаем воспроизведение трека.


#include <SD.h>             // необходимо включить SD библиотеку
#include <TMRpcm.h>         // также необходимо включить данную библиотеку...
#include <SPI.h>
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 4;
int ser = 0;  // значение из порта
TMRpcm music;   // создать объект для использования в данном скетче
void setup()
{
 // Открыть последовательное соединение и ждать открытия порта:
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  music.speakerPin = 9; // 11 на Mega, 9 на Uno, Nano и т.д.
  music.setVolume(5);    //   от 0 до 7. Установка уровня громкости
  music.quality(1);        //  1 для 2x передескритезации, 0 for для нормального режима
}
void loop()
{  
 if (Serial.available() > 0) // пришли данные
 {
   ser = Serial.read();
    if (ser =='1')
    {
      music.play("sounds/2.wav");
        Serial.println("Play 2.wav");
    //delay(30000);
    }
    else if (ser =='2')
    {
      music.play("sounds/2.wav",30); // воспроизвести файл, начиная с 30-ой секунды
        Serial.println("Play 2.wav starting at 30 sec.");
    }
    else if (ser =='3')
    {
      music.pause();  // поставить воспроизведение на паузу / снять с паузы
        Serial.println("Pause");
    }
    else if (ser =='4')
    {
      music.setVolume(0); // от 0 до 7. Устанавливает уровень громкости.
        Serial.println("Set volume 0");
    }
    else if (ser =='6')
    {
      music.setVolume(5); // от 0 до 7. Устанавливает уровень громкости.
        Serial.println("Set volume 5");
    }
    else if (ser =='0')
    {
      music.disable(); // выключить таймер на выходном выводе и остановить воспроизведение
        Serial.println("Stop");
    }
  }
}

В мониторе порта видим что у нас все работает отлично.

В мониторе порта видим что у нас все работает отлично.

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
#13.1. Arduino SD карта. Создаем, удаляем файлы. Чтение, запись файлов. http://portal-pk.ru/news/222-131-arduino-sd-karta-sozdaem-udalyaem-faily-chtenie-zapis.html Константин Portal-PK 2019-10-10T15:10:03+03:00 Во втором уроке просвещенном работе с SD картой . Научимся создавать и удалять файлы с помощью Arduino. Также запишем информацию в файл и считаем её. Как получить информацию о карте памяти и файлах хоронящихся на карте смотрите в предыдущем уроке: Урок13. Библиотека SD Arduino. Выводим информацию о SD карте.

Для роботы нам понадобится библиотека SD.h которую можно установить через менеджер библиотек.

библиотека SD.h которую можно установить через менеджер библиотек

Для урока нам понадобиться:

1. Arduino UNO или Arduino NANO

2. Модуль SD карты .

3. Беспаечная макетная плата .

4. Соединительные провода .

Подключаем SD-модуль к Arduino UNO по такой схеме.

Подключаем SD-модуль к Arduino UNO по такой схеме.

Давайте создадим файл на флешке, для этого используется функции SD.open(). Которая открывает файл на SD карте. Если файл открывается для записи, и если он еще не существует, то он будет создан (но содержащий его каталог уже должен существовать).

Remove() - Удаляет файл.

SD.exists() - проверяет существует ли файл.

Простой пример скетча для создания и удаления файлов с помощью библиотеки SD.

#include <SPI.h>
#include <SD.h>
File myFile;
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 4;
void setup() 
{
  // Открыть последовательное соединение и ждать открытия порта:
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect)) 
  {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  // проверим есть ли такой файл на флешке
  if (SD.exists("example.txt")) 
  {
    Serial.println("example.txt Есть такой. ");
  } 
  else 
  {
    Serial.println("example.txt нет. ");
  }
  // открыть новый файл и немедленно закрыть его
  Serial.println(" Создаем example.txt... ");
  myFile = SD.open("example.txt", FILE_WRITE);
  myFile.close();
  // проверить, существует ли файл:
  if (SD.exists("example.txt")) 
  {
    Serial.println(" example.txt Есть такой. ");
  } 
  else 
  {
    Serial.println("example.txt нет.");
  }
  // удалить файл:
  Serial.println("  Удаляем example.txt... ");
  SD.remove("example.txt");
  if (SD.exists("example.txt")) 
  {
    Serial.println(" example.txt есть такой. ");
  } 
  else 
  {
    Serial.println(" example.txt нет. ");
  }
}
void loop() 
{
  // после завершения настройки ничего не делать.
}

После загрузке в мониторе порта мы увидим вот такую информацию.

создания и удаления файлов с помощью библиотеки SD.

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

Если нам не нужно удалять файл, можно закомментировать строку отвечающую за удаления и уведомления, что будем удалять файл тоже лучше закомментировать.

// удалить файл:
 // Serial.println("  Удаляем example.txt... ");
 // SD.remove("example.txt");

Сейчас наш файл создан и не удален. С ним можно работать.

Сейчас наш файл создан и не удален. С ним можно работать.

Давайте создадим файл и запишем информацию в него. Код будит не очень сильно измене.

#include <SPI.h>
#include <SD.h>
File myFile;
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 4;
void setup() 
{
  // Открыть последовательное соединение и ждать открытия порта:
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");
  // Открыть файл. Обратите внимание, что в какой-либо момент может быть открыт только один файл,
  // поэтому вы должны закрыть один файл перед открытием следующего.
  myFile = SD.open("test.txt", FILE_WRITE);
  // если файл открыт, то записать в него:
  if (myFile) 
  {
    Serial.print(" Запись в файл test.txt... ");
    myFile.println(" Текст: 1, 2, 3.");
    // закрыть файл:
    myFile.close();
    Serial.println("Ok.");
  } 
  else 
  {
    // если файл не открыт, то вывести сообщение об ошибке:
    Serial.println("ошибка открытия test.txt");
  }
  // снова открыть файл для чтения:
  myFile = SD.open("test.txt");
  if (myFile) 
  {
    Serial.println("test.txt:");
    // читать из файла, пока в нем ничего не останется:
    while (myFile.available()) 
    {
      Serial.write(myFile.read());
    }
    // закрыть файл:
    myFile.close();
  } 
  else 
  {
    // если файл не открыт, то вывести сообщение об ошибке:
    Serial.println("ошибка открытия test.txt");
  }
}
void loop() 
{
  // после завершения настройки ничего не делать.
}

В мониторе порта мы увидим, что файл создан и удачно сохранился наш текст.

В мониторе порта мы увидим, что файл создан и удачно сохранился наш текст.

Если перезагрузить Arduino. То текст запишется еще раз в файл.

Если перезагрузить Arduino. То текст запишется еще раз в файл.

Это отличное решение для сохранения показаний с датчика.

Файл на карте памяти выглядит вот так.

Файл на карте памяти выглядит вот так.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
Урок 13. Библиотека SD Arduino. Выводим информацию о SD карте http://portal-pk.ru/news/221-urok-13-biblioteka-sd-arduino-vyvodim-informaciyu-o-sd-karte.html Константин Portal-PK 2019-10-08T07:51:18+03:00 Сегодня в уроке начнем изучать работу с SD картой . Для этого подключим библиотеку SD . И выедим информацию о карте и файлах которые хранятся на карте памяти.

Сегодня в уроке начнем изучать работу с SD картой. Для этого подключим библиотеку SD.

Для урока нам понадобиться:

1. Arduino UNO или Arduino NANO

2. Модуль SD карты.

3. Беспаечная макетная плата.

4. Соединительные провода.


Подключаем SD-модуль к Arduino UNO вот по такой схеме.

Подключаем SD-модуль к Arduino UNO вот по такой схеме.

SD карта подключается к шине SPI следующим образом:

  • MOSI - вывод 11
  • MISO - вывод 12
  • CLK - вывод 13
  • CS - зависит от вашей платы расширения или модуля SD карты.

SD карта подключается к шине SPI следующим образом:

Здесь, как и в других примерах Arduino, используется вывод 4.Подключение к Arduino NANO аналогично. К пинам с теме же номерами. Подключение других модулей или шилдов с SD картой может отличаться.

Подключаем Arduino к компьютеру и загружаем код:

// Подключить библиотеку SD:
#include <SPI.h>
#include <SD.h>
// Задать переменные, использующие функции вспомогательной библиотеки SD:
Sd2Card card;
SdVolume volume;
SdFile root;
// Измените это в соответствии с вашей платой расширения или модулем;
const int chipSelect = 4;
void setup() {
  // Открть последовательный порт и ждать выполнения его открытия:
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  // мы будем использовать код инициализации из вспомогательных библиотек,
  // так как мы только проверяем, работает ли карта!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) 
  {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    while (1);
  } 
  else 
  {
    Serial.println("Wiring is correct and a card is present.");
  }
  // тип карты
  Serial.println();
  Serial.print("Card type:         ");
  switch (card.type()) 
  {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }
  // попробуем открыть "том"/"раздел" - он должен быть FAT16 или FAT32
  if (!volume.init(card)) 
  {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }
  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());
  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();
  // напечатать тип и размер первого тома FAT-типа
  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);
  volumesize = volume.blocksPerCluster();    // кластеры это коллекции блоков
  volumesize *= volume.clusterCount();       // у нас будет много кластеров
  volumesize /= 2;                           // блоки SD карты всегда равны 512 байт (2 блока равны 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);
  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
  // перечислить все файлы на карте с датой и размером
  root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop(void) 
{
}

Открываем монитор порта и видим информацию о карте.

Открываем монитор порта и видим информацию о карте.

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

Один минус файлы с русским названием не отображает. Вместо русских букв одни почерки.

Один минус файлы с русским названием не отображает. Вместо русских букв одни почерки.

Это первый и самый простой пример работы с SD картой. Продолжение следует.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
Самодельный ЧПУ фрезерный станок на Arduino с дисплеем http://portal-pk.ru/news/220-samodelnyi-chpu-frezernyi-stanok-na-arduino-s-displeem.html Константин Portal-PK 2019-10-03T14:09:29+03:00 Кто следит за моими проектами на сайте или в группе Вконтакте. Знают, что я делаю новый ЧПУ станок на Arduino . Особенность данного станка в том, что он работает как 3D принтер . У него есть дисплей и флешка для загрузки управляющей программы. Остальное все по аналогии работы на 3D принтере . Выбираем файл и станок фрезерует . На дисплее отображается минимальную информацию о процессе.

 Для распечатки деталей ушло больше 2 кг. ABS пластика.

Разработку начал с распечатки всех комплектующих для станка. Для распечатки деталей ушло больше 2 кг. ABS пластика . За основу взял готовую конструкцию Root3 Lite CNC. Так как версия Lite. В данном проекте не все заготовок выложены в отрытый доступ. И кое что по ходу работы пришлось сделать самостоятельно.

При сборке механической части использовал алюминиевый профиль в качестве направляющих по оси X и Y. По оси Z установил линейные направляющие 8 мм, аналогичные используются в 3D принтере.

При сборке механической части использовал алюминиевый профиль в качестве направляющих по оси X и Y. По оси Z установил линейные направляющие 8 мм, аналогичные используются в 3D принтере.

Вот что понадобилось для сборки механической части:

- Шаговые двигателя Nema17 -4 шт. Подробнее ...

- Зубчатые шкивы и ремни GT2 . Подробнее ...

- Шпиндель 500W . Подробнее ...

- Полированный вал 8 мм и линейные подшипник. Подробнее ...

- Подшипники качения двух размеров. Подробнее ...

- Болты, винты, гайки, шайбы и пр.

Для управления ЧПУ изначально купил комплект Mega2560 R3 + RAMPS 1.4+ DVR8825 + 2004 LCD . Загрузил прошивку Marlin . Произвел минимальные настройки прошивки Marlin , подробнее о настройках читайте тут.

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

Купил графический дисплей lcd 12864.

При настройки прошивки марлин столкнулся с такой проблемой. Для работы по оси Y двух шаговых двигателей необходимо произвести настройки, а в интернете информации нет. Кому интересно решение читайте на форуме: Marlin подключаем 2 двигателя к оси Y или X. Назначаем вторым двигателем E1

Так как Marlin поддерживает Русский язык , перевел все пункты меню. Так же переименовал часть пунктов меню. Но пака еще встречаются слова «Печать» и «Принтер». Но это не так страшно. Со временим все подправлю.

Первый запуск выгладил вот так.

Для управления ЧПУ изначально купил комплект Mega2560 R3 + RAMPS 1.4+ DVR8825 + 2004 LCD .

Все прошло успешно. Но нашел пару багов в прошивке. Но в целом все получилось.

После чего напечатал кабель укладчики и корпус под дисплей . Уложил все провода. Электронику установив в небольшой электрический щиток. Предварительно его пришлось немного модернизировать. Сверху щитка установил вентилятор с защитной решеткой . Которую также напечатал на 3D принтере.

Вот такой самодельны фрезерный ЧПУ станок с дисплеем получился.

Вот такой самодельны фрезерный ЧПУ станок с дисплеем получился.

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

Бесплатныйонлайн генератор G-Code для ЧПУ станка —MakerCAM

Онлайнпрограмма для симуляции готового G-Codeдля ЧПУ.

Используя эти два сервиса вы бесплатно сможете сделать код и проверить его.

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

Станок без проблем справляется с фанерой 12 мм.

Станок без проблем справляется с фанерой 12 мм.

На фрезерном станке с ЧПУ можно делать достаточно красивые вещи .

На фрезерном станке с ЧПУ можно делать достаточно красивые вещи .

Такое не сделать на станке лазерной резки.

Такое не сделать на ЧПУ станке лазерной резки.

Такое не сделать на станке лазерной резки.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем проекте.

]]>
Восстановление данных с жесткого диска или флешки http://portal-pk.ru/news/219-vosstanovlenie-dannyh-s-zhestkogo-diska-ili-fleshki.html Константин Portal-PK 2019-09-26T12:29:16+03:00 Сегодня не найти организацию которая бы хранила документацию в бумажном виде. Все хранится на компьютерах. Что облегчает работу с документами и распечатать можно в любой момент и в любом количестве.

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

Возможно ли восстановить данных с жестких дисков?

Если ваш офис находиться в Москве вы можете воспользоваться услугами лаборатории восстановления данных 24. Официальный сайт https://data-recovery-24.ru.

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

То вы ошибаетесь.

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

Восстановление данных с флешки, если ваше флешка

Восстановление данных с флешки, если ваше флешка не определяться компьютером или вы ее сломали, тоже не проблема для специалистов лаборатории.

Одной из сложных задач это восстановления данных с устройств продукции Apple. В лаборатории восстановления данных 24. Помогут со срочным восстановление данных c жёстких или гибридных накопителей Mac, MacBook, iMac, Mac Pro, Time Capsule . А также восстановление с ssd дисков iMac, Mac Pro, Macbook Air .

Замечательная лаборатория находиться в Москве по адресу ул. Беговая улица д. 7.

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

]]>
Строим график на телефоне по данным с датчика. http://portal-pk.ru/news/218-stroim-grafik-na-telefone-po-dannym-s-datchika.html Константин Portal-PK 2019-09-26T07:16:31+03:00 Показание с подключенного датчика к Arduino можно вывести на семи сегментный индикатор, на дисплей или в приложении. Как сделать самое простое приложения для вывода данных с датчика на Android телефон рассказывал тут Показание с датчика температуры и влажности на телефоне. dht11 + esp8266

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

графика на дисплей или на смартфон

Для этого подключим к Arduino NANO, Bluetooth модель HC-06 и потенциометр, который будет выполнять роль датчика. Почему именно потенциометр, а не реальный датчик. С помощью потенциометра можно сделать более наглядные графики . А принцип тот же, что и с подключенным датчиком.

 подключим к Arduino NANO, Bluetooth модель HC-06 и потенциометр

Bluetooth модель HC-06 подключаем к пинам 0 и 1 по аппаратному UART порту .

Bluetooth модель HC-06 подключаем к пинам 0 и 1 по аппаратному UART порту .

Поэтому подключать к компьютеру во время работы нельзя. Как пользоваться программный UART портом рассказываю тут в середине статьи: 12.2- Дисплей Nextion урок 2. Подключаем и передаемданные на Arduino.

Если возникли вопросы пишите на форум.

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

int in = A0;
void setup() {
  Serial.begin(9600);
  pinMode(in,INPUT);
}
void loop() {
  byte val = map(analogRead(in),0,1024.0,0,255);    //аналоговое значение 1024 приводим к 255  
  Serial.print(val);                               //отправляем данные   
  delay(400);                                        
}

Приступим к приложению для телефона на Android . Как сделать подключение по Bluetooth к приложению я рассказывал вот в этой статье: BluetoothHC-06 и ардуино. Приложение андроид дляуправления Реле с телефона.

Приступим к приложению для телефона на Android

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

Нам понадобятся 2 невидимых компонента - это Bluetooth и часы для отчета интервалов для построения графика.

Блоки программы в mit app inventor.

Блоки программы в mit app inventor.

Создадим переменные для постройки графика.

Переменную Y берем с показаний которые поступают по Bluetooth. X увеличиваем на 1. Вся программа работает внутри счетчика часов.

Переменную Y берем с показаний которые поступают по Bluetooth. X увеличиваем на 1

Сам график строиться по 2 точкам. Предыдущая и текущая.

Сам график строиться по 2 точкам. Предыдущая и текущая.

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

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

Можно сделать сдвиг в лево. Но тут будут больше кода. Для понимания работы постарался сделать как можно проще.

В итоге у нас получаются вот такие графики.В итоге у нас получаются вот такие графики.

В добавок можно изменить стиль оформления графиков.

В добавок можно изменить стиль оформления графиков. Изменить толщину и цвет линии графика.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока.

И до встречи в следующем проекте.

]]>
Машинка на радиоуправлении. Arduino + nrf24l01 + пульт. http://portal-pk.ru/news/217-mashinka-na-radioupravlenii-arduino-nrf24l01-pult.html Константин Portal-PK 2019-09-19T09:01:58+03:00 Давно я уже не делал радио управляемые модели . Решил оживить свой старый проект: Радиоуправлениена Arduino + NRF24L01 + гироскоп GY-521 MPU-6050. Но не просто оживить. Но и доработать. Так как у меня есть 3D принтер . Раму для машины решил напечатать новую. Так же с кодом решил немного поработать. За это время знаний стало больше и на старые проекты уже смотрю совсем по другому. Но обо всем по порядку.

И так напечатал раму для Ардуино машинки . Фото уже выкладывал в группе в ВК. Вот что получилось:

напечатал раму для Ардуино машинки

Исходники для печати можете скачать тут.

Установил электронику: Arduino UNO, драйвер L298n, два мотор-редуктора с колесами и конечно же радио модуль nrf24l01.

Arduino UNO, драйвер L298n, два мотор-редуктора с колесами

Все комплектующие лучше покупать в Китае. Например на сайте aliexpress. Потратите в 2 раза меньше. И доставка у недорогих товаров бесплатная или очень маленькая. А если купить у одного проводка. То можно сэкономить на доставке . Для этого берем 1 товар с платной доставкой. А остальные с бесплатной. И вам все положат в одну посылку и ВСЕ отправят платной доставкой. Вот такой небольшой ЛайфХак.

Установить переключатель

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

Установил 2 бокса под аккумуляторы 18650

Установил 2 бокса под аккумуляторы 18650. Соединил их последовательно и подключил к драйверу L298n. Так как у драйвера есть понижающий стабилизатор на 5 вольт. С соответствующих разъемов мы берм 5в и подключаем Arduino UNO. Но тут есть минус. Нужно следить, чтобы аккумуляторы не пере разрядились. Иначе они выйдут из строя. Остальная часть схемы ни чем не отличается от предыдущего проекта.

Схема подключения Ардуино машинки на радио управлении

Пульт управления берем из предыдущего проекта. Схема подключения пульта управления на Arduino + NRF24L01 + гироскоп GY-521 MPU-6050 . Выглядит вот так.

Схема подключения пульта управления на Arduino + NRF24L01 + гироскоп GY-521 MPU-6050

Скетч тоже без изменений.

#include <SPI.h>          
#include <nRF24L01.h>
#include <RF24.h>
const uint64_t pipe = 0xF0F1F2F3F4LL;
RF24 radio(9, 10);
byte button_jostik = 8;  // кнопка джостика
byte button_1 = 2;  // кнопка
byte button_2 = 3;  // кнопка 
byte button_3 = 4;  // кнопка 
byte button_4 = 4;  // кнопка 
byte button_5 = 5;  // кнопка 
byte button_6 = 7;  // кнопка 
byte transmit_data[9]; // массив, хранящий передаваемые данные
byte latest_data[9]; // массив, хранящий последние переданные данные
boolean flag; // флажок отправки данных
// Гироскоп ///
#include <Wire.h>
#include "Kalman.h"
Kalman kalmanX;
Kalman kalmanY;
uint8_t IMUAddress = 0x68;
/* IMU Data */
int16_t accX;
int16_t accY;
int16_t accZ;
int16_t tempRaw;
int16_t gyroX;
int16_t gyroY;
int16_t gyroZ;
double accXangle; // Angle calculate using the accelerometer
double accYangle;
double temp;
double gyroXangle = 180; // Angle calculate using the gyro
double gyroYangle = 180;
double compAngleX = 180; // Calculate the angle using a Kalman filter
double compAngleY = 180;
double kalAngleX; // Calculate the angle using a Kalman filter
double kalAngleY;
uint32_t timer;
/* переменные */
boolean lastButten = LOW;     // предыдущее состояние кнопки
boolean currentButten = LOW;  // текущее состояние кнопки
int status = 0;       // текущий статус
void setup() {
  Serial.begin(9600); //открываем порт для связи с ПК
  pinMode(button_jostik, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_1, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_2, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_3, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_4, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_5, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_6, INPUT_PULLUP); // настроить пин кнопки
  radio.begin();
    delay(50);
    radio.setChannel(9);
    radio.setPayloadSize(8);
    radio.setRetries(1,1);
    radio.setDataRate(RF24_250KBPS);
    radio.setPALevel(RF24_PA_HIGH);
    radio.openWritingPipe(pipe);
  /// Гтроскоп 
    Wire.begin();
  i2cWrite(0x6B,0x00); // Disable sleep mode
  if(i2cRead(0x75,1)[0] != 0x68) { // Read "WHO_AM_I" register
    Serial.print(F("MPU-6050 with address 0x"));
    Serial.print(IMUAddress,HEX);
    Serial.println(F(" is not connected"));
    while(1);
  }    
  kalmanX.setAngle(180); // Set starting angle
  kalmanY.setAngle(180);
  timer = micros();
}
void loop() {
  currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW 
  if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
  {
    status = !status; // инвертируем Статус 
  }
  lastButten =  currentButten;  // Переприсваеваем прошлое состояние кнопки
  if (status == true)
  {
    transmit_data[1] = map(analogRead(A0), 0, 1023, 0, 255); // получить значение
    // в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве
    transmit_data[2] = map(analogRead(A1), 0, 1023, 0, 255);
    }
  else
  {
    /* Update all the values */
    uint8_t* data = i2cRead(0x3B,14);
    accX = ((data[0] << 8) | data[1]);
    accY = ((data[2] << 8) | data[3]);
    accZ = ((data[4] << 8) | data[5]);
    tempRaw = ((data[6] << 8) | data[7]);
    gyroX = ((data[8] << 8) | data[9]);
    gyroY = ((data[10] << 8) | data[11]);
    gyroZ = ((data[12] << 8) | data[13]);
    /* Calculate the angls based on the different sensors and algorithm */
    accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG;
    accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG;  
    double gyroXrate = (double)gyroX/131.0;
    double gyroYrate = -((double)gyroY/131.0);
    gyroXangle += gyroXrate*((double)(micros()-timer)/1000000); // Calculate gyro angle without any filter
    gyroYangle += gyroYrate*((double)(micros()-timer)/1000000);
    //gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate
    //gyroYangle += kalmanY.getRate()*((double)(micros()-timer)/1000000);
    compAngleX = (0.93*(compAngleX+(gyroXrate*(double)(micros()-timer)/1000000)))+(0.07*accXangle); // Calculate the angle using a Complimentary filter
    compAngleY = (0.93*(compAngleY+(gyroYrate*(double)(micros()-timer)/1000000)))+(0.07*accYangle);
    kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter
    kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (double)(micros()-timer)/1000000);
    timer = micros();
    temp = ((double)tempRaw + 12412.0) / 340.0;
    Serial.print(kalAngleX);Serial.print("\t");
    Serial.print(kalAngleY);Serial.print("\t");
    //Serial.print(temp);Serial.print("\t");
    Serial.print("\n");
     int y = compAngleY;
     if (y>250) y=250;
     if (y< 110) y= 110;
     int x = compAngleX;
     if (x>250) x=250;
     if (x< 110) x= 110;
    transmit_data[1] = map(x, 110, 250, 0, 255); // получить значение
    // в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве
    transmit_data[2] = map(y, 110, 250, 0, 255);
  }
  transmit_data[0] = !digitalRead(button_jostik); // инвертированный (!) сигнал с кнопки
  transmit_data[3] = !digitalRead(button_1); // инвертированный (!) сигнал с кнопки
   transmit_data[4] = !digitalRead(button_2); // инвертированный (!) сигнал с кнопк
   transmit_data[5] = !digitalRead(button_3); // инвертированный (!) сигнал с кнопки
   transmit_data[6] = !digitalRead(button_4); // инвертированный (!) сигнал с кнопки
   transmit_data[7] = !digitalRead(button_5); // инвертированный (!) сигнал с кнопки
   transmit_data[8] = !digitalRead(button_6); // инвертированный (!) сигнал с кнопки
  for (int i = 0; i < 9; i++) { // в цикле от 0 до числа каналов
    if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
      flag = 1; // поднять флаг отправки по радио
      latest_data[i] = transmit_data[i]; // запомнить последнее изменение
    }
  }
  //if (flag == 1) { 
  //  radio.powerUp(); // включить передатчик
    radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
 //   flag = 0; //опустить флаг
  //  radio.powerDown(); // выключить передатчик
  // }
}
boolean debvance (boolean last) //убираем дребизг
{
  boolean current = digitalRead (button_jostik); // считываем данные с кнопки
  if (last != current) // Если текущее состояни еотличететься от предыдущего 
  {
   delay (5);   // Ждем 5 милисек.
   current = digitalRead (button_jostik); // Присваеваем текущее состояние кнопки
    return current; 
  }
}
void i2cWrite(uint8_t registerAddress, uint8_t data){
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.write(data);
  Wire.endTransmission(); // Send stop
}
uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) {
  uint8_t data[nbytes];
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.endTransmission(false); // Don't release the bus
  Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading
  for(uint8_t i = 0; i < nbytes; i++)
    data[i] = Wire.read();
  return data;
}

Пульт планирую переделывать. Тем более он выглядит не очень красиво.

Пульт планирую переделывать

И ребенок у меня его модернизировал. Проводки пере подключал. Я конечно все восстановил. Но работает немного не так как раньше. Смотрите в видео всем отличие.


Искать причину почему радио пульт стал так работать нет времени и желания. Как говорил все ровно его буду переделывать.

#include <SPI.h>        
#include <nRF24L01.h>
#include <RF24.h>
const uint64_t pipe = 0xF0F1F2F3F4LL; 
RF24 radio(9, 10); 
byte msg[9];
const int in1 = 2;    // direction pin 1
const int in2 = 4;    // direction pin 2
const int in3 = 7;    // PWM pin to change speed
const int in4 = 8;    // direction pin 2
const int ena = 5;    // PWM pin to change speed
const int enb = 6;    // PWM pin to change speed
/* определяем два массива с перечислением пинов для каждого мотора */
unsigned char RightMotor[3] =   {in1, in2, ena};
unsigned char LeftMotor[3] =   {in3, in4, enb};
/*
   управление скоростью мотора
   motor - ссылка на массив пинов
   v - скорость мотора, может принимать значения от -100 до 100
*/
void Wheel (unsigned char * motor, int v)
{
  if (v>100) v=100;
  if (v<-100) v=-100;
  if (v>0) {
    digitalWrite(motor[0], HIGH);
    digitalWrite(motor[1], LOW);
    analogWrite(motor[2], v*2.55);
  }
  else if (v<0) {
    digitalWrite(motor[0], LOW);
    digitalWrite(motor[1], HIGH);
    analogWrite(motor[2], (-v)*2.55);
  }
  else {
    digitalWrite(motor[0], LOW);
    digitalWrite(motor[1], LOW);
    analogWrite(motor[2], 0);
  }
}
void setup(){
  pinMode(in1, OUTPUT);      // connection to L298n
  pinMode(in2, OUTPUT);      // connection to L298n
  pinMode(in3, OUTPUT);      // connection to L298n
  pinMode(in4, OUTPUT);      // connection to L298n
  pinMode(ena, OUTPUT);      // connection to L298n;
  pinMode(enb, OUTPUT);      // connection to L298n;
  Serial.begin(9600);
 pinMode(LED_BUILTIN, OUTPUT);
 delay(50);
 radio.begin();
 radio.setChannel(9); 
 radio.setPayloadSize(8);
 radio.setDataRate(RF24_250KBPS);  
 radio.setPALevel(RF24_PA_HIGH); 
 radio.openReadingPipe(1,pipe); 
 radio.startListening(); 
}
void loop() {   
 if (radio.available()){ 
radio.read(&msg, sizeof(msg));
} 
else
{
msg[1]=127;
msg[2]=127;}
int x= map(msg[2], 0, 255, -100, 100);
int y= map(msg[1], 0, 255, -100, 100);
 /* управляем правым мотором */
  Wheel (RightMotor, x - y);
  /* управляем левым мотором */
  Wheel (LeftMotor, x + y); 
//Serial.println(msg[1]);
}

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

int x= map(msg[2], 0, 255, -100, 100);
int y= map(msg[1], 0, 255, -100, 100);

При отсутствии связи данные параметры были равны 0. А ноль по коду мы приводим к -100. Вращаем колесо в обратную сторону. Вот от сюда и проблема.

машинка на Arduino радио модуле nrf24l01 с пультом управления

В итоге получилась вот такая машинка на Arduino радио модуле nrf24l01 с пультом управления. Который управляет машиной при наклоне пульта. Не нужно нажимать на кнопки.

Машинка и пульт управления на Ардуино

Планирую доработку пульта и машинки. Так что Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.Всем Пока-Пока. И до встречи в следующем проекте.

]]>
Грузоподъемность мини квадрокоптера Eachine H8 Mini http://portal-pk.ru/news/216-gruzopodemnost-mini-kvadrokoptera-eachine-h8-mini.html Константин Portal-PK 2019-09-11T13:56:41+03:00 Сегодня проверим грузоподъемность мини квадрокоптера Eachine H8 Mini . Вы наверное решили, что я впал в детства! Не совсем так. Тут в первую очередь я планирую получить знание, что сможет поднять квадрокоптер. И получиться ли на него что либо подмешать. Ну и поиграть, в нашем детстве даже машинок на пульте ДУ не было. Не говоря уже про квадрокоптер.

Подготовил я вот такие грузы

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

Квадрокоптер справился со всеми грузами до банки с канифолью. Тут начались небольшие трудности. Так как аккумулятор к тому времени уже был немного разряжен. Квадрокоптер не смог поднять 20 грамм. Но после полной зарядки данный груз поддался. Высота полета составляет всего 2-5 см над поверхностью. Но все же он летит. Если поставит новый аккумулятор. Возможно что он поднимется на 1-2 метра. Но не факт.

 Квадрокоптер не смог поднять 20 грамм.

Подробнее испытания на грузоподъемность квадрокоптера Eachine H8 Mini смотрите в видео.

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

 Квадрокоптер не предназначен для подъема даже небольших грузов.

Постараюсь за зиму собрать квадрокоптер. Как я люблю из говна и палок. Возможно и камеру прицеплю. Но это уже совсем другая история!

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
LEGO роботы. http://portal-pk.ru/news/215-lego-roboty.html Константин Portal-PK 2019-09-04T09:05:57+03:00 Конструкторы ЛЕГО одни из самых распространенных. И не зря, так как из них можно собрать здание, транспорт. Даже целые космические станции и города. Но у данных конструкторов есть один небольшой минус. Они не умеют самостоятельно двигаться и издавать звуки.

Конструкторы ЛЕГО

На самом деле это не так. Есть наборы ЛЕГО. Которые включают в себя микроконтроллер, дачки и исполнительные монизмы. Что позволяет из конструктора собрать машинку которая будет самостоятельно ездить, различные сборные приборы для изучения физики. Но это не все. Также вы можете без труда собрать автономного робота. Который будет оснащен датчиками и сенсорами, позволяющие ему самостоятельно обходить препятствие и выполнять заданные действия. При этом вы можете делать модификации, добавлять датчики, что позволит вашему LEGO роботу совершать новые действия и становиться более умным.

LEGO робот

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

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

]]>
Обзор приставки которую можно собрать за 3 т. руб. http://portal-pk.ru/news/214-obzor-pristavki-kotoruyu-mozhno-sobrat-za-3-t-rub.html Константин Portal-PK 2019-09-04T07:24:43+03:00 Для любителей игр сейчас очень большой выбор. Поиграть можно на ПК или на игровой приставке. Сегодня речь пойдет про игровую консоль которую я собрал за 3 тыс. руб .

Поиграть можно только в ретро игры. В современные игры не поиграть. Но что вы хотели за такие деньги. А если учесть что в магазине старые приставки (Sega, Playstation, Nintendo и пр.) стоят в приделах стоимость в которую обошлась мне приставка на Orange Pi Lite. То тут еще и сэкономить можно.

приставка на Orange Pi Lite

Начнем все по порядку. Что необходимо для создания данного девайса? И сколько все стоит ?

- Orange Pi Lite с блоком питания - 1500 руб.

- Джойстики - 980 руб.

- Вентилятор для охлаждения - 120 руб.

- Карта памяти на 16 Gb - 420 руб.

Orange Pi Lite с блоком питания

Стоимость указана на момент покупки. Сейчас ситуация возможно немного другая.

Корпус для приставки напечатал на 3D принтере. Скачать модель для печати можно тут. Радиаторы выпилил из старых алюминиевых радиаторов от компа.

Корпус для приставки напечатал на 3D принтере

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

Я установил RetrOrange Pi , почему именно эта операционная систему рассказываю вот тут: Игроваяконсоль на orange pi. Выбор железа и ОС.

На данном вопросе останавливаться не буду в данной статье.

Какие приставки поддерживает и из них я играю :

  • Playstation
  • PSP
  • Sega Dreamcast
  • Sega Master System / Game Gear / Mega Drive
  • Game Boy
  • Nintendo

и пр.

Какие приставки поддерживает и из них я играю

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
Обзор мини квадрокоптера. Покупал по очень низкой цене. http://portal-pk.ru/news/213-obzor-mini-kvadrokoptera-pokupal-po-ochen-nizkoi.html Константин Portal-PK 2019-09-03T07:25:04+03:00 Вы наверное знаете что я увлекаюсь разработкой проектов на Arduino, ESP8266, ESP32 и на однопалатных компьютерах. Как и все Ардуинщики мне охота собрат как можно больше интересных проектов, в том числе квадрокоптер. Но к сожалению ни на все хватает времени и средств.

я решил купить ребенку квадрокоптер

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

Коробка немного помятая, но при этом все целое.

В комплекте:

  1. Квадрокоптер.
  2. Джойстик для управления.
  3. Инструкция на английском и китайском языках.
  4. Usb зарядка.
  5. 2 запасных винта.

Eachine H8 Mini прошел сырой снег, ветер, кусты и провода.

Плохо что не заказал с дополнительными аккумуляторами. Заряда хватает всего на 5 мин. А спустя 3-4 месяца летать стал еще меньше времени.

Eachine H8 Mini прошел сырой снег, ветер, кусты и провода. Но спустя 9 месяцев он до сих пор работает. Немного разломали разъем коннектора подключения аккумулятора, перестал работать 1 синий светодиод (видать от падений в сырой снег). На корпусе появились царапины, но без них ни куда не деться. Подробнее смотрите в видео обзоре мини квадрокоптер Eachine H8 Mini.

Плюсы:

  • низкая стоимость,
  • живучесть, но это возможно мне повезло,

Минусы

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


квадрокоптер Eachine H8 Mini.

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

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
12.2 - Дисплей Nextion урок 2. Подключаем и передаем данные на Arduino. http://portal-pk.ru/news/212-122---displei-nextion-urok-2-podklyuchaem-i-peredaem-dannye-na.html Константин Portal-PK 2019-08-30T07:57:42+03:00 Создавать проекты, и загружать картинки в Nextion Editor мы научились в предыдущем уроке. Сегодня продолжаем осваивать работу с дисплеем Nextion, также подключим данный устройство к Arduino.

 работу с дисплеем Nextion, также подключим данный устройство к Arduino.

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

Знание которых поможет вам сэкономить время при разработке проектов:

1. Команды заканчивается тремя байтами "0xff 0xff 0xff"
2. Все команды и параметры находятся в ASCII
3. Все команды написаны строчными буквами.

Любая электроника нуждается в корпусе, исполнительном механизме. Где же заказать изготовление деталей? Для данных работ отлично подойдет ООО «М-Техника».

Основные направления деятельности компании:

  • изготовление деталей и металлических изделий различной сложности;
  • нанесение защитных и декоративных покрытий гальваническим способом на металлоизделия заказчика;
  • термообработка металлоизделий;

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

Добавляем Страницу с названием Button.


Добавляем страницу с названием Button.

Сейчас у нас есть 2 страницы. Как же нам сделать переключения между страницами. Переключает между страницами можно командой:

page Button или page 1

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

Куда же добавить данную команду?
В данном уроке мы сделаем переключение со страница Logo с задержкой в 3 сек на страницу Button.
Для этого нажмем на страницу Logo и в обработчике событий загрузки страницы добавим следующие строки.

В данном уроке мы сделаем переключение со страница Logo с задержкой в 3 сек

Первая строка delay=3000 работает аналогично delay() в Arduino IDE. Задержка 3000 мс.

Все параметры и команды вы можете посмотреть в официальной документации. Здесь есть кое-какие ошибки в синтаксисе. Но описано все подробно.

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

добавим прогресс бар

Как поменять цвет прогресс бара, и прочие настройки расскажу в видео.

прогресс бар, и в его свойствах добавим цикл.

Из цикла видно, что мы добавляем по 1 к свойству j0.val. Это значение заполнения школы в свойствах прогресс бара.

Прогресс бар. Отображает заполненную на заданное значение процентов линейку.

  • Sta – возможные значения: solid color и image
  • dez – направление. Возможные значения:
    • horizontal – по горизонтали
    • vertical – по вертикали
  • bco – цвет при заполнении 0%. Этот атрибут появляется при выборе значения solid color в атрибуте sta
  • pco – цвет при заполнении 100%. Этот атрибут появляется при выборе значения solid color в атрибуте sta
  • bpic – индекс картинки кнопки при заполнении в 0%. Этот атрибут появляется при выборе значения image в атрибуте sta
  • ppic – индекс картинки при заполнении в 100%. Этот атрибут появляется при выборе значения image в атрибуте sta
  • val – наполнение. Возможные значения: от 0 до 100.
  • x и y – координаты вставки прогресс бара
  • w и h – ширина и высота прогресс бара.

Прогресс бар не будет обновляться если не добавить переменную

doevents //обновление экрана во время цикла

Приветственная страница готово.


Оформим страницу Button.

Оформим страницу Button.

Добавим прогресс бар и кнопку с двумя состояниями.

-Кнопка с двумя положениями.

  • bco0 – цвет переключателя в положении 0. Этот атрибут появляется при выборе значения solid color в атрибуте sta
  • bco1 – цвет переключателя в положении 1. Этот атрибут появляется при выборе значения solid color в атрибуте sta
  • pic0 – индекс картинки переключателя в положении 0. Этот атрибут появляется при выборе значения image в атрибуте sta
  • pic1 – индекс картинки переключателя в положении 1. Этот атрибут появляется при выборе значения image в атрибуте sta
  • picс0 – индекс вырезанной картинки переключателя в положении 0. Этот атрибут появляется при выборе значения crop image в атрибуте sta
  • picс1 – индекс вырезанной переключателя в положении 1. Этот атрибут появляется при выборе значения crop image в атрибуте sta
  • val – положение переключателя. Возможные значения 0 и 1
  • x и y – координаты вставки кнопки
  • w и h – ширина и высота кнопки.

В атрибутах кнопки sta поменяем значение на image

В атрибутах кнопки sta поменяем значение на image. И подгрузим картинки в поля: pic0 и pic1.

И подгрузим картинки в поля: pic0 и pic1

В свойствах кнопки добавим такой код, который отправится на Arduino при нажатии.

В свойствах кнопки добавим такой код, который отправится на Arduino при нажатии.

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

С дизайном и подготовкой в Nextion Editor закончили. Сейчас нашу прошивку можно загрузить в дисплей.
Подключаем дисплей Nextion к Arduino NANO по схеме.

Подключаем дисплей Nextion к Arduino NANO по схеме.

Подключение к Arduino UNO аналогично.

// библиотека для эмуляции Serial порта
#include <SoftwareSerial.h>
// создаём объект mySerial и передаём номера управляющих пинов RX и TX
// RX - цифровой вывод 8, необходимо соединить с выводом TX дисплея
// TX - цифровой вывод 9, необходимо соединить с выводом RX дисплея
SoftwareSerial mySerial(8, 9);
byte flag = 0;
byte i = 0;
// переменная для хранения данных
String data;
// функция отправки конца команды
// команда поступающая в дисплей должна кончаться символами «0xFF0xFF0xFF»
void comandEnd() {
  for (int i = 0; i < 3; i++) {
    mySerial.write(0xff);
  }
}
// отправка на Nextion (номер экрана, название переменной) + данные
void SendInt(String dev, int data)
{
  mySerial.print(dev);   // Отправляем данные dev(номер экрана, название переменной) на Nextion
  mySerial.print("=");   // Отправляем данные =(знак равно, далее передаем сами данные) на Nextion 
  mySerial.print(data);  // Отправляем данные data(данные) на Nextion
  comandEnd();
  dev = "";    // Очищаем переменную
  data = "";   // Очищаем переменную
}
void setup() {
   // открываем последовательный порт
  mySerial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
    // ждём данные от дисплея
if (mySerial.available()) {
    char inc;
    inc = mySerial.read();
    data += inc;
    if (inc == 0x0A) { //конец команды
      // если пришёло 'on'
        if (data.indexOf("on") >= 0) {
          flag = !flag;
          digitalWrite(LED_BUILTIN, flag);   // turn the LED on (HIGH is the voltage level)
          SendInt("Button.bt0.val", flag);
        }
      data = "";
    }
  }
  if (flag)
  {
    SendInt("Button.j0.val", i);    //Передаем Свойства и чифры
    i++;
    delay(20);
      if (i==100)
        {
          flag = 0;
          digitalWrite(LED_BUILTIN, flag); 
          i=0;
          SendInt("Button.j0.val", i);    //Передаем Свойства и чифры
          SendInt("Button.bt0.val", flag);    //Передаем Свойства и чифры
        }
    }
}

Скетч также подойдет для обоих плат. При желании можно использовать и на A rduino MEGA, ESP32, ESP8266 и пр.

У данной платы всего 1 аппаратный Serial Port. Будем использовать программный порт. Для этого нужно установить и подключить библиотеку SoftwareSerial.h.

// библиотека для эмуляции Serial порта
#include <SoftwareSerial.h>
// создаём объект mySerial и передаём номера управляющих пинов RX и TX
// RX - цифровой вывод 8, необходимо соединить с выводом TX дисплея
// TX - цифровой вывод 9, необходимо соединить с выводом RX дисплея
SoftwareSerial mySerial(8, 9);

Следующие две функции формируют и отправляют цифровые параметры на дисплей.

// функция отправки конца команды
// команда поступающая в дисплей должна кончаться символами «0xFF0xFF0xFF»
void comandEnd() {
  for (int i = 0; i < 3; i++) {
    mySerial.write(0xff);
  }
}
// отправка на Nextion (номер экрана, название переменной) + данные
void SendInt(String dev, int data)
{
  mySerial.print(dev);   // Отправляем данные dev(номер экрана, название переменной) на Nextion
  mySerial.print("=");   // Отправляем данные =(знак равно, далее передаем сами данные) на Nextion 
  mySerial.print(data);  // Отправляем данные data(данные) на Nextion
  comandEnd();
  dev = "";    // Очищаем переменную
  data = "";   // Очищаем переменную
}

Здесь мы считываем полученные параметры и сравниваем, если пришла команда то выполняем.

    // ждём данные от дисплея
if (mySerial.available())  // ждём данные от дисплея
{
    char inc;
    inc = mySerial.read();
    data += inc;
    if (inc == 0x0A) { //конец команды
        if (data.indexOf("on") >= 0) // если пришёло 'on'
        { 
        // делаем что-то
        }
      data = "";
    }
  }

Эта строчка отправляет состояние кнопки на дисплей. Для чего это нужно? Чтобы не получилось так, что на дисплее кнопка нажата, а светодиод не горит.

    SendInt("Button.j0.val", i);    //Передаем значение для заполнения прогрксс бара

Эта функции отправляет процент заполнения прогресс бара.

    SendInt("Button.bt0.val", flag);    //Передаем состояние кнопки

Более подробно объясняю в видео. Если есть вопросы пишите на форум.

Если вам интересна данная тема пишите в комментарии.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
Файловая система SPIFFS в ESP8266 и ESP32 http://portal-pk.ru/news/211-failovaya-sistema-spiffs-v-esp8266-i-esp32.html Константин Portal-PK 2019-08-27T16:24:22+03:00 У микроконтроллеров ESP8266 и ESP32 есть своя файловая система SPIFFS (Serial Peripheral Interface Flash File System). Из названия понятно, что она работает по шине SPI.

SPIFFS аналогична файловой системе компьютера , но имеет ряд ограничений. Она позволяет создавать, редактировать файлы в тестовых форматах.
Загрузить можно файлы в формате: "txt", "htm", "html", "js", "json", "c", "h", "cpp", "css", "xml" и другие текстовые документы. Данные документы можно без труда отредактировать удалить. Также можно загрузить графические элементы в формате: "png", "jpg", "gif", "ico" и пр. Что позволяет реализовать веб-интерфейс для управления ESP8266 или ESP32.
В интернет источниках не раз встречал информацию о том, что нельзя создавать директории в файловой системе SPIFFS. Но в уроках Сергея Третьякова по созданию web-интерфейса, используются и папки. Возможно, что ситуация изменилась и создания директорий доработали.
Кстати у Сергея достаточно понятные и доступные видео уроки по созданию web-интерфейся для управления проектом на ESP8266. При желании можно доработать данные примеры и реализовать, что-то подобное на ESP32.

Создать текстовый документ можно напрямую в коде. Но вот для загрузки картинки понадобиться специальный плагин, который устанавливается в Arduino IDE. Для каждой версии ESP свой плагин.

Для установки в папке программы Arduino создайте папку tools. Если ее нет и скопируйте туда содержимое вот из этого архива.
Должно получиться вот так.

Arduino создайте папку tools

Одна папка для работы с файловой системой ESP32, вторая с ESP8266 .
Затем необходимо перезагружаем Arduino IDE.

перезагружаем Arduino IDE

После чего перейдем в пункт меню Инструменты. И у нас должны появиться еще 2 пункта меню. Если у вас нет данных пунктов в меню, попробуйте обновить Arduino IDE до более новой версии.

папке со скетчем создать папку data

Чтобы загрузить файлы, необходимо в папке со скетчем создать папку data. И поместить туда нужные файлы.
Я бы порекомендовал взять пример для проверки вот от сюда. Здесь реализована работа с файловой системой и плюс визуальный редактор.
Причем скетч адоптирован для обоих плат и для 32 и для 8266.

Скачиваем архив. Заходим в папку FSBrowser. Открываем файл FSBrowser.ino. Ставим все необходимые библиотеки. Они ставятся из менеджера библиотек.
Прошиваем плату и загружаем файлы для этого наживаем на загрузчик.

Прошиваем плату и загружаем файлы для этого наживаем на загрузчик.

Внимание! При прошивке и загрузке файлов на некоторых версиях ESP32 нужно нажимать кнопку boot, которая расположена на плате. Это нужно сделать когда начинается прошивка. Удерживаем ее около 3 сек. После чего побегут проценты загрузки.

После удачной загрузки заходим в монитор порта и смотри наш Ip адрес.

заходим в монитор порта

В браузере переходим по адресу http://<ваш_IP>/edit И видим редактор и список всех загруженных файлов.

едактор и список всех загруженных файлов

Ссылка http://esp8266fs.local/edit не работает. Понятно что проблема с DNS, но пока не проверял по какой причине. Если есть предложения как решить данную задачу пишите, буду благодарен.
В данном редакторе можно создавать и редактировать текстовые документы. Загружать напрямую на ESP32 или ESP8266 файлы .

Возможности данного редактора можно расширить. Если кому интересно пишите на форум. Подскажу или напишу статью, что нужно для этого сделать.

Визуальный редактор неоглядно показывает роботу файловой системы. И упрощает работу с ними.


Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
Esp32 управляем реле по средствам bluetooth. Arduino ide http://portal-pk.ru/news/210-esp32-upravlyaem-rele-po-sredstvam-bluetooth-arduino-ide.html Константин Portal-PK 2019-08-26T15:14:35+03:00 Как управлять реле по Wi-Fi и bluetooth уже рассказывал. Сегодня немного расширим данную тему и попробуем в работе новый, быстрый мокро контроллер у которого на бору двух ядерный процессор, Wi-Fi и bluetooth. Да! Вы правильно поняли, сегодня будем подключать реле к ESP32. Посмотрим на сколько данный МК быстрее стандартных bluetooth модулей: HC-05 и HC-06.

Итак приступим. Для начало подключим все вот по такой схеме.

подключать реле к ESP32

Подключил специально на пин D2, чтобы отследить роботу. Так как на данный пин подключен светодиод платы. Он светит синим цветом когда реле выключается, это видно на видео.

Код для ESP32 и управление через bluetooth.

#include "BluetoothSerial.h" // библиотека
BluetoothSerial ESP_BT; // Объект для Bluetooth
int incoming; // значение с Bluetooth
const int relayPin = 2; // пин подключения реле
void setup() {
  ESP_BT.begin("Portal-PK"); // Имя Bluetooth
  pinMode (relayPin, OUTPUT);// подключаем реле
}
void loop() {  
  if (ESP_BT.available()) // Если получили по Bluetooth 
  {
    incoming = ESP_BT.read(); // Считываем информацию
    if (incoming == 48)
        {
        digitalWrite(relayPin, LOW); // реле включили
        ESP_BT.println("Relay On — Portal-Pk.ru");
        }      
    if (incoming == 49)
        {
        digitalWrite(relayPin, HIGH); // реле выключиди 
        ESP_BT.println("Relay Off — Portal-Pk.ru");
        }     
  }
  delay(20);
}

Код прокомментирован и в видео объясняю с «заиканием» каждую строчку. Если, что то не понятно задавайте вопросы на форуме.

Таблица ASCII

Таблица ASCII

При съемках видео ступил. Символы выводил как число. Просто нужно получаемую информацию из порта получать как char. И не нужно заморачиваться с таблицей ASCII.

#include "BluetoothSerial.h" // библиотека

BluetoothSerial ESP_BT; // Объект для Bluetooth

char incoming; // значение с Bluetooth
const int relayPin = 2; // пин подключения реле

void setup() {
  ESP_BT.begin("Portal-PK"); // Имя Bluetooth
  pinMode (relayPin, OUTPUT);// подключаем реле
}

void loop() {
  
  if (ESP_BT.available()) // Если получили по Bluetooth 
  {
    incoming = ESP_BT.read(); // Считываем информацию

    if (incoming == '0')
        {
        digitalWrite(relayPin, LOW); // реле включили
        ESP_BT.println("Relay On — Portal-Pk.ru");
        }
        
    if (incoming == '1')
        {
        digitalWrite(relayPin, HIGH); // реле выключиди 
        ESP_BT.println("Relay Off — Portal-Pk.ru");
        }     
  }
  delay(20);
}    

Для управления можно воспользоваться bluetooth терминалом. Как рассказываю тут: Урок11 - Bluetooth модуль HC-06. Управление Arduino стелефона.

Или установить приложение которое можно скачать ниже.

приложение которое можно скачать ниже

Вывод можно сделать следующий. ESP32 работает быстрее и стабильнее. При этом стоимость дешевле чем купить Arduino NANO и Bluetooth модуль HC-06.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
Образовательная робототехника http://portal-pk.ru/news/209-obrazovatelnaya-robototehnika.html Константин Portal-PK 2019-08-23T07:48:21+03:00 Каждый мальчишка, да и многие девочки мечтают построить свою ракету, робота, самолет и т.д. Полететь в космос или на луну. Бороздить бесконечные просторы космоса. На данной почве интерес к современным технологиям у молодежи с каждым годом растет. Одно из самых перспективных направлений, это робототехника. Данное направление становиться все более перспективным и доступным. Сегодня не нужно придумывать из чего собрать робота. Где и что купить для открытия класса робототехники. Компания Базис предлагает готовые решения для вашего ребенка. И так же для вашего класса робототехники. Даже если у вас уже действующая школа робототехники на сайте компании вы найдете новые и уникальные Образовательные робототехнические модули ТЕХНОЛАБ

Для вашего ребенка хорошим выбором будет: Образовательный робототехнический модуль "Предварительный уровень"

Образовательный робототехнический модуль "Предварительный уровень"

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

Классам робототехники и продвинутым юным конструкторам роботов будет интересен Образовательный робототехнический модуль "Экспертный уровень"

Образовательный робототехнический модуль "Экспертный уровень

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

конструктор модульных станков

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

Еще одной полезным инструментом для школы робототехники будет Образовательный модуль "3D Прототипирования"

3D Прототипирования"

Который научить работать с 3D моделями:
1. Сканирование объемных деталей.
2. Научит печатать деталей на 3D принтере.
Работа с 3D принтером и сканером помогут на наглядном примере изучит программы для создания и редактирования 3D моделей и основы работы с ЧПУ станками.

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

]]>
Урок 12.1 -Nextion Editor урок 1. Скачиваем и первый пример hmi. http://portal-pk.ru/news/208-nextion-editor-urok-1-skachivaem-i-pervyi-primer-hmi.html Константин Portal-PK 2019-08-22T10:10:15+03:00 Для моего недавнего проекта была поставлена задача управление с дисплея. И достаточно красивая графика. Выбор пал на дисплей линейки Nextion.

дисплей линейки Nextion

Это обусловлено тем, что у данного дисплея есть ряд преимуществ:

1. Собственный редактор прошивки Nextion Editor. В котором достаточно просто сделать интерфейс, при этом не нужно много писать кода.

Nextion Editor

2. Сенсорный экран. Все активные элементы привязываются автоматически и нет требуется калибровка. Все дисплеи идут откалиброванные с завода.

3. Не расходует мощности нашей Arduino. Так как дисплей оснащен своим микроконтроллером.


Минусы на мой взгляд:

1. Резистивный сенсор. Срабатывает только при нажатии. Что достаточно не привычно. Но при этом срабатывает достаточно быстро и точно.

2. Ограничения разработки возможностью редактора nextion editor . Некоторые задачи не возможно реализовать. Или приходиться делать костыли.

3. Nextion Editor достаточно коряво выводит русские буквы и нет переноса по словам. Только буквенный перенос на новую строчку для любого шрифта.

4. Не поддерживаются картинки с прозрачным фоном . Заливает их черным фоном.

Но это не так критично. Сделать можно очень красивые и сложные панели управления.

Купить дисплей Nextion можно тут .

Скачать редактор Nextion Editor можно тут.

Скачать редактор Nextion Editor

Также можно установить Nextion Editor на OS Linux . Я установил на Ubuntu. Для этого устанавливаем PlayOnLinux. Ищем наше приложения.

Также можно установить Nextion Editor на OS Linux

Нажимаем установить и программа PlayOnLinux автоматически все установит.

После установки запускаем программу. Создаем новый проект для этого в пункте меню выбираем New, вводим название проекта lesson-one и сохраняем. Наш проект будет сохранен в файл lesson-one. hmi. В окне Setting во вкладке Device выберем модель дисплея.

Setting во вкладке Device

Во вкладке Display выбираем ориентацию дисплея и кодировку iso-8859-5, для поддержки русского языка. Во вкладке project можно установить пароль для доступ к проекту.

кодировку iso-8859-5

После создания проекта откроется рабочее поле

После создания проекта откроется рабочее поле

1. Главное меню.

2. Меню управления выравниванием и порядком элементов.

3. Библиотека элементов.

4. Область отображения.

5. Список страниц проекта.

6. Библиотека изображений /Библиотека шрифтов.

7. Окно вывода результатов компиляции.

8. Окно для ввода кода, выполняемого при возникновении события.

9. Зона редактирования атрибутов выбранного элемента.


Давайте добавим картинку в наш проект на Arduino для этого воспользуемся вкладкой загрузки изображений в проект. Загружать нужно картинки соответственного размер. Если разрешение вашего экрана 480х320. Картинка должна быть такого же размера. Программа не умеет подгонять размеры картинок. Это касается и других элементов.

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

Давайте добавим картинку в наш проект на Arduino

Основные элементы
— Добавить изображение. При нажатии этой кнопки откроется стандартное окно выбора файла изображения на диске.
— Удалить выделенное изображение.
— Заменить выделенное изображение.
— Вставить новое изображение перед выделенным.
— Поднять изображение в списке вверх. Индексы изображений будут пересчитаны для обеспечения последовательности сверху вниз.
— Опустить изображение в списке вниз.
— удалить все изображения.

Сейчас мы можем использовать наше изображение в проект.

Давайте сделаем его фоном нашей первой страницы.

свойства страницы pages0, sta на image

Поменяем свойства страницы pages0, sta на image и выберем нашу картинку.

свойства страницы pages0, sta на image

Наш первый проект готов.

Нажимаем кнопку Debug в панели меню. В новом окне откроется пример, как это будет отображаться на дисплее Nextion.

Давайте переименуем страницу с нашим логотипом на Logo. В следующем уроке расскажу для чего я это сделал.

 переименуем страницу с нашим логотипом на Logo

И еще один небольшой нюанс использования программы Nextion Editor . Пока вы не нажмете кнопку Debug или Compile. Бинарный файл для прошивке не обновиться. Можно сделать много изменения, загрузить на дисплей, а изменений нет. Возможно это в моей версии программы или в Linux она себя так ведет. Но у меня такая ситуация была.


Прошить дисплей Nextion можно двумя способами:

1. С помощью UART программатора. Для прошивки воспользуйтесь пунктом меню Upload. Это достаточно долгий процесс. И в Linux нужно заморочиться с портами. Поэтому я пользуюсь вторым способом.

 С помощью UART программатора

2. П рошивка с Sd карты . Для этого в пункте меню file выбираем open builed folder.

Прошивка с Sd карты

Выбираем файл lesson-one.tft и копируем его на карту памяти. Карту предварительно нужно отформатировать в формате FAT32. Карта памяти должна быть 10 класса.


Прошивка дисплея Nextion.

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

Прошивка дисплея Nextion.

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

дисплея Nextion

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

Если вам интересна данная тема пишите в комментарии.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
Orange pi для игры, мультимедийная станции и для работы в офисе. http://portal-pk.ru/news/207-orange-pi-dlya-igry-multimediinaya-stancii-i-dlya-raboty-v.html Константин Portal-PK 2019-08-20T12:05:19+03:00 Однопалатных компьютеров сегодня очень много. Разных производителей и различных моделей. Можно найти mini PC для решения различных задач.
Сегодня я расскажу про недорогую линейку однопалатных мини ПК Orange pi. Данный однопалатным компьютером я пользуюсь уже больше 2 лет.

недорогой одноплатный компьютер Orange pi win plusТак как у меня постоянно не хватало свободного ПК Для работе в офисе или для просмотра youtube. Поэтому больше 2 лет назад я купил недорогой одноплатный компьютер Orange pi win plus. Почему именно этот мини ПК? Дело в том, что он был недорогой с хорошими характеристики. Подробные характеристики и фото смотрите тут.
Но после покупки я понял, что для него очень мало операционных систем и стабильно работает только Armbian. Также пришлось потратить много времени, что бы настройкой воспроизведения видео. Пару дней танцев с бубном. Пк заработок. Работает по сей день. Что я на нем делаю:
1. Редактирование документов и выкладываю материалы на сайт.
2. Смотрю youtube.
И на этом его возможности задачи заканчиваются. Может у вас совсем другие результаты и вы можете подсказать более интересное решения для использования данного Одноплатника. Пишите в комментарии.

Второй однопалатный компьютер Orange pi LiteВторой однопалатный компьютер Orange pi Lite, я приобрел для создания ретро приставки. Для данного однопалатного мини ПК доступно много дистрибутивов. И сделать на нем можно мультимедийную станции, также использовать как персональный компьютер. Подробнее почему именно данный Mini PC я использую и какую ОС поставить читайте в моей статье: Игровая консоль на orange pi. Выбор железа и ОС.
Приставку я собрал и играем с ребенком. Да и гости не прочь поиграть. Так же есть желающие, чтобы я помог им собрать такую же.
Если вам интересна данная тема пишите в комментарии. Если будут комментарии я в свою очередь напишу статью как собрать ретро приставку на недорогом одно платном ПК и может сниму видео. Фото и характеристик Orange pi Lite сотрите тут.

Orange pi Lite менее производительный чем Orange pi win plus

Технические моменты не буду сравнивать, в интернете их очень много. Только поделюсь своим мнением об использовании данный мини ПК. Несмотря на то что Orange pi Lite менее производительный чем Orange pi win plus у него больше возможностей из-за большего выбора дистрибутивов ОС. И при этом они намного стабильнее работают. За 2 года использования Orange pi win plus из всех ОС Обновилась только Armbian. Многие вообще перестали поддерживать данную плату. И на официальных сайтах уделены дистрибутивы. И найти их можно на торрентах или на файлообменниках. Что не внушает доверия.

Orange pi Lite

Конечно это все для различения. Данную линейку мини ПК я планирую использовать в качестве Сердца моего умного дома. Но об это в следующий раз.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
Онлайн программа для симуляции готового G-Code для ЧПУ. http://portal-pk.ru/news/206-onlain-programma-dlya-simulyacii-gotovogo-g-code-dlya-chpu.html Константин Portal-PK 2019-08-12T09:51:47+03:00 Я уже рассказывал как можно сделать чертеж в формате .svg: Inkscape где скачать русскую версию. Настройка Inkscape. И потом из данного файла сгенерировать G-code для ЧПУ станка: Бесплатный онлайн генератор G-Code для ЧПУ станка — MakerCAM.

Как же легко и безболезнен проверить полученный код. Можно воспользоваться управляющей программой для ЧПУ станка. Например universal g-code sender. Как скачать и установить данную программу тоже рассказывал Universal G-Code Sender программа для управления ЧПУ станком.

Но что делать если работать нужно с флешки. И у станка нет монитора. Например как у моего последнего ЧПУ станка. Или у станка стоит компьютер без интернета или без возможности редактировать G-Code. Также на производстве нет времени на это.
Для проверки G-code онлайн я использую вот такую программу: G-Code Q'n'dirty toolpath simulator.
Данная программа работает в любом браузере.

G-Code Q'n'dirty toolpath simulator.

Для проверки кода достаточно перетащить файл или скопировать код и вставить в поле слева.

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

время обработки, минимальное и максимальное перемещение по осям.Справой стороны у нас выводиться 3D модель. Которую можно покрутить. Красными линиями обозначен холостое перемещение. Белыми траектория обработки.

выводиться 3D модель
Ниже приведен вид сверху.

Ниже приведен вид сверху

Вот так будет выглядеть G-code, который мы сделали в MakerCAM в статье: Бесплатный онлайн генератор G-Code для ЧПУ станка — MakerCAM.
будет выглядеть G-code, который мы сделали в MakerCAM
Данная программа очень похожа на universal g-code sender.
И пользоваться ей на столько же просто.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
Бесплатный онлайн генератор G-Code для ЧПУ станка — MakerCAM http://portal-pk.ru/news/205-besplatnyi-onlain-generator-g-code-dlya-chpu-stanka-—-makercam.html Константин Portal-PK 2019-07-23T11:40:19+03:00 Я уже рассказывал как в Inkscape можно начертить 2D деталь. Если не читали смотреть тут: Inkscape где скачать русскую версию. Настройка Inkscape
После создания чертежа в формате .svg из него нужно сделать G-code. Это можно сделать и с помощью Inkscape. Но в данной программе делать, это достаточно долго и много ненужных операций. Для себя открыл онлайн генератор кода MakerCAM.

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

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

MakerCAM можно создавать простые элементы

Но рисовать все ровно проще в Inkscape.
Итак, возьмем заготовку которая сделана в Inkscape. И сделаем наш первый G-code в MakerCAM.

Выбираем файл с компьютера, в меню выберем File - Open SVG File

Итак, возьмем заготовку

Выбираем файл с компьютера, в меню выберем File - Open SVG File .

меню CAM


В меню CAM находятся все основные операции обработки.
Пункт меню drill operation отвечает за сверление.
Выбираем все нужные отверстия удерживая клавишу Shift. И настраиваем сверление.

drill operation отвечает за сверление
name - название операции, можно не менять;
tool diameter - диаметр инструмента;
target depth - глубина сверления;
drill location - центр отверстия, оставляем path center;
hole spacing - расстояние между отверстиями;
safely height - безопасная высота перемещения;
stock surface - начальная высота сверления;
peck distance - заглубление сверла за один прием, выставляем в зависимости от жесткости материала;
plunge rate - скорость врезания режущего инструмента;
После заполнения всех полей должны получить вот такой результат.

После заполнения всех полей должны получить вот такой результат.
Как видим, диаметр сверла выставил 5 мм. А отверстия изначально нарисованы 8 мм. Но несмотря на это сверление будет производиться в центре отверстия.


Сейчас выберем центральный круг сделаем выборку на глубину 3 мм. Выбираем пункт меню pocket operation.

Сейчас выберем центральный круг
name - название;
tool diameter - диаметр фрезы;
target depth - глубина фрезерования;
safely height - безопасная высота перемещения;
stock surface - начальная высота обработки;
step over - процент выборки от диаметра фрезы, не рекомендую ставить больше 50%.
step down - глубина фрезерования за один проход;
feed rate - скорость подачи по осям X, Y;
plunge rate - скорость врезания режущего инструмента;
direction - направление движения рабочего инструмента: по часовой стрелке, или против .

Дальше вырежем нашу деталь, для этого воспользуемся пунктом меню profile operation.

вырежем нашу деталь, для этого воспользуемся пунктом меню profile operation

name - название;
tool diameter - диаметр инструмента;
target depth - глубина фрезерования;
Inside/Outside - вырезать внутри или снаружи, ставим Outside (снаружи);
safely height - безопасная высота перемещения инструмента;
stock surface - начальная высота обработки;
step down - глубина реза за один проход;
feed rate - скорость подачи режущего инструмента;
plunge rate - скорость фрезерования;
direction - направление движения рабочего инструмента: по часовой стрелке, или против .


Обработку детали выбрали сейчас нужно все перепробовать в G-code. Для этого в меню CAM выбираем пункт calculate all.
После чего все траектории обработки будут помечены красным полупрозрачным цветом.

calculate all
Сейчас нужно сохранить в файл.
Выбираем в CAM пункт export gcode.

CAM пункт export gcode
Не забутке выделить все операции. Они должны подсвечиваться синим цветом. В противном случае у вас будет обработка операции которая была выделена остальные не сохраняться.


Сейчас можно зайти в любую программах в которой можно проверить G-code. В Linux нет нормальных программ для эмуляции работы ЧПУ станка. Для проверки кода я пользуюсь программой Universal G-code Sender. Про данную программу уже рассказывал вот тут: Universal G-Code Sender программа для управления ЧПУ станком.
Готовый код можно скачать тут.


Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
Доработка бюджетного 3D принтера Anet A8 - Prusa i3. http://portal-pk.ru/news/204-dorabotka-byudzhetnogo-3d-printera-anet-a8---prusa-i3.html Константин Portal-PK 2019-07-19T07:01:10+03:00 В интернете очень много негативных отзывов о бюджетном 3D принтере Anet A8. Но покупая 3D принтер за 8-9 т. руб. Не стоит ожидать что он будет точным, быстрым и вам не нужно будет его калибровать и модернизировать. Калибровать нужно даже самый дорогой принтер .
Я как счастливый обладатель нового принтера Anet , печатал пластикам PLA и без дополнительных доработок. Но когда возникла потребность печатать ABS пластики по 8-10 часов в день. Без модернизации тут не обойтись.

Немного рекламы. Заходите на сайт спонсора данной статьи арминда.рф. На сайте вы найдете много полезно для вашего производства в том числе Насосы для пропана и нефтепродуктов, компрессоры для СУГ.


Список моих доработок:

1. Распечатал крепления двигателя по оси Y. Крепление с 2 шпильками которые проходят по всему основанию и фиксируются во втором креплении. Данные шпильки играют роль начинателя ремня по оси Y .
Скачать модели для печати можно тут https://www.thingiverse.com/thing:2045010

Распечатал крепления двигателя по оси Y

шпильки по оси Y.

Данные шпильки играют роль начинателя ремня по оси Y.
2. Сделал более надежную фиксацию, для пружинок крепления стола . Для этого распечатал вот такие модельки.

пружинок крепления стола

надежную фиксацию
Скачать модели для печати можно тут https://www.thingiverse.com/thing:2350276


3. Напечатал крепления для вентилятора обдува экструдера . Также кнопку для винтика нажима механизма заправки филамента в экструдер.

крепления для вентилятора обдува экструдера
Скачать модели для печати можно тут https://www.thingiverse.com/thing:2257772


4. Поменял свисток на турбине. Но это не нужная модификация при печати ABS пластиком . Все модернизации которые сделал сразу после покупки 3Д принтера тут: Обзор 3D принтера Anet A8. Сборка. Наладка. Примеры печати


5. Сделал дополнительную направляющую для пластика .

дополнительную направляющую для пластика


Скачать модели для печати можно тут http://www.thingiverse.com/thing:1795148


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

накладки с пластиковыми втулками

накладки с пластиковыми втулками
Скачать модели для печати можно тут http://www.thingiverse.com/thing:2174461


7. Также сделал натяжитель ремня по оси X .

натяжитель ремня по оси X
Скачать модели для печати можно тут http://www.thingiverse.com/thing:2291602


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

уменьшения нагрузки на шаговый двигатель экструдера
Скачать модели для печати можно тут https://www.thingiverse.com/thing:1998669


9. Установил кнопку включения с предохранителем и со стандартным разъемом для подключения. Кнопку покупал тут http://s.click.aliexpress.com/e/b2LO95Gc

кнопку включения с предохранителем
Скачать модели для печати можно тут


10. На блок питания установил киллер 80х80. Который покупал тут http://s.click.aliexpress.com/e/bVb0pACo

11. Добавил 2 MOSFET транзистора . Один для нагрева стола второй для нагрева экструдера . Подключаем все вот по такой схеме.

Добавил 2 MOSFET транзистора для anet a8 по схеме
MOSFET транзисторы покупал вот тут http://s.click.aliexpress.com/e/FCc0VzA

Добавил 2 MOSFET транзистора

Один для нагрева стола второй для нагрева экструдера.


Скачать модели для печати можно тут https://www.thingiverse.com/thing:2086107

Более подробнее про доработку 3д принтера anet a8 смотрите в видео. Так как тут не все что я изменил. Просто нет фото и сделать сейчас не могу. Принтер стоит в закрытом корпусе.

Первая печать ABS пластиком после модернизации станка.

Первая печать ABS пластиком после модернизации станка.
Напечатал детали для фрезерного ЧПУ станка. Ушло около 2 кг пластика.

Напечатал детали для фрезерного ЧПУ станка. Ушло около 2 кг пластика.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
PathCAM — Программа генерации g-code для фрезерного ЧПУ станка из 3D моделей .stl или .obj. http://portal-pk.ru/news/203-pathcam-—-programma-generacii-g-code-dlya-frezernogo-chpu.html Константин Portal-PK 2019-07-18T07:13:32+03:00 Наткнулся недавно на программу которая может сгенерировать траекторию движения для фрезерных ЧПУ станков из 3D моделей в формате .stl или .obj .

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

И так вернемся обратно к наше программе. Вот что пишет автор о своем программном обеспечении:

«PathCAM - Программное обеспечение для генерации траекторий для роботов с ЧПУ! PathCAM - это простой и удобный инструмент для создания 2,5-мерных траекторий для вырезания форм из заготовки с помощью фрезерного станка с ЧПУ. PathCAM может подключаться напрямую к некоторым роботам с ЧПУ и может экспортировать простой .gcode для других.

PathCAM - Программное обеспечение для генерации траекторий для роботов с ЧПУ

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


Установить в PathCAM

Установить в PathCAM

Ubuntu

Сборка и запуск с помощью этих команд:

sudo apt-get install mono-devel mono-gmcs
git clone https://github.com/xenovacivus/PathCAM.git
cd PathCAM
xbuild
mono GUI/bin/Debug/PathCAM.exe

Windows

  • Скачать пакет PathCAM MSI
  • Кроме того, вы можете создавать исходные коды с помощью Mono или Visual Studio 2012.

Использование.

Начните с загрузки файла .stl или .obj - вы можете просто перетащить файл из файловой системы или воспользоваться кнопкой «Открыть файл».Перед загрузкой файла убедитесь, что раскрывающийся список для масштаба установлен правильно (большинство файлов в Thingiverse указаны в миллиметрах). Вы можете перемещать модели. Получив все, что вам нужно, попробуйте сгенерировать несколько путей.

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

Начните с загрузки файла .stl или .obj

  • Добавить контуры периметра: добавляет траектории, которые следуют за краями объекта. Траектории будут разделены на слои в зависимости от «Максимальной глубины резания» и будут выполнять два прохода вдоль каждого края: один черновой разрез, удаление основной массы материала и чистый разрез, подгоняя край до точного размера.


Сгенерированные пути инструмента вы можете сохранить их в файл .gcode

Сгенерированные пути инструмента вы можете сохранить их в файл . gcode или запустить их непосредственно из PathCAM на определенных станках (включая машины с GRBL !!!). Подключения к большему количеству станкам будут добавлены в будущем - если вы об этом думаете, скажите что-нибудь, и, возможно, он будет добавлен раньше!


Программа работает но у меня на Linux глючит. Возможно на Windows будет работать стабильнее.

Программа не является идеально. Но может кому-нибудь пригодиться.

]]>
Bluetooth HC-06 и ардуино. Приложение андроид для управления Реле с телефона. http://portal-pk.ru/news/202-bluetooth-hc-06-i-arduino-prilozhenie-android-dlya-upravleniya.html Константин Portal-PK 2019-07-16T11:34:25+03:00 Как подключить Bluetooth модель HC-06 или HC-05 рассказывал в Уроке 11 - Bluetooth модуль HC-06. Управление Arduino с телефона.

В уроке мы использовали стороннее приложения для Android телефона или планшета. Сегодня мы напишем свое приложение в mit app inventor. Подправим скетч из Arduino урока11, для работы с низкоуровневым реле. С высоко уровненным рее работать будет без изменения скетча. Чем отличаются высоко уровневые реле от низко уровневых. Низко уровневые включается, когда на сигнальны Пин реле подается LOW. Высоко уровневый включается, когда подадим HIGH. Конструктивные особенности и более подробную информацию ищите в интернете.

Приступим к приложению для Андроида , для этого воспользуемся самым простым решением app inventor 2. Если у вас возникли сложности с данной средой разработки у меня на сайте есть боле простые примеры написания приложений в данной среде разработки : Wi-Fi реле на NodeMCU. Управление Android приложением
Интерфейс программы будет выглядеть вот так.

Интерфейс программы app inventor 2
В приложение нужно добавить: BluetoothClient1 и Clock1 с интервалом обновления 100.
Кнопка «Bluetooth» осуществляет подключение к hc-06 модулю.
Копка «Disconnect» разрывает соединение.
Кнопки «On» и «Off» включают и выключают реле.
Блоки программы для подключения и отключения модулю HC-06 :

Блоки программы для подключения и отключения модулю HC-06:
Блок управления и вывода информации на дисплей.

Блок управления и вывода информации на дисплей.
Копка включения отправляет по блютуз каналу значение равное 1. Кнопка отключения отправляет 0.
Cloc1 это часы, проверяют информацию которая пришла по Bluetooth и выводит ее в текстовое поле Info.
Приложение на Android устройстве выгладить вот так.

Приложение на Android устройстве
После нажатия на кнопку «Bluetooth». У вас откроется окно выбора устройства.

После нажатия на кнопку «Bluetooth». У вас откроется окно выбора устройства.

Выбираете ваше устройство. После чего можно управлять реле. При нажатии на кнопку «On».

При нажатии на кнопку «On»

В поле Info выведется информация «Rele On — Portal-Pk.ru». При выключении реле на экран телефона будет строка «Rele Off — Portal-Pk.ru»

При выключении реле на экран телефона будет строка «Rele Off — Portal-Pk.ru»
Подключаем к Arduino UNO реле и модуль по схеме. Подключаем к Arduino UNO реле и модуль по схеме
Если у вас Arduino NANO, то реле и bluetooth модуль hc 06 подключить по схеме.

Arduino NANO, то реле и bluetooth модуль hc 06 подключить по схеме
Скетч bluetooth реле ардуино будет вот таким.

int LED = 5;
int val = 0;
void setup() {
  Serial.begin(9600); //Инициирует последовательное 
  //соединение и задает скорость передачи данных в бит/c (бод)
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);
}
void loop() {
  if (Serial.available() > 0) // пришли данные
  {
    val = Serial.read();
    if (val=='1')         // если 1 то включаем светодиод
     {
      digitalWrite(LED,LOW);
      Serial.print("Rele On - "); // вывод данных
      Serial.println("Portal-Pk.ru"); // вывод данных с переносом строки
     }
    if (val=='0')         // если 0 то выключаем светодиод
      {
        digitalWrite(LED,HIGH);
        Serial.print("Rele Off - "); // вывод данных
        Serial.println("Portal-Pk.ru");  // вывод данных с переносом строки
      }
  }
}

Если вы сделали все правильно, то у вас получиться вот такой результат.

 Arduino из урока: Bluetooth модуль HC-06. Управление Arduino с телефона

 bluetooth реле ардуино
Подключенная нагрузка будет включаться и выключаться . Если у вас работает наоборот возьмите код для Arduino из урока: Bluetooth модуль HC-06. Управление Arduino с телефона.

Сегодня мы разобрали связку ардуино андроид bluetooth . Планирую сделать машину с управлением по bluetooth . И много другое.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем проекте.

]]>
Урок 11 - Bluetooth модуль HC-06. Управление Arduino с телефона. http://portal-pk.ru/news/201-bluetooth-modul-hc-06-podklyuchenie-k-arduino-upravlenie.html Константин Portal-PK 2019-06-29T15:30:28+03:00 В предыдущей статье УправляемArduino через USB. Библиотека Serial.Я рассказал как можно управлять Arduino с компьютера. Bluetooth модуль устроит так, что он работает с библиотекой Serial. Поэтому Bluetooth является самым простым инструментом для беспроводного управления. Но у него тоже есть свои минусы и ограничения о которых я расскажу в следующих проектах.

Рассмотрим подключения на примере Bluetooth модуля HC-06 . Модуль подключается к 0 и 1 пинам ардуины.

Bluetooth модуля HC-06

Схема подключения Bluetooth модуля HC-06 к Arduono UNO.

Схема подключения Bluetooth модуля HC-06 к Arduono UNO

Схема подключения Bluetooth модуля HC-06 к Arduono NANO .

Схема подключения Bluetooth модуля HC-06 к Arduono NANO

Будите внимательны. Подключать нужно RX =>TXD, TX =>RXD.
Скетч будим использовать из статьи: Управляем Arduino через USB. Библиотека Serial .

int LED = 13;
int val = 0;

void setup() {
  Serial.begin(9600); //Инициирует последовательное 
  //соединение и задает скорость передачи данных в бит/c (бод)
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);
}

void loop() {
  if (Serial.available() > 0) // пришли данные
  {
    val = Serial.read();
    if (val=='1')         // если 1 то включаем светодиод
     {
      digitalWrite(LED,HIGH);
      Serial.print("Led On - "); // вывод данных
      Serial.println("Portal-Pk.ru"); // вывод данных с переносом строки
     }
    if (val=='0')         // если 0 то выключаем светодиод
      {
        digitalWrite(LED,LOW);
        Serial.print("Led Off - "); // вывод данных
        Serial.println("Portal-Pk.ru");  // вывод данных с переносом строки
      }
  }
}

Чтобы ни чего самостоятельно не писать для Android. Воспользуемся готовым приложением который умеет подключаться к Bluetooth устройствам и отправлять и получать данные в терминал - Bluetooth Terminal.

Скачать его можно в Плей маркете. В поиск вбиваем Bluetooth Terminal.

В поиск вбиваем Bluetooth Terminal

Устанавливаем приложение.

Устанавливаем приложение

Запускаем его и ищем наше устройство.

Запускаем его и ищем наше устройство.Почему-то мое устройство видит как HC-05. Но это не страшно работают данные модули одинаково.

Сейчас оправим в терминале 1. Светодиод на плате включается, при этом мы получаем в терминал ответ «Led On - Portal-Pk.ru»

Сейчас оправим в терминале 1. Светодиод на плате включается, при этом мы получаем в терминал ответ «Led On - Portal-Pk.ru»

Led On - Portal-Pk.ru

Если отправим 0, выключается, при этом мы получаем в терминал ответ «Led Off - Portal-Pk.ru»

Если отправим 0, выключается, при этом мы получаем в терминал ответ «Led Off - Portal-Pk.ru»

Это самый простои пример управления с помощью Bluetooth модуля. Планирую сделать несколько проектов по данной теме. Написать приложение для Android.

Больше фото смотрите тут: Урок 10 - Датчик температуры DS18B20, подключаем к Arduino.

Предыдущий урок: Фото для урока 11. Bluetooth модуль HC-06. Управление Arduino с телефона.

Если вам интересна данная тема пишите в комментарии.

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Всем Пока-Пока. И до встречи в следующем уроке.

]]>
Управляем Arduino через USB. Библиотека Serial. http://portal-pk.ru/news/200-upravlyaem-arduino-cherez-usb-biblioteka-serial.html Константин Portal-PK 2019-06-18T08:44:23+03:00 Набор функций Serial служит для связи устройства Ардуино с ПК или другими устройствами, поддерживающими последовательный интерфейс обмена данными. Все платы Arduino имеют хотя бы один последовательный порт (UART). Для обмена данными Serial используют цифровые порты ввод/вывода 0 (RX) и 1 (TX) , а также USB порт. Важно учитывать, что если вы используете функции Serial, то нельзя одновременно с этим использовать пины 0 и 1 для других целей.

Среда разработки Arduino IDE имеет встроенный монитор порта. Для начала обмена данными необходимо запустить монитор нажатием кнопки « Монитор порта » и выставить ту же скорость связи, с которой вызвана функция begin().

Основные функции Serial
  • begin()
  • end()
  • available()
  • read()
  • flush()
  • print()
  • println()
  • write()
  • peek()

В нашем примере мы рассмотрим только часть функция Serial.

Serial.write() – записывает в порт данные в двоичном виде.

Serial.print() - может иметь много значений, но все они служат для вывода информации в удобной для человека форме. Например, если информация, указанная как параметр для передачи, выделена кавычками – терминальная программа выведет ее без изменения. Если вы хотите вывести какое-либо значение в определенной системе исчисления, то необходимо добавить служебное слово: BIN-двоичная, OCT – восьмеричная, DEC – десятичная, HEX – шестнадцатеричная. Например: Serial.print(25,HEX).

Serial.println() делает то же, что и Serial.print(), но еще переводит строку после вывода информации.

SerialEvent() Автоматически вызывается при поступлении новых данных.

Serial.begin() Инициирует последовательное соединение и задает скорость передачи данных вбит/c (бод). Для обмена данными с компьютером используйте следующие значения: 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600 или 115200.

Первое что мы с вами сделаем это будем управлять встроенным светодиодом на плату Arduino который подключен к 13 пину.

int LED = 13;
int val = 0;
void setup() {
  Serial.begin(9600); //Инициирует последовательное 
  //соединение и задает скорость передачи данных в бит/c (бод)
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);
}
void loop() {
  if (Serial.available() > 0) // пришли данные
  {
    val = Serial.read();
    if (val=='1')         // если 1 то включаем светодиод
      digitalWrite(LED,HIGH);
    if (val=='0')         // если 0 то выключаем светодиод
      digitalWrite(LED,LOW);
  }
}

В монитор порта ни какой информации не возвращается. Также можно вывести в монитор порта информацию полученную от Arduino.

В монитор порта ни какой информации не возвращается

При включении светодиода выведем: « Светодиод вкл .». И также выведем слово « Portal-Pk.ru», с переносом строки. Чтобы следующая запись выводилась строчкой ниже.

При выключении светодиода выведем: «Светодиод выкл.». И также выведем слово «Portal-Pk.ru» с переносом строки.

int LED = 13;
int val = 0;
void setup() {
  Serial.begin(9600); //Инициирует последовательное 
  //соединение и задает скорость передачи данных в бит/c (бод)
  pinMode(LED, OUTPUT);
  digitalWrite(LED, HIGH);
}
void loop() {
  if (Serial.available() > 0) // пришли данные
  {
    val = Serial.read();
    if (val=='1')         // если 1 то включаем светодиод
     {
      digitalWrite(LED,HIGH);
      Serial.print("Светодиод вкл. "); // вывод данных
      Serial.println("Portal-Pk.ru"); // вывод данных с переносом строки
     }
    if (val=='0')         // если 0 то выключаем светодиод
      {
        digitalWrite(LED,LOW);
        Serial.print("Светодиод выкл. "); // вывод данных
        Serial.println("Portal-Pk.ru");  // вывод данных с переносом строки
      }
  }
}

При выключении светодиода выведем: «Светодиод выкл.». И также выведем слово «Portal-Pk.ru»

Данный инструмент помогает при отладки программы . В монитор порта модно вывести состояние оборудования, на коком этапе выводит ошибку и пр.

Смотрите также: Уроки Arduino: Подключение датчиков и модулей к Arduino

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

]]>
Урок 10 - Датчик температуры DS18B20, подключаем к Arduino. http://portal-pk.ru/news/199-datchik-temperatury-ds18b20-podklyuchaem-k-arduino.html Константин Portal-PK 2019-06-16T11:20:24+03:00 В предыдущем уроке мы рассмотрели подключения датчика температуры и влажности DHT11 к Arduino. И выяснили что данный датчик не очень точный. Чем же его можно заменить? Одним из распространенных датчиков для измерения температуры являться DS18B20. Рассмотрим в данном уроке варианты подключения датчика, пару примеров программного решения.

Одним из распространенных датчиков для измерения температуры являться DS18B20

Характеристики датчика DS18B20:

  • Погрешность измерения не больше 0,5 С (для температур от -10С до +85С). Не требуется дополнительная калибровка.
  • Диапазон измерений от -55 С до +125 С.
  • Напряжение питания от 3,3В до 5В.
  • Датчик обладает своим уникальным серийным кодом.
  • Не требуются дополнительные внешние элементы.
  • Можно подключить сразу до 127 датчиков к одной линии связи.
  • Информация передается по протоколу Wire.
  • Существует так называемый режим паразитного питания – в нем происходит питание напрямую от линии связи. Для подключения в этом случае нужны только 2 провода. Важно, что в этом режиме не гарантируется корректная работа при температурах выше 100С. Режим паразитного питания удобно обычно применяется для приложений с удаленным температурным датчиком.

Датчик выпускается в открытом корпусе в виде транзистора для измерения температуры воздуха.

Датчик DS18B20 выпускается в открытом корпусе в виде транзистора для измерения температуры воздухаМожно купить датчик в виде модуля DS18B20. Распаренный на плате.

Можно купить датчик в виде модуля DS18B20Также датчик DS18B20 продеться в закрытом корпусе для измерения температуры жидкости.

Также датчик DS18B20 продеться в закрытом корпусе для измерения температуры жидкости

Для урока нам понадобиться:

Подключаем датчик DS18B20 к Arduino NANO вот по такой схеме.

Подключаем датчик DS18B20 к Arduino NANO

Подключение датчика DS18B20 к Arduino UNO будет вот таким.

Подключение датчика DS18B20 к Arduino UNO

Для написания программы нам понадобиться библиотека OneWire.<