Справочник языка Ардуино. Arduino IDE. Arduino справочник: библиотеки, функции.
Код для Arduino и A4988 (DRV8825), который позволяет вращать шаговым двигателем без библиотеки. Код для Arduino управления драйвером A4988 (DRV8825) с использованием библиотеки AccelStepper.
Данная библиотека позволяет вам создавать маленькие растровые изображения размером 20x16 пикселей и отображать их на обычном символьном дисплее на базе Hitachi HD44780. Библиотека предоставляет типовые функции рисования, такие как линия, прямоугольник, инвертирование и т.д. Управление происходит на уровне пикселей.
Справочник языка Ардуино. Arduino IDE. Arduino справочник: библиотеки, функции.
Примеры кода для KY-008 и Arduino. Схема подключения KY-008 к Arduino UNO.
Ардуино (Arduino) для начинающих. Помогут изучить основы программирования и разработки проектов на Arduino.
Микросхема RDA5807M - это FM радиоприемник нового поколения с поддержкой RDS/RBDS и цифровым управлением по I2C. Микросхема выполнена по CMOS технологии, что определяет ее минимальное энергопотребление. RDA5807M уже содержит все необходимые узлы и требует лишь небольшого числа внешних компонентов. А мощный аудиопроцессор обеспечивает оптимальное качество звука при различных условиях приема. Все это делает RDA5807M удачным выбором для носимых, портативных устройств.
Energy Efficiency control utilizing Domoticz home automation server, node-red, Raspberry Pi Zero W and Esp12 via Arduino IDE.
OLED_StatusIcons описание дополнения библиотеки OLED_I2C для отображения значков в строке состояния на русском языке Скачать: на официальном сайте зеркало1 зеркало2 Введение: Эта библиотека является дополнением к библиотеке OLED_I2C и сама по себе работать не будет. Предназначена для отображения значков в строке состояния OLED-дисплея. Строка состояния может располагаться в верхней или нижней части дисплея, но иконки должны быть расположены все на одной линии. Библиотека поддерживает значки размером 8x8 и 16x16 пикселей. Обратите внимание, что одновременно допускается использовать значки только одного размера. Иконки для данной библиотеки могут быть сделаны самостоятельно. Они должны быть монохромными и иметь размер 8х8 или 16х16 пикселей. Другие размеры не поддерживаются. Поддерживаемые значки: Определенные литералы: Размер иконок ICONSIZE_8X8: 1 ICONSIZE_16X16: 2 Выравнивание иконок ICONPOSITION_TOP_RIGHT: 0 (выравнивание по верхнему правому углу) ICONPOSITION_TOP_LEFT: 1 (выравнивание по верхнему левому углу) ICONPOSITION_BOTTOM_RIGHT: 2 (выравнивание по нижнему правому углу) ICONPOSITION_BOTTOM_LEFT: 3 (выравнивание по нижнему левому углу) Функции: OLED_StatusIcons(OLED, size, position); Инициализация библиотеки Параметры: OLED: ранее инициализированная функция OLED библиотеки OLED_I2C size: размер значков (ICONSIZE_8X8 или ICONSIZE_16X16) position: выравнивание значков (ICONPOSITION_TOP_RIGHT, ICONPOSITION_TOP_LEFT, ICONPOSITION_BOTTOM_RIGHT или ICONPOSITION_BOTTOM_LEFT) Пример: OLED_StatusIcons myIcons(&myOLED, ICONSIZE_8X8, ICONPOSITION_BOTTOM_LEFT); // Запуск библиотеки Примечание: Обратите внимание на то, что перед именем OLED обьекта ставится символ ‘&’ begin(); Инициализация строки состояния Параметры: Нет Пример: myIcons.begin(); // Инициализация строки состояния updateSpeed(ms); Скорость обновления строки состояния Параметры: ms: время в миллисекундах между обновлениями (100-10000). По умолчанию 1000 Пример: myIcons.updateSpeed(1000); // Установить частоту обновления 1 раз в 1000мс enableStatusbar(); Включение управляемой прерываниями строки состояния Параметры: Нет Пример: myIcons.enableStatusbar(); // Включить управляемую прерываниями строку состояния disableStatusbar(); Отключение управляемой прерываниями строки состояния Параметры: Нет Пример: myIcons.disableStatusbar(); // Отключить управляемую прерываниями строку состояния refreshStatusbar(); Принудительное обновление строки состояния Параметры: Нет Пример: myIcons.refreshStatusbar(); // Немедленно обновить строку состояния Примечание: При очистке дисплея строка состояния также очищается и будет такой оставаться в течение некоторого времени до следующего цикла обновления. Для немедленной перерисовки строки состояния необходимо использовать функцию refreshStatusbar(). createIcon(position, bitmap [, enabled]); Создание нового значка в строке состояния Параметры: position: позиция нового значка (0-13 для значка 8x8 и 0-6 для значка 16x16) bitmap: массив, содержащий растровое изображение для данного значка enabled: <необязательный параметр> Отчет о создании значка: false (по умолчанию) или true Возврат: (булевое значение) true (истинно) если иконка успешно создана, иначе - false (ложно) Пример: myIcons.createIcon(0, power_8, true); // Создать иконку в положении, наиболее близкому к выбранному краю и включить ее Примечание: Позиция 0 всегда ближе всего к выбранному краю выравнивания. Новый значок в той же позиции, где уже есть значок создать нельзя. deleteIcon(position); Удаление значка в строке состояния Параметры: position: позиция значка для удаления Возврат: (булевое значение) true (истинно) если значок успешно удален, иначе - false (ложно) Пример: myIcons.deleteIcon(0); // удалить значок в позиции 0 enableIcon(position); Включить/показать значок в строке состояния Параметры: position: позиция значка для включения/отображения Пример: myIcons.enableIcon(0); // включить/отобразить значок в позиции 0 disableIcon(position); Отключение/скрытия значка в строке состояния Parameters: position: позиция значка для отключения/скрытия Пример: myIcons.disableIcon(0); // отключить/скрыть значок в позиции 0 changeIcon(position, bitmap); Замена растрового изображения для существующего значка Параметры: position: положение значка, которым будет заменен стандартный растровый рисунок bitmap: массив, содержащий растровое изображение для данного значка Пример: myIcons.changeIcon(0, mail_8); // Замена растрового изображения для значка, находящегося в позиции 0
Прошивка Arduino Pro Mini с помощью конвертора PL2303HX. Схема подключения Arduino Pro Mini к PL2303HX.
Схема подключения к Arduino NANO, HY-DJM-5V, модуля KY-022, и модуля с двумя реле. Замена одного проходного выключателя на реле.
Arduino машинка своими руками. Управление с помощью джойстика. Схема подключения электроники робота машину на Ардуино.
ESP32: Простой скетч в Arduino IDE. Загрузка кода в ESP32.
Введение В моих публикациях [1,2,3] подробно описана цепочка датчик – Arduino-интерфейс Python. В реальных условиях промышленного производства датчики находиться...
KY-009 - Модуль RGB светодиода (SMD). Подключение к Arduino. Схема подключения KY-009 к Arduino. KY-009 Пример кода Arduino.
Урок Arduino. Дребезг — программное устранение. Нажатие кнопки без ложных срабатываний. Дребезг кнопки можно устранить 2 способами.
Урок ESP8266. Подключение сдвигового регистра 74HC595. Схема подключения сдвигового регистра 74HC595 к NodeMCU.
Хрестоматия радиолюбителя, 5-е изд. | Бурлянд В.А., Жеребцов И.П. (сост.)Издательство «Энергия», 1971Язык: русскийФормат: djvuКоличество: 512Размер: 39.3 МбКнига представляет собой учебное пособие для радиокружков, радиокурсов и самообразования. В ней изложены основы радиотехники и собраны
Краткий обзор операционной системы реального времени FreeRTOS и способа реализации многозадачности в скетчах для Arduino.
Допустим, Вы решили оформить написанные Вами функции/классы для Arduino в библиотеку, чтобы Вам самим было проще с ними работать, и главное, чтобы кто-то другой...
Цель урока: использование переменных в проектах на Arduino. Применение переменных типа int в Arduino распростарнено и имеет большое знаечение.
Автор: Е. И. Юревич Серия книг: Учебная литература для вузов (BHV) Жанр: учебники и пособия для вузов,ки...
ESP8266 урок. Анализ массивов JSON. Вывод параметром полученных из массива JSON.
Схема подключения часов матрицы на Arduino NANO. Код часов на Arduino и светодиодах WS2812B.
Модуль фоторезистора KY-018. Подключение к Arduino. Схема подключения модуля KY-017 к Arduino UNO.
Энциклопедия юного радиолюбителя-конструктора, 9-е изд. | Борисов В.Г.Год: 2001Издательство: М.: Солон-РЯзык: русскийФормат: djvu, pdfСтраниц: 526Размер: 63.6 МбВ форме популярных бесед книга знакомит юного читателя с историей развития радио, современной радиотехникой и электроникой. Книга содержит
Серия Ремонт в 156 книгах - Предназначенная для специалистов и подготовленных пользователей, обслуживающих бытовую и оргтехнику. Все, что вы хотели узнать о ремонте простой и сложной бытовой электронной техники и промышленной аппаратуры. Нужные схемы и описания принципов работы, методики поиска и
Строим графики waveform - дисплей Nextion. Вывод графиков на дисплее Nextion по полученным данным с Arduino.
Описание модуля KY-012 (зуммер). Схема подключения KY-012 активного зуммера к Arduino. Пример кода для модулей KY-012, KY-010 подключенных к Arduino.
KY-010 – модуль с оптическим прерывателем. Схема подключения модуля KY-010 к Arduino Uno.
Это издание является заключительной частью серии из трех книг для начинающих радиолюбителей. Первые две книги — «Азбука радиолюбителя» и «Школа радиолюбителя» — ставили своей целью дать юному читателю основные представления как о радиотехнике в общем, так и о содержании радиолюбительской
Структура flash-памяти дисплеев DWIN и особенности распределения данных. Особенности работы с файлами дисплеев на T5L1 и T5L2 DWIN.
Сегодня в уроке программирования Arduino познакомимся с циклом for. Для этого разберём пример подачи сигнала бедствия SOS с помощью Arduino и светодиода.
В одной из прошлых публикаций я писал о своей библиотеке LiquidCrystal_I2C_Ext для создания меню на текстовом LCD дисплее и энкодере вращения. Библиотека получилась довольно интересная. Только название, как выяснилось впоследствии, уже используется. Поэтому я принял решение переименовать её в LiquidCrystal_I2C_Menu. Кроме нового имени в ней появились и новые возможности. А недавно я сделал версию библиотеки для управления с помощью кнопок - LiquidCrystal_I2C_Menu_Btns. Итого на ваш выбор представлены две библиотеки, о которых пойдет речь в сегодняшней статье. Где качать Библиотеки находятся на github по ссылкам: https://github.com/VladimirTsibrov/LiquidCrystal_I2C_Menu - управление энкодером https://github.com/VladimirTsibrov/LiquidCrystal_I2C_Menu_Btns - управление кнопками Чтобы скачать интересующую библиотеку необходимо нажать на кнопку Code, затем Download ZIP: Для установки библиотеки в среду Arduino распакуйте содержимое архива в папку Arduino_dir\libraries\ и удалите из названия "-master". Как подключать Библиотеки предназначены для работы с дисплеями LCD2004 и LCD1602 с I2C интерфейсом. Для управления потребуются либо энкодер вращения с кнопкой, например, KY-040, либо 3-4 кнопки. Схемы их подключения к Ардуино приведены ниже: Схема подключения дисплея и энкодера к Ардуино для работы с LiquidCrystal_I2C_Menu Схема подключения дисплея и кнопок к Ардуино для работы с LiquidCrystal_I2C_Menu_Btns Вы можете выбрать для подключения любые другие пины Ардуино. Только не забудьте потом прописать их в скетче, чтобы библиотека знала, с какими выводами ей работать. Для библиотеки LiquidCrystal_I2C_Menu_Btns достаточно трёх кнопок. Четвертая опциональная, используется для отмены действий и возврата из функций. Как использовать Обе библиотеки одинаковы в использовании, за исключением функций подключения и опроса элементов управления (attachEncoder / attachButtons и getEncoderState / getButtonsState). В остальном они взаимозаменяемы. Помимо унаследованных из LiquidCrystal_I2C функций в них реализованы следующие: printAt(x, y, text) – вывод текста на дисплей с указанной позиции. printf(format, …) – форматированный вывод текста. Лично мне очень не хватало этой функции. Если раньше приходилось делать несколько вызовов print, или выводить текст в промежуточный буфер функцией sprintf, то сейчас достаточно одного вызова printf. printfAt(x, y, format, …) – форматированный вывод с указанной позиции. attachEncoder(pinA, pinB, pinBtn) – сообщает библиотеке, к каким выводам Ардуино подключен энкодер. Только для LiquidCrystal_I2C_Menu. getEncoderState() – опрос состояния энкодера. Возвращает значение типа eEncoderState (перечисляемый тип, описан в библиотеке как {eNone, eLeft, eRight, eButton}). Только для LiquidCrystal_I2C_Menu. attachButtons(pinLeft, pinRight, pinEnter, [pinBack]) – сообщает библиотеке, к каким выводам Ардуино подключены кнопки. Только для LiquidCrystal_I2C_Menu_Btns. getButtonsState() – опрос состояния кнопок. Возвращает значение типа eButtonsState (перечисляемый тип, описан в библиотеке как {eNone, eLeft, eRight, eButton, eBack}). Только для LiquidCrystal_I2C_Menu_Btns. printMultiline(text) – вывод длинного текста с возможностью вертикальной прокрутки. Возврат из функции осуществляется при нажатии кнопки. inputVal(title, min, max, default, [step = 1], [*onChangeFunc = NULL]) – ввод числового значения. title – заголовок; параметры min и max задают диапазон, в котором может изменяться значение; default – начальное значение; step – величина приращения, по умолчанию равна 1; необязательный параметр onChangeFunc – указатель на функцию, которая должна вызываться при изменении значения. inputValAt(x, y, min, max, default, [step = 1], [*onChangeFunc = NULL]) – аналогична функции inputVal, но в отличие от нее не очищает дисплей при вызове и ввод значения осуществляется с указанной позиции. inputValBitwise(title, value, precision, [scale = 0], [signed = false]) – позволяет вводить числовые значения путем редактирования отдельных разрядов числа. Параметр title определяет заголовок; value – ссылка на переменную, в которую будет помещен результат ввода; precision – общее количество разрядов в числе; scale – количество разрядов после запятой, значение по умолчанию 0; signed – разрешает (при значении true) или запрещает (при значении false – по умолчанию) ввод отрицательных чисел. Функция возвращает true, если пользователь подтвердил ввод, false, если отказался. inputStrVal(title, buffer, length, available_symbols) – аналогично функции inputValBitwise предоставляет возможность поразрядного ввода, но кроме цифр могут быть введены и другие символы. Параметр title определяет заголовок; buffer – ссылка на символьный буфер, в который будет помещен результат ввода; length – количество вводимых символов; параметр available_symbols – это строка символов, доступных для ввода. Функция возвращает true, если пользователь подтвердил ввод, false, если отказался. selectVal(title, list_of_values, count, [show_selected = true], [selected_index = 0]) – позволяет выбрать значение из списка list и возвращает индекс выбранного элемента. title – отображаемый на дисплее заголовок; list – список значений для выбора, представляет собой массив значений типа char*, String или int; count – количество элементов в массиве; show_selected - флаг отображения метки на выбранном элементе; selected_index – индекс выбранного по умолчанию элемента. showMenu(menu, menu_length, show_title) – отображает меню и возвращает ключ выбранного элемента. menu – массив элементов типа sMenuItem; menu_length – длина меню; show_title – признак необходимости отображения заголовка. getSelectedMenuItem() – возвращает ключ выбранного пункта меню для использования внутри обработчиков. attachIdleFunc(*IdleFunc) – позволяет привязать функцию, которая будет вызываться библиотекой при бездействии. Разберём несколько примеров их использования. printAt, printf, printfAt #include #include LiquidCrystal_I2C_Menu lcd(0x27, 20, 4); void setup() { char hello[] = "Hello, world!"; String s = "String example"; lcd.begin(); lcd.printf("millis=%lu", millis()); lcd.printAt(3, 1, hello); lcd.printAt(0, 2, s); lcd.printfAt(0, 3, "%s", s.c_str()); } void loop() { } Результат работы функций printAt, printf, printfAt Функция printAt поддерживает те же типы данных, что и print: вы можете выводить на дисплей целые и дробные числа, текстовые строки, будь то массив символов или переменная типа String. А при работе с функциями форматированного вывода printf и printfAt не забывайте, что они не поддерживают тип String и передавать им нужно указатель на строку в стиле Си. Для этого достаточно вызвать функцию c_str() класса String, в примере выше это показано. attachEncoder, getEncoderState и attachButtons, getButtonsState #include #include LiquidCrystal_I2C_Menu lcd(0x27, 20, 4); // Пины, к которым подключен энкодер #define pinCLK 2 #define pinDT 3 #define pinSW 4 int x = 0; void setup() { lcd.begin(); lcd.attachEncoder(pinDT, pinCLK, pinSW); lcd.printfAt(0, 0, "%d ", x); } void loop() { // Опрашиваем энкодер eEncoderState EncoderState = lcd.getEncoderState(); switch (EncoderState) { case eLeft: // При вращении влево уменьшаем значение переменной x--; break; case eRight: // При вращении вправо увеличиваем значение переменной x++; break; case eButton: // При нажатии кнопки энкодера обнуляем значение переменной x = 0; break; case eNone: // Энкодер не вращается, кнопка не нажата. Выходим из функции return; } lcd.printfAt(0, 0, "%d ", x); // Покажем новое значение x } В данном примере выполняется подключение энкодера функцией attachEncoder и опрос его состояния в цикле. При вращении энкодера изменяется значение переменной x, затем выводится на дисплей. Нажатие на кнопку приводит к обнулению переменной. Аналогичный пример для библиотеки LiquidCrystal_I2C_Menu_Btns вы найдете в папке \examples\Buttons. Отличие состоит в использовании функций attachButtons и getButtonsState. Последняя возвращает значение типа eButtonsState, которое определено в библиотеке следующим образом: enum eButtonsState {eNone, eLeft, eRight, eButton, eBack}; Это те же значения, что используются при работе с энкодером, плюс новое значение eBack для кнопки "Назад". Подключать эту кнопку необязательно, то есть функция attachButtons может быть вызвана с тремя параметрами: lcd.attachButtons(pinLeft, pinRight, pinEnter); printMultiline #include #include #include LiquidCrystal_I2C_Menu lcd(0x27, 20, 4); // Пины, к которым подключен энкодер #define pinCLK 2 #define pinDT 3 #define pinSW 4 // Объявим две строки в памяти программ. Так они не будут занимать оперативную память const char text_1[] PROGMEM = "Using PROGMEM example"; const char text_2[] PROGMEM = "This text is stored in FLASH"; const char* const text[] PROGMEM = {text_1, text_2}; void setup() { lcd.begin(); lcd.attachEncoder(pinDT, pinCLK, pinSW); } void loop() { char *buffer; // Вывод на экран длинной строки. Строка занимает оперативную память. lcd.printMultiline("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua"); // Вывод строки из памяти программ. buffer = (char*) malloc(30); // Буфер для временного хранения строки strcpy_P(buffer, (char*)pgm_read_word(&(text[0]))); // Копируем строку в буфер lcd.printMultiline(buffer); // Выводим содержимое буфера на экран strcpy_P(buffer, (char*)pgm_read_word(&(text[1]))); // Аналогично со второй строкой lcd.printMultiline(buffer); free(buffer); // Освобождаем буфер // Другой пример хранения строк в памяти программ - использование макроса F(). lcd.printMultiline(F("Using F() macro example. Press button to continue.")); } Результат работы функции printMultiline Функция printMultiline позволяет выводить на дисплей длинные строки с возможностью прокрутки. Но, объявив несколько таких строк в своем скетче, при компиляции вы можете заметить, как быстро они "съедают" память данных. В Ардуино Уно для хранения данных доступно всего 2кб, тогда как для кода программы отведено 32кб. Поэтому при наличии в программе большого объема текстовых данных целесообразно хранить их в памяти программ (FLASH). Для этого используется ключевое слово PROGMEM. PROGMEM – это модификатор переменных, он сообщает компилятору, что указанная переменная должна быть размещена не в памяти данных, а в памяти программ. Работает этот модификатор только с типами данных, объявленными в файле pgmspace.h, частью которой он является. Чтобы впоследствии процессор мог что-то сделать с этими данными, они должны быть скопированы из FLASH в SRAM. Для этого в примере выше выделяется буфер, в который происходит считывание строк text[0] и text[1]. После того как данные выведены на дисплей буфер может быть освобожден. Еще один вариант размещения строки в памяти программ – это использование макроса F() непосредственно в функции printMultiline. В примере это также показано. inputVal, inputValAt #include #include LiquidCrystal_I2C_Menu lcd(0x27, 20, 4); // Пины, к которым подключен энкодер #define pinCLK 2 #define pinDT 3 #define pinSW 4 void setup() { lcd.begin(); lcd.attachEncoder(pinDT, pinCLK, pinSW); } void loop() { // Для примера запросим длину массива uint8_t len = lcd.inputVal("Input array len", 5, 10, 8); uint8_t A[len]; uint8_t t; // Затем элементы массива for (uint8_t i = 0; i < len; i++) { lcd.printfAt(0, 0, "Input A[%d]: ", i); // Приглашение для ввода A[i] = lcd.inputValAt(12, 0, 0, 9, 5); // Ввод значения } // Отсортируем массив for (uint8_t i = 0; i < len - 1; i++) { for (uint8_t j = i + 1; j < len; j++) { if(A[i] > A[j]){ t = A[i]; A[i] = A[j]; A[j] = t; } } } // И выведем на дисплей lcd.clear(); lcd.print("Sorted array:"); lcd.setCursor(0, 1); for (uint8_t i = 0; i < len; i++) lcd.printf("%d ", A[i]); // Ожидаем нажатия кнопки для продолжения while (lcd.getEncoderState() == eNone); } Использование функций printfAt и inputValAt для ввода значений Для демонстрации использования функций inputVal и inputValAt в данном примере предлагается ввести длину массива, а затем элементы массива. Введенный массив сортируется и выводится на дисплей. Отличие этих двух функций состоит в том, что inputValAt при вызове не очищает дисплей и позволяет предварительно вывести на дисплей заголовок, используя printf. В скетче выше это используется для отображения индекса вводимого элемента массива. В некоторых случаях необходимо знать значение переменной в процессе её редактирования, а не по завершении редактирования. Это позволило бы оперативно применять новое значение. Тогда, например, при изменении громкости мы сможем не только видеть её новое значение на дисплее, но и воспринимать изменение на слух. Для таких случаев в функциях inputVal и inputValAt предусмотрен параметр onChangeFunc. В нём передаётся указатель на функцию, которая должна вызываться при каждом изменении редактируемого параметра. Внутри такой функции можно применить новое значение параметра или даже визуализировать его ввод: отобразить шкалу как в примере ниже. Шкала ввода для функций inputVal и inputValAt В примерах к библиотеке есть скетч inputVal_onChange, поясняющий использование параметра onChangeFunc. inputValBitwise #include #include LiquidCrystal_I2C_Menu lcd(0x27, 20, 4); // Пины, к которым подключен энкодер #define pinCLK 2 #define pinDT 3 #define pinSW 4 double val = 0; void setup() { lcd.begin(); lcd.attachEncoder(pinDT, pinCLK, pinSW); } void loop() { // Ввод 5-значного числа со знаком, 2 цифры после запятой: if (lcd.inputValBitwise("Input value", val, 5, 2, true)) { lcd.print("You entered: "); lcd.print(val); } else lcd.print("Input canceled"); while (lcd.getEncoderState() == eNone); } Пример использования функции inputValBitwise для поразрядного ввода чисел Параметры, с которыми вызывается функция inputValBitwise в данном скетче, определяют ввод пятиразрядного числа со знаком, два младших разряда отведены для дробной части. При подтверждении ввода функция возвращает true и помещает введённое значение в переменную val. Ещё несколько примеров ввода чисел функциями inputVal и inputValBitwise вы найдёте в скетче Input_double_and_long. inputStrVal #include #include LiquidCrystal_I2C_Menu lcd(0x27, 20, 4); // Пины, к которым подключен энкодер #define pinCLK 2 #define pinDT 3 #define pinSW 4 char ip[] = "192.168.001.001"; // Массив символов с начальным значением/маской void setup() { lcd.begin(); lcd.attachEncoder(pinDT, pinCLK, pinSW); } void loop() { if (lcd.inputStrVal("Input IP", ip, 15, "0123456789")){ lcd.print("You entered:"); lcd.printAt(0, 1, ip); } else lcd.print("Input canceled"); while (lcd.getEncoderState() == eNone); } Пример использования функции inputStrVal для маскированного ввода Здесь функция inputStrVal используется для ввода IP адреса. При вызове функции содержимое переданного буфера рассматривается как значение по умолчанию и выводится на дисплей. Последний параметр функции определяет разрешенные для ввода символы, в данном случае только цифры. Если буфер содержит символы, которые не могут быть введены, то их не удастся изменить. Таким способом можно реализовать маскированный ввод или, например, показать единицу измерения для вводимого значения. selectVal #include #include LiquidCrystal_I2C_Menu lcd(0x27, 20, 4); // Пины, к которым подключен энкодер #define pinCLK 2 #define pinDT 3 #define pinSW 4 int index = 0; void setup() { lcd.begin(); lcd.attachEncoder(pinDT, pinCLK, pinSW); } void loop() { String list[] = {"Europa+", "Record", "DFM", "Retro FM", "Energy"}; index = lcd.selectVal("Select station", list, 5, true, index); lcd.printf("%s selected", list[index].c_str()); while (lcd.getEncoderState() == eNone); } Пример работы функции selectVal Функция selectVal используется для выбора значения из списка. Она работает с массивами значений типа char*, String или int и возвращает индекс выбранного элемента. Последние два параметра функции необязательны, это show_selected - определяет, должно ли визуально выделяться выбранное значение (по умолчанию true) и preselected - задаёт индекс выбранного элемента (по умолчанию -1 - ничего не выбрано). showMenu #include #include LiquidCrystal_I2C_Menu lcd(0x27, 20, 4); // Пины, к которым подключен энкодер #define pinCLK 2 #define pinDT 3 #define pinSW 4 // Объявим перечисление, используемое в качестве ключа пунктов меню enum {mkBack, mkRoot, mkRun, mkOptions, mkMode, mkSpeed, mkLog, mkSelftest, mkHelp, mkFAQ, mkIndex, mkAbout}; // Описание меню // структура пункта меню: {ParentKey, Key, Caption, [Handler]} sMenuItem menu[] = { {mkBack, mkRoot, "Menu demo"}, {mkRoot, mkRun, "Run"}, {mkRoot, mkOptions, "Options"}, {mkOptions, mkMode, "Mode"}, {mkOptions, mkSpeed, "Speed"}, {mkOptions, mkLog, "Print log"}, {mkOptions, mkSelftest, "Selftest"}, {mkOptions, mkBack, "Back"}, {mkRoot, mkHelp, "Help"}, {mkHelp, mkFAQ, "FAQ"}, {mkHelp, mkIndex, "Index"}, {mkHelp, mkAbout, "About"}, {mkHelp, mkBack, "Back"}, {mkRoot, mkBack, "Exit menu"} }; uint8_t menuLen = sizeof(menu) / sizeof(sMenuItem); void setup() { lcd.begin(); lcd.attachEncoder(pinDT, pinCLK, pinSW); } void loop() { // Показываем меню uint8_t selectedMenuItem = lcd.showMenu(menu, menuLen, 1); // И выполняем действия в соответствии с выбранным пунктом if (selectedMenuItem == mkRun) lcd.print("Run selected"); else if (selectedMenuItem == mkMode) lcd.print("Mode selected"); else if (selectedMenuItem == mkSpeed) lcd.print("Speed selected"); else if (selectedMenuItem == mkLog) lcd.print("Print log selected"); else if (selectedMenuItem == mkSelftest) lcd.print("Selftest selected"); else if (selectedMenuItem == mkFAQ) lcd.print("FAQ selected"); else if (selectedMenuItem == mkIndex) lcd.print("Index selected"); else if (selectedMenuItem == mkAbout) lcd.print("About selected"); else if (selectedMenuItem == mkBack) lcd.print("Exit selected"); delay(2000); } Пример меню, построенного функцией showMenu Функция showMenu берёт на себя отрисовку меню и навигацию по нему. Входными параметрами функции являются массив элементов типа sMenuItem (это и есть наше меню), длина массива и признак отображения заголовка в меню. В качестве заголовка используется название родительского пункта меню. Отключение отображения заголовка полезно при использовании дисплея 1602. Итак, меню - это массив элементов sMenuItem. Данная структура определёна в библиотеке следующим образом: struct sMenuItem { uint8_t parent; uint8_t key; char *caption; void (*handler)(); }; Параметры parent и key служат для задания иерархии, caption – указатель на название элемента меню, handler - указатель на функцию, которая будет вызываться при выборе данного пункта меню. Будем называть такие функции обработчиками. В качестве parent и key могут быть использованы целочисленные значения, начиная с 1. Но гораздо удобнее определить для них символьные имена, то есть работать с перечислением. Обратите внимание на то, что первым в перечислении должно быть определено значение mkBack, ему соответствует значение 0. Данное значение является служебным и используется для пунктов меню, отвечающих за возврат на уровень выше. При выборе пункта меню, не имеющего подменю и обработчика, функция возвращает соответствующее ему значение key. После этого остаётся проанализировать вернувшееся значение при помощи if или case и выполнить соответствующее выбранному элементу действие. Если же для выбранного пункта меню задан обработчик, то он будет вызван, после чего управление вернётся в меню. getSelectedMenuItem и использование обработчиков меню #include #include LiquidCrystal_I2C_Menu lcd(0x27, 20, 4); // Пины, к которым подключен энкодер #define pinCLK 2 #define pinDT 3 #define pinSW 4 int brightness = 50; int _delay = 10; // Обработчики пунктов меню SetBrightness и SetDelay // Используются для ввода значений brightness и _delay void SetBrightness() { brightness = lcd.inputVal("Input brightness(%)", 0, 100, brightness, 5); } void SetDelay() { _delay = lcd.inputVal("Input delay(ms)", 0, 20, _delay); } // Объявим перечисление, используемое в качестве ключа пунктов меню enum {mkBack, mkRoot, mkOptions, mkSetBrightness, mkSetDelay}; // Описание меню // структура пункта меню: {ParentKey, Key, Caption, [Handler]} sMenuItem menu[] = { {mkBack, mkRoot, "Main menu", NULL}, {mkRoot, mkOptions, "Options", NULL}, {mkOptions, mkSetBrightness, "SetBrightness", SetBrightness}, {mkOptions, mkSetDelay, "SetDelay", SetDelay}, {mkOptions, mkBack, "Back", NULL}, {mkRoot, mkBack, "Back", NULL} }; uint8_t menuLen = sizeof(menu) / sizeof(sMenuItem); void setup() { lcd.begin(); lcd.attachEncoder(pinDT, pinCLK, pinSW); } void loop() { uint8_t selectedMenuItem = lcd.showMenu(menu, menuLen, 1); // Вызываем меню /* Реакция на выбор пунктов меню SetBrightness и SetDelay реализована * в функциях-обработчиках. * При необходимости здесь может располагаться анализ значения selectedMenuItem * для пунктов, не имеющих обработчиков: if (selectedMenuItem == ...) {...} */ } В этом примере для двух пунктов меню заданы функции-обработчики SetBrightness и SetDelay. Они не имеют параметров и ничего не возвращают - это обязательное требование к обработчикам. Обработчики вызываются прямо из функции showMenu, то есть она не завершается и не возвращает ключ выбранного пункта меню. Внутри обработчиков можно как угодно работать с дисплеем, перерисовывать его и вызывать функции библиотеки, после завершения обработчика меню будет восстановлено. Один обработчик можно привязать сразу к нескольким пунктам меню. В этом случае, чтобы понять, какой пункт был выбран, используется функция getSelectedMenuItem. Она возвращает ключ выбранного пункта. Далее ключ нужно проанализировать и выполнить соответствующий код. attachIdleFunc При вызове большинства функций библиотеки ожидается действие от пользователя: выбор пункта в меню, ввод значения и так далее. При этом мы по сути находимся в цикле и выполнение остальной части программы невозможно, пока мы не выйдем из этого цикла. Это логично. Но возможны случаи, когда такая логика работы не подходит. Например, если нам нужно опрашивать какие-либо датчики даже во время работы меню. В таких случаях поможет функция attachIdleFunc. Она позволяет указать функцию, которую будет вызывать библиотека снова и снова, пока мы находимся в меню, вводим или выбираем значения. А уже внутри этой самой функции можно сделать опрос датчиков или что угодно, что не будет долго выполняться, чтобы не мешать библиотеке опрашивать кнопки и энкодер. Для демонстрации описанного функционала в приведённом ниже примере включается и выключается встроенный светодиод Ардуино, пока мы находимся внутри функций inputVal и printMultiline. #include #include LiquidCrystal_I2C_Menu lcd(0x27, 20, 4); // Пины, к которым подключен энкодер #define pinCLK 2 #define pinDT 3 #define pinSW 4 unsigned long tm = 0; bool ledState = false; // Данная функция будет вызываться из библиотеки при бездействии void myIdleFunc() { if (millis() - tm >= 500) { // Включаем и выключаем встроенный светодиод на Ардуино tm = millis(); ledState = !ledState; digitalWrite(LED_BUILTIN, ledState); } } void setup() { lcd.begin(); lcd.attachEncoder(pinDT, pinCLK, pinSW); lcd.attachIdleFunc(myIdleFunc); pinMode(LED_BUILTIN, OUTPUT); lcd.print("Press the button"); } int x = 0; void loop() { myIdleFunc(); if (lcd.getEncoderState() == eButton) { // Для проверки вызовем любую функцию библиотеки, // которая ожидает действий от пользователя: x = lcd.inputVal("Input some val", 0, 100, x); lcd.printMultiline("Some text here"); lcd.clear(); lcd.print("Press the button"); } } Изначально myIdleFunc вызывается внутри функции loop, в результате светодиод мигает. При нажатии на кнопку энкодера происходит вызов функций библиотеки, выполнение loop приостанавливается. Тем не менее светодиод продолжает мигать, поскольку myIdleFunc вызывается библиотекой. И работе функций inputVal и printMultiline это не мешает. Изменение названий пунктов меню Ещё один приём, который я хочу показать, это изменение названий пунктов меню в ходе работы программы. Может пригодиться для отображения значений переменных в пунктах меню. В библиотеках есть примеры таких скетчей: Updating_menu_captions и Menu_for_setting_params. Пример изменения названий пунктов меню Поддержка дисплеев с кириллицей Если ваш дисплей поддерживает кириллицу, то для корректного отображения русского текста необходимо включить её поддержку в самой библиотеке. Для этого в заголовочном файле (LiquidCrystal_I2C_Menu.h или LiquidCrystal_I2C_Menu_Btns.h) найдите и раскомментируйте строку: #define CYRILLIC_DISPLAY После этого сохраните внесённые изменения. Теперь русские буквы могут быть использованы в меню и других функциях библиотеки. Не забывайте, что для хранения одной русской буквы используется два байта, а не один. Поэтому для строки из N русских букв следует выделять N * 2 + 1 байт памяти. Кроме того, при включении поддержки кириллицы вам станут доступны следующие функции: uint8_t strlenUTF8(char *s) void substrUTF8(char* source, char* dest, uint8_t fromPos, uint8_t count) Функция strlenUTF8 возвращает длину строки s в символах (а не байтах, в отличие от функции strlen). Функция substrUTF8 копирует подстроку из строки source, начиная с символа fromPos, длиной count символов (опять же символов, а не байтов) в строку dest. Эти функции не являются методами классов LiquidCrystal_I2C_Menu / LiquidCrystal_I2C_Menu_Btns и вызываются "напрямую", без указания имени экземпляра класса, например: #include #include LiquidCrystal_I2C_Menu lcd(0x27, 20, 4); void setup() { lcd.begin(); char myText[] = "Привет, мир!"; char mySubstr[21]; lcd.print(strlenUTF8(myText)); // Напечатает "12" substrUTF8(myText, mySubstr, 8, 3); lcd.printAt(0, 1, mySubstr); // Напечатает "мир" } void loop() { } Другие параметры Кроме упомянутого выше CYRILLIC_DISPLAY заголовочные файлы библиотек содержат и другие параметры, которые могут быть изменены. Рассмотрим их. #define SCROLL_LONG_CAPTIONS - Данный параметр включает прокрутку длинных пунктов меню. Если такая возможность не нужна, просто закомментируйте данную строку. Это позволит немного уменьшить размер скомпилированного кода. Если же прокрутка нужна, то обратите внимание на временные интервалы данной функции: #define SCROLL_DELAY 800 // Задержка прокрутки #define DELAY_BEFORE_SCROLL 4000 // Задержка перед началом прокрутки #define DELAY_AFTER_SCROLL 2000 // Задержка после вывода всей строки - Они определяют скорость прокрутки и задержки перед её началом и в конце. #define ENCODER_POOL_DELAY 5 - Интервал опроса энкодера (только для библиотеки LiquidCrystal_I2C_Menu). Я всегда использую 5мс. Может быть кому-то понадобится установить другое значение #define BUTTONS_POOL_DELAY 50 #define BUTTONS_HOLD_BEFORE_REPEAT 1000 - Определяют интервал опроса кнопок и задержку при удержании кнопки нажатой (только для библиотеки LiquidCrystal_I2C_Menu_Btns). По истечении интервала BUTTONS_HOLD_BEFORE_REPEAT нажатая кнопка будет читаться как повторно нажатая каждые BUTTONS_POOL_DELAY мс до тех пор, пока она не будет отпущена. Вместо заключения При создании данных библиотек была проделана большая работа. Поэтому, надеюсь, вы оцените результат. Если возникнут вопросы по их использованию - пишите в комментариях, постараюсь на них ответить.
ESP8266 уроки. HTTP-сервер ESP8266. Выводим информацию HTML, Javascript и CSS. Код JavaScript для вывода HTTP-сервера ESP8266.
Книга посвящена проектированию электронных устройств на основе микроконтроллерной платформы Arduino. Приведены основные сведения об аппаратном и программном обеспечении Arduino. Изложены принципы программирования в интегрированной среде Arduino IDE. Показано, как анализировать электрические схемы,
Силовая электроника: от простого к сложному (+CD) | Семенов Б.Ю.Год: 2009Издательство: Солон-Пресс Серия: Библиотека инженера Язык: русскийФормат: pdfСтраниц: 416Размер: 185.3 МбЭта книга — не учебник, не справочник и не научно-исследовательская монография. Она написана инженером-практиком на