Arduino и ЧПУ на Portal-PK.ru http://portal-pk.ru/ Arduino проекты, уроки, а также самоделки и самодельные ЧПУ станки на Portal-PK.ru ru Елочная смарт-гирлянда с управлением через мобильное приложение. 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.
Twinkle Fade - Blink several LEDs on, fading out.
Twinkle Fade Random - Blink several LEDs in random colors on, fading out.
Sparkle - Blinks one LED at a time.
Flash Sparkle - Lights all LEDs in the selected color. Flashes single white pixels randomly.
Hyper Sparkle - Like flash sparkle. With more flash.
Strobe - Classic Strobe effect.
Strobe Rainbow - Classic Strobe effect. Cycling through the rainbow.
Multi Strobe - Strobe effect with different strobe count and pause, controlled by speed setting.
Blink Rainbow - Classic Blink effect. Cycling through the rainbow.
Chase White - Color running on white.
Chase Color - White running on color.
Chase Random - White running followed by random color.
Chase Rainbow - White running on rainbow.
Chase Flash - White flashes running on color.
Chase Flash Random - White flashes running, followed by random color.
Chase Rainbow White - Rainbow running on white.
Chase Blackout - Black running on color.
Chase Blackout Rainbow - Black running on rainbow.
Color Sweep Random - Random color introduced alternating from start and end of strip.
Running Color - Alternating color/white pixels running.
Running Red Blue - Alternating red/blue pixels running.
Running Random - Random colored pixels running.
Larson Scanner - K.I.T.T.
Comet - Firing comets from one end.
Fireworks - Firework sparks.
Fireworks Random - Random colored firework sparks.
Merry Christmas - Alternating green/red pixels running.
Fire Flicker - Fire flickering effect. Like in harsh wind.
Fire Flicker (soft) - Fire flickering effect. Runs slower/softer.
Fire Flicker (intense) - Fire flickering effect. More range of color.
Circus Combustus - Alternating white/red/black pixels running.
Halloween - Alternating orange/purple pixels running.
Bicolor Chase - Two LEDs running on a background color (set three colors).
Tricolor Chase - Alternating three color pixels running (set three colors).
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.

Данную библиотеку можно установить из менеджера библиотек или скачать отсюда.

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

 <code>#include <OneWire.h>
OneWire ds(2);
void setup() {
    Serial.begin(9600);
}
void loop() {
    byte i;
    byte data[12];
    byte addr[8];
    float celsius;
    // поиск датчика
    if ( !ds.search(addr)) {
        ds.reset_search();
        delay(250);
        return;
    }
    ds.reset();
    ds.select(addr);
    ds.write(0x44, 1); // измерение температуры
    delay(1000);
    ds.reset();
    ds.select(addr); 
    ds.write(0xBE); // начало чтения измеренной температуры
    //показания температуры из внутренней памяти датчика
    for ( i = 0; i < 9; i++) {
        data[i] = ds.read();
    }
    int16_t raw = (data[1] << 8) | data[0];
    // датчик может быть настроен на разную точность, выясняем её 
    byte cfg = (data[4] & 0x60);
    if (cfg == 0x00) raw = raw & ~7; // точность 9-разрядов, 93,75 мс
    else if (cfg == 0x20) raw = raw & ~3; // точность 10-разрядов, 187,5 мс
    else if (cfg == 0x40) raw = raw & ~1; // точность 11-разрядов, 375 мс
    // преобразование показаний в градусы Цельсия 
    celsius = (float)raw / 16.0;
    Serial.print("t=");
    Serial.println(celsius);
}
</code>

Код ниже будет выводить показание температуры в монитор порта каждую секунду

Но данный пример достаточно сложный для понимания. Для упрощения работы с датчиком лучше использовать библиотеку DallasTemperature. Данная библиотека ставиться поверх OneWire. Т.е. для ее роботы должна быть установлена библиотека OneWire.

С библиотекой DallasTemperature устанавливаются примеры. Вы можете воспользоваться любым из них.

Мы рассмотрим более простотой пример.

<code>#include <OneWire.h>
#include <DallasTemperature.h>
// контакт 2 на Arduino:
#define ONE_WIRE_BUS 2
// создаем экземпляр класса OneWire, чтобы с его помощью
// общаться с однопроводным устройством
OneWire oneWire(ONE_WIRE_BUS);
// передаем объект oneWire объекту sensors:
DallasTemperature sensors(&oneWire);
void setup(void)
{
  Serial.begin(9600);
  // запускаем библиотеку:
  sensors.begin();
}
void loop(void){
  // вызываем функцию sensors.requestTemperatures(),
  // которая приказывает всем устройствам, подключенным к шине
  sensors.requestTemperatures();
  Serial.print("Celsius temperature: ");
  //  в Цельсиях:
  Serial.print(sensors.getTempCByIndex(0));
  Serial.print(" - Fahrenheit temperature: ");
  //  в Фаренгейтах:
  Serial.println(sensors.getTempFByIndex(0));
  delay(1000);
}
</code>

В данном примере температура выводиться 1 раз в секунду. И при этом выводится температура в Цельсиях и фарингитах.

В данном примере температура выводиться 1 раз в секунду.

Как видите данный пример намного меньше и более понятен для новичка.


На одну шину можно подключить до 127 датчиков вот по такой схеме.

На одну шину можно подключить до 127 датчиков вот по такой схеме

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

Больше фото тут: Фото для урока 10. Подключаем DS18B20 к Arduino

Предыдущий урок: Урок 9 - Подключаем датчик температуры и влажности DHT11 к Arduino


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

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

]]>
Светодиодные часы своими руками на ардуино (Arduino) WS2812 управляемых (адресных) http://portal-pk.ru/news/198-svetodiodnye-chasy-svoimi-rukami-na-arduino-arduino-ws2312.html Константин Portal-PK 2019-06-13T08:28:48+03:00 После очередной модернизации своего 3D принтера . Кстати статья и видео по модернизации Anet 8A скоро выложу.

И так о чем это я. Ах да. И вот решил я напечатать плоские и большие детали. Именно они у меня отрывались от стала 3D принтера. Даже бывало отрывало вместе со скотчем.

Нашел я модель светодиодных часов . Скачать модель можно со страницы автора.

Нашел я модель светодиодных часов

Для проекта желательно взять плату Arduino Nano , и модуль часов DS3231.

Сборка часов на Arduino и адресных светодиодах WS2812:

1. Печатаем все детали на 3D принтере.

Печатаем все детали на 3D принтере

2. Приклеиваем светодиодную ленту на 2 пластины и спаиваем их зигзагом.

Приклеиваем светодиодную ленту на 2 пластины и спаиваем их зигзагом

Нашел я модель светодиодных часов.

3. Устанавливаем решетки поверх ленты. Получим вот такой результат. Устанавливаем решетки поверх ленты

4. Укладываем все в корпус часов и крепим все на винтики М3.

Укладываем все в корпус часов и крепим все на винтики М3

5. Ставим крепление для ножек и крепим ножки.

Ставим крепление для ножек и крепим ножки.

6. Подключаем электронику по схеме.

Подключаем электронику по схеме.

Подключаем электронику по схеме.

7. Загружаем прошивку в Arduino. Автор использует Arduino Pro Mini, я решил использовать Arduino NANO v2 (ATmega168).

Загружаем прошивку в Arduino. Автор использует Arduino Pro Mini, я решил использовать Arduino NANO v2 (ATmega168)

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

В итоги у часов получились вот такие возможности:

1. Настройка цвета циферблата.

2. Изменение яркости 10 режимов.

3. Вывод текущей даты в виде бегущей строки.

4. Сохранение всех настроек в энергонезависимую память. При выключении часы сохраняются все настройки.

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

6. Прошивка уменьшаться на Arduino Nano V2.0 (ATmega168) . При увеличение функционала часов необходимо использовать Arduino Nano V3.0 (ATmega328) .

В итоги у часов получились вот такие возможности

В связи с тем что я использовал Arduino Nano V2.0 (ATmega168), дальше расширять функционал не получится. Нет свободной памяти. Но если поставить Arduino Nano V3.0 (ATmega328) в которой памяти в 2 раза больше . Соответственно функционал можно расширят:

1. Сделать авто регулировку яркости. Поставив фото резистор.

2. Поставить спикер и написать настройку будильника.

3. К функциям будильника можно сделать стробоскоп. Мигать просто белым или как полицейская сирена одна сторона синим другая красным.

4. Поменять Arduino Nano на NodeMCU и сделать управление часами через смартфон. Вывести погоду, курс валюты. Грубо говорят сделать информер. Но так как дисплей часов не очень большой. Большая информация будет не очень читабельная.

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

Больше фото по проекту сотрите тут: Светодиодные часы своими руками на ардуино (Arduino) WS2312

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

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

]]>
Урок 9 - Подключаем датчик температуры и влажности DHT11 к Arduino http://portal-pk.ru/news/197-podklyuchaem-datchik-temperatury-i-vlazhnosti-dht11-k-arduino.html Константин Portal-PK 2019-06-11T04:53:26+03:00 Датчик температуры и влажности DHT11 очень распространен в Ардуино проектах. Например в умных домах. Даже не смотря на характеристики:

  • Потребляемый ток – 2,5 мА (максимальное значение при преобразовании данных);
  • Измеряет влажность в диапазоне от 20% до 80%. Погрешность может составлять до 5%;
  • Применяется при измерении температуры в интервале от 0 до 50 градусов (точность – 2%)
  • Питание – от 3 до 5 Вольт;
  • Одно измерение в единицу времени (секунду). То есть, частота составляет 1 Гц;

Как видим датчик DHT11 не очень точный. Но он достаточна дешевый. И для измерение в бытовых помещениях подходит.

датчик DHT11

Датчик может быть в виде модуля и у него всего 3 ноги для подключения. Как в моем случае.

Так и самостоятельный датчик. С 4 ногами. Схема подключения для него будет вот такая.

 датчик DHT11 С 4 ногами

Мы рассмотрим подключения модуля. Подключение отличается не очень сильно.

Схема подключения DHT11 к Arduino NANO

Схема подключения DHT11 к Arduino NANO

Схема подключения DHT11 к Arduino UNO

Схема подключения DHT11 к Arduino UNO

Программа для обоих вариантов будет одинаковая.

Для подключения датчика DHT11 к Arduino потребуется библиотека DHT. Скачать можно здесь.

Для подключения датчика DHT11 к Arduino потребуется библиотека DHT

Для работы нежно установить еще и Adafruit_Sensor.

После установки библиотек выбираем пример в Arduino IDE для этого преходим (Файл -> Примеры -> DHT sensor -> DHTtester).

Или копируйте вот этот код. Это то же пример из библиотеки.

 
#include "DHT.h"
#define DHTPIN 2     // контакт, к которому подключаемся
// и расскомментировать строчку датчика:
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
// инициализируйте датчик DHT 
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!"); 
  dht.begin();
}
void loop() {
  delay(2000);
  // считывание данных температуры и влажности
  float h = dht.readHumidity();
  // температура в Цельсиях:
  float t = dht.readTemperature();
  // температура в Фаренгейте:
  float f = dht.readTemperature(true);
  // проверяем, корректно ли прочитались данные,
  // и если нет, то пробуем еще раз:
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    // "Не данных с DHT!"
    return;
  }
  // рассчит теплового индекса;
  float hi = dht.computeHeatIndex(f, h);
  Serial.print("Humidity: ");  //  "Влажность: "
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");  //  "Температура: "
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");  //  "Тепловой индекс: "
  Serial.print(hi);
  Serial.println(" *F");
}


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

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

Данные температуры и влажности выводятся в виде строки с интервалом 2 сек.

Данные температуры и влажности выводятся

Также выводится температура в Фаренгейтах и тепловой индекс.


Больше фото урока Подключаем датчик температуры и влажности DHT11 к Arduino. Смотрите тут.

Предыдущий урок: Урок 8 — Подключаем реле к Arduino. Пример работы и скетч

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

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

]]>
Приложение с одной кнопкой для управления Wi-Fi реле http://portal-pk.ru/news/196-prilozhenie-s-odnoi-knopkoi-dlya-upravleniya-wi-fi-rele.html Константин Portal-PK 2019-05-15T13:42:07+03:00 Управлять нагрузкой с помощью реле достаточно просто. Можно сделать автоматизацию данного процесса. Или даже сделать Wi-Fi реле на базе NodeMCU. Об этом подробно рассказываю в своем предыдущем проекте: Wi-Fi реле на NodeMCU. Управление Android приложением
Управлять одним реле с помощью двух кнопок не очень удобно. Да и место занимает на экране много. Поэтому решил переделать приложения для Android. Прошивка для NodeMCU остается без изменений и останавливаться на ее описании не буду.
Переделаем дизайн Android приложения в MIT App Inventor. У меня получилось вот так.

дизайн Android приложения в MIT App Inventor


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

Объявим глобальную переменную flag
При нажатии кнопку Button2 Мы сохраняем Ip который указан в поле TextBox1.
Кнопка Button1 Это наша кнопка ради которой я пишу данную статью. Включение и выключение реле. При нажатие которой отправляем запрос. Если переменная flag равна 1 на выключения реле и если 0 то на включения реле. У вас может работать на оборот все зависит от типа реле.

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

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

Проверяем, что приложение отвечает и все работает нормально. Это обозначает код 200. Дальше проверяем, что мы получили от приложения. Если получаем значение OFF значит наше устройство выключено и соответственно меняем цвет кнопки на красный и пишем надпись на Выключить. Иначе если получено значение значение On значить наше реле включено, меняем цвет кнопки на зеленый и меняем надпись на Включить.

На телефоне данное приложение выглядит вот так.

На телефоне данное приложение выглядит вот так

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

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


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

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

]]>
Где послущать музыку в 21 веке. http://portal-pk.ru/news/195-gde-poslushchat-muzyku-v-21-veke.html Константин Portal-PK 2019-05-04T09:25:06+03:00 Майские праздники в самом разгаре. И каждый выбирает отдых под себя. Одни едут на дачу, для того чтобы культурно отдохнуть, пожарить шашлык. Другие ходят в гости. Третьи наслаждаются отдыхом дома. Но отдых не отдых без любимой музыки.

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

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

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

]]>
Bluetooth колонки своими руками http://portal-pk.ru/news/194-bluetooth-kolonki-svoimi-rukami.html Константин Portal-PK 2019-05-03T13:44:37+03:00 Весна в самом разгаре. Все выезжают на дачи, в сады и просто на природу. Чтобы культурно отдохнуть или заняться посадкой культурных растений. Для того чтобы веселее работалось, да и отдых не отдых без музыки. Для этих целей отлично подходят беспроводные колонки. Но достаточно мощные стерео Bluetooth колонки не всем по карману. Да и тратить деньги чтобы раз в месяц послушать на даче музыку, сомнительное решение для семейного бюджета. Поэтому я решил сделать из старых колонок которые лежат у меня без дела уже больше 5 лет.

Для переделки нам понадобиться:
1. Старые колонки.
2. Блютуз модуль.
3. Разъем для подключения источника питания.
4. Для подключения на природе может понадобиться Power bank.


Из колонок выкидываю всё лишнее.

Из колонок выкидываю всё лишнее

И устанавливаю Bluetooth модуль.

 Bluetooth модуль


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

Динамики, которые стоят в колонках отлично подошли


Питание модуля 5В. Подойдет зарядное устройство от телефона или Power bank. Поэтому я сделал из usb провод для подключения я к колонке.

сделал из usb провод для подключения я к колонке

Ответною часть установил в колонку.

Ответною часть установил в колонку

Все спаиваем и получаем наши беспроводные Bluetooth колонки.

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

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

]]>
Урок 9 - Бегущие огни на Arduino UNO http://portal-pk.ru/news/193-begushchie-ogni-na-arduino-uno.html Константин Portal-PK 2019-05-02T12:52:03+03:00 Продолжаем уроки в которых мы используем Arduino, резисторы и светодиоды. Мы уже делали Светофор, полицейский стробоскоп, отправляли сигнал sos и пр.
Сегодня мы будем делать бегущие огни. Бегущие огни уже были в другом блоке уроков на Arduino: Урок 2 — Подключаем сдвиговый регистр 74НС595 к Arduino. «Бегущие» огни
При подключении к сдвиговому регистру всего при подключении по 3 проводам мы можем управлять 8 светодиодами. Но вот чтобы подключить 10 светодиодов, нужно подключать 2 сдвиговых регистра и использовать всего 2 выхода из 8 доступных в регистре. Это не очень логично. Иногда бывает проще подключить к плате Arduino нужное количество светодиодов. Что я и планирую сделать. В примере будет 5 самых простых режимов бегущих огней на Arduino.

Для урока нам понадобится:

  • Arduino UNO или Arduino Nano
  • Плата макетная беспаечная
  • Резисторы 220 ОМ
  • Соединительные провода папа-папа
  • Светодиоды 3 или 5 мм.

Для урока нам понадобится

Подключим наши 10 светодиоды вот по такой схеме.

Подключим наши 10 светодиоды вот по такой схеме



В живую будет выгладить так.

режимов бегущих огней на Arduino

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

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

Первый пример бегущих огней на Arduino, последовательное включение одного светодиода с 1 по 10. По пинам на ардуино будет с 0 по 9. Это нужно учитывать при написании кода.

int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
  for (int i = 0; i < last_pin; i++) // цикл 
    pinMode(i, OUTPUT);  // инициализируем пины как выходы 
}
// Основной цикл 
void loop() {
  for (int j = 0; j < last_pin; j++) { //перебираем пины с 0 до last_pin
    digitalWrite(j, HIGH); //зажигание следующего светодиода
    delay(300); //задержка 300мсек
    digitalWrite(j, LOW); //гасим все светодиоды
  }
}

Немного изменим данный пример и сделаем 2 цикла. Получим включение всех светодиодов и выключение в обратном направлении.

int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
  for (int i = 0; i < last_pin; i++) // цикл 
    pinMode(i, OUTPUT);  // инициализируем пины как выходы 
}
// Основной цикл 
void loop() {
  for (int j = 0; j < last_pin; j++) { //перебираем пины с 0 до last_pin
    digitalWrite(j, HIGH); //зажигание следующего светодиода
    delay(300); //задержка 300мсек
  }
  for (int j = last_pin-1; j >= 0; j--) { //перебираем пины с 0 до last_pin
       digitalWrite(j, LOW); //гасим все светодиоды
    delay(300); //задержка 300мсек
  }
}

Объединив код первого и второго примера получим включение одного светодиода в прямом и обратном направлении. Во втором цикли ставим j-2, потому что у нас пины начинаются с 0, а число светодиодов с 1 до 10. Также чтобы 10 светодиод не включался 2 раза вычитаем еще 1.

int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
  for (int i = 0; i < last_pin; i++) // цикл 
    pinMode(i, OUTPUT);  // инициализируем пины как выходы 
}
// Основной цикл 
void loop() {
  for (int j = 0; j < last_pin; j++) { //перебираем пины с 0 до last_pin
    digitalWrite(j, HIGH); //зажигание следующего светодиода
    delay(300); //задержка 300мсек
    digitalWrite(j, LOW); //гасим все светодиоды
  }
  for (int j = last_pin-2; j > 0; j--) { //перебираем пины с 0 до last_pin
    digitalWrite(j, HIGH); //зажигание следующего светодиода
    delay(300); //задержка 300мсек
    digitalWrite(j, LOW); //гасим все светодиоды
  }
}

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

int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
  for (int i = 0; i < last_pin; i++) // цикл 
    pinMode(i, OUTPUT);  // инициализируем пины как выходы 
}
// Основной цикл 
void loop() {
int half = last_pin/2; //last_pin должгно быть четным числом 
  for (int j = 0; j < half; j++) { //перебираем пины с 0 до last_pin
    int k = last_pin-j-1;
    digitalWrite(j, HIGH); //зажигание следующего светодиода
    digitalWrite(k, HIGH); //зажигание следующего светодиода
    delay(300); //задержка 300мсек
    digitalWrite(k, LOW); //гасим все светодиоды
    digitalWrite(j, LOW); //гасим все светодиоды
  }
}

И по аналогии делаем расходящиеся огни.

int last_pin = 10; //Кол-во светодиодов
//блок для инициализации входов-выходов и других исходных данных
void setup() {
  for (int i = 0; i < last_pin; i++) // цикл 
    pinMode(i, OUTPUT);  // инициализируем пины как выходы 
}
// Основной цикл 
void loop() {
int half = last_pin/2; //last_pin должгно быть четным числом 
  for (int j = half; j > 0; j--) { //перебираем пины с 0 до last_pin
    int k = last_pin-j;
    digitalWrite(j-1, HIGH); //зажигание следующего светодиода
    digitalWrite(k, HIGH); //зажигание следующего светодиода
    delay(500); //задержка 300мсек
    digitalWrite(k, LOW); //гасим все светодиоды
    digitalWrite(j-1, LOW); //гасим все светодиоды
  }
}

Как видно без использования сдвигового регистра код получается намного проще и меньше строчек. Один минус количество ограничено. Максимум 20 светодиодов можно подключить к Arduino Uno и 22 к Arduino NANO. Думаете что я ошибся с цифрами. Подписывайтесь на канал. И в следующем уроке в данном блоке уроков я покажу как можно это реализовать.

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

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

]]>
Роль авто в современном мире. http://portal-pk.ru/news/190-rol-avto-v-sovremennom-mire.html Константин Portal-PK 2019-04-21T09:31:33+03:00 Наш мир с каждым днем становиться все более динамичный. Движение становиться все более быстрым. Что диктует тенденцию наличия автомобиля, не только в каждой семье но и у каждого члена семьи, старше 18 лет. Авто необходимо не только для личного использования. Для торговых представителей, менеджеров, машине является незаменимым инструментом в работе. Точность поставки играет решающую роль. Поэтому авто должно быть еще и надежное.

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

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

Исходя из этого приобрести машину достаточно не сложно.

]]>
Светодиодный ночник в виде куба. http://portal-pk.ru/news/189-svetodiodnyi-nochnik-v-vide-kuba.html Константин Portal-PK 2019-04-21T07:47:22+03:00 Расширяя используемы материалы и технологии в разработке проектов на Arduino. Сегодня расскажу про светодиодный куб напечатанный на 3d принтере .

светодиодный куб напечатанный на 3d принтере

По традиции в своих разработках использую только бесплатное программное обеспечение . При создании 3D моделей встал вопрос с помощью какой бесплатной программы можно делать достаточно быстро и красивые детали. Еще один момент я работаю только на Linux. Подсмотрел весь спектр программного обеспечения для 3D моделирования. Мне понравились 2 программы:

1. Blender

2. FreeCad

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

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

Основание светильника .

Основание светильника

Корпус светильника.

Корпус светильника.

Скачать модели можно бесплатно и без регистрации из раздела Мои модели для печати на 3d принтере


Электроника светодиодного куба .

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

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

В демонстрационном видео я подвешивал на окно.

Сборка светодиодного Ночника

Сборка светодиодного Ночника.

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

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

симпатичный куб

Скетч для светильника.

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

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#define PIN 6
// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.
void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}
void loop() {
  // Some example procedures showing how to display to the pixels:
  colorWipe(strip.Color(255, 0, 0), 50); // Red
  colorWipe(strip.Color(0, 255, 0), 50); // Green
  colorWipe(strip.Color(0, 0, 255), 50); // Blue
//colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW
  // Send a theater pixel chase in...
  theaterChase(strip.Color(127, 127, 127), 50); // White
  theaterChase(strip.Color(127, 0, 0), 50); // Red
  theaterChase(strip.Color(0, 0, 127), 50); // Blue
  rainbow(20);
  rainbowCycle(20);
  theaterChaseRainbow(50);
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}
void rainbow(uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}
//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();
      delay(wait);
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}
//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
      }
      strip.show();
      delay(wait);
      for (uint16_t i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

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

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

]]>
Тенденции развития. http://portal-pk.ru/news/188-tendencii-razvitiya.html Константин Portal-PK 2019-04-09T18:40:10+03:00 В современном, динамически растущем мире. Стремительное развитие происходит не только в робототехнике и в сфере микроконтроллерной техники. Но также сферы продаже и услуг не стоят на месте.

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

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

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

]]>
Лазерный станок с ЧПУ. Основные понятия http://portal-pk.ru/news/187-lazernyi-stanok-s-chpu-osnovnye-ponyatiya.html Константин Portal-PK 2019-04-09T12:32:07+03:00 Лазерный станок с ЧПУ имеет различные применения в отрасли нашего времени. Несмотря на то, что он очень дорогой, сегодня лазерная резка широко используется для производства от небольших бытовых изделий (в качестве рекламных материалов) до специализированных материалов. Есть много предметов, которые изготавливаются с помощью лазерной резки или гравировки, но лишь немногие знают, как они были изготовлены.

Лазерный станок с ЧПУ

История оборудования для лазерной резки начинается с 1965 году, когда машина, разработанная американской компанией Western Electric Engineering Research Center, впервые использовалась для сверления алмазных штампов. Пару лет спустя они начали резать металлы с помощью лазерных струй кислорода, а затем этот метод был использован для резки титана. Эффективность лазерной резки побудила инженеров адаптировать CO2-лазеры для резки неметаллических материалов. Сегодня уже существуют специальные станки для лазерной резки для определенных применений в широком спектре моделей и марок.

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

CO2-лазеры

Лазер - это устройство, предназначенное для концентрации светового луча в определенной точке; Он состоит из пары зеркал, активной среды, которая позволяет усиливать свет (в твердом, газообразном или жидком состоянии) и пучка света или электрического тока, который будет отдавать энергию активной среде. Название этого устройства - усиление света стимулированным излучением, лазер - его аббревиатура на английском языке (Light Amplification by Stimulated Emission of Radiation), и сегодня оно имеет множество промышленных применений, медицинских и телекоммуникационных.

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

Станок для лазерной резки

Станок для лазерной резки позволяет создавать сложные конструкции, достигая высокой точности, потому что лазер способен перемещаться по любой траектории с высокой скоростью. Кроме того, в зависимости от мощности резки, можно резать различные материалы средней плотности. Это оборудование в настоящее время имеет автоматизированную работу благодаря ЧПУ (числовое управление с помощью компьютера), которое позволяет, помимо поддержания постоянного расстояния между поверхностью материала и излучателем света, программировать команды, которые управляют скоростью и конструкцией, которой следует следовать в соответствии с потребностями каждого среза и материала.

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

Лазерная резка становиться все боле доступной и постепенно начинает вытеснять фрезерные станки с ЧПУ.


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

]]>
Простая аркадная игра на базе Arduino и дисплее LCD – 16x2 http://portal-pk.ru/news/186-prostaya-arkadnaya-igra-na-baze-arduino-i-displee-lcd-16x2.html Константин Portal-PK 2019-04-05T07:55:41+03:00 Игра с использованием Arduino и жидкокристаллического дисплея 16 × 2 . Простая и недорогая реализация игры с минимальными компонентами и простым программированием.

Это хорошая отправная точка для создания собственных ЖК-игры. Здесь предоставлен пример игры в прыжки с боковой прокруткой. Arduino LCD Game . Один минус в том, что используется всего одна кнопка для управления игрой.

Игра с использованием Arduino и жидкокристаллического дисплея 16 × 2

Инструкция по воспроизведению

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

Игра на Arduino это здорово. Но пиграть лучьше на новеньком телефоне. Рекомендую посмотреть Отзывы на смартфон Honor Play 64Г .

С микроконтроллерами Arduino очень легко создавать множество вещей. В этой статье расписано, как создать простую 1-кнопочную видеоигру.

подключить ЖК-дисплей 16 × 2 к Arduino UNO

Автор проекта предоставляет принципиальную схему и список необходимых компонентов, из которых можно получить представление о том, насколько проста реализация проекта. Все, что для этого нужно, это подключить ЖК-дисплей 16 × 2 к Arduino UNO , а также добавить кнопку прерывания.

Список компонентов: Arduino UNO ЖК-экран (16 x 2 символа)

Список компонентов:

Работа с видеоигрой с использованием Arduino

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


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

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

]]>
От программирования на php до разработки роботов и ЧПУ. http://portal-pk.ru/news/185-ot-programmirovaniya-na-php-do-razrabotki-robotov-i-chpu.html Константин Portal-PK 2019-03-28T18:10:49+03:00 Как я рассказывал, программирование микроконтроллеров в среде Arduino IDE и проектирование ЧПУ станков, это мое хобби. Также последнее время я ударился в робототехнику. Планирую собирать от самых простых роботов, до сложных дротов. Но это пока планы. Которые я постепенно реализую.

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

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

После чего происходит поэтапная разработка.

1. Изначально происходит разработка макета страницы, на основе которой делается верстка.

2. По разработанной структуре приложения разрабатывается структура базы данных.

3. Написание движка сайта на различных языках. Я пишу на php.

4. Тестирование нового сайта

5. Доработка найденных недочетов.

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

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

]]>
Экология на производстве. http://portal-pk.ru/news/184-ekologiya-na-proizvodstve.html Константин Portal-PK 2019-03-28T17:45:31+03:00 Любое предприятия или производства используют большое количество различных материалов. При этом ни одно производство не может обойтись без горюче самосмазочных материалов. Это увеличивает аварийного разлива данных материал. Разлив нефтепродуктов наносит большой вред природе и обитающим поблизости насекомым и животным. Причем влияние разлива нефтепродуктов влияют не только на том участке, где был разлив вредных для природы продуктов. Но и прилегающим территории также страдает. Это связанно стем, что дождями и грунтовыми водами нефть разноситься по близ лежащим территориям. Более сложная ситуации разлива нефти в близи водоемов, рек. В таких случае распространение опасных для природы веществ происходит с катастрофически быстрой скоростью. За считанные часы загрязненная территория может увеличиться в разы.
Что делать в таких случаях и как происходит ликвидация разливов нефти?
Для этого есть специализированное оборудование которое помогает остановить загрязнение окружающей среды. И в кротчайшие сроки ликвидировать разлив нефтепродуктов, но и утилизировать последствие аварии.

]]>
Декорирование и покрытее поверхностей самоделок и проектов на Arduino http://portal-pk.ru/news/183-dekorirovanie-i-pokrytee-poverhnostei-samodelok-i.html Константин Portal-PK 2019-03-24T10:31:14+03:00 Как вы знаете что я делаю проекты на Arduino и разливные самоделки из фанеры дерева и МДФ. Сделать достаточно интересную и функциональную вещь это часть работы при создании моих самоделок. Их нужно еще декорировать и покрыть поверхность, что бы они была красивыми и выглядела не только функционально но и аккуратно и симпатично. Для этого есть много различных материалов в том числе мебельный воск. Который придает изделиям очень презентабельный вид. Многие считаю, что воск однообразный и не очень крас сивого цвета. Но современный воск отличается от наших представлений и подойдет практически для любой вещи сделанной из дерева,фанеры и не только.

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

Сейчас я начел делать проекты на своем 3D принтере. Меня интересует чем можно покрывать изделия напечатанные из PLA и ABS пластика? Чем пользуетесь вы? Пишите в комментарии.


]]>
Робот на Arduino, Motor Shield L293D и ультразвуковом датчике HC-SR04 http://portal-pk.ru/news/182-robot-na-arduino-motor-shield.html Константин Portal-PK 2019-03-23T19:07:39+03:00 Устранение препятствий – это одно из существенных центральных проблем при разработке мобильных роботов. В этом документе представлена конструкция умной машины на базе ардуина , которая самостоятельно может определять препятствия и объезжать их , принимая разумные решения. Это роботизированная машинка собирается на мотор шилде (Adafruit Motor Shield), поэтому для ее сборки не нужно ничего паять. Для сервопривода, который вращает сенсор (глаза робота), предусмотрен также вывод.

конструкция умной машины на базе ардуина

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

полностью автономным, робот

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

Автономный робот - это тот, который имеет какие-то встроенные функции искусственного интеллекта.

Автономный робот

Для создания робота на Arduino, Motor Shield L293D и ультразвуковом датчике HC-SR04 понадобиться:

Arduino UNO

Motor Shield L293D

Мотор-редуктор с колесами

Серво Micro 9 г Sg90s

Ultrasonic Sensor - HC-SR04 (Generic)

Li-Ion Battery 1000mAh

RGB Diffused Common Cathode

Buzzer

Resistor 330 ohm

Перемычки для макетных плат

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

схему подключения робота на Arduino, Motor Shield L293D и ультразвуковом датчике HC-SR04

Так же необходимо наличие 2 библиотек в среде Arduino IDE:

AFMotor.h
Servo.h

Скачать код для машины на на Arduino, Motor Shield L293D и ультразвуковом датчике HC-SR04.

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

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


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

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

]]>
Можно ли автоматизировать бассейн с помощью arduino? http://portal-pk.ru/news/180-mozhno-li-avtomatizirovat-bassein-s-pomoshchyu-arduino.html Константин Portal-PK 2019-03-19T11:41:18+03:00 В современных домах принято делать бассейн. Это неотъемлемая част большинства частных домов. Но не смотря на это бассейн это не просто резервуар с водой. А еще и очень сложная система водоочистки и водоподготовки.

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

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

]]>
Шины для машины или робота http://portal-pk.ru/news/179-shiny-dlya-mashiny-ili-robota.html Константин Portal-PK 2019-03-19T11:12:04+03:00 На улице весна. И погода достаточно не стабильная. Сперва все тает, потом застывает. Что приводит к сложностям в движении на автомобиле. Не только по проселочной дороге, но и по городским шоссе. Для более лучшего сцепление с дорогой нужно выбрать качественные покрышки. Шины cordiant обладают хорошими техническими характеристиками резины Кордиант и логичной ценой изделия. Несмотря на довольно молодой возраст (бренд Cordiant появился всего лишь в 2005 году), эти шины успели завоевать любовь и признание потребителя, и достойно конкурируют с европейскими и японскими аналогами.
Не только автомобилям нужны качественные шины для передвижения по скольской и неровной поверхности. Но и самодельные роботы нуждаются в хороших и надежных колесах. На сайте про робототехнику вы найдете большое количество 3D моделей колес. А также модели роботизированных машин.

]]>
Основные операции обработки на фрезерных станках с ЧПУ. http://portal-pk.ru/news/178-frezernyi-stanok-s-chpu-osnovnye-ponyatiya.html Константин Portal-PK 2019-03-15T20:00:46+03:00 Как только начинается процесс фрезерования с ЧПУ, станок начинает вращать режущий инструмент со скоростью, достигающей тысячи оборотов в минуту. В зависимости от типа используемого фрезерного станка и требований фрезерного инструмента, когда инструмент врезается в заготовку, станок выполняет одно из следующих действий для получения необходимых разрезов на заготовке:

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

Фрезерный станок с ЧПУ. Основные понятия.

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

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

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

Наиболее распространенные операции фрезерования с ЧПУ включают в себя:

  1. Торцевое;
  2. Обычное;
  3. Угловое;
  4. Фрезерование формы.

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

Торцевое фрезерование

Типы торцевого фрезерования включают торцевое и боковое фрезерование, в которых используются концевые и боковые фрезы соответственно.

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

Угловое фрезерование

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

Фрезерование форм

Другие операции на фрезерных станках

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

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

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

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

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

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

]]>
Классификация станков с ЧПУ: виды, предназначение http://portal-pk.ru/news/177-klassifikaciya-stankov-s-chpu-vidy-prednaznachenie.html Константин Portal-PK 2019-03-12T17:21:25+03:00 Типы станков с числовым программным управлением практически безграничны.
Эти инструменты могут быть классифицированы в соответствии с моделью таких устройств, как т окарный станок с CNC, сверлильный, шлифовальный, зуборезный, инструмент для нарезания резьбы , фрезерный станок, долбежный, протяжной, пильный станок и тд.

  • Второй способ классификации - по точности: стандартная или высокоточная
  • Третий способ классификации - технология, используемая для обработки
  • Модернизированные машины

Типы станков с числовым программным управлением практически

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

Фрезерные станки с ЧПУ

Фрезерные станки с ЧПУ

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

Плазменные и лазерные режущие станки с ЧПУ
Лазерные резаки направляют мощные лазеры через оптику, фокусируя выходной луч для резки материала. Типичным коммерческим лазерным резаком будет управлять система ЧПУ (компьютерное цифровое управление). Обычно используются три основных типа станков для лазерной резки.

 Плазменные и лазерные режущие станки с ЧПУ
1. Газовые лазеры, такие как CO2 или Nd / Nd-YAG, производят лазеры, разряжая электрический ток через газ. Они применяются для резки самых разных промышленных материалов (от мягких тканей до титана).
2. Твердотельные, как и волоконные лазеры, применяются для резки отражающего металлического материала.
3. Хотя плазменные резаки часто сравнивают с лазерными резаками, вместо лазеров используются ускоренные струи горячей плазмы. Они режут сталь, алюминий, нержавейку латунь и медь.
Формирователь. В этом устройстве режущий элемент расположен над неподвижной заготовкой, что дает ему возможность свободно перемещаться по линии. Формирователь использует прямолинейное или линейное движение между одноточечным режущим инструментом и заготовкой.

3D принтеры
3D-печать - это процесс, при котором создаются различные твердые детали и предметы из цифрового файла.

3D принтеры

Процесс также известен как аддитивное производство (AM). Термин, который получил широкое распространение в 2000-х годах.

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

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


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

]]>
Что такое ЧПУ станок. Основные понятия. http://portal-pk.ru/news/176-chto-takoe-chpu-stanok-osnovnye-ponyatiya.html Константин Portal-PK 2019-03-08T08:34:18+03:00 От создания прототипов до создания произведений искусства и производства изделий, обработка, в целом, стала более точной и эффективной с появлением станков с ЧПУ. В дополнение к ускорению производства, эти инструменты автоматизировали многие высокотехнологичные процессы обработки и открыли дверь для изготовления изделий, которые невозможно изготовить вручную. Аббревиатура «ЧПУ» означает «числовое программное управление».

ббревиатура «ЧПУ» означает «числовое программное управление»

Станок с ЧПУ - это устройство с компьютерным управлением, которое может резать, вырезать и фрезеровать запрограммированные конструкции из дерева, МДФ, пластмасс, пен и металлов. При этом используются различные инструменты, часто с широким спектром возможностей резки.

фрезеровать запрограммированные конструкции из дерева, МДФ

Фрезерование металлов

Основные понятия

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

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

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

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

Для предприятий, в частности, оборудования с ЧПУ значительно повышают эффективность, так как они обеспечивают более быстрое производство. Они не только автоматизируют процессы, которые являются трудоемкими и занимают много времени, когда выполняются вручную. Такие станки могут более точно создавать копии готового продукта с высокой скоростью. Это, в свою очередь, позволяет производить больше товаров по более низкой цене.

оборудования с ЧПУ значительно повышают эффективность

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

История станков с ЧПУ

Первые станки с числовым программным управлением появились в 1940-х годах. Сильно отличающиеся от оборудования с ЧПУ, как мы его знаем сегодня, эти ранние модели включали инструменты, которые затем использовалась в качестве формы хранения данных. К 1960-м годам внедрение мини компьютеров привело к падению цен, что вызвало распространение станков с ЧПУ. В последующие годы расширилась доступность, сделав ЧПУ популярным среди отечественных производителей инструментов к концу 80-х годов. Сегодня станки с числовым программным управлением широко используются не только в промышленном производстве и в бизнесе, но и любителями.

История станков с ЧПУ

Обработка на машинах с программным управлением является, пожалуй, самым значительным производственным процессом XXI века, а его функциональные возможности способствуют технологическому прогрессу во всем мире. Это профессия, которая идет в ногу с ростом технологий, и машинисты по всей планете меняют мир, благодаря своим навыкам обработки на станках с CNC (computer numerical control).

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

]]>
Принципиальные особенности и применение шаговых двигателей. http://portal-pk.ru/news/175-principialnye-osobennosti-i-primenenie-shagovyh.html Константин Portal-PK 2019-03-06T12:54:35+03:00 Шаговый двигатель – это электродвигатель постоянного тока, без контактных щеток, у которого полный оборот делится на определенное число равных шагов. Положение данного устройства может затем быть задано для перемещения и удержания на одном из этих этапов без какого-либо датчика положения для обратной связи (контроллер с разомкнутым контуром), при условии, что механизм тщательно подобран для применения в отношении крутящего момента и скорости. Импульсные двигатели с переключением - это очень большие шаговые приборы с уменьшенным числом полюсов и, как правило, с замкнутым контуром.

Шаговый двигатель

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

 шагового двигателя

устроуство шагового двигателя

Области применения

От простых DVD плееров или принтеров в быту до сложнейших станков с ЧПУ или роботизированной руки шаговые двигатели можно найти практически везде. Способность совершать точные движения с электронным управлением позволила этим устройствам найти применение во многих сферах, таких как камеры наблюдения, жесткие диски, станки с ЧПУ, 3D-принтеры, робототехника, сборочные роботы, лазерные резаки и многое другое.

Перед тем, как купить шаговый двигатель, нужно ознакомиться с основными преимуществами и недостатками:

Преимущества

  • Достигнута низкая стоимость контроля;
  • Высокий момент вращения при запуске и низкая скорость;
  • Простота конструкции;
  • Низкие эксплуатационные расходы;
  • Меньше шансов затормозить или поскользнуться;
  • Будет работать в любой среде;
  • успешно используется в робототехнике в широком масштабе;
  • Высокий уровень надежности;
  • Обладает полным крутящим моментом в состоянии покоя (во время нахождения обмоток под напряжением);
  • Большая точность позиционирования и повторяемость движения;
  • Немедленный ответ на запуск / останов / реверс;
  • Обладает высокой степенью надежности, благодаря отсутствию контактных щеток;

Недостатки шагового двигателя

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

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

]]>
Фрезерование. Использование фрез в станках с ЧПУ http://portal-pk.ru/news/174-frezerovanie-ispolzovanie-frez-v-stankah-s-chpu.html Константин Portal-PK 2019-02-28T09:22:59+03:00 Процесс фрезеровки.

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

встречное фрезерование

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

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

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

Классификация фрез.

Основным их различием является форма зубьев.

Они бывают: торцевые, дисковые, угловые, концевые, для обработки т-образных пазов, фасонная затылованная и фасонная остроконечная фрезы и многие другие.

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


Фрезы подразделяются на:

1. Фрезы с направляющим подшипником. Использую для фрезерования кромок, выбора пазов. В основном применяются в деревообработке.

Фрезы с направляющим подшипником

Фрезы с подшипником для кромки

Фреза микрошип

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

Фрезы без направляющего подшипника

Фрезы без направляющего подшипника

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

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


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

]]>
Что напечатать на 3D принтере на 8 Марта? Уникальный подарок. http://portal-pk.ru/news/173-chto-napechatat-na-3d-printere-na-8-marta-unikalnyi.html Константин Portal-PK 2019-02-26T17:33:06+03:00 8 Марта не за горами. И пора уже задуматься о подарках. В магазинах очень много различных сувениров. Но даже при таком изобилии бывают случаи, что дарят одинаковые подарки. Как избежать такой ситуации! Можно сделать что-нибудь своими руками. Но сделать можно 1-2. Ну максимум 3 подарка. А если вам нужно поздравлять женский коллектив. Тут своими руками точно не сделать подарки. Девушкам и девочкам можно куклы курн купить. Но если вам нужно большое количество подарков. На помощь приходит 3D принтер. С каждым годом он стоит все дешевле. И расходные материалы стали более разнообразные и боле доступны. Перед новым годом, я купил себе бюджетный 3Д принтер Anet A8. Сейчас я печатаю на нем различные проекты и сувениры.

Итак, что же напевать на 3D принтере на 8 Марта. Есть большое количество готовых моделей сувенирной продукции. Так же различных полезных вещей. Вот что мне понравилось:

1. Статуэтка в виде цифры 8 с розочкой наверху. Достаточно симпатичный и тематичный сувенир.

Статуэтка в виде цифры 8 с розочкой наверху.

2. Какой праздник без цветов. Можно распечатать вот такие симпатичные розы. Это уникальный подарок. Вы можете распечатать их любого цвета. Какой пластик у вас есть под рукой. Они обойдутся вам дешевле чем подкупить живые розы на 8 Марта. Цены на цветы в это время кусаются.

 симпатичные розы

3. Симпатичные цветы. Можно распечатать целый букет.

 Симпатичные цветы

4. Шкатулка в виде сердечка под конфеты.

 Шкатулка в виде сердечка

Данную шкатулку можно распечатать с различными крышками. И каждая шкатулка будет уникальная. Отличный сюрприз на Восьмое Марта.

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

5. Еще одна шкатулка. Можно использовать как конфетницу. А также как упаковку под более дорогой подарок.

 шкатулка

6. Статуэтка пары лебедей в виде цифры 8. Очень красивый сувенир. Отличный сувенир на международный женский день.

 Статуэтка пары лебедей в виде цифры 8

7. Кулон сердечка. Внутри которого изображена пара.

Кулон сердечка

8. Кулон сердечка с узором.

Кулон сердечка с узором

9. Кулон 3D сердечка. Отличный подарок на 8 мата.

 Кулон 3D сердечка

10. У какой женщины нет косметики. Иногда ее столько, что просто некуда складывать. В таком случае подойдет вот такой симпатичный органайзер под косметику.

симпатичный органайзер под косметику

11. Крепление на ванну в виде подставки с креплением под бокал. Очень романтичный подарок.

 Крепление на ванну в виде подставки с креплением под бокал

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

симпатичную подставку под телефон

13. Раскладная подставка под телефон или планшет. Достаточно полезная вещь не только на 8 Марта.

Раскладная подставка под телефон или планшет

14. Цветы мы уже напечатали. Нам нужна ваза.

 Нам нужна ваза

15. Вазу можно напечатать и попроще.

Вазу можно напечатать и попроще

16. Или более сложную вазу.

более сложную вазу

Можно напечатать на 3D принтере не только данные вещи. Возможно вы планируете напечатать сережки, заколку, кольцо или браслет. Выбор очень большой, что можно напечатать на 3d принтере на восьмое марта. Обо все не рассказать в одной статье.

Я поделился вещами которые понравились мне и часть из них я уже печатал на своем 3D принтере.

Если есть вопросы предложения пишите в комментарии или на форум.



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

]]>
Игровая консоль на orange pi. Выбор железа и ОС. http://portal-pk.ru/news/172-igrovaya-konsol-na-orange-pi-vybor-zheleza-i-os.html Константин Portal-PK 2019-02-20T18:13:17+03:00 Немного о моих новых идеях и планах. А именно речь пойдет о самодовольной консоли на однопалатном компьютере. Но обо всем порядку. Для чего она мне нужна и как я решил ее сделать.

Пару месяцев назад решил купит ребенку 8 битную или 16 битную приставку. Посмотрел стоимости в различных магазинах от 1200 и до 5000 руб. Можно и дороже найти. И тут пришла мне идея самостоятельно собрать консоль. Если вас интересует что-то больше чем однопалатный компьютер предлагаю посмотреть комплекс апартаментов бизнес-класса от neopark застройщика.
Начел я изучать данную тему. Первое что понадобиться это железа. Самый оптимальный вариант это Raspberry Pi 3 + игровой kit. Набор с беспроводными джойстиками.

Raspberry Pi 3 + игровой kit. Набор с беспроводными джойстиками.

По стоимости можно уложиться 5 т. руб. (стоимость на момент написание статьи). Но я не ищу легких путей. Поэтому буду делать на более дешевой, но при этом более производительной плате Orange Pi Lite. Возможно у вас есть предложение более логичное. Но на данный момент я считаю, что данный однопалатный компьютер оптимальный по соотношению цена качество.
Дальше нужно выбрать операционную систему которая подойдет для выбранного однопалатного компьютера Orange Pi Lite.

однопалатнsq компьютер Orange Pi Lite.

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

Orange Pi One

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

Для однопалатных компьютеров большое количество операционных систем. Некоторые предназначены для создания ретро консоли на основе одноплатника:

1. Lakka - официальная сборка от авторов RetroArch и LibRETRO.

Скачать дистрибутив для Raspberry Pi.
Скачать для Orange Pi.
Данную ОС можно установить не только на эти одноплатнике но и на других. Также можно установить на старые ПК.

2. RetroPie - изначально сборка RetroArch + EmulationStation под Raspberry Pi, позже адаптирована под иные ОС. Скачать дистрибутив для Raspberry Pi
Скачать дистрибутив для OrangePi — RetroOrangePi

3. Batocera Linux - изначально сборка RetroArch + EmulationStation для ПК.

4. RetroArch + Ubuntu/Debian - оставим это линуксоводам в качестве секс-треножер. =)

5. Recalbox - это еще одна сборка готовой ОС для ретро-гейминга на базе RetroArch + EmulationStation. Подходит только для Raspberry Pi

6. Но мне понравилась RetrOrange Pi
Данная операционная система заточена в основном под Orange Pi. Но это понятно из названия.


Основные эмуляторы которые поддерживает данная ОС:

  • Playstation (Beetle PSX, PCSX_rearmed)
  • Game Boy Advance (VBA-M)
  • Arcade (FBA, Mame 2000-2016)
  • PSP (PPSSPP)
  • Sega Dreamcast (Reicast)
  • Sega Master System / Game Gear / Mega Drive / CD (Genesis Plus GX)
  • Game Boy / Game Boy Color (Gambatte)
  • Nintendo DS (DeSmuMe)
  • Nintendo 64 (Mupen64Plus)
  • Atari 7800 (ProSystem)
  • Atari 2600 (Stella)
  • Atari Jaguar (Virtual Jaguar)

и пр.

При выборе основывался на максимальной экономии. И на простоте настроек и использования. К моменту сборки и запуска возможно что-то измениться. Но Однопалатный компьютер буду использовать Orange Pi Lite. Тем более я его уже заказал и он уже в пути. Так что в ближайшее время будет статья про самодельную консоль на однопалатном компьютере.

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

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

]]>
Ардуино светофор на digispark и ws2812b http://portal-pk.ru/news/171-arduino-svetofor-na-digispark-i-ws2812b.html Константин Portal-PK 2019-02-09T16:44:28+03:00 Сегодня речи пойдет про светофор на на DigiSpark и адресных светодиодах WS2812 . Это вторая версия светофора. Про первую я рассказывал вот тут Светофорна Digispark и адресных светодиодах WS2812 —Ардуино светофор. Первая версия получилась достаточно удобная и состояла из меньшего количество деталей. Почему я решил сделать вторую версию? Дело в том, что бокс под батарейки которые, я использовал в первой версии светофора на Arduino, очень подорожал. Некоторые продавцы продают его за 5 долларов на Алиэкспресс. Дороже всей остальной электроники. Поэтому я решил поменять бокс на более дешевый. А раз пришлось переделывать корпус. Принял решение изменить и размер самого светофора и сделать его больше первой версии. Также в ножку светофора добавил металлический стержень для увеличения жесткости. Потому что с первой версией были инциденты. Дети падали на него и отламывали ножку. Поэтому решил усилить.

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

Вырезал заготовки для светофора на адресных светодиодах из МДФ.

 заготовки для светофора на адресных светодиодах из МДФ

Как видно на фото получилось большое количество запчастей. Зачистил заготовки и склеил. Перед склейкой установил вовнутрь светофора 3 адресных светодиода. Можно было использовать обычные светодиоды. Как в Уроке7 - Светофор на Arduino своими руками. Пишескетч используя функции. Но тогда бы не получиться из него сделать красивый ночник с несколькими режимами работы .

В итоге получился вот такой светофор.

 светофор

Теперь его нужно покрасить и подготовить для установки остальной электроники и бокса под батарейки.

электроники и бокса под батарейки

Теперь можно устанавливать электронику:

1. Digispark

2. Адресные светодиоды WS2812

3. Резистор 10 кОм

4. Бокс под батарейки 4 x AA

5. Кнопка без фиксации

6. Кнопка с фиксации

 установка электроники

Перед установки электроники. Нужно запрограммировать DigiSpark . К прошлому видео мне написали много комментариев, с просьбой выложить прошивку. Прошивка достаточно простая. Как подключить адресные светодиоды к DigiSpark рассказывал тут: Digispark подключаем светодиоды ws2812. Программируем в Arduino IDE. Я использую библиотеку NeoPixel. Тут есть пример с включением светодиодов определенном цветом и эффекты которые я использую в светофоре.

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

Устанавливаем батарейки и включаем. Вот такой светофор получается.

такой светофор получается

ночник

У меня ребенок использует его как ночник. 4 батареек купленных в фикс прайс за 55 руб. за 4 шт., хватает на 7 ночей. Достаточно неплохо. Можно купить и аккумуляторные батарейки, возможно будет более экономичнее. Но я пока не проверял.

Светофор я собрал месяца 3 назад. До сих пор он работает исправно и радует ребенка.

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

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

]]>
Показание с датчика температуры и влажности на телефоне. dht11 + esp8266 http://portal-pk.ru/news/170-pokazanie-s-datchika-temperatury-i-vlazhnosti-na.html Константин Portal-PK 2019-02-01T12:40:55+03:00 Продолжаем тему NodeMCU и App Inventor. И сегодня по просьбе моих зрителей на канале YouTube. Сделаю вывод показаний с датчика. Не просто одно показание. А значение температуры и влажности. Для этого буду использовать датчик DHT11, он конечно не очень точный (Влажность вообще отвратительно показывает. Может из-за библиотеки.) но для примера работы подойдет. В предыдущем проекте Управляй новогодней гирляндой со смартфона. NodeMCU + App Inventor я делал обратную связь. Но она имела кучу ограничении. Получить можно только одно значение. Конечно можно сделать много страничек и с каждой получать данные от одного датчика. Или данные отделить разделителем и в приложении раскладывает полученную строку на данные. Но это не удобно. И мягко говоря так никто давно не делает. Правильно было бы воспользоваться форматом json. Но к сожалению App Inventor нет готового решения для разбора json. Но зато можно обробатывать данные в формате xml. Поэтому я пошел по пути наименьшего сопротивления. И формировать данные на стороне сервера в xml. В нашем случае NodeMCU.

dht11 + esp8266

Для начала работы нам нужно понимать как будет выглядеть xml страница.

 xml страница

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

Преступим к приложению на App Inventor. Оформление будет простым и название элементов дизайна будут стандартное. Как называет программа App Inventor по умолчанию.

Преступим к приложению на App Inventor
Тут у нас несколько полей. К которые будем выводить значения температуры и влажности.
Кнопка Настройки, как и в предыдущем проекте открывает страницу настроек в которой мы можем указать Ip адрес устройства.
В данном приложении будем использовать новый компонент Clock (часы). В данном проекте будем использовать таймер. Для хранения времени создадим глобальную переменную time, равную 0.

компонент Clock (часы
В таймере первым делом сделаем счетчик. Который будет добавлять 1 к переменновыводить значения температуры и влажностий time, каждую секунду. Дальше сделаем ограничение значения time. Для этого создадим условие. Если time больше 10, тогда обнуляем переменную.
В следующем условии проверяем если переменная time равна 5, тогда выполняем следующее условие. ( Тут можно прировнять к любому числу от 0 до 9, и данные все ровно будут выводиться 1 раз в 10 сек.)
В следующем условии я пытался убрать ошибку, если у нас нет подключения к NodeMCU. Но к сожалению. Ошибка все равно выскакивает. И ругается, что нет может подключиться к странице. Можно конечно сделать флаг в настройках. Но поэкспериментирую в следующий раз.
Дальше мы делаем GET запрос к нашей странице. Этот кусок кода вам должен быть знаком. Если нет посмотрите предыдущие 2 проекта: Управляй новогодней гирляндой со смартфона. NodeMCU + App Inventor, Wi-Fi реле на NodeMCU. Управление Android приложением

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

Процедура listXML
Процедура listXML получает данные и сохраняет в локальную переменную xml. Дальше с помощью стандартной функции App Inventor .XMLTextDecode полученный xml данные преобразуем и сохраняем в переменную list. Так как полученные данные сохраняются в виде массива с разделение в виде скобок нам нужно выделить из него нашу температуру и влажность. Для этого Их массива list сохраняем значение температуры в переменную t. И влажность в переменную f.

Веб-обработчикВеб-обработчик нам знаком. И мы как всегда проверяем код ответа. Если он равен 200. То все данные пришли и их можно передавать в процедуру listXML.
И остается вывести значения температуры и влажности в текстовые поля.

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

Теперь перейдем к электронике. Подключим датчик DHT11 к NodeMCU.

Подключим датчик DHT11 к NodeMCU

Для написания кода нам понадобиться:
1. Второй урок Третьякова Сергея: ШАГ №2 * WEBSERVER WEB СЕРВЕР
2. Библиотека <DHTesp.h> Ставиться из менеджера библиотек. (У меня влажность показывает максимум 34 % либо глюк датчика. Также возможно библиотека работает некорректно. Температуру показывает нормально, для точности датчика DHT11 .)

Подключаем библиотеки и необходимые переменные.

#include <DHTesp.h>
#define DHTPIN D3
// Uncomment one of the lines below for whatever DHT sensor type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
DHTesp dht;
// Переменные для XML запроса
String XML;
dht.setup(DHTPIN, DHTesp::DHTTYPE); // Connect DHT sensor to GPIO

Далее во вкладке HTTP_init Добавляем вот этот код.

void HTTP_init(void) {
  HTTP.on("/xml",handleXML); // формирование xml страницы для передачи данных в web интерфейс
  // Запускаем HTTP сервер
  HTTP.begin();
}
void handleXML(){
  buildXML();
  HTTP.send(200,"text/xml",XML);
}
// создаем xml данные
void buildXML(){
  float humidity = dht.getHumidity();
  float temperature = dht.getTemperature();
  XML="<?xml version='1.0'?>";
  XML+="<Donnees>"; 
    XML+="<temp_c>";
    XML+=temperature;
    XML+="</temp_c>";
    XML+="<humidity>";
    //XML+=alert_h();
    XML+=humidity;
    XML+="</humidity>";
   // XML+="<time>";
   // XML+=XmlTime();
  //  XML+="</time>";
  XML+="</Donnees>"; 
}

Тут у нас получение данных с датчика и формирование xml. Вывод данных на страницу /xml.
В следующем проекте планирую объединить функционал из предыдущего видео и вывод данных с помощью XML.


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


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

]]>
Простые 3D модели для печати. Для новичков в 3D-печати. http://portal-pk.ru/news/169-prostye-3d-modeli-dlya-pechati-dlya-novichkov-v-3d-pechati.html Константин Portal-PK 2019-01-29T13:38:20+03:00 После сборки 3D принтера Anet A8. Необходимо его откалибровать и протестировать печать при различны настройках. Чтобы подобрать оптимальные настройки и режимы печать. А опыта еще нет и печатать что-то сложное нет смысла. Печатать 10 раз калибровочный куб нет смысла! Нужно напечатать на 3D принтере что нибудь полезное для себя и близких. Поэтому я решил печатать веши которые мне понравились. Ну еще и ребенок попросил. Куда тут денешься!

А вот ПВХ завесы и перегородки для автомоек и складов не напечатать на 3D принтере, но можно эластичные полосовые пвх завесы купить.

Десять 3D-моделей которые мне понравились и практически все я напечатал на 3D принтера Anet A8:

1. Для калибровки можно распечатать на 3D принтера кораблик Benchy.

3D принтера кораблик Benchy

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

2. Многие начинают печать с Эйфелевой башни. Но я ее не печатал. И пока не планирую но ссылку на нее оставлю.

печать с Эйфелевой башни

3. До покупки 3D-принтера видел видео на ютюбе про подвижного динозавра. И Он мне понравился. Поискал в интернете и нашел его. Вот он Flexi Rex

Flexi Rex

На момент написание статьи напечатал уже 2 копии.

4. Из той же серии что и Динозавр, гибкая рыбка. Очень интересная 3D-модель для печати на 3Д принтере. И при этом очень нравиться детям.

 гибкая рыбка

5.Робот который печатается собранным. Но при этом у него гнуться руки и ноги. Так же поворачивается голова. Взрослые в недоумении. Как так возможно. Многие не верят, что можно напечатать такого робота целиком на 3D принтере.

Робот который печатается собранным

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

 Самолет. Который можно запускать как бумажную воронку

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

Разводной гаечный ключ

8. Подставка под телефон или планшет. Имеет небольшие размеры. Можно переносить с собой. Так как подставка складывается в очень тонкую пластинку около 3-4 мм.

Подставка под телефон или планшет.

Кроме этого можно распечатать подставку трех размеров. Удобная и функциональная 3D-модель для 3D-печати.

9. Понравилась вот такая вот коробка. Которая закрывается при вращении нижнего основания. Но к сожалению пока не распечатал.

 коробка

10.Небольшая головоломка. Головоломка которая состоит из 3 деталей и собирается в куб. Легко печатается на 3D принтере и при этом полезна для занимательная игрушка.


Все 3д-модели достаточно несложные для печати. И я практически все печатал. А у меня опыт печати меньше 1 месяца.

Кроме всего делаю модификации 3D-принтера Anet A8. Для чего распечатываю различные 3D-модель на 3D-принтере. Но про это модели я расскажу в следующий раз.


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


]]>
Обзор 3D принтера Anet A8. Сборка. Наладка. Примеры печати http://portal-pk.ru/news/168-obzor-3d-printera-anet-a8-sborka-naladka-primery-pechati.html Константин Portal-PK 2019-01-23T08:17:16+03:00 И снова тема 3D принтера. Изначально я планировал собрать данный станок с ЧПУ самостоятельно с нуля. Но тут ко мне пришла лень. Не совсем лень. Просто в интернете очень много статей про сложность сборки 3D-принтера . И что не стоит его собирать если у вас нет опыта пользования сие полезным агрегатом. Очень много рассказов про то, что 3D принтер даже настроить сложно . Очень много моментов которые нужно учитывать. А при сборке самостоятельно можно просто столкнуться с рядовыми проблемами которые решают владельцы принтеров ежедневно. И при этом бросить сборку при пуска-наладке. Ну и все в этом духе.

Посидел, посчитал. Самостоятельно я могу собрать 3D принтер за 7-8 т. руб. На сборку у меня примерно уйдет около 2 месяцев. (это расчетные значении, на самом деле это может заткнуться на 3 - 4 месяца). Посмотрел на Алике, самые дешевые принтеры. И приобрел 3D принтер Anet A8 с доставкой со склада в России. Получил я принтер через 4 дня. Ну очень быстро. Доставка курьером до квартиры. И это всего за 10 т. руб.!!! В подарок дали пластика 0.5 кг.

Управлять 3D принтером можно с ноутбука asus или печатать прям с карты памяти, которая идет в комплекте с принтером.

3D-принтер Anet A8

Собрать 3D-принтер Anet A8 не составить труда, тем более в комплекте идет карта памяти с инструкцией. Если что инструкция тут A8 3D Printer Installation Instructions-161230.pdf. Вдруг кому пригодиться.

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

Подключение электроники 3D-принтер Anet A8 на Русском

Правда я ее нашел уже когда все подключил.

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

После сборки нужно обязательно выровнять ось Z

Поворачиваем правый или левый винт оси Z выставляем нужное расстояние. Если у вас есть дети то обязательно убедитесь, чтобы они не настраивали данные винты. У меня ребенок первые 2-3 дна настраивал 3D-принтер Anet A8 . Подкручивал данные винты и мне приходилось заново калибровать 3D принтер .

настроить конечный выключатель оси Z

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

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

с помощью регулировочных винтов настраиваем высоту стола

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

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

нажмите вернуть домой

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

нажмите на любой конечник

У меня по оси X перемещение шло в противоположном направлении. Лечиться это очень легко. Переворачиваем провода одно из обмотки двигателя. ( Нужно прозвонить и найти обмотку и перевернуть данные провода. Если перевернуть любые 2 провода то у вас может перестать работать шаговый двигатель).

И так 3D-принтер Anet A8 откалиброван . Калибровку шаговые двигателя в принципе не нужно. Так как они идут откалиброванные в прошивке на заводе. Если у вас не так пишите в комментарии.

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

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

Первую тестовую печать

После покупки 3D-принтер Anet A8 уже прошел месяц.

После покупки 3D-принтер Anet A8 уже прошел месяц.

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

1. При первой печати у меня очень сильно свистела турбина которая обдувает деталь. Разобрал я ее и смазал специальной силиконовой смазкой для куллеров. Но свист пе прошел.

свисток который одевается на турбину

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

систему обдува

2. Гудит двигатель оси Y. Остальные оси работают намного тише. Попробовал ослабить ремень но гул так и не прошел. Можно конечно изменить ток на двигателе. Но плата которой оснашен 3D-принтер Anet A8 не имеет потенциометров для регулировки данных параметров. Что очень не удобно. Возможно есть другое решение. Если у вас есть информация по данному вопросу, напишите в комментарии.

3. Акриловая рама не позволяет печатать на большой скорости. Комфортно печатает на скорости 30 мм/сек., внешние стенки и 60 мм/сек. заполнение. На боле большой скорости начинаются проблемы с качеством. Для укрепления корпуса начел распечатывать и устанавливать дополнительные детали.

распечатывать и устанавливать дополнительные детали

4. Возникла проблема с адгезией. (Проблема прилипания пластик к стало.) На скотч который был приклеен к столу, при покупке, очень хорошо все приклеивалось. Но снимать было достаточно сложно. Поэтому скотч очень быстро изорвался. И пришлось искать замену. О том, что я пробовали и на каком варианте остановился расскажу в отдельной статье. Это достаточно интересная и обширная тема. Так как я попробовал некоторые нестондартные компоненты которые пришли в голову.


В качестве программы для генерации G-кода из 3D модели использую Cura которая была на флешке с принтером. Хотя есть новые версии, но пока не доходят руки до освоения новых программ.

Вывод: Не смотря на небольшие недочеты 3D-принтер Anet A8, я доволен покупкой. Все заработало достаточно быстро и качество неплохое. Для домашнего использования в бюджетном сегменте неплохое решение.


В ближайшее время на сайте будут проекты сделанные мной на 3D-принтер Anet A8 . Так что подписывайтесь на новости сайта, канал и вступайте в группу в ВК.

]]>
Управляй новогодней гирляндой со смартфона. NodeMCU + App Inventor http://portal-pk.ru/news/167-upravlyai-novogodnei-girlyandoi-so-smartfona-nodemcu-app.html Константин Portal-PK 2019-01-14T17:11:29+03:00 В прошлом году я делал новогоднюю подсветку: Подсветка на Arduino и ws2812 - На новый год. Arduino UNO управляла данной подсветкой, информация выводилась на ЖК-дисплей 1602. В этом году я решил сделать гирлянду и подсветку под управлением NodeMCU. Это позволило организовать беспроводное управления с выводом информации на смартфон. Для управления можно сделать веб-интерфейс . Но на мой взгляд это не очень удачное решение для управления новогодней подсветкой на NodeMCU и адресных светодиодах ws2812. Так как скорость отклика и время загрузки страниц достаточно большое и в связи с чем возникают небольшие провисание.

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

гирлянда из 33 ws2812 светодиодов

приложение в App Inventor для управления умной новогодней гирляндой

Поэтому я решил сделать простое приложение в App Inventor для управления умной новогодней гирляндой. Тем более у меня уже есть небольшой опыт по реализации связки NodeMCU и приложений написанных на App Inventor: Wi-Fi реле на NodeMCU. Управление Android приложением

Как я спаивал светодиоды расскажу и покажу в видео. В итоге у меня получилась гирлянда из 33 ws2812 светодиодов. Это оптимальное количество светодиодов для подключения к зарядному для телефона.

Подключил ws2812 к NodeMCU вот по такой схеме.

Подключить ws2812 к NodeMCU схема

Приложение решил разделить на 2 экрана.

Первый экран App Inventor управление светодиодами.

Первый экран App Inventor управление светодиодами.


Второй экран это экран настроек.

Второй экран это экран настроек


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

Блок обработки нажатия кнопок в App Inventor

Блок обработки нажатия кнопок в App Inventor


Данный блок аналогичен Предыдущему проекту: Wi-Fi реле на NodeMCU. Управление Android приложением и описывать его подробно не буду. Тут только кнопка Button6 не знакома вам, она переключается на экран Screen2. Функционал остальных кнопок:

prev — Предыдущий режим

next — Следующий режим

minus — Уменьшаем яркость

plus — Увеличиваем яркость

auto — Включение Авто-режима.

Авто-режим это переключение режимов по порядку с интервалом 1 мин. (время можно изменить в прошивке NodeMCU.)

У вас иноверное возник вопрос, а где выключение авто-режима. Я нестал делать отдельную кнопку и сделал включение авто-режима при нажатии смены режима: prev или next.

Создал две глобальные переменные:

Создал две глобальные переменные

num — содержит полученный ответ в цифровом формате

list — массив наших режимов.

Веб-обработчик организован по принципу предыдущего проекта

Веб-обработчик организован по принципу предыдущего проекта. Сперва мы получаем ответ от сервера. В нашем случае от NodeMCU. Если ответ 200 ( все в порядке). Дальше проверяем значение ответа.

Если значение Меньше 14. ( у меня просто сделано 13 режимов). Тогда в текстовое поле Label2 выводим режим. Для этого полученное число num сравниваем с массивом list.

В текстовое поле Label6 выводим информацию «Выключен». Это означает, что Авто режим выключен если он был включен. Так же активируем кнопку включения авто режима Button5.

Следующее условие Иначе Если значение больше или ровно 100 и при этом меньше или ровно 350 выполняем следующие действия. Вы наверное поняли, что тут мы будем управлять яркостью.

В текстовое значение Label4 выводим процент яркости. Но для этого от полученного значения вычтем 100. (Я в прошивке специально добавлял 100, чтобы наше значение не совпадали с режимами. ) И умножим на 0.4 - это приведение значения к процентам, так как наше значение яркости 250. Я думаю тут понятно. Это простая математика.

Последнее условие когда значение num равно 400. Это включение авто-режима.

В текстовое поле Label6 выводим информацию «Включен». Это означает, что Авто-режим управления новогодней гирляндой был включен. Так же прячем кнопку Button5.

С Приложением для Android разобрался приступаем к программированию NodeMCU.

Для этого нам понадобиться:

1. Второй урок Третьякова Сергея: ШАГ №2 * WEBSERVER WEB СЕРВЕР

2. Библиотека для работы с ws2812 светодиодами WS2812FX

В библиотеке Есть более 50 световых эффектов. Чтобы выбрать нужные режимы можно загрузить в NodeMCU пример который идет с библиотекой и выбрать понравившиеся режимы. Мне понравились (7,8,10,11,12,17,20,32,33,38,36,42,46).

Добавим в урок Сергея переменные и подключаем библиотеку WS2812FX

#include <WS2812FX.h>
#define LED_COUNT 285 // кол-во светодиодов в гирлянде
#define LED_PIN D4 // пин для вывода на гирлянду
WS2812FX strip = WS2812FX(LED_COUNT, LED_PIN, NEO_RGB + NEO_KHZ800);
int i = 0; // счётчик индекса в массиве эффектов
int m = 13; // кол-во эффектов, см. массив modes
int l = 0; // индекс прошлого (last) эффекта
#define DEFAULT_SPEED 3000 // задержка в мс, по дефолту 1000
#define TIMER_MS 60000 // время длительности одного эффекта в мс
int j = 25; // максимальнаяя яркасть *10 
boolean auto_rejim = false; // авто режим выкл. 
unsigned long last_change = 0; // предыдущее значениее времени
unsigned long now = 0; //текущее значениее времени

Затем создадим страницу управления Новогодней подсветкой. И Создадим все необходимые функции:

void HTTP_init(void) {
...
  HTTP.on("/led", handle_Led); // Упровляем Led http://192.168.0.101/led?status=auto
  // Запускаем HTTP сервер
  HTTP.begin();
}
void handle_Led() { 
  int modes[] = {7,8,10,11,12,17,20,32,33,38,36,42,46}; // массив с желаемыми ID эффектов
  String status = HTTP.arg("status");
  if (status == "prev") 
  {
    i++;
      if (i>12)
        i=0;
    strip.setMode(modes[i]);
    //strip.setMode(i);
    String k = String(i+1);
    auto_rejim = false;
    HTTP.send(200, "text/plain", k);
  }
  if (status == "next") 
  {
    i--;
       if (i<0)
          i=12;
    strip.setMode(modes[i]);
    String k = String(i+1);
    auto_rejim = false;
    HTTP.send(200, "text/plain", k);
  } 
  if (status == "minus") 
  {
    j--;
       if (j<1)
          j=1;
    strip.setBrightness(j*10);
    String k = String(j*10+100);
    HTTP.send(200, "text/plain", k);
  } 
  if (status == "plus") 
  {
    j++;
       if (j>25)
          j=25;
    strip.setBrightness(j*10);
    String k = String(j*10+100);
    HTTP.send(200, "text/plain", k);
  } 
  if (status == "auto") 
  {
  auto_rejim = true;
  HTTP.send(200, "text/plain", "400");
  } 
   if(modes[i] == 17 || modes[i] == 42 || modes[i] == 46){
      strip.setSpeed(DEFAULT_SPEED*3); // очень быстрые - х3
    }
    else
     strip.setSpeed(DEFAULT_SPEED); // вернуть скорость на дефолт
}
void Auto_Led() {
 if (auto_rejim)
 { 
  int modes[] = {7,8,10,11,12,17,20,32,33,38,36,42,46}; // массив ID эффектов
  if(now - last_change > TIMER_MS) {
   if(modes[i] == 17 || modes[i] == 42 || modes[i] == 46){
      strip.setSpeed(DEFAULT_SPEED*3); // очень быстро х3
    }
    else
     strip.setSpeed(DEFAULT_SPEED); // вернуть скорость на дефолт
    strip.setMode(modes[i]);
    last_change = now;
    l = modes[i];
    i++;
    if(i == m)
      i = 0;
  }
 }
}

Функция Auto_Led() переключает режимы в авто-режиме. Для ее работы необходимо в основной цикл loop добавить

 now = millis();
strip.service();
Auto_Led();

Вот такая небольшая программа у нас получилась, но при этом достаточно функциональная.

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

В следующем Проекте расскажу как, я сделал пяти метровую светодиодную подсветку на окно и управляю данной подсветкой со смартфона . Фишка подсветки в том, что она запитана от 2 А блока питания и все работает. Не веришь!? Подписывайся на мой канала и вступай группу в ВК чтобы не пропустить.

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

]]>
Wi-Fi реле на NodeMCU. Управление Android приложением http://portal-pk.ru/news/166-wi-fi-rele-na-nodemcu-upravlenie-android-prilozheniem.html Константин Portal-PK 2018-12-24T18:59:53+03:00 В предыдущем проекте я уже рассказывал как можно управлять реле по Wi-Fi. Но использовать сторонне приложение для управления своими проектами не дальновидно. И нет перспективно. Поэтому я решил написать пару Android приложения для своих новых проектов на ES8266 это просто изыскания для проектирования.

Посмотрел среды разработки под Android и мне понравились:

1. Android Studio

2. MIT App Inventor

Так как я не писал Android приложения, разобраться с Android Studio потребует достаточно большое количество времени. И для вас повторить мои проекты будет гораздо сложнее. Поэтому я решил пойти по самому легкому пути и написал приложение на MIT App Inventor.

написал приложение на MIT App Inventor

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

Первое. В приложении мы можем указать IP устройства. И нам не нужно постоянно его прописывать в коде NodeMCU.

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

Программа для NodeMCU берем из прошлого проекта без изменений. Сделаем дизайн приложения в MIT App Inventor.

Сделаем дизайн приложения в MIT App Inventor

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

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

Набросаем код блоками

В блоке

обрабатываем нажатие кнопки Button1

Мы обрабатываем нажатие кнопки Button1. Зеленой блок Set отправляет заброс в веб обработчик Web1. Блок Join собирает нашу ссылку из 3 частей. Первая и третья части это просто текстовые поля. Поле TextBox1 берет параметры из поля ввода. В него мы указываем IP адрес подключения.

Кнопка Button2 работает аналогично Button1. Только она отправляет сигнал на отключение реле.

Блок кода Web1 отправляет Get запрос

Блок кода Web1 отправляет Get запрос который мы сформировали с помощью кнопки.

Внутри первого блока условия проверяем код ответа. Если мы получили код ответа 200 (нет ошибок), выполняем следующее условие. Иначе выводим ошибку.

Второе условие проверяет Содержимое ответа. Содержимое мы сформировали сами в программа NodeMCU.

HTTP.on("/rele", handle_Rele);
...
void handle_Rele() {
  String restart = HTTP.arg("status");
  if (restart == "1") 
  {
    digitalWrite(RELE, HIGH);
    HTTP.send(200, "text/plain", "On");
  }
  if (restart == "0") 
  {
    digitalWrite(RELE, LOW);
    HTTP.send(200, "text/plain", "OFF");
  }  
}

On - реле включено

OFF - реле выключено.

В текстовое поле Label1 выводим состояние реле.

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

Wi-Fi реле на NodeMCU

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

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

]]>
Урок 3. TTP223 сенсорная кнопка схема подключения к Arduino http://portal-pk.ru/news/165-ttp223-sensornaya-knopka-shema-podklyucheniya-k-arduino.html Константин Portal-PK 2018-12-12T18:13:52+03:00 Сенсорные кнопки устроенны так, что они реагируют на изменение емкости. Изначально кнопка имеет определенную емкость, которая разная у каждой модели данных датчиков.

Сенсорные кнопки устроенны так

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

TTP223 сенсорная кнопка

сенсорная кнопка

Технические характеристики TTP223

  • Напряжение питания постоянного тока, В: 2 – 5.5
  • Потребляемый ток (в покое, при VCC= 3 В), мкА: 70
  • Максимальное время срабатывания (при VCC= 3 В), мС: 220
  • Габаритный размер платы, мм: 11x15

Подключим сенсорную кнопку TTP223 в Arduino

Подключим сенсорную кнопку TTP223 в Arduino

Как подключить кнопку к Arduino я рассказывал в Урок1 - Подключение кнопки и светодиода кплате Arduino

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

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

int led_pin=3;          // пин подключения
int button_pin = 4;     // пин кнопки
void setup() { 
    pinMode(led_pin, OUTPUT); // Инициализируем цифровой вход/выход в режиме выхода.
    pinMode(button_pin, INPUT); // Инициализируем цифровой вход/выход в режиме входа.
}
void loop() {
   if (digitalRead(button_pin) == HIGH) { // Если кнопка нажата 
      digitalWrite(led_pin, HIGH);// зажигаем светодиод
 }
  else { //Иначе
      digitalWrite(led_pin, LOW);// выключаем светодиод
  }
}

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

При этом есть еще один бонус от использования сенсорной кнопки. Нам не нужно устранять дребезг кнопки. Если вы не знаете что это смотрите : Урок2. Нажатие кнопки без ложных срабатываний.Устраняем дребезг кнопки

Также данную сенсорную кнопку можно сконфигурирован для работы в одном из 4 режимов для этого нужно спаять перемычки А и В на плате:

A

B

Режимы

0

0

На время касания на выходе “1”

1

0

На время касания на выходе “0”

0

1

режим триггера, состояние выхода после касания – “0”

1

1

режим триггера, состояние выхода после касания – “1”

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

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

подключим реле, вместо светодиода

Как видим, реле также отлично работает включается и выключается.

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

Для подачи напряжения буду использовать MICRO USB адаптер 5pinMICRO USB адаптер 5pin

Подключим светодиод к сенсорной кнопку . Как видим все работает.

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

Если же подключить реле к сенсорной кнопке TTP223 .

подключить реле к сенсорной кнопке TTP223

Оно не работает, потому, что кнопку можно подключить как логический ключ. Электродвигателя, реле и пр. (даже на 3-5 В) работать не будут. Сенсорная кнопка просто сгорит. Для примера я подключал параллельно 3 светодиода. И как видно из эксперимента начинаются ложные срабатывания. По техническим характеристикам даже 4 светодиода для данной кнопки много.

Но не обязательно ограничиваться реле. Можно подключать MOSSFET или твердотельное реле.

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

Вывод: Сенсорная кнопка TTP223 имеет ряд преимуществ при использовании в проектах на Arduino , по сравнению с тактовой кнопкой. Но она не может быть использована в силовых цепях.


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

Вконтакте и Facebook.

]]>
Управляем реле по wi-fi с телефона. NodeMCU и Arduino IDE http://portal-pk.ru/news/164-upravlyaem-rele-po-wi-fi-s-telefona-nodemcu-i-arduino-ide.html Константин Portal-PK 2018-12-05T11:23:14+03:00 В уроке: Урок8 — Подключаем реле к Arduino. Пример работыи скетч я рассказывал, что реле можно управлять без микроконтроллера. Но если надо управлять реле на расстоянии и без проводов. Например управлять светом по wi-fi. При решении поставленной задаче без микроконтроллера не обойтись. Я планирую использовать распространенную отладочную плату NodeMCU на базе ESP8266.

Упровление светом с помошью Wi-Fi приносит большое уудовольствие, но ни такое как новогодние туры в шри-ланку.

Подключим реле к NodeMCU по схеме.

Подключим реле к NodeMCU по схеме

В связи с достаточно большим объемом памяти, NodeMCU можно использовать как точку доступа и загрузить HTML станицы и управлять реле. Очень хороший пример реализации управления рассказывает в своих уроках Третьяков Сергей. По его урокам реализовать управления с помощью HTML интерфейс будет достаточно легко. Если вам интересна данная тема пишите в комментарии. Обязательно помогу и сниму пару видео по созданию и загрузки HTML в NodeMCU. Но для нашей задаче достаточно: ШАГ №2 * WEBSERVER WEB СЕРВЕР. Из чикла уроков Третьяков Сергя.

NodeMCU + relay

подключении NodeMCU к вашему Wi-Fi роутеру

Описание и код можно найти на странице урока и объяснять. что и как написать не буду. Нам останется дописать одну функцию которая будет посылать Get запрос на включение (http://192.168.0.101/rele?status=1) и выключения (http://192.168.0.101/rele?status=0) реле. «192.168.0.101» это ваш IP при подключении NodeMCU к вашему Wi-Fi роутеру. Можно посмотреть в мониторе порта.


void handle_Rele() {
  String restart = HTTP.arg("status");
  if (restart == "1") 
  {
    digitalWrite(RELE, HIGH);
    HTTP.send(200, "text/plain", "Ok");
  }
  if (restart == "0") 
  {
    digitalWrite(RELE, LOW);
    HTTP.send(200, "text/plain", "OFF");
  }  
}

Для проверки работы можно пройти по одной из получившихся ссылок (http://ваш_IP/rele?status=1 или http://ваш_IP/rele?status=0) и вы увидите, что реле включается и выключается. И в браузере выводит соответствующие надписи: On — Wi-Fi реле включен, Off — Wi-Fi реле выключено.

Теперь перейдем к управлению Wi-Fi реле с телефона . Для этого можно написать приложение для Android, но можно обойтись и без программирования. В этом нам поможет бесплатного приложения HTTP Edit Widget (условно бесплатного).

 приложения HTTP Edit Widget

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

должны получиться две кнопки

Для создания таких кнопок в списке виджетов выбираем HTTPEditWidge t. В отрывшемся меню настроек заполняем поля.

виджетов выбираем HTTPEditWidget

В поле « http://» указываем нужный адрес Если для выключения реле то http://192.168.0.101/rele?status=0. Пишем текст который будет выводиться на кнопке. В нашем случае «off». Ниже выбираем цвет кнопки и цвет текста. Кнопка Off готова. Аналогично делаем кнопку On, не забывая то включается реле вот по такому запросу: http://192.168.0.101/rele?status=1.

Если у вас кнопка включения выключает а выключение включает. Ни чего страшного. Вы просто подключили не на тот контакт реле. Поправить можно и в не переключая провода. Прост поменяйте местам значения status.

Если у вас кнопка включения выключает а выключение включает. Ни чего страшного. Вы просто подключили не на тот контакт реле.

Вот и готово наше Wi-FI реле на ESP8266. С повторением данного проекта я думаю у вас не будет проблем. По всем вопросам пишите на форум Управляем реле по wi-fi с телефона . По данномй проету открое топик: Если вы не знаете как пользоваться Arduino IDE. Читайте Программа Arduino IDE бесплатно для Windows, Mac OS, linux. Прошиваем Arduino Так же смотрите уроки по основам программирования Arduino.


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

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

]]>
Урок 8 — Подключаем реле к Arduino. Пример работы и скетч http://portal-pk.ru/news/163-podklyuchaem-rele-k-arduino-primer-raboty-i-sketch.html Константин Portal-PK 2018-11-28T18:00:02+03:00 Подключить реле к Arduino достаточно просто. Для примера мы будем использовать Скетч и подключения из урока: Урок2. Нажатие кнопки без ложных срабатываний.Устраняем дребезг кнопки

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

т схема подключения реле к Arduino UNO

Как видим, схема не многим отключается от исходного примера.

Реле может управлять различными бытовыми приборами.

Пара фоток сделанных при снятии видео по данному уроку: Подключение реле к Arduino.

 Подключение реле к Arduino

 Подключение реле к Arduino фото

реле и Arduino

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

Для более красивого и читабельного кода заменим переменную ledPin на relayPin . Так же заменим вспомогательную переменную ledOn на relayOn. У нас получиться вот такой скетч управления реле.


const int buttonPin = 2;      // номер входа, подключенный к кнопке
const int relayPin =  3;        // номер выхода светодиода
/* переменные */
boolean lastButten = LOW;     // предыдущее состояние кнопки
boolean currentButten = LOW;  // текущее состояние кнопки
boolean relayOn = false;        // текущее состояние свтодиода
void setup() // Функция setup()
{
  // инициализируем пин, подключенный к реле, как выход
  pinMode(relayPin, OUTPUT);     
  // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT);   
}
boolean debvance (boolean last) //убираем дребизг
{
  boolean current = digitalRead (buttonPin); // считываем данные с кнопки
  if (last != current) // Если текущее состояние отличететься от предыдущего 
  {
   delay (5);   // Ждем 5 милисек.
   current = digitalRead (buttonPin); // Присваеваем текущее состояние кнопки
    return current; 
  }
}
void loop() // Функция loop
{
  currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW 
  if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет
  {
    relayOn = !relayOn; // инвертируем значение 
  }
  lastButten =  currentButten;  // Переприсваеваем прошлое состояние кнопки
  digitalWrite(relayPin, relayOn);   // Включаем или выключаем реле (смотря что пришло после инверсии) 
  delay (2);   // Ждем 2 милисек.
}

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

Если подключить реле через кнопку с фиксацией . Вот по такой схеме.

 подключить реле через кнопку с фиксацией

То у нас все будет работать отлично. В качестве источника питания 5В можно использовать MICRO USB адаптер 5pin, при подключении от компьютера или адаптера. Так же можно подключить через понижающий трансформатор, например вот такой.


Вывод: Урок показывает как можно с помощью Arduino упровлять реле. Но в простых схемах управления реле использовать платформу Arduino или другой микроконтроллер не целесообразно.

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

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

]]>
Урок 7 — Подключаем HC-SR04 к Arduino. Библиотека NewPing http://portal-pk.ru/news/162-podklyuchaem-hc-sr04-k-arduino-biblioteka-newping.html Константин Portal-PK 2018-11-19T08:24:00+03:00 Ультразвуковой датчик HC-SR04 определения расстояния до предметов. Принцип роботы как у сонара, посылается пучок импульсов и получает отражения, и на основании задержки определяется расстояние до предмете. Так как датчик для определения расстояния основан на ультразвуки, он плохо работает для определения расстояния до звукопоглощающих предметов. Идеальными являются предметы с ровной и гладкой поверхностью например ПАНЕЛИ, ВАГОНКА ПВХ.

Ультразвуковой датчик HC-SR04

Описание ультразвукового дальномера HC-SR04

Датчик HC-SR04 является бесконтактным. Точность измерения обеспечивается от 2 до 400 см. На его работу не оказывает существенного воздействия электромагнитные излучения и солнечная энергия.

Ультразвуковой дальномер HC-SR04 имеет такие технические параметры:

  • Рабочее напряжение
  • Сила тока в пассивном состоянии < 2 мА
  • Рабочий параметр силы тока – 15 мА
  • Измерительный угол — 30°
  • Обзорный угол — 15°

Ультразвуковой дальномер HC-SR04 имеет такие технические параметры

Контакты подключения:

  • Контакт питания +5В
  • Trig – выход сигнала входа
  • Echo – вывод сигнала выхода
  • GND – «Земля»


Схема подключения ультразвукового датчика HC-SR04 к Arduino UNO

Схема подключения ультразвукового датчика HC-SR04 к Arduino UNO
Самой распространенной библиотекой для работы с датчиком HC-SR04 является NewPing. Описание и подледную версию можно найти на страничке проекта

подключения ультразвукового датчика HC-SR04 к Arduino UNO


Пример скетча который предложен на странице библиотеки NewPing


#include <NewPing.h>
#define TRIGGER_PIN  12
#define ECHO_PIN     11
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
void setup() {
  Serial.begin(115200);
}
void loop() {
  delay(200);
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm());
  Serial.println("cm");
}


Откроем монитор Serial порта.

Откроем монитор Serial порта
Как видим датчик HC-SR04 работает но есть шум. Выводит через определенное время нулевые значения. Данный код можно улучшить.


#include <NewPing.h>
#define TRIGGER_PIN  12
#define ECHO_PIN     11
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
float dist_3[3] = {0.0, 0.0, 0.0};   // массив для хранения трёх последних измерений
float middle, dist, dist_filtered;
float k;
byte i, delta;
unsigned long dispIsrTimer, sensTimer;
void setup() {
  Serial.begin(115200);
}
void loop() {
  if (millis() - sensTimer > 200) {                          // измерение и вывод каждые 50 мс
    // счётчик от 0 до 2
    // каждую итерацию таймера i последовательно принимает значения 0, 1, 2, и так по кругу
    if (i > 1) i = 0;
    else i++;
    dist_3[i] = (float)sonar.ping() / 57.5;                 // получить расстояние в текущую ячейку массива
    dist = middle_of_3(dist_3[0], dist_3[1], dist_3[2]);    // фильтровать медианным фильтром из 3ёх последних измерений
    delta = abs(dist_filtered - dist);                      // расчёт изменения с предыдущим
    if (delta > 1) k = 0.7;                                 // если большое - резкий коэффициент
    else k = 0.1;                                           // если маленькое - плавный коэффициент
    dist_filtered = dist * k + dist_filtered * (1 - k);     // фильтр "бегущее среднее"
   Serial.print("Ping: ");
  Serial.print(dist_filtered);
  Serial.println("cm");                // вывести
    sensTimer = millis();                                   // сбросить таймер
  }
}
// медианный фильтр из 3ёх значений
float middle_of_3(float a, float b, float c) {
  if ((a <= b) && (a <= c)) {
    middle = (b <= c) ? b : c;
  }
  else {
    if ((b <= a) && (b <= c)) {
      middle = (a <= c) ? a : c;
    }
    else {
      middle = (a <= b) ? a : b;
    }
  }
  return middle;
}

Как видим датчик HC-SR04 работает но есть шум


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


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

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

]]>
Самодельная рама для 3D принтера. Какую модель выбрать? Чертежи http://portal-pk.ru/news/161-samodelnaya-rama-dlya-3d-printera-kakuyu-model-vybrat.html Константин Portal-PK 2018-11-02T12:53:37+03:00 При разработке своих проектов на Arduino и ЧПУ. Я часто упираюсь в то, что на своем самодельном фрезерном станк е я могу сделать только плоские заготовки. А так часто необходимо сделать изогнутую стенку или сложную объемную деталь. Меня регулярно посещает мысль, что нужен 3D-пинтер. Стоят они не очень дорого. Это вам не Перевезти оргтехнику 20т фурой

В Китае можно купить недорогие 3D принтеры:

Анет 3d принтер Delta 3d Принтер CTC 3d принтер

Подробнее

Подробнее

Подробнее

3D принтер с доставкой из России: Анет A6 3D-принтер

Но как вы знаете я не ищу легких путей и люблю собирать самодельные станки с ЧПУ. Поэтому я решил собрать 3D принтер.

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

Можно купить готовые варианты рамы , цена относительно небольшая:

3d принтеры Reprap Ultimaker рамки фанеры 6 мм/4 мм Prusa i3 рамка 6 мм фанера Анет A8/hesine M505/tronxy 3D-принтер STEK/stek металлический каркас 3d принтера

Подробнее

Подробнее

Подробнее

Подробнее

Но раз я решил самодельны, значит самодельный. Сперва я планировал собрать самый простой 3D-принтер и выпилить основные части корпуса из фанеры вручную. Что то примерно вот такое:

самый простой 3D-принтер

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

1. Первая развертка предназначена для вырезки из стали 3 мм.

3d принтер. Чертеж рамы

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

Скачать чертежи 3D-принтера P3Steel

2. Вторая версия имеет те же минусы и недостатки. Но макет сделан из МДФ. Поэтому я решил сделать так же из МДФ. Для примера. А потом на основании данного макета модернизировать чертежи под свои материалы. И почестям пересобрать. И тут я нашел третий вариант.

Самодельная рама из МДФ 3D принтера

раскрой фанеры рамы 3D принтера

Скачать чертежи 3D-принтера I3 CORDOBESA Full Steel

3.Данная версия рамы 3D принтера уже предназначена для раскроя из фанеры 6 мм.

версия рамы 3D принтера уже предназначена для раскроя из фанеры 6 мм

Это то что я искал. Для первой пробной рамы для 3D-принтера, я думаю будет достаточно. Тем более зная себя точно, что нибудь буду переделывать и модернизировать. А как основная база на первый взгляд неплохой вариант. А как вы считаете?

Скачать чертежи 3D-принтера WoodMAX i3

Если у вас есть варианты рам для 3D принтера пишите в комментарии. Буду благодарен!

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

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

]]>
Часы-будильник на Arduino. Корпус сделан из конструктора LEGO. LEGO Arduino http://portal-pk.ru/news/160-chasy-budilnik-na-arduino-korpus-sdelan-iz-konstruktora.html Константин Portal-PK 2018-10-18T09:25:33+03:00 Пришел у меня 5 летний ребенок из садика и сказал, что ему задали сделать проект умные устройства в доме. Корпус можно сделать из любого подручного конструктора. Можно сделать из LEGO конструктора. Немного поразмыслив решили мы с сыном сделать часы-будильник на Digispark и 7 сегментном индикаторе на TM1637 с часами реального времени DS3231 .

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

часы-будильник на Digispark и 7 сегментном индикаторе на TM1637 с часами реального времени DS3231

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

Корпус из LEGO для чесов

Прошивка для часов на Digispark и 7 сегментном индикаторе на TM1637 с часами реального времени DS3231 в среде Arduino IDE:


#include <TinyWireM.h>
#include "TM1637.h"
#define CLK 4
#define DIO 3 
int soundPin = 1;             // объявляем переменную с номером пина спикера
const int buttonPin = 5;      // номер входа, подключенный к кнопке
int sensorValue = 0;
boolean status = false;
TM1637 tm1637(CLK,DIO);
///// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}
void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   TinyWireM.beginTransmission(0x68);
   TinyWireM.send(0);
   TinyWireM.send(decToBcd(second));    
   TinyWireM.send(decToBcd(minute));
   TinyWireM.send(decToBcd(hour));     
   TinyWireM.send(decToBcd(dayOfWeek));
   TinyWireM.send(decToBcd(dayOfMonth));
   TinyWireM.send(decToBcd(month));
   TinyWireM.send(decToBcd(year));
   TinyWireM.endTransmission();
}
void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{
  TinyWireM.beginTransmission(0x68);
  TinyWireM.send(0);
  TinyWireM.endTransmission();
  TinyWireM.requestFrom(0x68, 7);
  *second     = bcdToDec(TinyWireM.receive() & 0x7f);
  *minute     = bcdToDec(TinyWireM.receive());
  *hour       = bcdToDec(TinyWireM.receive() & 0x3f); 
  *dayOfWeek  = bcdToDec(TinyWireM.receive());
  *dayOfMonth = bcdToDec(TinyWireM.receive());
  *month      = bcdToDec(TinyWireM.receive());
  *year       = bcdToDec(TinyWireM.receive());
}
float get3231Temp(){
  byte tMSB, tLSB; 
  float temp3231;
  TinyWireM.beginTransmission(0x68);
  TinyWireM.send(0x11);
  TinyWireM.endTransmission();
  TinyWireM.requestFrom(0x68, 2);
  if(TinyWireM.available()) {
    tMSB = TinyWireM.receive(); //2's complement int portion
    tLSB = TinyWireM.receive(); //fraction portion
    temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
    temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8
  }
  else {
    //oh noes, no data!
  }
  return temp3231;
}
/////////////////
void setup() {
  TinyWireM.begin();
  tm1637.init();
  tm1637.set(7); // яркость, от 0 до 7
  pinMode(soundPin, OUTPUT); //объявляем пин как выход. 
  pinMode(buttonPin, INPUT_PULLUP);
 pinMode(5, INPUT);
    // установка часов 
        //byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;  second = 30;  minute = 50;  hour = 06;  dayOfWeek = 3; 
     // день недели 
     //dayOfMonth = 1; // день 
      ///month = 4; 
      //year = 14;  setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
}
void loop(){
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  byte temp = get3231Temp(); 
  int8_t TimeDisp[4]; 
    TimeDisp[0] = hour / 10;
    TimeDisp[1] = hour % 10;
    TimeDisp[2] = minute / 10;
    TimeDisp[3] = minute % 10;  
    if (second%2)
      tm1637.point(POINT_ON); // включаем точки
    else
      tm1637.point(POINT_OFF); // выключаем точки       
//  }
  buttonValue = digitalRead(buttonPin); // считываем данные с кнопки
   if(hour==7)
   {    
     if (minute==00)
     {
       if (second < 30)
         status = true;
       else
         status = false;
     }     
   }
   if (buttonValue)
      status = false;
   if (status)
    {
      tone(soundPin, 1500); // включаем звук частотой 100 Гц
      delay(200);
      tone(soundPin, 1000); // включаем звук частотой 100 Гц
      delay(200);
      tone(soundPin, 500); // включаем звук частотой 100 Гц
      delay(200);
    }
   else
    noTone(soundPin); // выключаем звук
  tm1637.display(TimeDisp); // отправляем массив на экран
}

Звуковой сигнал будет генерировать функция tone(). Как видно из программы настраивать время срабатывания будильника мы не сможем. Это связанна с тем что у Digispark мало пинов. И все уже заняты.

Если данный проект реализовать например на Atduino NANO, тогда можно реализовать настройку времени срабатывания будильника. Написать мелодии будильника и прочие фишки. Если данное видео и статья будут востребованы, то я сниму переделку на Arduino NANO. Но для первого раза я считаю что получилась не плох. А вы как считает? Пишите в комментариях свое мнение.


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

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

]]>
Новые Arduino проекты и Проекты сделанные на ЧПУ станке http://portal-pk.ru/news/159-novye-arduino-proekty-i-proekty-sdelannye-na-chpu-stanke.html Константин Portal-PK 2018-09-03T18:20:17+03:00 Вот и закончилось лета. И времени на разработку проектов на Arduino становиться больше. И сегодня я планирую рассказать о своих новых проектах которые я делаю на Ардуино и своем самодельном ЧПУ станке. Проекты еще в стадии разработки и не имеют конечного готового вида. Это вам не умз 42164 ремонт. Но все же я решил рассказать о них, чтобы услышит сторонне мнение. На канале видео я выложил раньше написания данной статьи. И первые мнения уже есть. Некоторые положительные, так же есть и отрицательны. Но любое мнение это повод улучить свои проект опираясь на ваше мнение.

Два проекта сделанные под управлением Arduino.
Первый проект про который я бы хотел рассказать это модифицированный и улучшенный светофор на ардуино и адресных светодиодах. Грубо говоря светофор версии 2.0. В данной версии я учел все недостатки и сделал его немного больше. Это видно по корпусу.

светофор на ардуино и адресных светодиодах. Грубо говоря светофор версии 2.0
Второй проект сделан так же на Arduino и адресных светодиодах WS2812. В качестве рассеивателя я использую стеклянные шарики которые рассеивают свет и вокруг каждого шарика и получается очень красивое свечение даже при белом свете. В данный момент уже внес некоторые изменения в данный проект и планируется разработка два направления данных ночников. Но об это в следующих статьях про мои проекты.

Ночник из стеклянных шариков
Третий проект сделан без использования Arduino. Это светильник общей мощностью 8 Вт на обычных светодиодах. Корпус высотой 42 см., выпилен на моем самодельном станке с ЧПУ. Данный корпус планирую использовать и в других моих проектах.

светильник общей мощностью 8 Вт на обычных светодиодах


Какой проект вам понравился больше всего? Пишите в комментарии. На основании ваших интересов буду планировать написание статей про данные проекты.


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

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

]]>
Аварийные огни + мигалка для автомобиля на Arduino и WS2812 http://portal-pk.ru/news/158-avariinye-ogni-migalka-dlya-avtomobilya-na-arduino-i-ws2812.html Константин Portal-PK 2018-08-08T11:49:31+03:00 Как вы наверное помните я деле машинку: СамодельнаяWifi машинка на NodeMCU. Машина делает дрифт. Мигалку делал на обычных светодиодах. Помещал их встарый корпус и получалась достаточно неплохая мигалка. Установленная на крышу машины. Так называемая крышная установка. На подобии наружной рекламы. Но как сделать мигалку и аварийные огни? В этом нам помогут светодиоды WS2812.

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

Подключать будем к Arduino UNO, можно подключить и к другим моделям, например Arduino NANO подключение ни чем не будет отличаться.

Вход « DIN» на светодиодном модуле подключаем к PIN 6 на Arduino.

Для написания кода будем использовать библиотеку Adafruit NeoPixel. В которой есть пример «standtest». Который будет основой для кода. Также я бы порекомендовал вам посмотреть данный пример. Что он делает и как работает, это поможет вам понять код ниже.

Для примера будем подключать 8 светодиодов.

Режимы работы :

ArrowLeft и ArrowRight - Включение левой и правой секции светодиодов (по 4 шт.).

WigWag — Плавное включение всех светодиодов (8 шт.) Слева на права и наоброт.

WigWag2 — Предыдущий режим только с разными цветами

BlinkOuter - мигают два внешних светодиода

OnOuter - включает два внешних светодиода

ClearLights - отключает все светодиоды


#include 
#ifdef __AVR__
#include 
#endif
#define PIN 6

// All of this stuff below is from the example
// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, PIN, NEO_GRB + NEO_KHZ800);

//NOTE: I tested this code with an 8 LED module, but you should be able to daisy chain multiple modules
//NOTE: Try changing the "8" to "4" to see how it reacts.

// This warning is from the example, probably worth considering
// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
  // This stuff is from the example, I commented it out since I am not using a Trinket
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  //#if defined (__AVR_ATtiny85__)
  // if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  //#endif
  // End of trinket special code
  strip.begin();
  strip.show();
}

void loop() {
  /*
   * For strip.Color(R, G, B), use 0-255 to set intensity
   * for each color (R)ed, (G)reen, (B)lue
   *
   * The last number is a delay 0-255 range.
   */

  // These are left/right signals
  ArrowLeft(strip.Color(0, 0, 255), 100); // Blue
  ArrowRight(strip.Color(255, 0, 0), 200); //Red

  // These are side to side or wig/wag
  WigWag(strip.Color(255, 0, 0), 200); // Red
  WigWag(strip.Color(0, 0, 255), 63); // Blue faster
  WigWag(strip.Color(0, 0, 255), 127); // Blue medium
  WigWag(strip.Color(0, 0, 255), 255); // Blue slowest
  WigWag(strip.Color(0, 255, 0), 200); // Green
  WigWag(strip.Color(255, 255, 0), 200); // Yellow
  ClearLights();
  delay(1000);
  // This is a 2 color wigwag
  WigWag2(strip.Color(0, 0, 255), strip.Color(255, 0, 0), 200); // Blue and Red
  ClearLights();
  delay(1000);

  // Blinks the outer most lights
  BlinkOuter(strip.Color(0, 0, 255), 200); //Blue
  BlinkOuter(strip.Color(0, 0, 255), 50); //Blue faster
  BlinkOuter(strip.Color(255, 255, 0), 200); //Yellow
  ClearLights();
  delay(1000);

  // Turns the outer most lights on
  OnOuter(strip.Color(63, 0, 0)); // Red 25%
  OnOuter(strip.Color(127, 0, 0)); // Red 50%
  OnOuter(strip.Color(191, 0, 0)); // Red 75%
  OnOuter(strip.Color(255, 0, 0)); // Red 100%
  ClearLights();
  delay(1000);
  OnOuter(strip.Color(0, 0, 255)); // Blue
  OnOuter(strip.Color(0, 255, 0)); // Green
  // Turns off all lights
  ClearLights();
  delay(5000);
}

void ArrowRight(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 4; j++) { // The j<# determines how many cycles
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
    }
    for (uint16_t i = 0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);
  }
}

void ArrowLeft(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 4; j++) { // The j<# determines how many cycles
    for (uint16_t i = strip.numPixels(); i + 1 > 0 ; i--) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
    }
    for (uint16_t i = strip.numPixels(); i + 1 > 0 ; i--) {
      strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);
  }
}

void WigWag(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 10; j++) { // The j<# determines how many cycles
    for (int i = 0; i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, c);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);

    for (int i = 0; i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, 0);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, c);
    }
    strip.show();
    delay(wait);
  }
}


void WigWag2(uint32_t c, uint32_t c2, uint8_t wait) {
  for (int j = 0; j < 20; j++) { // The j<# determines how many cycles
    for (int i = 0; i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, c);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, 0);
    }
    strip.show();
    delay(wait);

    for (int i = 0; i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, 0);
    }
    for (int i = (strip.numPixels() / 2); i < strip.numPixels(); i = i + 1) {
      strip.setPixelColor(i, c2);
    }
    strip.show();
    delay(wait);
  }
}

void ClearLights() {
  for (int i = 0; i < strip.numPixels(); i = i + 1) {
    strip.setPixelColor(i, 0);    //turn every pixel off
  }
  strip.show();
}

void BlinkOuter(uint32_t c, uint8_t wait) {
  for (int j = 0; j < 10; j++) { // The j<# determines how many cycles
    strip.setPixelColor(strip.numPixels() - 1, c);
    strip.setPixelColor(0, c);
    strip.show();
    delay(wait);
    strip.setPixelColor(strip.numPixels() - 1, 0);
    strip.setPixelColor(0, 0);
    strip.show();
    delay(wait);
  }
}

void OnOuter(uint32_t c) {
  strip.setPixelColor(strip.numPixels() - 1, c);
  strip.setPixelColor(0, c);
  strip.show();
  delay(3000);
}

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

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

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

]]>
Светодиодные часы на Arduino и светодиодах WS2812b http://portal-pk.ru/news/157-svetodiodnye-chasy-na-arduino-i-svetodiodah-ws2812b.html Константин Portal-PK 2018-08-01T09:18:00+03:00 Ка вы помните я уже делал часы на адресных светодиодах и Arduino. Если вы не в курсе смотрите мой проект: Классные самодельные настенные светодиодные часы на arduino.

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

Пример 1. Часы на Arduino, модуле реального времени RTC 1307 и светодиодной ленте WS2812b.

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

Часы на Arduino, модуле реального времени RTC 1307 и светодиодной ленте WS2812b
Вот такие симпатичные часы получаются и за небольшие деньги. Хоть вешай их себе в гостиную. Но для этого нужно подготовить стенку, чтобы часы гармонично вписывались. Интересно обои под покраску, цена данного удовольствия какая?
Код проекта.

/*
This is my sketch for a NEO PIXEL ring LED clock.
*/
//  Includes below:
#include <Wire.h>
#include <stdio.h>
#include <Adafruit_NeoPixel.h>
#include <RTClib.h> 
RTC_DS1307 RTC;             // Create RTC object
//  Define things here and set things up.
#define LED_Loop 60
#define PIN 6    // This is defining which Arduino pin is driving the Pixel ring used pin 6 but any digital will work
// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_Loop, PIN, NEO_GRB + NEO_KHZ800);
int LED[LED_Loop];
int THREE = (LED_Loop / 4);
int SIX = (THREE * 2);
int NINE = (THREE * 3);
int TWELVE = (LED_Loop-1);
int HR_Fade = 7;
int MN_Fade;
long HR_Colour;
long SE_Colour = 0x000055;
long THIS_LED;
int Led_Flag;
int argh;
//  trying this way to get colours working.
int HR_R;
int HR_G;
int HR_B;
int HR1_R = 0x55;
int HR1_G = 0;
int HR1_B = 0;
int HR2_R = 0x0D;
int HR2_G = 0;
int HR2_B = 0x0D;
int MN_R = 0;
int MN_G = 33;
int MN_B = 0;
//int SE_R = 0;
//int SE_G = 0;
//int SE_B = 0x55;
int hour_led;
int minute_led;
int second_led;
int new_minute;
//-----------------------------  Set up here -----------------------------//
void setup() 
{
  // put your setup code here, to run once:
  delay(2000);          //  This is just to give you time to open the window and watch.
  Serial.begin(9600);
  Serial.println("-------------------------------");
  Serial.println("Setting up");
  Wire.begin();
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  if (! RTC.isrunning()) 
  {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
  Serial.println("Done setting up");
  Serial.println("-------------------------------");
}
//-----------------------------  MAIN LOOP here -----------------------------//
void loop() 
{
  //  Get time
   DateTime now = RTC.now();
   //  24 hour time change colour of hour hand.
   int hr = now.hour();
   if (hr < 12)
   {
     //HR_Colour = HR_Colour1;
     HR_R = HR1_R;
     HR_G = HR1_G;
     HR_B = HR1_B;
   }
   else
   {
     //HR_Colour = HR_Colour2;
     HR_R = HR2_R;
     HR_G = HR2_G;
     HR_B = HR2_B;
   }
   int mins = now.minute();        //  This line is only incase any maths had to be done.
   second_led = now.second();
  //
  //  calculate leds
   hour_led = (((LED_Loop/12) * hr) + (mins / (LED_Loop/5)))%LED_Loop;
   if (hour_led == 60)
   {
     hour_led = 59;
   }
   minute_led = mins;
//  Debug code below
//
//------------------------------------------//
/*    
    Serial.print(now.year());
    Serial.print('/');
    Serial.print(now.month());
    Serial.print('/');
    Serial.print(now.day());
    Serial.print(' ');
    Serial.print(now.hour());
    Serial.print(':');
    Serial.print(now.minute());
    Serial.print(':');
    Serial.print(now.second());
    Serial.println();
*/
//------------------------------------------//
/*
  Serial.println("=========================");
  Serial.println(hr);
  Serial.println(mins);
  Serial.println("-------------------------");
  Serial.println(hour_led);
  Serial.println(minute_led);
  Serial.println(second_led);
*/
//------------------------------------------//
  //
  //  Show LEDs            ------------------   Main loop here -----------------
   //  Keep this at the top so it doesn't mess up any other settings when LEDs are
   //  turned on.
   strip.setPixelColor(second_led-1,SE_Colour/2);
   strip.setPixelColor(second_led-2,SE_Colour/4);
   strip.setPixelColor(second_led-3,SE_Colour/8);
   strip.setPixelColor(second_led-4,SE_Colour/16);
   strip.setPixelColor(second_led-5,0);
  //
  //  show THREE, SIX, NINE and TWELVE
  //
  strip.setPixelColor (THREE, 0x050505);
  strip.setPixelColor (SIX, 0x050505);
  strip.setPixelColor (NINE, 0x050505);
  strip.setPixelColor (TWELVE, 0x050505);
  //
  //  Now start setting LEDs below here.
  //
   if (second_led == 0)
   {
      strip.setPixelColor(LED_Loop-1, SE_Colour/2);
      strip.setPixelColor(LED_Loop-2,SE_Colour/4);
      strip.setPixelColor(LED_Loop-3,SE_Colour/8);
      strip.setPixelColor(LED_Loop-4,SE_Colour/16);
      strip.setPixelColor(LED_Loop-5,0);
      new_minute = 1;
   }
   if (second_led == 1)
   {
      strip.setPixelColor(second_led-1, SE_Colour/2);
      strip.setPixelColor(LED_Loop-1, SE_Colour/4);
      strip.setPixelColor(LED_Loop-2,SE_Colour/8);
      strip.setPixelColor(LED_Loop-3,SE_Colour/16);
      strip.setPixelColor(LED_Loop-4,0);
   }
   if (second_led == 2)
   {
      strip.setPixelColor(second_led-1, SE_Colour/2);
      strip.setPixelColor(second_led-2, SE_Colour/4);
      strip.setPixelColor(LED_Loop-1, SE_Colour/8);
      strip.setPixelColor(LED_Loop-2,SE_Colour/16);
      strip.setPixelColor(LED_Loop-3,0);
   }
   if (second_led == 3)
   {
      strip.setPixelColor(second_led-1, SE_Colour/2);
      strip.setPixelColor(second_led-2, SE_Colour/4);
      strip.setPixelColor(second_led-3, SE_Colour/8);
      strip.setPixelColor(LED_Loop-1,SE_Colour/16);
      strip.setPixelColor(LED_Loop-2,0);
   }
   if (second_led == 4)
   {
      strip.setPixelColor(second_led-1, SE_Colour/2);
      strip.setPixelColor(second_led-2, SE_Colour/4);
      strip.setPixelColor(second_led-3, SE_Colour/8);
      strip.setPixelColor(second_led-4,SE_Colour/16);
      strip.setPixelColor(LED_Loop-1,0);
   }
/*
  if (Led_Flag == 0)
  {
    //
    Led_Flag = 1;
    THIS_LED = strip.getPixelColor(second_led);
    //  This is where I am at.
    Serial.print(second_led);
    Serial.print(" ");
    Serial.println(THIS_LED);
  }
*/  
  /*----------------  Draw SECOND HAND on clock ----------------*/
   strip.setPixelColor(second_led,SE_Colour);
//   strip.setPixelColor(second_led,SE_Colour+THIS_LED);
//   strip.setPixelColor(second_led-1,THIS_LED);
   if (new_minute == 1)
   {
     //new_minute = 0;
//     strip.setPixelColor(minute_led-1,MN_Colour/50);
   }
  /*----------------  Draw MINUTE HAND on clock ----------------*/
   //strip.setPixelColor(minute_led,MN_Colour);
   //  MN_Fade for fading.
   strip.setPixelColor(minute_led,MN_R,MN_G,MN_B);
   strip.setPixelColor(minute_led+1, MN_R,     (MN_G * (second_led*10/6)/100)      , MN_B);
   strip.setPixelColor(minute_led-1, MN_R,     (MN_G * (100-(second_led*10/6))/100)      , MN_B);
  /*----------------  Draw HOUR HAND on clock ----------------*/
   strip.setPixelColor(hour_led,HR_R,HR_G,HR_B);
   //strip.setPixelColor((hour_led-1)%LED_Loop,HR_R/HR_Fade,HR_G,HR_B/HR_Fade);
   //strip.setPixelColor((hour_led+1)%LED_Loop,HR_R/HR_Fade,HR_G,HR_B/HR_Fade);
/*
   strip.setPixelColor(hour_led,HR_Colour);
   strip.setPixelColor((hour_led-1)%LED_Loop,HR_Colour);
   strip.setPixelColor((hour_led+1)%LED_Loop,HR_Colour);
*/   
   if (second_led > minute_led)
   {
     new_minute = 0;
   }
/*
  if (second_led != argh)
  {
     Led_Flag = 0;
     argh = second_led;
  }
*/  
  //
  //  show alarms
  //
  strip.show();
  delay(400);
  //                    ------------------   End of Main loop here -----------------
}


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

Пример 2. Часы на Arduino, модуле реального времени RTC 1307 и кольце светодиодов WS2812b.

В данном примере автор купил готовое кольцо из 60 светодиодов WS2812b. Циферблат нарисовал самостоятельно, разместив его в центре кольца.

Часы на Arduino, модуле реального времени RTC 1307 и кольце светодиодов WS2812b
В связи с тем, что кольцо было куплено данные часы наварят ли получаться дешевле. А может даже и дороже по сравнению с первый вариантом. Но зато тут меньше проблем с подбором корпуса и светодиодной ленты.

Что понравилось мне в данном пример, это то, что код всего лишь 70 строчек.

#include <Wire.h>
#include <RTClib.h>
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define PIXEL 60
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL, PIN, NEO_GRB + NEO_KHZ800);
RTC_DS1307 RTC; // Establish clock object
DateTime Clock; // Holds current clock time
byte hourval, minuteval, secondval;
void setup() {
 Serial.begin(9600);
  Wire.begin();            // Begin I2C
  RTC.begin();   // begin clock
    if (! RTC.isrunning()) {
//    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
  }
//  RTC.adjust(DateTime(__DATE__, __TIME__));
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  strip.setBrightness(20);
}
void loop() {
    Clock = RTC.now(); // get the RTC time
    secondval = Clock.second();  // get seconds
    minuteval = Clock.minute();  // get minutes
    hourval = Clock.hour();      // get hours
    if(hourval > 11) hourval -= 12; // This clock is 12 hour, if 13-23, convert to 0-11
    hourval = (hourval*60 + minuteval) / 12;   
    strip.setPixelColor(hourval, 0x008080);strip.setPixelColor(hourval-1, 0x004040);strip.setPixelColor(hourval+1, 0x004040);
//    strip.setPixelColor(hourval-2, 0x001010);strip.setPixelColor(hourval+2, 0x001010);
    strip.setPixelColor(minuteval, 0x800080);
//    strip.setPixelColor(minuteval-1, 0x200020);strip.setPixelColor(minuteval+1, 0x200020);
    strip.setPixelColor(secondval, 0x808000);//strip.setPixelColor(secondval-1, 0x002F00);strip.setPixelColor(secondval+1, 0x002F00);
    strip.show();
    strip.setPixelColor(hourval, 0x000000);strip.setPixelColor(hourval-1, 0x000000);strip.setPixelColor(hourval+1, 0x000000);
    strip.setPixelColor(hourval-2, 0x000000);strip.setPixelColor(hourval+2, 0x000000); 
    strip.setPixelColor(minuteval, 0x000000);strip.setPixelColor(minuteval-1, 0x000000);strip.setPixelColor(minuteval+1, 0x000000);
    strip.setPixelColor(secondval, 0x000000);//strip.setPixelColor(secondval-1, 0x000000);strip.setPixelColor(secondval+1, 0x000000);
  delay(25);
/*
   Serial.print(hourval, DEC);
   Serial.print(':');
  Serial.print(minuteval, DEC);
   Serial.print(':');
   Serial.println(secondval, DEC);
*/
}

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

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

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

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

]]>
Урок 6 - Свечение светодиода пока нажата кнопка на пульте ДУ (IR) http://portal-pk.ru/news/156-urok-6---svechenie-svetodioda-poka-nazhata-knopka-na.html Константин Portal-PK 2018-07-30T10:53:45+03:00 В предыдущем уроке я уже рассказал как можно подключить IR приемник к Arduino и включать и выключать светодиод с помощью пульта дистанционного управления (ДУ).
После чего мне поступили вопросы :
1. «А возможно ли организовать чтобы, например, включался светодиод но только на время удержания кнопки, и гас сразу после ее освобождения?»,
2. «Подскажите пожалуйста, а возможно ли организовать чтобы, например, включался светодиод но только на время удержания кнопки, и гас сразу после ее освобождения? нигде не получилось найти инфу»
Данный вопрос в принципе простой и я делал машину на пульте управления и Arduino по данному принципу. Поделился ссылкой на материал. Но почему то есть трудности по реализации данного управления. Давайте наденем домашние тапочки и пойдем разбираться.

 подключить IR приемник к Arduino И так рассмотрим пример из предыдущего урока "Управление Arduino с помощью пульта ДУ (IR). Библиотека IRremote", когда мы получаем коды с кнопок.


#include 
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}
void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

При нажатии кнопок пульта ДУ мы получаем вот такой результат.

FF18E7
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFA857
FF02FD
FF5AA5
FFFFFFFF
FFFFFFFF
FFFFFFFF
FF10EF
FF5AA5

Как видим у нас при длительном нажатии выводит вот такой код: «FFFFFFFF». Который не относиться ни к одной кнопки. Этот код выводиться с определенной периодичностью, когда кнопка нажата и мы ее не отпускаем. Отпустив кнопку мы увидим, что данный код больше не выводиться в сериал порт. Используя данный принцип можно написать код под наши нужды. Вот пример условия который нам нужно добавить в код.

   

 if (results.value == 0xFFFFFFFF) // кнопка зажата
      {
        flag = flag;          // собновляем состояние светодиода
      }



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

//FF10EF   — стрелочка вправо
//FF5AA5   — стрелочка влево
#include "IRremote.h"
IRrecv irrecv(11);           // указываем вывод, к которому подключен приемник
decode_results results;
int flag = 0;                // состояние светодиода 0-выкл. 1- вкл. 
long prestroMillis = 0;      // для отчета времени первоночальное значение
void setup() {
  irrecv.enableIRIn();       // запускаем прием
}
void loop() {
  unsigned long curstroMillis = millis();  // устанавливаем время в сейчас
  if ((curstroMillis - prestroMillis) > 200) // проверяем интервал
  {
    if (irrecv.decode(&results)) { // если получаем данные с пульта ДУ
      if (results.value == 0xFF10EF)
        flag = 1;           // вкл. светодиод
      if (results.value == 0xFFFFFFFF) // кнопка зажата
      {
        flag = flag;          // собновляем состояние светодиода
      }
      irrecv.resume();        // принимаем следующую команду
    }
    prestroMillis = curstroMillis; // обнуляем счетчик для нового цикла 
  } 
  else                     // данные не поступают с пульта ДУ 
  flag = 0;                // выключаем светодиод
 digitalWrite( 13, flag );
}

Возникли вопросы. Пишите в комментарии.


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

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

]]>
Светофор на Digispark и адресных светодиодах WS2812 — Ардуино светофор http://portal-pk.ru/news/155-svetofor-na-digispark-i-adresnyh-svetodiodah-ws2812-arduino.html Константин Portal-PK 2018-07-27T08:54:02+03:00 В предыдущей статье: « Неудачныепроекты Arduino светильников и светофора» я уже рассказывал про разработку светофора и о том что у меня не получилось сделать его полностью функциональным и работоспособным. Спустя пару недель я доработал его и теперь готов представить самодельный светофор на Ардуино и адресных светодиодах WS2812.

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

аготовки для корпуса выпилил на своем самодельном ЧПУ станке

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

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

Схема подключения

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

 демонстрирую сборку схемы подключения на макетной плате

Светофор готов и что он умеет?

Светофор готов и что он умеет?


Я расширил его функционал и сделал не просто светофор но и ночник, у которого есть режимы:

1. Светофор

2. Смена цветов

3. Радуга

4. Белое свечение.


После сборки данного светофора на Digispark и адресных светодиодах WS2812 прошло больше месяца и я пока не менял батарейки. Не смотря на то что ребенок очень часто играет светофором. Да и гости, не зависимо от возраста готовы посмотреть и поиграть данной самоделкой на Arduino.


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

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

]]>
Неудачные проекты Arduino светильников и светофора http://portal-pk.ru/news/154-neudachnye-proekty-arduino-svetilnikov-i-svetofora.html Константин Portal-PK 2018-07-26T09:12:08+03:00 Любая разработка приводит к неудачным и промежуточным моделям. Которые не удовлетворяют всем потребностям и ожиданием.

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


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

светофор на Arduino

Поэтому я сделал вывод, что светофор на Arduino необходимо дорабатывать. И в ближайшее время сделаю новую версию.


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

корпус для светильника на Ардуино и адресных светодиодах

Пока думаю что можно сделать с данной моделью.


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

 светильник

Обо всем рассказываю подробно в видео.


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

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

]]>
ЧПУ станок своими руками на базе arduino. Пошаговая инструкция + видео http://portal-pk.ru/news/153-chpu-stanok-svoimi-rukami-na-baze-arduino-poshagovaya.html Константин Portal-PK 2018-05-08T11:01:56+03:00 Все мои статьи с видео про создание ЧПУ станков на одной странице. Своего рода инструкция.

Данная страница будет пополняться. Не забудьте добавить ее в закладки!

UniversalG-Code Sender программа для управления ЧПУстанком.


Проект №3. самодельный CNC станок из мебельных направляющих на базе Arduino UNO

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

Заготовке вырезанные на данном ЧПУ станке можно посмотреть тут......

Готовые проекты сотрите тут...

Комплектующие ЧПУ :

Механика для ЧПУ недорого >>>

Расходные материалы для CNC >>>


Проект №2. Лазерный гравировальный станок с ЧПУ (шаговые двигателя от матричного принтера)

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

Для управления использовал электронику: Arduino UNO + CNCshield v3 + драйвера A4988

Недорогую электронику для ЧПУ можно купить в Китае >>>


Проект №1. Мой первый ЧПУ станок из матричных принтеров (Не удачная версия)

Для проверки своих сил собрал ЧПУ станок из того что было под рукой. Дополнительно затратил денег не больше 3 тыс. руб.

Станок работал. Но работа была не очень хорошего качества и было много ограничений по функционалу. Но что можно ожидать от CNC станка за 3 000 руб.

Для сборки ЧПУ станка из деталей от принтера были использовано:

  1. 3 Матричных принтера формата А3.
  2. Мебельные направляющие: 2 пары 500 мм. И одна пара на 300 мм.
  3. Доска 25х100, брусок 25х25, фанера толщиной 8 мм.
  4. Блок питания от компьютера.
  5. Arduino NANO
  6. Драйвера L298 4 шт.
  7. Строительные и мебельные уголки.
  8. Саморезы, винты, гайки и шпилька М10.
  9. Телефонные провода, провода из компьютера.
  10. Переменный резистор из автомобиля.
  11. Двигатель от автомобильного компрессора.
  12. Шаговый двигатель от сканера .
  13. Латунная цанга.

Недорогие ЧПУ станки>>>

]]>
Universal G-Code Sender программа для управления ЧПУ станком. http://portal-pk.ru/news/152-universal-g-code-sender-programma-dlya-upravleniya-chpu-stankom.html Константин Portal-PK 2018-04-20T12:23:51+03:00 Для управления ЧПУ станками используется G-Code.
G-Code - это язык программирования, используемый для отправки команд на станки с ЧПУ (числовое программное управление).

Universal G-Code Sender можно с качать отсюда.
Основным преимуществом является то, что Universal G-code Sender может работать на разных настольных платформах, таких как Windows, OS X, Linux и даже Raspberry Pi.
Для работы Universal G-code Sender необходимо устоновить Java:

  • Java 7 или выше — для Universal G-code Sender 1.0.8 и более ранних
  • Java 8 или выше - для Universal G-code Sender 1.0.9 и 2.0

Если у вас не установлена Java, качаем и устанавливаем ее отсюда.
Как установить Java 8 в Ubuntu читайте тут.
Очень частый вопрос который мен задают: «Нет файла ***.exe как запустить приложение?» В Windows есть и другие исполняемых файлы. Один из которых ***.bat.
Для запуска программы в Windows запускаем "start-windows.bat", в Linux запускаем "start.sh".

Для того чтобы подключить программу к станку нужно:

  • Выбрали порт - у меня COM4
  • Скорость - 115200
  • Нажали кнопку "Open"

Universal G-code Sender

Увидели надпись **** Connected to COM4 @ 115200 baud **** - у нас все работает. Обратите внимание, что в Arduino должна быть загружена прошивка GRBL. В противном случае ни чего не получаться.

Следующий распространенный вопрос: «У меня на английском. Где взять русскую версию?» В Universal G-code Sender встроенны несколько языковых пакетов в том числе и Русский. Заходим в настройки и переключаем на русский.

Universal G-code Sender встроенны несколько языковых пакетов в том числе и Русский

Universal G-Code Sender можно с качать отсюда
В закладке "Консоль" - в консоли пишем команду G1 X10 Y10 F300 - наши моторы крутятся.
В закладке "Упровления осями", можно управлять осями через кнопки.
Можно загрузить GCODE файл, для этого нажмите на кнопку "Обзор" - указываем GCODE файл.


Как я создавал Свой самодельный ЧПУ станок можете посмотреть тут:

1. Какподобрать шаговый двигатель для станкаЧПУ. ШД из принтера.

2. Платарасширения для Arduino UNO, CNC shield v3 и драйверовA4988

3. Настройкадрайвера A4988. Первый запуск шаговыхдвигателей

4. Самодельныйфрезерный ЧПУ станок из мебельныхнаправляющих. Механика

5. СамодельныйЧПУ CNC фрезерный станок. Часть 2. Электроника

6. Настройка прошивки Grbl ЧПУ станка. Калибровка ЧПУ

Купить Комплектующие для ЧПУ или готовый ЧПУ станок. можно недорого в Китае:


Во второй версии Universal G-code Sender ветка UGS Platform. Тут все немного по другому.

Во второй версии Universal G-code Sender ветка UGS Platform
Для запуска программы вам нужно зайти в папку bin. В Windows запускаем "ugsplatform.exe" и "ugsplatform64.exe" для 64-битной ОС, в Linux и MAC OS запускаем "ugsplatform".
Для работы данной версии требуется Java 8 или выше.
Интерфейс тут отличается. Для смены языка на русский преходим Tools→Options. В вкладе UGS, вбираем вкладку Sender Options. Тут уже меняем язык.

Для смены языка на русский преходим Tools→Options. В вкладе UGS, вбираем вкладку Sender Options


Вот так выглядит окно 3D-вида заготовки для фрезерования.

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

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

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

]]>
Подсветка на Arduino и ws2812 - На новый год http://portal-pk.ru/news/151-podsvetka-na-arduino-i-ws2812-na---novyi-god.html Константин Portal-PK 2018-04-05T12:25:10+03:00 Перед новым годом делал подсветку на Arduino и адресных светодиодах ws2812. Если вы постоянно читаете новости в группе проекта и на сайте, то вы наверное в курсе про основные этапы сборки данной подсветки. Если нет, то я вам расскажу.
Первое что я сделал это. Для этого я воспользовался своим самодельным фрезерным станком с ЧПУ.

вырезал заготовки для корпуса под электронику

 самодельным фрезерным станком с ЧПУ

Ручка для потенциометра вырезанная на ЧПУ

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

Склеил корпус для электроники

корпус для электроники


Для гирлянды я использовал следующую электронику:
1. Управляет всем -Arduino UNO
2. Тактовые кнопки переключают режимы.
3. Потенциометр регулирует яркость.
4. Светодиоды ws2812, но проще использовать светодиодную ленту ws2812. Но у меня ее не было под рукой.
5. Блок питания 5В 2А.
6. ЖК-дисплей 1602 16x2 с I2C модулем
7. Провода.

На все комплектующие которые я покупаю и мне они нравятся по соотношению цена и качество, я делаю закладки: Ардуино и все для проектов на Arduino, Комплектующие для ЧПУ и ЧПУ станки.
Подсветка выглядит вот так:

Подсветка выглядит вот так

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

свет очень красиво рассеивается по радиусу

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


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

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

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

]]>
NodeMcu Motor Shield. Описание и тестовый Скетч http://portal-pk.ru/news/150-nodemcu-motor-shield-opisanie-i-testovyi-sketch.html Константин Portal-PK 2018-04-03T09:07:25+03:00 Купил для NodeMcu Motor Shield. При покупке шилда будьте внимательны он совместим только с версией nodemcu amica. На картинке слева.

версией nodemcu amicaЕсли вы не знаете как прошить NodeMCU читайте: Чтотакое NodeMCU? Программируем в среде ArduinoIDE

Motor Shield Состоит из следующих элементов.

Motor Shield Состоит из следующих элементов

Колодка GPIO рассчитаны для подключения сервоприводов. Данную колодку я использовал в своем проекте на ESP8266: Манипуляторсвоими руками из фанеры

Данная колодка очень удобна и для подключении различной периферии .

Шилд еще оснащен драйвером L293DD. Благодаря чему к Motor Shield можно подключить 2 двигателя постоянного тока с напряжением до 36 В. Для работы драйвера необходимо подать питания на клеммы motor power. Первый двигатель подключается к колодке motor A, второй к motor B.

Распиновка и основные характеристики драйвера L293DD с лева на картинке.

 драйвера L293DD с лева на картинке

Справа L293D версия с 16 ногами у L293DD 20 ног. Прикладываю Даташит для данных драйверов L293DD.pdf.

Подключаем двигателя и питание к Motor Shield вот по такой схеме.

Подключаем двигателя и питание к Motor Shield вот по такой схеме


Может кому прегодиться файл Motor Shield для Fritzing ESP12E Motor Shield.fzpz

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

#define PIN_D1 5  // gpio5 = D1  PWM_A
#define PIN_D2 4  // gpio4 = D2  PWM_B
#define PIN_D3 0  // gpio0 = D3  DA (A- A+) подключается двигатель 
#define PIN_D4 2  // gpio2 = D4  DB (B- B+) подключается двигатель

void setup() 
   {
    pinMode(PIN_D1, OUTPUT); // инициализируем Pin как выход
    pinMode(PIN_D2, OUTPUT); // инициализируем Pin как выход
    pinMode(PIN_D3, OUTPUT); // инициализируем Pin как выход
    pinMode(PIN_D4, OUTPUT); // инициализируем Pin как выход
   }

void loop()
{
  digitalWrite(PIN_D1, HIGH);   // PWM_A HIGH
  digitalWrite(PIN_D3, HIGH);   // DA HIGH
  delay(2000);                  // wait 
  digitalWrite(PIN_D3, LOW);    // DA LOW
  delay(2000);                  // wait
  digitalWrite(PIN_D2, HIGH);   // PWM_B HIGH, изменяется направление вращения двигателя на контактах (B- B+)
  digitalWrite(PIN_D4, HIGH);   // DB HIGH
  delay(2000);                  // wait 
  digitalWrite(PIN_D4, LOW);    // DB LOW
  delay(2000);                  // wait 
  digitalWrite(PIN_D2, LOW);    // PWM_B LOW

 }

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


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

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

]]>
Классные самодельные настенные светодиодные часы на arduino http://portal-pk.ru/news/149-klassnye-samodelnye-nastennye-svetodiodnye-chasy-na.html Константин Portal-PK 2018-03-22T13:39:54+03:00 Как вы знаете это мои вторые часы на Arduino и светодиодах. Если вы не вкурсе, посмотрите мой первый проект часов можете тут: Arduinoчасы - Видео 4. Делаем корпус и собираемArduino часы

Первые часы на Ардуино я дела все руками и у меня было мало опыта в программировании микроконтроллеров. Хотя это было буквально год назад. Сейчас у меня есть самодельный ЧПУ станок с помощью которого я вырезал все заготовки корпуса для часов .

заготовки корпуса для часов

заготовки корпуса для часов

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

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

  • одно нажатие - настройка часов;
  • второе нажатие - настройка минут;
  • третье нажатие — настройка яркости часов.

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

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

  1. Arduino NANO
  2. Адресные светодиоды WS2812
  3. Модуль реального времени DS1307. В первой версии использовал модуль DS3231SN
  4. Кнопки

Также в часах есть замечательный режим. Когда время ровно 1,2,3 и т. д. По минутным светодиодам бежит светодиод . Данное действия очень хорошо видно и даже боковым зрением можно заметить что время ровно, а вот столько часов, нужно будет посмотреть на часы.


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

Пару фото часов на arduino и адресных светодиодах WS2812

фото часов на arduino и адресных светодиодах WS2812

фото часов на arduino

фото часов на arduino и адресных светодиодах

фото на адресных светодиодах WS2812

фото часов на arduino и светодиодах

Это не последняя версия часов. У меня есть еще с пяток идей. Жду комплектующие из Китая. Так что не пропусти. Добавь сайт в закладки!


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

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

]]>
Очередной проект на Digispark и адресных светодиодах WS2812. Работа ЧПУ http://portal-pk.ru/news/148-ocherednoi-proekt-na-digispark-i-adresnyh-svetodiodah-ws2812.html Константин Portal-PK 2018-03-16T11:36:07+03:00 Небольшой проект на Digispark и адресных светодиодах WS2812, но при этом достаточно симпатичный.
Сегодня я расскажу как я собирал очередной светильник.
На своем самодельном фрезерном станке с ЧПУ я вырезал заготовки для светильника. В группе ВК я уже выкладывал фото заготовок, с вопросом, что я такое делаю. Ответы были но все неправильные.

заготовки для светильника

заготовки для светильника


Схема подключения Digispark и адресных светодиодов WS2812 аналогично предыдущему проекту: Меняем Arduino на Digispark в светильнике на ws2812. digispark проекты.

Схема подключения Digispark и адресных светодиодов WS2812
В итоге получается вот такой светильник.

Конечно фото и видео не передает всей красоты и яркости. Но тоже выглядит неплохо.

две версии светильников на Digispark и адресных светодиодах WS2812

светильник на Digispark и адресных светодиодах WS2812

на Digispark и адресных светодиодах WS2812

две версии светильников

две версии светильников на Digispark и адресных светодиодах WS2812

две версии светильников на Digispark

две версии светильников на Digispark и адресных светодиодах WS2812

светильникна Digispark
Как вы поняли сделал я две версии светильников на Digispark и адресных светодиодах WS2812. С восьмигранным основанием достаточно функциональный и красивый.
Но судить вам . Пишите в комментариях ваши мнения.

В планах сделать светильник с пультом ДУ и с Wi-fi управлением. Что получиться у меня смотрите на канале и читайте на сайте.


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

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

]]>
Урок 5 - Управление Arduino с помощью пульта ДУ (IR). Библиотека IRremote http://portal-pk.ru/news/147-urok-4---upravlenie-arduino-s-pomoshchyu-pulta-du-ir.html Константин Portal-PK 2018-03-13T12:38:02+03:00

При создании проектов на Arduino. Часто возникает вопрос, с помощью чего управлять проектом. И желательно на расстоянии. Кнопки уже не модно.

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

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

 пульт с IR приемником

Купить пульт с IR приемником всего за 100 руб. можно тут.

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

IR приемником

IR приемником

И вот такого плана.

IR приемникомIR приемником

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

Подключаем IR к Arduino UNO вот по такой схеме

Подключаем к Arduino UNO вот по такой схеме. К другим Ардуинкам подключается аналогично.

Для работы нам понадобиться библиотека IRremote. Скачать ее можно тут.

С библиотекой устанавливается ряд примеров. Нам понадобиться IrrecvDemo.

IrrecvDemo

IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}
void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

После того как скетч загружен и IR приемник подключен можно проверить какой код соответствует той или иной кнопке пульта ДУ. Поднажимайте на кнопки и в мониторе последовательного порта (Ctrl+Shift+M) вы уведите следующее.

;FF18E7
FFFFFFFF
FFA857
FF02FD
FF18E7
FF38C7
FF4AB5
FF5AA5
FF10EF
FF5AA5
FFFFFFFF
FF10EF
FF5AA5

 в мониторе последовательного порта (Ctrl+Shift+M) вы уведите следующее

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

Само простое, чем можно управлять это включение и выключения встроенного светодиода на плату Arduino при помощи пульта дистанционного управления и инфракрасного приемника.

Схема подключения как и в примере выше. Коды кнопок моего пульта:

//FF10EF   — стрелочка вправо
//FF5AA5   — стрелочка влево

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

//FF10EF   — стрелочка вправо
//FF5AA5   — стрелочка влево
#include "IRremote.h"
IRrecv irrecv(11); // указываем вывод, к которому подключен приемник
decode_results results;
void setup() {
  irrecv.enableIRIn(); // запускаем прием
}
void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
    case 0xFF10EF:
        digitalWrite( 13, HIGH );
        break;
    case 0xFF5AA5:
        digitalWrite( 13, LOW );
        break;
    }    
    irrecv.resume(); // принимаем следующую команду
  }
  delay(100);
}

Вот так можно легко научить вашу Arduinо понимать команды с пульта.


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

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

]]>
Основы программирования Digispark в среде Arduino IDE. Модели A и B http://portal-pk.ru/news/146-osnovy-programmirovaniya-digispark-v-srede-arduino-ide.html Константин Portal-PK 2018-03-05T11:15:36+03:00 Сделал я пару проектов на Digispark :
1. Как сделать самодельный пистолет из Digispark и сломанной игрушки
2. Меняем Arduino на Digispark в светильнике на ws2812. digispark проекты.

И меня засыпали вопросами: Чем отличается от Arduino? Как написать скетч в среде Arduino IDE для Digispark? И пр.

И я решил сделать небольшую заметки для вас и если я что то забуду, можно будет подсмотреть.
Обратите внимание Digispark есть 2 модели А и В. Но нет ни одной статьи чтобы было описаны модели А, а это В.
Но я опытным путем выявил что, это: модель Digispark А

модель Digispark А


Digispark модель В

Digispark модель В



Если я ошибаюсь обязательно напишите в комментарии.


Характеристики Digispark:

  • Поддержка Arduino IDE 1.0 и более поздних (OS X, Windows и Linux)
  • Питание от USB или внешнего источника - 5 В или 7-35 V (автоматический выбор)
  • Регулятор на 5В 500мА
  • Встроенный USB
  • 6 портов ввода / вывода (2 используются для USB, только если ваша программа активно общается по USB, в противном случае вы можете использовать все 6, даже если вы программируете с помощью USB)
  • 8KB флэш-памяти (около 6КБ с загрузчиком)
  • I²C и SPI интерфейс
  • PWM на 3 вывода (больше ШИМ выходов можно обеспечить программным способом)
  • сделан на базе ATtiny85-20SU микроконтроллера

Характеристики Digispark


Все выводы могут быть использованы в качестве цифровых входов/выходов:
Pin 0 → I2C SDA, PWM (LED on Model B)
Pin 1 → PWM (LED on Model A)
Pin 2 → I2C SCK, Analog
Pin 3 → Аналоговый вход (Занят контактом USB+, в случае использования USD)
Pin 4 → PWM (Занят контактом USB-, в случае использования USD)
Pin 5 → Аналоговый вход

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

Но не смотря на все плюсы Digispark все же отличается от Arduino. Вот список некоторых различий, которые стоит учитывать при проектировании или устранении неполадок:
1. Digispark сделан базе Attiny85 у которго есть много отличий от ATmega328 Arduino, и некоторые библиотеки могут работать некорректно на нем.
2. У Digispark имеется только около 6 КБ флэш-памяти для хранения вашего кода.
3. Контакт 3 и контакт 4 (P3 и P4) используются для связи через USB и программирования. Поэтому использовать данные пины при программировании нельзя. Их можно пользовать, когда у вас отключен USB.
4. Контакт 3 (P3) к нему подключен нагрузочный резистор 1,5 кОм, который требуется, когда P3 и P4 используются для связи через USB. Вам возможно потребоваться учесть данный факт при работе с данным пином.
5. Digispark не имеет аппаратного последовательного порта или аппаратного последовательного интерфейса к USB-конвертеру.

Пример использования цифрового выхода.
Все контакты способны к цифровому выходу, хотя P5 составляет 3 В при HIGH вместо 5 В.
0 - P0, 1 - P1, 2 - P2 и т. д. - обозначение пинов в программе.

void setup() {
    //All pins are capable of Digital output, though P5 is 3 V at HIGH instead of 5 V
    pinMode(0, OUTPUT); //0 is P0, 1 is P1, 2 is P2, etc. - unlike the analog inputs, for digital outputs the pin number matches.
}
void loop() {
    digitalWrite(0,HIGH); //Turn the pin HIGH (5 V)
    delay(1000);
    digitalWrite(0,LOW); //Turn the pin LOW (GND)
    delay(1000);
}

Пример использования цифрового входа (чтение).
ПРИМЕЧАНИЕ. Внутренний нагрузочный резистор (включается при вызове digitalWrite (0) после установки вывода на вывод, где 0 - номер штыря) намного слабее (около 25 кОм) на ATtiny, чем на Arduino, поэтому бортовой светодиод может помешает. Если они вам нужен, вы можете использовать другой порт. Измените схему, чтобы не требовалось внутреннее подтягивание, или вырезать светодиодную дорожку. Для модели A это пин P1 для модели B, это ппин P0.

int sensorValue = 0;

void setup() {
    //All pins are capable of digital input.
    pinMode(0, INPUT); //0 is P0, 1 is P1, 2 is P2, etc. - unlike the analog inputs, for digital inputs the pin number matches.
}
void loop() {
    sensorValue = digitalRead(1); //Returns HIGH or LOW (true or false / 1 or 0).
}

Пример аналогового чтения
Буте внимательны при аналоговом чтении, номера пинов отличаются от нумерации на плате. Например: P2 - аналоговый вход 1. Остальные смотрите в коде ниже.

int sensorValue = 0;

void setup() {
    //You need not set pin mode for analogRead - though if you have set the pin to
    //output and later want to read from it then you need to set pinMode(0,INPUT);
    //where 0 is the physical pin number not the analog input number.
    //
    //See below for the proper pinMode statement to go with each analog read.
}
void loop() {
    // The analog pins are referenced by their analog port number, not their pin
    //number and are as follows:

    sensorValue = analogRead(1); //Read P2
    //To set to input: pinMode(2, INPUT);
    //THIS IS P2, P2 is analog input 1, so when you are using analog read, you refer to it as 1.

    //sensorValue = analogRead(2); //Read P4
    //To set to input: pinMode(4, INPUT);
    //THIS IS P4, P4 is analog input 2, so when you are using analog read, you refer to it as 2.

    //sensorValue = analogRead(3); //Read P3
    //To set to input: pinMode(3, INPUT);
    //THIS IS P3, P3 is analog input 3, so when you are using analog read, you refer to it as 3.

    //sensorValue = analogRead(0); //Read P5
    //To set to input: pinMode(5, INPUT);
    //THIS IS P5, P5 is analog input 0, so when you are using analog read, you refer to it as 0.
}

Аналоговый выход
Тут все проще 0 - P0, 1 - P1, 4 - P4 - в отличие от аналоговых входов, для аналоговых (PWM) выходов номер штыря соответствует номеру порта.

void setup() {
    //P0, P1, and P4 are capable of hardware PWM (analogWrite).
    pinMode(0, OUTPUT); //0 is P0, 1 is P1, 4 is P4 - unlike the analog inputs, 
                        //for analog (PWM) outputs the pin number matches the port number.
}
void loop() {
    analogWrite(0,255); //Turn the pin on full (100%)
    delay(1000);
    analogWrite(0,128); //Turn the pin on half (50%)
    delay(1000);
    analogWrite(0,0);   //Turn the pin off (0%)
    delay(1000);
}

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

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

]]>
Меняем Arduino на Digispark в светильнике на ws2812. digispark проекты. http://portal-pk.ru/news/145-menyaem-arduino-na-digispark-v-svetilnike-na-ws2812.html Константин Portal-PK 2018-02-15T13:45:25+03:00 В интернете много проектов на Digispark, но светильника на адресных светодиодах с переключением режимов и регулированием яркости, на подобии моего светильника который я делал на Arduino, нет. Поэтому я решил переделать свой ночник на светодиодах ws2812 под управлением Arduino NANO.

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

#include <Adafruit_NeoPixel.h>
#define BUTTON_PIN   2    // Digital IO pin connected to the button.  This will be
                          // driven with a pull-up resistor so the switch should
                          // pull the pin to ground momentarily.  On a high -> low
                          // transition the button press logic will execute.
#define PIXEL_PIN    6    // Digital IO pin connected to the NeoPixels.
#define PIXEL_COUNT 16
// Parameter 1 = number of pixels in strip,  neopixel stick has 8
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_RGB     Pixels are wired for RGB bitstream
//   NEO_GRB     Pixels are wired for GRB bitstream, correct for neopixel stick
//   NEO_KHZ400  400 KHz bitstream (e.g. FLORA pixels)
//   NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip), correct for neopixel stick
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
bool oldState = HIGH;
int showType = 0;
void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}
void loop() {
  // Get current button state.
  bool newState = digitalRead(BUTTON_PIN);
  // Check if state changed from high to low (button press).
  if (newState == LOW && oldState == HIGH) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if (newState == LOW) {
      showType++;
      if (showType > 9)
        showType=0;
      startShow(showType);
    }
  }
  // Set the last button state to the old state.
  oldState = newState;
}
void startShow(int i) {
  switch(i){
    case 0: colorWipe(strip.Color(0, 0, 0), 50);    // Black/off
            break;
    case 1: colorWipe(strip.Color(255, 0, 0), 50);  // Red
            break;
    case 2: colorWipe(strip.Color(0, 255, 0), 50);  // Green
            break;
    case 3: colorWipe(strip.Color(0, 0, 255), 50);  // Blue
            break;
    case 4: theaterChase(strip.Color(127, 127, 127), 50); // White
            break;
    case 5: theaterChase(strip.Color(127,   0,   0), 50); // Red
            break;
    case 6: theaterChase(strip.Color(  0,   0, 127), 50); // Blue
            break;
    case 7: rainbow(20);
            break;
    case 8: rainbowCycle(20);
            break;
    case 9: theaterChaseRainbow(50);
            break;
  }
}
// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}
void rainbow(uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}
// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;
  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}
//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();
      delay(wait);
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}
//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
        }
        strip.show();
        delay(wait);
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, 0);        //turn every third pixel off
        }
    }
  }
}
// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else if(WheelPos < 170) {
    WheelPos -= 85;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  }
}

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

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

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

Схема подключения светодиодов ws2812 к Digispark

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

Фото моего светильника на Digispark и светодиодах ws2812 .

светильника на Digispark и светодиодах ws281

светильника на Digispark

Digispark и светодиодах ws2812

Есть идеи сделать Wi-fi светильник, но посмотрим как будет время и желание. Ваша активность на прямую влияет на мое желание. Не забывайте про это!

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

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

]]>
Манипулятор своими руками из фанеры http://portal-pk.ru/news/144-manipulyator-svoimi-rukami-iz-fanery.html Константин Portal-PK 2018-02-13T13:13:34+03:00 Как вы знаете сделал я самодельный ЧПУ фрезерный станок. Входе обучения работы на нем я делаю различные поделки и механизмы. Нашел в интернете исходные файлы (MeArmV03.svg) для манипулятора и решил вырезать его на ЧПУ станке.

 исходные файлы для манипулятора и решил вырезать его на ЧПУ станке

Я думал что с первого раза у меня ни чего не получиться. Так как это достаточно сложная работа для ЧПУ и очень много мелких деталей.

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

И Вот что у меня получилось. Достаточно не плохо на мой взгляд.

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

монипулятор на NodeMCU

Код получился не очень красивый но для проверки достаточно.

// определение режима соединения и подключение библиотеки RemoteXY  
#define REMOTEXY_MODE__ESP8266WIFI_LIB_POINT
#include <ESP8266WiFi.h> 

#include <RemoteXY.h> 

// настройки соединения  
#define REMOTEXY_WIFI_SSID "portalpk" 
#define REMOTEXY_WIFI_PASSWORD "" 
#define REMOTEXY_SERVER_PORT 6377 


// конфигурация интерфейса   
#pragma pack(push, 1) 
uint8_t RemoteXY_CONF[] = 
  { 255,4,0,0,0,31,0,6,5,0,
  4,128,48,50,42,9,4,4,0,6,
  12,9,36,2,4,0,85,11,9,37,
  2,4,128,8,4,42,9,4 }; 
   
// структура определяет все переменные вашего интерфейса управления  
struct { 

    // input variable
  int8_t slider_1; // =0..100 положение слайдера 
  int8_t slider_2; // =0..100 положение слайдера 
  int8_t slider_3; // =0..100 положение слайдера 
  int8_t slider_4; // =0..100 положение слайдера 

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY; 
#pragma pack(pop) 


///////////////////////////////////////////// 
//           END RemoteXY include          // 
///////////////////////////////////////////// 
#include <Servo.h> 
#define PIN_SERVO1 D1
#define PIN_SERVO2 D2
#define PIN_SERVO3 D3
#define PIN_SERVO4 D4
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;



void setup()  
{ 
  RemoteXY_Init ();  
   
  // TODO you setup code  
  RemoteXY.slider_1 = 50;  
  RemoteXY.slider_2 = 50; 
  RemoteXY.slider_3 = 50; 
  RemoteXY.slider_4 = 50; 
  servo1.attach(PIN_SERVO1);
  servo2.attach(PIN_SERVO2);
  servo3.attach(PIN_SERVO3);
  servo4.attach(PIN_SERVO4);

   
} 

void loop()  
{  
  RemoteXY_Handler (); 
   
   
  // TODO you loop code 
  // используйте структуру RemoteXY для передачи данных 
  int ms = RemoteXY.slider_1*20+500;  
  servo1.writeMicroseconds(ms);  

    int ms2 = RemoteXY.slider_2*10+500;  
  servo2.writeMicroseconds(ms2);  

    int ms3 = RemoteXY.slider_3*10+500;  
  servo3.writeMicroseconds(ms3);  

    int ms4 = RemoteXY.slider_4*10+500;  
  servo4.writeMicroseconds(ms4);  

}

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

Тестирования самодельного манипулятора показал

NodeMCU

руки-манипулятора

Тестирования самодельного манипулятора показал , что все работает но скорее всего не достаточно питания от одного аккумулятора 18650. И происходить перезагрузка NodeMCU.


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

]]>
Inkscape где скачать русскую версию. Настройка Inkscape http://portal-pk.ru/news/143-inkscape-gde-skachat-russkuyu-versiyu-nastroika-inkscape.html Константин Portal-PK 2018-02-08T18:21:04+03:00 Мне часто задают вопрос с помощью какой программы я создаю G-Code для своего самодельного ЧПУ станка. Поэтому я решил снять небольшой курс по созданию G-Code для ЧПУ станков. В данном курсе расскажу какими программами пользуюсь я и какие сервисы мне помогают в этом деле.

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

Я скачиваю данную программу с официального сайта: inkscape.org.

с официального сайта: inkscape.org.

В разделе Download.

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

В видео рассказываю подробно как настроить Inkscape для начала работы

В Inkscape есть вспомогательные линии как в Компас 3D. Данный инструмент помогает упростить работу при создании чертежей. Хотя данная программа не предназначена для черчения чертежей.

В следующем видео расскажу как нарисовать простые детали и сделать G-Code.

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

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

]]>
Как сделать самодельный пистолет из Digispark и сломанной игрушки http://portal-pk.ru/news/142-kak-sdelat-samodelnyi-pistolet-iz-digispark-i-slomochnoi.html Константин Portal-PK 2018-01-31T14:21:08+03:00 При большом изобилии пластиковых игрушек, современные дети не ценят их. В следствии чего игрушки очень быстро надоедают или их просто ломают. У моего ребенка есть с пяток пистолетов из которых он играет одним.
Взял я один из таких пистолетов и решил его переделать. Для переделки мне понадобились:


1. Digispark
2. Светодиоды
3. резисторы 220 Ом
4. бокс под батарейки
5. Выключатель
6. конечный выключатель от старого принтера можно использовать и такой
7. компьютерный спикер
8. батарейки
9. провода


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

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

Все собрал по схеме:

Схема подключения пистолета на DS



Скетч для пистолета на Digispark

int led_0 = 0; // пин подключения Led1
int led_1 = 1; // пин подключения Led2
int led_2 = 2; // пин подключения Led3
const int buttonPin = 3;      // номер входа, подключенный к кнопке
int soundPin = 4; // объявляем переменную с номером пина спикера 
// переменные 
int flag = 0; // флаг Led
boolean open = true; // флаг, включения
int interval[6]={50, 120, 90, 240, 150, 50};    // интервал включения/выключения LED
void setup()  { 
  //выводs на выход
  pinMode(led_0, OUTPUT);
  pinMode(led_1, OUTPUT);
  pinMode(led_2, OUTPUT);
    // инициализируем пин, подключенный к кнопке, как вход
  pinMode(buttonPin, INPUT_PULLUP); 
  pinMode(soundPin, OUTPUT); //объявляем пин как выход.  
} 
void loop()  { 
 boolean current = digitalRead (buttonPin); // считываем данные с кнопки
 if(current)
 {
   for (int x=0; x<6; x++) { // цикл 6 проходов
    if(flag > 3)
      flag = 0;
    if (open) // если true
        digitalWrite(flag, HIGH); 
    else // иначе
      digitalWrite(flag, LOW); 
    delay(interval[x]); // Ждем 
     if (x == 5) // если последний проход по циклу
        flag++; // передаем слово (меняем текущий пин) 
    open = !open; //меняем false на true и наоборот;
   if(open)
    tone(soundPin, 500); // включаем звук частотой 500 Гц 
    else
    tone(soundPin, 100); // включаем звук частотой 100 Гц  
   }  
 }
 else
 noTone(soundPin); // выключаем звук                    
}

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

И тут он решил взять его в детский садик. И всего один день в садике превратил его вот в это

Что в садике с ним сделали? Как там играют?


Что в садике с ним сделали? Как там играют? Вроде бы в садике игрушки тоже пластиковые и при этом целые.
По просьбе ребенка пистолет я восстановил. И он продолжает радовать ребенка.


Минутка программирования в Arduino IDE

А вы используете конструкцию:

if (условие 1)
{
  // выполнять действие A
}
else if (условие 2)
{
  // выполнять действие B
}
else
{
  // выполнять действие  C
}

Минутка программирования в Arduino IDE

Пишите ваши примеры.
Мой ответ будет в следующей статье.

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

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

]]>
Самодельный станок с ЧПУ цена. Калькуляция стоимости фрезерного станка http://portal-pk.ru/news/141-samodelnyi-stanok-s-chpu-cena-kalkulyaciya-stoimosti.html Константин Portal-PK 2018-01-23T13:06:29+03:00 Если вы не увлекаетесь изготовлением изделий из дерева, пластика и пр. Но вас наверняка не раз посещают мысль. А какая цена фрезерного ЧПУ станка ? И дешевле сделать самодельный станок с ЧПУ или купить?

Я собрал самодельный фрезерный станок с ЧПУ. Вот все этапы сборки и настройки:

1. Какподобрать шаговый двигатель для станкаЧПУ. ШД из принтера.

2. Платарасширения для Arduino UNO, CNC shield v3 и драйверовA4988

3. Настройкадрайвера A4988. Первый запуск шаговыхдвигателей

4. Самодельныйфрезерный ЧПУ станок из мебельныхнаправляющих. Механика

5. СамодельныйЧПУ CNC фрезерный станок. Часть 2. Электроника

6. Настройка прошивки Grbl ЧПУ станка. Калибровка ЧПУ

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

На сайте есть раздел, где я делаю закладки на материалы которые я покупал для ЧПУ.

Цена ЧПУ станка получилась следующая:

Цена ЧПУ станка

Комплектующие для ЧПУ покупал тут:

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

Но я не посчитал стоимость шпинделя. В качестве шпинделя я использую гравер. Также я прикупил Бок питания на 7 А. Так как блок питания от компьютера не очень удобный и я решил его заменить на более компактный.

На дополнительные материалы я потратил:

дополнительные материалы

Расходные материалы для ЧПУ станка лучше не учитывать в общую стоимость станка. Но я решил посчитать сколько всего потратил средств до полного запуска станка и небольшую модернизацию.

В итоге я потратил около 9 тыс руб.

Расходные материалы для ЧПУ станка лучше не учитывать

Вы скажете, что за данную сумму можно купить в Китае станок. И не нужно заморачиваться по разработке и сборке!

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

Во-вторых рабочая область такого станка будет максимуму 200 на 300 мм.

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

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

Это мое мнение. Возможно у вас другое мнение и опыт поэтому жду ваши комментарии.


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

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

]]>
Что такое NodeMCU? Программируем в среде Arduino IDE http://portal-pk.ru/news/140-chto-takoe-nodemcu-programmiruem-v-srede-arduino-ide.html Константин Portal-PK 2018-01-19T19:36:45+03:00 NodeMCU это отладочная плат на базе микроконтроллера ESP8266. Основная особенность данных микроконтроллеров наличие Wi-fi на борту. Вы сможете управлять своим проектом через Wi-fi соединения, это упрощает создания радио управляемых моделей. Разработку систем умного дома и пр.

NodeMCU имеет 11 пинов ввода-выводов

Как показано на картинке выше NodeMCU имеет 11 пинов ввода-выводов.

Доп. Назначение пинов:

  • D1–D10 — выходы с ШИМ (PWM)
  • A0 — аналоговый вход с АЦП
  • D9, D10 — UART
  • D1, D2 — I²C/TWI
  • D5–D8 — SPI

Это не очень много по сравнению с той же Arduino NANO у которой 22.

Запитать NodeMCU можно :

  • 5-18 вольт через вывод Vin (согласно параметрам стабилизатора AMS1117-3.3)
  • 5 вольт через вывод VUSB или USB-гнездо
  • 3.3 вольта непосредственно через выводы 3V

Однако мой опыт показывает что при подключении по Vin больше 9 В . Стабилизатор начинает очень сильно греться и через некоторое время начинаются сбои в работе Wi-fi.

На плате установлен ESP-12E, параметры взяты из даташита на ESP-12E:

  • протокол Wi-Fi 802.11 b/n/g
  • частота 2.4 - 2.5 GHz (2400-2483.5 MHz)
  • режим Wi-Fi: точка доступа, клиент
  • защита Wi-Fi: WPA, WPA2
  • шифрование Wi-Fi: WEP, TKIP, AES
  • сетевые протоколы: IPv4, TCP, UDP, HTTP, FTP
  • 80 MHz 32-bit процессор
  • 11 доступных портов ввода/вывода UART, HSPI, I2C, I2S, GPIO, PWM
  • рабочее напряжение 3.0 ... 3.6 вольт
  • максимальная нагрузка на вывод не более 12 mA
  • максимальное потребление модуля 200 mA, среднее 80 mA (подробнее в 11 таблице даташита ESP-12E)
  • рабочая температура -40 ... 125 С

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

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

В пункте меню Фаил → Настройки

программировать NodeMCU в среде Arduino IDE

В поле Дополнительные ссылки для Менеджера плат пишем такую ссылку:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Жмем ОК и переходим в окно менеджера плат:

 менеджер плат Arduino IDE

В самом низу будет нужный нам пакет « esp8266 by ESP8266 Community». Выбираем его и жмем кнопку «Установка».

«esp8266 by ESP8266 Community

Спустя некоторое время пакет скопирует необходимые файлы и в Arduino IDE.

пакет скопирует необходимые файлы и в Arduino IDE

После чего можно будет выбрать нужную нам плату.

Arduino IDE NodeMCU

После чего выбираем порт. В Ubuntu это выгладит так.

После чего выбираем порт. В Ubuntu это выгладит так.

В Windows это com-порт.

Все Сейчас можно загрузить первый скетч. Для примера возьмем ESP8266 Blink из примеров которые устанавливаются при установки платы ESP8266.

/*
 ESP8266 Blink by Simon Peter
 Blink the blue LED on the ESP-01 module
 This example code is in the public domain
 
 The blue LED on the ESP-01 module is connected to GPIO1 
 (which is also the TXD pin; so we cannot use Serial.print() at the same time)
 
 Note that this sketch uses LED_BUILTIN to find the pin with the internal LED
*/

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
                                    // but actually the LED is on; this is because 
                                    // it is active low on the ESP-01)
  delay(1000);                      // Wait for a second
  digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
  delay(2000);                      // Wait for two seconds (to demonstrate the active low LED)
}

После загрузки вы увидите мигание синего светодиода на плате NodeMCU

После загрузки вы увидите мигание синего светодиода на плате NodeMCU. Мы научились прошивать данную отладочную плату. Сейчас можно создавать различные проекты на ESP8266.

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

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

]]>
Модернизация самодельного станка с ЧПУ: выравниваю столешницу и пр. http://portal-pk.ru/news/139-modernizaciya-samodelnogo-stanka-s-chpu-vyravnivayu.html Константин Portal-PK 2018-01-16T12:16:06+03:00 Любая самоделка имеет ряд недочетов и изъянов. Не исключение и мой самодельный фрезерный станок с ЧПУ .

Как я собирал ЧПУ можно посмотреть тут:

1. Какподобрать шаговый двигатель для станкаЧПУ. ШД из принтера.

2. Платарасширения для Arduino UNO, CNC shield v3 и драйверовA4988

3. Настройкадрайвера A4988. Первый запуск шаговыхдвигателей

4. Самодельныйфрезерный ЧПУ станок из мебельныхнаправляющих. Механика

5. СамодельныйЧПУ CNC фрезерный станок. Часть 2. Электроника

6. Настройка прошивки Grbl ЧПУ станка. Калибровка ЧПУ

Модернизацию своего самодельного ЧПУ станка я начал с поднятии столешницы и выравнивании поверхности. Вы скажете: «А зачем понимать столешницу? Чем больше высота тем лучше.» Я также думал пока не поработал на станке с ЧПУ . И потом понял что это дополнительные перемещения и люфты. Поэтому я поднял столешницу станка на 50 мм. Сейчас рабочая высота 70 мм. Немного, но это оптимальная высота для фрезерного станка с ЧПУ данного размера.

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

ыравнивал столешницу в 2 этапа. Так как фрезеровал фрезой всего 3 мм

Выравнивание прошло успешно. Но вот соседям шум не очень понравился. Нет они не жаловались! Просто я выключил станок и было слышно что за передачу они смотрят по телевизору. И тут я понял что нужно уменьшать шум.

роклеил мягким линолеумово все близ лежащие поверхности у гравера

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

Шуметь стало немного тише и при этом звук стал менее звонкий. Буду дальше смотреть за реакцией соседей. Надеются, что сейчас не буду им мешать!

Следующее что я сделал, это установил импульсный блок питания о котором рассказываю тут: Дешевыйблок питания на 12 В для ЧПУ из Китая.Делаем корпус

установил импульсный блок питания

Перед заменой блока питания замерил рабочий ток, но он оказался очень маленький. Я думаю что это у меня проблемы с мультиметром. Поставил импульсный блок питания на ЧПУ станок и сделал пробное фрезерования. Вырезал заготовки для спинера.

Вырезал заготовки для спинера

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

Это не все что я хотел изменить в своем самодельном станке с ЧПУ. Буду еще переделывать и исправлять недочеты. Поэтому читайте на сайте Портал-ПК или смотрите на канале на ютюб.

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

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


]]>
Умный ночник на Arduino и адресных светодиодах WS2811 http://portal-pk.ru/news/138-umnyi-nochnik-na-arduino-i-adresnyh-svetodiodah-ws2811.html Константин Portal-PK 2018-01-15T07:47:12+03:00 В интернете большое количество проектов на Arduino с использованием адресных светодиодов и лент WS2812. Я тоже решил сделать пару проектов на данных замечательных светодиодах WS2811.

При создании проекта были использованный следующие материалы:

1. Адресные светодиоды

2. Arduino Nano

3. Тактовые кнопки

Сделал я вот такой ночник с двумя режимами и регулированием яркости.

Сделал я вот такой ночник на Arduino и ленте  WS2812

Первый режим плавно изменяет цвет светодиодов со сдвигом на один. Второй режим светит обычным белым цветом.

Регулирование яркости изменяет яркость на 20%.

Программа сделана практически на стандартных примерах которые устанавливаются с библиотекой FastLED.

Установить библиотеку FastLED можно из менеджера библиотек.

Установить библиотеку FastLED

Или скачать архив отсюда и установить библиотеку FastLED

Скетч небольшой и прокомментирован.

#include <FastLED.h>

#define LED_PIN     6
byte button_rejim = 2;  // кнопка режим
byte button_yarkast = 3;  // кнопка яркасть
int rejim = 0;       // текущий режим
int yarkast = 100;       // текущая яркасть 
boolean lastButten = LOW;     // предыдущее состояние кнопки
boolean currentButten = LOW;  // текущее состояние кнопки

boolean lastButten2 = LOW;     // предыдущее состояние кнопки 2
boolean currentButten2 = LOW;  // текущее состояние кнопки 2

// Information about the LED strip itself
#define NUM_LEDS    15
#define CHIPSET     WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

// How many seconds to show each temperature before switching
#define DISPLAYTIME 20
// How many seconds to show black between switches
#define BLACKTIME   3

void setup() {
  pinMode(button_rejim, INPUT_PULLUP); // настроить пин кнопки
  pinMode(button_yarkast, INPUT_PULLUP); // настроить пин кнопки
  //delay( 3000 );
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalSMD5050 );
  
}

boolean debvance (boolean last) //убираем дребизг 1
{
  boolean current = digitalRead (button_yarkast); // считываем данные с кнопки
  if (last != current) // Если текущее состояни еотличететься от предыдущего 
  {
   delay (5);   // Ждем 5 милисек.
   current = digitalRead (button_yarkast); // Присваеваем текущее состояние кнопки
    return current; 
  }
}

boolean debvance2 (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) // Проверяем отпускали мы кнопку или нет
  {
    yarkast  = yarkast+50; // увеличиваем яркость 
  }
 lastButten =  currentButten;  // Переприсваеваем прошлое состояние кнопки
  if (yarkast > 250)
    yarkast = 0;

  currentButten2 = debvance2 (lastButten2); // Передаем функции дребезга значение по умолчанию LOW 
  if (lastButten2 == LOW && currentButten2 == HIGH) // Проверяем отпускали мы кнопку или нет
  {
    rejim  = !rejim; // изменяем режим
  }
 lastButten2 =  currentButten2;  // Переприсваеваем прошлое состояние кнопки   

if (rejim)
{
  FastLED.setBrightness( yarkast );
  static uint8_t starthue = 0;
  fill_rainbow( leds, NUM_LEDS, ++starthue, 40);

}
else
{

  static uint8_t hue;
     for(int i = 0; i < NUM_LEDS; i++) {   
      leds[i] = CHSV(0,0,yarkast); 
     }
} 
   FastLED.show();
   FastLED.delay(10);
}

Я думаю вопросов не должно быть. Но если что то не работает пишите будем разбираться.


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

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

]]>
ESP8266 ESP-01 светодиодная матрица. Выводим текст через web-интерфейс http://portal-pk.ru/news/137-esp8266-esp-01-delaem-svetodiodnuyu-matricu-vyvodim-tekst.html Константин Portal-PK 2018-01-10T09:51:30+03:00 Нашел пример светодиодной матрицы. Управление которой происходит через web-интерфейс. Достаточно интересная тема. Поэтому решил сделать заметку чтобы не потерять.

Сам не проверял. Да и пока нет возможности проверить. Но мне пригодятся некоторые библиотеки из данного проекта. Ссылка на проект вот тут: ESP8266 ESP-01 - NeoPixel NeoMatrix - Text Scroller.

Необходимые библиотеки можно скачать тут:

Скетч ESP8266 ESP-01 - NeoPixel NeoMatrix - Text Scroller

// Include NeoPixel Specific Libraries
#include <Adafruit_GFX.h>
#include <Adafruit_NeoPixel.h>
#include <Adafruit_NeoMatrix.h>
// Include ESP Specific Libraries
#include <ESP8266httpUpdate.h>
#include "espneotext.h"
// Define ESP-01 PIN
#define PIN 2
// MATRIX DECLARATION:
// Parameter 1 = width of EACH NEOPIXEL MATRIX (not total display)
// Parameter 2 = height of each matrix
  // 8x8 (8, 8)
// Parameter 3 = pin number (most are valid)
  // PIN 2
// Parameter 4 = matrix layout flags, add together as needed
// Parameter 5 = pixel type flags, add together as needed:
  // NEO_GRB     Pixels are wired for GRB bitstream (v2 pixels)
  // NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip)
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, PIN,
  NEO_MATRIX_TOP     + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE,
  NEO_GRB            + NEO_KHZ800
);
// Define Your WiFi Connection Information
const char* WiFi_SSID = "<SSID-HERE>";
const char* WiFi_PASS = "<PASSWORD-HERE>";
// Set Defaults
String dispText;
String dispColor;
int disp = 0;
int pixelsInText;
int x = matrix.width();
const uint16_t colors[] = {
  matrix.Color(255, 0, 0),
  matrix.Color(0, 255, 0),
  matrix.Color(0, 0, 255)
};
// Create an instance of the server and specify the port to listen on as an argument.
WiFiServer server(80);
void setup(){
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(40);
  matrix.setTextColor(matrix.Color(80,255,0));
  //matrix.setTextColor(colors[0]);
  //Serial.begin(115200); // DEBUG
  delay(10);
  // Connect to WiFi network
  //Serial.println(); // DEBUG
  //Serial.print("Connecting to "); // DEBUG
  //Serial.println(WiFi_SSID); // DEBUG
  WiFi.begin(WiFi_SSID,WiFi_PASS);
  while(WiFi.status() != WL_CONNECTED){
    delay(1000);
    //Serial.print("."); // DEBUG
  }
  //Serial.println(""); // DEBUG
  //Serial.println("WiFi Connected"); // DEBUG
  // Start the server
  server.begin();
  //Serial.println("Server Started"); // DEBUG
  // Print the IP address
  //Serial.println(WiFi.localIP()); // DEBUG
}
void loop(){
  // Check if a client has connected
  WiFiClient client = server.available();
  // Wait until the client sends some data
  if(!client){ return; }
    //Serial.println("Client Connected"); // DEBUG
  // Color Options
  // http://www.javascripter.net/faq/hextorgb.htm
  // Process the Request/GET - Strips out everything in order.
  String command0 = client.readStringUntil('?');
    //Serial.print("Command0: "); // DEBUG
    //Serial.println(command0); // DEBUG
  String allParams = client.readStringUntil(' ');
    //Serial.print("Query Parameter: "); // DEBUG
    //Serial.println(allParams); // DEBUG
  if(allParams.indexOf("line=") >= 0){
    disp = 1; // true
    dispText = allParams.substring(allParams.indexOf("=")+1,allParams.indexOf("&rgb="));
    dispText.replace("+"," ");
    dispText.replace("%20"," ");
    dispText.replace("%21","!");
    dispText.replace("%27","'");
    pixelsInText = (dispText.length() * 7)+8;
      //Serial.print("Scroll Text: ");       // DEBUG
      //Serial.println(dispText);            // DEBUG
    // Set user prefered color
    dispColor = allParams.substring(allParams.indexOf("&rgb=")+5,allParams.length());
      //Serial.print("Scroll Text Color: "); // DEBUG
      //Serial.println(dispColor);           // DEBUG
    // Lame check for any other parameters. Need a better way to do this!
    if(dispColor.indexOf("&") == -1){
      int r = dispColor.substring(0,dispColor.indexOf(",")).toInt();
        //Serial.println(r_val); // DEBUG
      int g = dispColor.substring(int(dispColor.indexOf(","))+1,(dispColor.lastIndexOf(","))).toInt();
        //Serial.println(g_val); // DEBUG
      int b = dispColor.substring(int(dispColor.lastIndexOf(","))+1).toInt();
        //Serial.println(b_val); // DEBUG
      matrix.setTextColor(matrix.Color(r,g,b));
    }
    if(disp){
      while(x + 17 > (matrix.width() - pixelsInText)){
        matrix.fillScreen(0);
        matrix.setCursor(--x, 0);
        matrix.print(dispText);
        matrix.show();
        delay(100);
      }
      x = matrix.width();
    }
    // Display form page again so it's not blank! ------------------
    // Prepare the response
    String resp = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
    resp += displayPage;
    // Send the response to the client
    while(resp.length()>2000){
      String dummy = resp.substring(0,2000);
      client.print(dummy);
      resp.replace(dummy," ");
    }
    client.flush();
    client.print(resp);
    delay(10);
    // The client will actually be disconnected, when the function returns and 'client' object is destroyed!
    //Serial.println("Client Disconnected!"); // DEBUG
  }else{
    // Display requested form page -----------------------------------
    // Prepare the response
    String resp = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n";
    resp += displayPage;
    // Send the response to the client
    while(resp.length()>2000){
      String dummy = resp.substring(0,2000);
      client.print(dummy);
      resp.replace(dummy," ");
    }
    client.flush();
    client.print(resp);
    delay(10);
    // The client will actually be disconnected, when the function returns and 'client' object is destroyed!
    //Serial.println("Client Disconnected!"); // DEBUG
  }
}

Настройка подключения к сети Wi-fi

// Define Your WiFi Connection Information
const char* WiFi_SSID = "<SSID-HERE>";
const char* WiFi_PASS = "<PASSWORD-HERE>";

Пин подключения светодиодов

// Define ESP-01 PIN
#define PIN 2

Настройка светодиодной матрица

// MATRIX DECLARATION:
// Parameter 1 = width of EACH NEOPIXEL MATRIX (not total display)
// Parameter 2 = height of each matrix
  // 8x8 (8, 8)
// Parameter 3 = pin number (most are valid)
  // PIN 2
// Parameter 4 = matrix layout flags, add together as needed
// Parameter 5 = pixel type flags, add together as needed:
  // NEO_GRB     Pixels are wired for GRB bitstream (v2 pixels)
  // NEO_KHZ800  800 KHz bitstream (e.g. High Density LED strip)
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, PIN,
  NEO_MATRIX_TOP     + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_PROGRESSIVE,
  NEO_GRB            + NEO_KHZ800
);

Подключаем веб интерфейс приложения который находиться в файле #include "espneotext.h"

#ifndef header_h
#define header_h
String displayPage =
"<!DOCTYPE HTML>\r\n"
"<html lang=\"en\">\r\n"
"<head>\r\n"
"  <meta charset=\"utf-8\">\r\n"
"  <meta name='viewport' content='width=device-width'>\r\n"
"  <title>Send Text to ESP-01 / NeoMatrix / v2</title>\r\n"
"  <link href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css' rel='stylesheet' integrity='sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7' crossorigin='anonymous'>\r\n"
"  <link rel=\"stylesheet\" href=\"https://raw.githubusercontent.com/bgrins/spectrum/master/spectrum.css\">\r\n"
"  <style>#sentMsgs{display:inline-block;margin:0 15px 20px;padding:10px 20px;min-height:60px;background-color:#777;color:lime;border:1px solid gray;clear:both;}.adjust-text{margin:20px 0 0;padding:0 20px;}.clearfix{clear:both;}</style>\r\n"
"</head>\r\n\r\n"
"<body style='background:#EFEFEF;'>\r\n"
"\r\n"
"   <form>\r\n"
"     <div class='col-md-4'>\r\n"
"       <h3>Enter Text to Send on the NeoPixel Matrix: <input type=\"text\" id=\"color-picker\"></h3>\r\n"
"       <div class='input-group'>\r\n"
"         <input type='text' name='line' id='line' class='form-control' maxlength='60'>\r\n"
"         <div class='input-group-btn'>\r\n"
"           <button class='btn btn-default' id='send-text'>Send Text</button>\r\n"
"         </div>\r\n"
"       </div>\r\n"
"     </div>\r\n"
"   </form><br>\r\n\r\n"
"   <div class='col-md-4 adjust-text clearfix'><h4>Messages Sent</h4></div>\r\n"
"   <div id='sentMsgs' class='col-md-4' contentEditable='true'></div>\r\n"
"\r\n"
" <script src=\"https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.min.js\"></script>\r\n"
" <script src=\"https://raw.githubusercontent.com/bgrins/spectrum/master/spectrum.js\"></script>\r\n"
" <script>\r\n"
"   // This will build up a queue and send or just timeout if the messages are too many or the message is too long\r\n"
"   function sendMsg(){\r\n"
"     var line = $('#line');\r\n"
"     var color = '';\r\n"
"     var colorPicker = $('#color-picker');\r\n"
"     var msg = line.val().replace(';','');\r\n"
"     if(colorPicker.val() == ''){ color = '&rgb=80,255,0'; }\r\n"
"     else{ color = '&'+colorPicker.val().replace('(','=').replace(/\\)| /g,''); }\r\n"
"\r\n"
"     var url2Send = '/?line='+msg+color;\r\n"
"     line.val('');\r\n"
"     if(typeof msg !== 'undefined' && msg.trim() !== ''){\r\n"
"       $.ajax({ url: url2Send }).done(function(){ $('#sentMsgs').prepend('Message Sent: '+msg+'<br>\\n\'); console.log('Message Sent: '+msg+' ['+color+']'); });\r\n"
"     }\r\n"
"   }\r\n"
"   $(document).keypress(function(e){ if(e.which === 13){ sendMsg(); e.preventDefault(); } });\r\n"
"   $('#send-text').click(function(e){ sendMsg(); e.preventDefault(); });\r\n"
"   $('#color-picker').spectrum({preferredFormat:'rgb',clickoutFiresChange:true,color:'#50FF00'});\r\n"
" </script>\r\n"
"\r\n"
"</body>\r\n"
"</html>\r\n";
#endif

Если вы все правильно сделали у вас должно получиться вот такой интерфейс

ESP8266 ESP-01 - NeoPixel NeoMatrix

Можно изменить цвет текста

NeoPixel NeoMatrix - Text Scroller

Если у вас выводит на экран только текст проверти, что у вас есть подключения к интернету так как стили https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/cs... https://raw.githubusercontent.com/bgrins/spectrum/... и скрипты https://ajax.googleapis.com/ajax/libs/jquery/2.2.2... https://raw.githubusercontent.com/bgrins/spectrum/... грузятся из интернета. Или скачайте их и загрузите в микроконтроллер. Конечно я не могу гарантировать что для них хватит места в ESP-01.


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

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

]]>
Digispark подключаем светодиоды ws2812. Программируем в Arduino IDE http://portal-pk.ru/news/136-digispark--na-attiny85-podklyuchaem-adresnye-svetodiody-ws2812.html Константин Portal-PK 2018-01-10T08:20:22+03:00 Купил Digispark на ATtiny85. Установил поддержку платы в Arduino IDE. Так как по умолчанию Digispark не поддерживает. Подключил к компьютеру и залил пробный скетч. Все работает. С установочным пакетом установилось много примеров в том числе и работа с адресными светодиодами.

Подключил светодиоды ws2812 по схеме:

Digispark на ATtiny85 подключаем адресные светодиоды ws2812

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

// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library
#include <Adafruit_NeoPixel.h>
// Which pin on the Arduino is connected to the NeoPixels?
#define PIN            0
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      1
// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_RGB + NEO_KHZ800);
int delayval = 500; // delay for half a second
void setup() {
  pixels.begin(); // This initializes the NeoPixel library.
}
void loop() {
  // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.
  for(int i=0;i<NUMPIXELS;i++){
    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    pixels.setPixelColor(i, pixels.Color(0,150,0)); // Moderately bright green color.
    pixels.show(); // This sends the updated pixel color to the hardware.
    delay(delayval); // Delay for a period of time (in milliseconds).
  }
}

Библиотеку NeoPixel устанавливать не нужно. Она устанавливается с примерами для Digispark.

Поискал в интернете и нашел неплохой пример мигания светодиодами как на дискотеке

#include <Adafruit_NeoPixel.h>
// set to pin connected to data input of WS8212 (NeoPixel) strip
#define PIN         0
// any pin with analog input (used to initialize random number generator)
#define RNDPIN      2
// number of LEDs (NeoPixels) in your strip
// (please note that you need 3 bytes of RAM available for each pixel)
#define NUMPIXELS   60
// max LED brightness (1 to 255) – start with low values!
// (please note that high brightness requires a LOT of power)
#define BRIGHTNESS  50
// increase to get narrow spots, decrease to get wider spots
#define FOCUS       65
// decrease to speed up, increase to slow down (it's not a delay actually)
#define DELAY       5000
// set to 1 to display FPS rate
#define DEBUG       0
// if true, wrap color wave over the edge (used for circular stripes)
#define WRAP        1
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
// we have 3 color spots (reg, green, blue) oscillating along the strip with different speeds
float spdr, spdg, spdb;
float offset;
#if DEBUG
// track fps rate
long nextms = 0;
int pfps = 0, fps = 0;
#endif
// the real exponent function is too slow, so I created an approximation (only for x < 0)
float myexp(float x) {
  return (1.0/(1.0-(0.634-1.344*x)*x));
}
void setup() {
  // initialize pseudo-random number generator with some random value
  randomSeed(analogRead(RNDPIN));
  // assign random speed to each spot
  spdr = 1.0 + random(200) / 100.0;
  spdg = 1.0 + random(200) / 100.0;
  spdb = 1.0 + random(200) / 100.0;
  // set random offset so spots start in random locations
  offset = random(10000) / 100.0;
  // initialize LED strip
  strip.begin();
  strip.show();
}
void loop() {
  // use real time to recalculate position of each color spot
  long ms = millis();
  // scale time to float value
  float m = offset + (float)ms/DELAY;
  // add some non-linearity
  m = m - 42.5*cos(m/552.0) - 6.5*cos(m/142.0);
  // recalculate position of each spot (measured on a scale of 0 to 1)
  float posr = 0.15 + 0.55*sin(m*spdr);
  float posg = 0.5 + 0.65*sin(m*spdg);
  float posb = 0.85 + 0.75*sin(m*spdb);
  // now iterate over each pixel and calculate it's color
  for (int i=0; i<NUMPIXELS; i++) {
    // pixel position on a scale from 0.0 to 1.0
    float ppos = (float)i / NUMPIXELS;
    // distance from this pixel to the center of each color spot
    float dr = ppos-posr;
    float dg = ppos-posg;
    float db = ppos-posb;
#if WRAP
    dr = dr - floor(dr + 0.5);
    dg = dg - floor(dg + 0.5);
    db = db - floor(db + 0.5);
#endif
    // set each color component from 0 to max BRIGHTNESS, according to Gaussian distribution
    strip.setPixelColor(i,
      constrain(BRIGHTNESS*myexp(-FOCUS*dr*dr),0,BRIGHTNESS),
      constrain(BRIGHTNESS*myexp(-FOCUS*dg*dg),0,BRIGHTNESS),
      constrain(BRIGHTNESS*myexp(-FOCUS*db*db),0,BRIGHTNESS)
      );
  }
#if DEBUG
  // keep track of FPS rate
  fps++;
  if (ms>nextms) {
    // 1 second passed – reset counter
    nextms = ms + 1000;
    pfps = fps;
    fps = 0;
  }
  // show FPS rate by setting one pixel to white
  strip.setPixelColor(pfps,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS);
#endif
  // send data to LED strip
  strip.show();
}

Также есть неплохой пример с использованием другой библиотеки light_ws2812. Скачиваем библиотеку отсюда.

// Dependency:
//   light_ws2812
//   https://github.com/cpldcpu/light_ws2812
// ---
// if you have USB 3.0 ports, you might need a USB 2.0 hub to program this.
// use the cRGB struct hsv method
#define USE_HSV
#include <WS2812.h>
#define NUM_LEDS 25
#define outputPin 0
#define UPDATES_PER_SECOND 20
WS2812 LED(NUM_LEDS); 
cRGB my_crgb;
int h = 0;   //stores 0 to 614
int x = 2;
byte steps = 1; //number of hues we skip in a 360 range per update
byte sat = 255;
byte val = 220;
void setup() {
  // Power up safety delay
  delay(1000);
  LED.setOutput(outputPin);
}
void loop() {
  int inner_h = h;
  for( int i = 0; i < NUM_LEDS; i++ ) {
    if (i%2) {
      inner_h += (i/2)*x;
    }
    if(inner_h >= 360)
    {
        inner_h %= 360;
    }
    my_crgb.SetHSV(inner_h, sat, val);
    LED.set_crgb_at(i, my_crgb);
  }
  h += steps;
  if(h >= 360)
  {
     h %= 360;
  }
  LED.sync();
  delay(1000 / UPDATES_PER_SECOND);
}

Для работы данного примера требуется намного меньше места на Digispark. Поэтому можно дописать функции.

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

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

]]>
Урок 2. Нажатие кнопки без ложных срабатываний. Устраняем дребезг кнопки http://portal-pk.ru/news/135-urok-2-nazhatie-knopki-bez-lozhnyh-srabatyvanii.html Константин Portal-PK 2018-01-05T14:54:48+03:00 В предыдущем уроке: Урок1 - Подключение кнопки и светодиода к плате Arduino, я рассказал как подключить кнопку к Arduino . При нажатии на тактовую кнопку светодиод загорается. Если отпускаем он гаснет. Такое исполнение очень редко используется в проектах на Arduino.

Самое распространенное это смена состояния при нажатии на кнопку.

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

дребезг кнопки

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

Как же бороться с дребезгом кнопки?

Существует несколько вариантов:

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

2. Программный. Дребезг длиться