http://wikihandbk.com/ruwiki/api.php?action=feedcontributions&user=Myagkij&feedformat=atomОнлайн справочник - Вклад [ru]2024-03-28T18:11:59ZВкладMediaWiki 1.40.0http://wikihandbk.com/ruwiki/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Ads&diff=14779284Шаблон:Ads2024-03-09T13:37:19Z<p>Myagkij: </p>
<hr />
<div>{{Навигационная таблица<br />
|имя = Партнерские ресурсы<br />
|navbar = plain<br />
|state = mw-collapsible mw-collapsed<br />
|стиль_основного_заголовка = background:#ccccff; padding:0 0.5em 0;<br />
|заголовок = Партнерские ресурсы<br />
|изображение = <br />
|стиль_тела = border: 2px solid #eee; margin: 0.5em 0; clear: both;<br />
|стиль_заголовков = background:#ddddff; padding:0 0.2em 0; font-size: 90%;<br />
|стиль_списков = <br />
|стиль_нечетных = background:transparent; padding:0.2em; font-size: 85%;<br />
|стиль_четных = background:#eee; font-size: 85%; padding:0.2em;<br />
<br />
|стиль_вверху =<br />
|вверху =<br />
<br />
|заголовок1 = Криптовалюты<br />
|список1 = <br />
* [https://www.bestchange.ru/?p=1271211 Обмен криптовалют - www.bestchange.ru]<br />
* [https://www.coinex.com/register?refer_code=vd8ax Криптовалютная биржа CoinEx]<br />
* [https://www.binance.com/ru/register?ref=37012120 Криптовалютная биржа Binance]<br />
* [https://hiveos.farm?ref=127764 HIVE OS - операционная система для майнинга] <br />
* [https://e4pool.com/ e4pool - Мультивалютный пул для майнинга.]<br />
|заголовок2 = Магазины<br />
|список2 = <br />
* [https://alitems.com/g/1e8d114494647eb3631e16525dc3e8822de1876e/ AliExpress — глобальная виртуальная (в Интернете) торговая площадка, предоставляющая возможность покупать товары производителей из КНР];<br />
* [https://www.computeruniverse.net/ru/ computeruniverse.net] - Интернет-магазин компьютеров(Промо код '''5 Евро''' на первую покупку:'''FWWC3ZKQ''');<br />
|заголовок3 = Хостинг<br />
|список3 =<br />
* [https://m.do.co/c/cae2dccf6519 DigitalOcean - американский провайдер облачных инфраструктур, с главным офисом в Нью-Йорке и с центрами обработки данных по всему миру];<br />
|заголовок4 = Разное<br />
|список4 =<br />
* [https://edugrampromo.com?rid=5f097c4fa7fea1fe Викиум - Онлайн-тренажер для мозга]<br />
* [https://edugrampromo.com?rid=87eaf10f525e378f&ulp=https%3A%2F%2Flikecentre.ru%2Fconcentrat%2F%3Froistat_param1%3Dconcentrat Like Центр - Центр поддержки и развития предпринимательства.]<br />
* [https://edugrampromo.com?rid=f59feeb733e58541 Gamersbay - лучший магазин по бустингу для World of Warcraft.]<br />
* [https://edugrampromo.com?rid=289b67b868ea9dcb&ulp=https%3A%2F%2Fpremium-offers.xyz%2Fw58cxs%3Ftariff_id%3D100 Ноотропы OmniMind N°1 - Усиливает мозговую активность. Повышает мотивацию. Улучшает память.]<br />
* [https://edugrampromo.com?rid=6f052898eac77bd8 Санкт-Петербургская школа телевидения - это федеральная сеть образовательных центров, которая имеет филиалы в 37 городах России.]<br />
* [https://edugrampromo.com?rid=087420565dcdd597 Lingualeo.com — интерактивный онлайн-сервис для изучения и практики английского языка в увлекательной игровой форме.]<br />
* [https://edugrampromo.com?rid=57520bea7f66ee3b Junyschool (Джунискул) – международная школа программирования и дизайна для детей и подростков от 5 до 17 лет, где ученики осваивают компьютерную грамотность, развивают алгоритмическое и креативное мышление, изучают основы программирования и компьютерной графики, создают собственные проекты: игры, сайты, программы, приложения, анимации, 3D-модели, монтируют видео.]<br />
* [https://edugrampromo.com?rid=5f945625e2ace4b1 Умназия - Интерактивные онлайн-курсы и тренажеры для развития мышления детей 6-13 лет]<br />
* [https://edugrampromo.com?rid=670a0ea1ce614b2a&ulp=https%3A%2F%2Flive.skillbox.ru%2Funiversity SkillBox - это один из лидеров российского рынка онлайн-образования. Среди партнеров Skillbox ведущий разработчик сервисного дизайна AIC, медиа-компания Yoola, первое и самое крупное русскоязычное аналитическое агентство Tagline, онлайн-школа дизайна и иллюстрации Bang! Bang! Education, оператор PR-рынка PACO, студия рисования Draw&Go, агентство performance-маркетинга Ingate, scrum-студия Sibirix, имидж-лаборатория Персона.]<br />
* [https://edugrampromo.com?rid=44dc54d5145899d1 «Нетология» — это университет по подготовке и дополнительному обучению специалистов в области интернет-маркетинга, управления проектами и продуктами, дизайна, Data Science и разработки. В рамках Нетологии студенты получают ценные теоретические знания от лучших экспертов Рунета, выполняют практические задания на отработку полученных навыков, общаются с экспертами и единомышленниками. Познакомиться со всеми продуктами подробнее можно на сайте https://netology.ru, линейка курсов и профессий постоянно обновляется.]<br />
* [https://edugrampromo.com/?rid=1ed7207891f11c0d StudyBay Brazil – это онлайн биржа для португалоговорящих студентов и авторов! Студент получает уникальную работу любого уровня сложности и больше свободного времени, в то время как у автора появляется дополнительный заработок и бесценный опыт.]<br />
* [https://edugrampromo.com/unreg-order?rid=bc6edf2d6d6d23dc Автор24 — самая большая в России площадка по написанию учебных работ: контрольные и курсовые работы, дипломы, рефераты, решение задач, отчеты по практике, а так же любой другой вид работы. Сервис сотрудничает с более 70 000 авторов. Более 1 000 000 работ уже выполнено.]<br />
* [https://edugrampromo.com/order?rid=a198c2dad2c1ce3f StudyBay – это онлайн биржа для англоязычных студентов и авторов! Студент получает уникальную работу любого уровня сложности и больше свободного времени, в то время как у автора появляется дополнительный заработок и бесценный опыт.]<br />
|заголовок5 = <br />
|список5 =<br />
<br />
|заголовок6 = <br />
|список6 = <br />
<br />
|заголовок7 = <br />
|список7 = <br />
<br />
|заголовок8 = <br />
|список8 = <br />
<br />
|заголовок9 = <br />
|список9 =<br />
<br />
|заголовок10 = <br />
|список10 = <br />
<br />
|заголовок11 = <br />
|список11 =<br />
<br />
|заголовок12 =<br />
|список12 =<br />
<br />
|заголовок13 = <br />
|список13 = <br />
<br />
|заголовок14 = <br />
|список14 = <br />
<br />
|заголовок15 = <br />
|список15 = <br />
<br />
|заголовок16 = <br />
|список16 = <br />
<br />
|заголовок17 = <br />
|список17 = <br />
<br />
|заголовок18 = <br />
|список18 = <br />
<br />
|стиль_внизу = <br />
|внизу = <br />
}}</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%90%D0%BD%D0%B5%D0%BA%D0%B4%D0%BE%D1%82:18694&diff=14763576Анекдот:186942024-03-09T06:01:49Z<p>Myagkij: </p>
<hr />
<div>{{Панель управления/Анекдот}}<br />
{{Анекдот<br />
|Заголовок=#18694<br />
|Назад=18693<br />
|Вперед=18695<br />
|Текст анекдота=<br />
к петьке(п) и василию ивановичу(в) собираются в гости троцкий(т)и крупская(к).(в) говорит (п) иди в сарай и запрись.<br />
(п) спрашивает:зачем?<br />
(в) отвечает: ты когда напьешся всех обсирать начинаешь<br />
(п): ну в этот раз я ни буду! <br />
(в) ну ладно остовайся.<br />
приходятв гости (т) и (к) випивиют по первой, второй и.т.д...очнулся (п)в сарае и спрашивает (В) зачем меня запер?<br />
(в) отвечает: когда тыпьяный плюнул в тарелку (к) я стерпел , когда ты плюнул ей вв сиськия стерпел, но когда ты залез на (т) и начал его за уши тянутьи орать на х.я залупе уши я тебя запер.<br />
}}<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
<br />
{{Навигационная таблица/Портал/Анекдот}}</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%90%D0%BD%D0%B5%D0%BA%D0%B4%D0%BE%D1%82:69464&diff=14531701Анекдот:694642024-03-03T10:08:17Z<p>Myagkij: </p>
<hr />
<div>{{Панель управления/Анекдот}}<br />
{{Анекдот<br />
|Заголовок=#69464<br />
|Назад=69463<br />
|Вперед=69465<br />
|Текст анекдота=Происшествие Темной ночью, при ярком свете луны, когда жена и дети спали крепкимсном, поэт Чаровник Н. П. открыл окно, прошел по карнизу, вскарабкалсяпо трубе на крышу и назад уже больше не вернулся.Нет покоя служителям муз! Говорят, в ту роковою ночь у поэта ни стихи,ни личная жизнь не сложились...<br />
}}<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
<br />
{{Навигационная таблица/Портал/Анекдот}}</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Windows:%D0%A0%D0%B5%D1%86%D0%B5%D0%BF%D1%82%D1%8B/%D0%97%D0%B0%D0%BF%D1%83%D1%81%D0%BA_%D0%BF%D1%80%D0%BE%D0%B2%D0%BE%D0%B4%D0%BD%D0%B8%D0%BA%D0%B0_%D0%B2_%D1%82%D0%B5%D0%BA%D1%83%D1%89%D0%B5%D0%B9_%D0%BF%D0%B0%D0%BF%D0%BA%D0%B5&diff=14328649Windows:Рецепты/Запуск проводника в текущей папке2024-02-27T18:08:52Z<p>Myagkij: Новая страница: «{{Панель управления/Windows}} {{Myagkij-редактор}} =Запуск проводника в текущей папке= ==Проблема== Запуск проводника в текущей папке. ==Решение== <syntaxhighlight lang="VBScript"> start . </syntaxhighlight> =См.также= =Внешние ссылки= <references /> {{Навигационная таблица/Портал/Windows}} категори...»</p>
<hr />
<div>{{Панель управления/Windows}}<br />
{{Myagkij-редактор}}<br />
<br />
=Запуск проводника в текущей папке=<br />
<br />
==Проблема==<br />
<br />
Запуск проводника в текущей папке.<br />
<br />
==Решение==<br />
<br />
<syntaxhighlight lang="VBScript"><br />
start .<br />
</syntaxhighlight><br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
<br />
{{Навигационная таблица/Портал/Windows}}<br />
[[категория:Рецепт]]<br />
[[категория:Рецепты]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Windows/%D0%A0%D0%B5%D1%86%D0%B5%D0%BF%D1%82%D1%8B&diff=14328640Шаблон:Windows/Рецепты2024-02-27T18:08:23Z<p>Myagkij: /* Командная строка */</p>
<hr />
<div>==Рецепты==<br />
<br />
==Командная строка==<br />
<br />
* [[Windows:Рецепты/Быстрый переход в системную папку системы|Быстрый переход в системную папку системы]]<br />
* [[Windows:Рецепты/Запуск проводника в текущей папке|Запуск проводника в текущей папке]]<br />
<br />
===Windows 8===<br />
<br />
* [[Windows:Рецепты/Забыли ключ Windows 8|Забыли ключ Windows 8]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Windows:%D0%A0%D0%B5%D1%86%D0%B5%D0%BF%D1%82%D1%8B/%D0%91%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4_%D0%B2_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%BD%D1%83%D1%8E_%D0%BF%D0%B0%D0%BF%D0%BA%D1%83_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&diff=14328615Windows:Рецепты/Быстрый переход в системную папку системы2024-02-27T18:06:48Z<p>Myagkij: </p>
<hr />
<div>{{Панель управления/Windows}}<br />
{{Myagkij-редактор}}<br />
<br />
=Быстрый переход в системную папку системы=<br />
<br />
==Проблема==<br />
<br />
Быстрый переход в системную папку системы(например:C:/Windows).<br />
<br />
==Решение==<br />
<br />
<syntaxhighlight lang="VBScript"><br />
cd %windir%<br />
</syntaxhighlight><br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
<br />
{{Навигационная таблица/Портал/Windows}}<br />
[[категория:Рецепт]]<br />
[[категория:Рецепты]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Windows:%D0%A0%D0%B5%D1%86%D0%B5%D0%BF%D1%82%D1%8B/%D0%91%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4_%D0%B2_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%BD%D1%83%D1%8E_%D0%BF%D0%B0%D0%BF%D0%BA%D1%83_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B&diff=14328606Windows:Рецепты/Быстрый переход в системную папку системы2024-02-27T18:06:18Z<p>Myagkij: Новая страница: «{{Панель управления/Windows}} {{Myagkij-редактор}} =Быстрый переход в системную папку системы= ==Проблема== Быстрый переход в системную папку системы. ==Решение== <syntaxhighlight lang="VBScript"> cd %windir% </syntaxhighlight> =См.также= =Внешние ссылки= <references /> {{Навигационная таблица/Пор...»</p>
<hr />
<div>{{Панель управления/Windows}}<br />
{{Myagkij-редактор}}<br />
<br />
=Быстрый переход в системную папку системы=<br />
<br />
==Проблема==<br />
<br />
Быстрый переход в системную папку системы.<br />
<br />
==Решение==<br />
<br />
<syntaxhighlight lang="VBScript"><br />
cd %windir%<br />
</syntaxhighlight><br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
<br />
{{Навигационная таблица/Портал/Windows}}<br />
[[категория:Рецепт]]<br />
[[категория:Рецепты]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Windows/%D0%A0%D0%B5%D1%86%D0%B5%D0%BF%D1%82%D1%8B&diff=14328596Шаблон:Windows/Рецепты2024-02-27T18:05:04Z<p>Myagkij: /* Рецепты */</p>
<hr />
<div>==Рецепты==<br />
<br />
==Командная строка==<br />
<br />
* [[Windows:Рецепты/Быстрый переход в системную папку системы|Быстрый переход в системную папку системы]]<br />
<br />
===Windows 8===<br />
<br />
* [[Windows:Рецепты/Забыли ключ Windows 8|Забыли ключ Windows 8]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/Time&diff=13937706Arduino:Библиотеки/Time2024-02-18T07:44:17Z<p>Myagkij: /* Функции */</p>
<hr />
<div>{{Arduino панель перехода}}<br />
{{Перевод от Сubewriter}}<br />
{{Myagkij-редактор}}<br />
<br />
= Библиотека Time <ref>[http://www.pjrc.com/teensy/td_libs_Time.html www.pjrc.com - Time Library]</ref><ref>[http://playground.arduino.cc/Code/Time playground.arduino.cc - Arduino Time library]</ref>=<br />
<br />
Эта библиотека позволяет '''Arduino''' следить за временем, не используя для этого стороннее оборудование. Она позволяет скетчу получать информацию о текущем времени и дате: секунде, минуте, часе, дне, месяце и годе. Кроме того, она использует временной тип данных '''time_t''' (стандартный для языка '''C'''), что позволяет без труда рассчитать истекшее время и использовать полученные временные значения на разных платформах.<br />
<br />
{{Примечание1|Теперь доступны новые версии библиотек [http://www.pjrc.com/teensy/td_libs_Time.html Time], [http://www.pjrc.com/teensy/td_libs_TimeAlarms.html TimeAlarms] и [http://www.pjrc.com/teensy/td_libs_DS1307RTC.html DS1307RTC], которые были обновлены для новых версий '''Arduino''' и совместимости с '''Arduino Due'''. Код библиотеки '''Time''' обновлен и отличается от старой библиотеки '''DateTime''', которая не работала с '''Arduino 1.6.1'''. В папке библиотеки '''Time''' также есть несколько скетчей-примеров, демонстрирующих ее использование, но для некоторых из них может потребоваться библиотека '''UDPbitewise''', скачать которую можно [https://bitbucket.org/bjoern/arduino_osc/get/tip.zip здесь].}}<br />
<br />
Дополнительную документацию ищите в файле '''«readme.txt»''', идущем в комплекте с библиотекой.<br />
<br />
== Загрузка ==<br />
<br />
Чтобы загрузить библиотеку, пройдите по [https://github.com/PaulStoffregen/Time этой ссылке], кликните на зеленую кнопку '''Clone or download''', а затем на '''Download ZIP'''. Когда '''ZIP'''-файл скачается, распакуйте его, а получившуюся папку переименуйте в '''«Time»'''. Проверьте эту папку на наличие файлов '''«Time.cpp»''' и '''«Time.h»'''.<br />
<br />
== Установка ==<br />
<br />
Чтобы использовать библиотеку, поместите распакованный '''ZIP'''-файл в папку для [[Arduino:Библиотеки|библиотек IDE Arduino]]. Чтобы узнать, где находится эта папка на '''PC''', откройте '''IDE Arduino''', кликните на '''Файл > Настройки (File > Preferences)''' – адрес папки будет указан в самом верху, в поле '''«Размещение папки скетчей» (Sketchbook location)'''. Затем перезапустите '''IDE Arduino'''. Если папки '''«libraries»''' нет, ее нужно создать. <br />
<br />
== Функции ==<br />
<br />
=== Базовые функции ===<br />
<br />
* Функция '''hour()''' считывает текущий час. Диапазон доступных значений: '''0-23'''.<br />
* Функция '''minute()''' считывает текущую минуту. Диапазон доступных значений: '''0-59'''.<br />
* Функция '''second()''' считывает текущую секунду. Диапазон доступных значений: '''0-59'''.<br />
* Функция '''day()''' считывает текущий день. Диапазон доступных значений: '''0-31'''.<br />
* Функция '''weekday()''' считывает текущий день недели. Воскресенье – это '''«1» и т.д'''.<br />
* Функция '''month()''' считывает текущий месяц. Диапазон доступных значений: '''1-12'''.<br />
* Функция '''year()''' считывает текущий год. Возвращает четырехзначную цифру ('''«2009»''', '''«2012»''' и т.д.)<br />
* Функция '''setTime(t)''' выставляет системное время на время, сохраненное в переменной '''t'''. Эту функцию можно использовать в варианте '''setTime(hr,min,sec,day,month,yr)''', где шесть аргументов в скобочках – это значения, отвечающие за час, минуту, секунду, день, месяц и год.<br />
* Функция '''adjustTime(adjustment)''' настраивает системное время при помощи добавления определенного значения.<br />
<br />
{{Внимание1|Функция '''adjustTime()''' несовместима с функцией '''setSyncProvider()''', поскольку настраивает только системное время, но не время в синхронизаторе. То есть смещение времени при использовании '''adjustTime()''' будет потеряно при следующем использовании синхронизатора. Если время сместилось вперед, то вызов '''now()''', скорее всего, причитает время от синхронизатора, чем системное время, настроенное библиотекой. Таким образом, если вы используете синхронизатор и вам нужно сосчитать настроенное время, то надеяться на '''now()''' не стоит, даже если вы вызываете эту функцию сразу после '''adjustTime()'''.}}<br />
<br />
=== Функции для работы с 12-часовым форматом ===<br />
<br />
* Функция '''hourFormat()''' переключает библиотеку в слежение за временем в 12-часовом формате.<br />
* Функция '''isAM()''' возвращает [[Arduino:Справочник языка Arduino/Константы/true|true]], если текущее время – до полудня ('''AM''').<br />
* Функция '''isPM()''' возвращает [[Arduino:Справочник языка Arduino/Константы/true|true]], если текущее время – после полудня ('''PM''').<br />
<br />
=== Для 32-битного типа данных «time_t» ===<br />
<br />
Для времени используется специальный тип данных '''time_t''', в котором хранится количество секунд, прошедших с 1 января 1970 года. Этот тип данных, состоящий из одного числа, упрощает хранение и сравнение данных о времени, потому что вам уже не приходится иметь дело с несколькими числами вроде количества дней в месяце, количества месяцев в году и т.д.<br />
<br />
Работа с этими данными осуществляется через опциональный аргумент t, который указывается в функциях для считывания времени и даты. Это предотвращает ошибки в ситуациях, к примеру, когда между считыванием минуты и секунды начинается новая минута, и итоговые значения получаются некорректными. Использование опционального параметра устраняет эту проблему.<br />
<br />
* Функция '''now()''' считывает время, прошедшее с 1 января 1970 года (в секундах).<br />
Конструкция '''time_t t = now()''' сохраняет текущее время в переменную '''t'''.<br />
* Функция '''hour(t)''' считывает час, сохраненный в переменной '''t'''.<br />
* Функция '''minute(t)''' считывает минуту, сохраненную в переменной '''t'''.<br />
* Функция '''second(t)''' считывает секунду, сохраненную в переменной '''t'''.<br />
* Функция '''day(t)''' считывает день, сохраненный в переменной '''t'''.<br />
* Функция '''weekday(t)''' считывает день недели, сохраненный в переменной '''t'''.<br />
* Функция '''month()''' считывает месяц, сохраненный в переменной '''t'''.<br />
* Функция '''year()''' считывает год, сохраненный в переменной '''t'''.<br />
<br />
Другими словами, семь функций выше конвертируют переменную типа '''time_t''' в обычную единицу измерения времени (минуту, час, месяц и пр.). Возможно, этими функциями будет пользоваться проще, чем '''BreakTime()''' и '''7'''-фрагментным аргументом '''tm''' (см. ниже).<br />
<br />
* Функция '''makeTime(tm)''' конвертирует обычные дату и время в тип данных '''time_t'''. Соответственно, возвращаемое значение – тип данных '''time_t'''. Аргумент '''tm''' – переменная типа '''TimeElements''', которая имеет следующие поля:<br />
<br />
<syntaxhighlight lang="c"><br />
tm.Second Секунды 0-59<br />
tm.Minute Минуты 0-59<br />
tm.Hour Часы 0-23<br />
tm.Wday Дни недели 0-6 (не нужно для mktime)<br />
tm.Day Дни 1-31<br />
tm.Month Месяцы 1-12<br />
tm.Year Годы 0-99 (отсчет начинается с 1970)<br />
</syntaxhighlight><br />
<br />
* Функция '''breakTime(t, tm)''' конвертирует тип данных '''time_t''' в обычные дату и время. Аргумент '''tm''' – переменная типа '''TimeElements''', имеющая 7 полей и рассчитывающаяся на основе аргумента t.<br />
<br />
=== Строковые функции ===<br />
<br />
* '''monthStr()'''<br />
* '''monthShortStr()'''<br />
* '''dayStr()'''<br />
* '''dayShortStr()'''<br />
<br />
Обратите внимание, что для этих строковых функций нужен аргумент. Он не должен быть временной меткой (к примеру, '''time_t'''), а чем-то вроде '''month()'''. То есть в итоге у вас должно получиться что-то вроде '''monthStr(month())''' или '''dayStr(weekday())'''.<br />
<br />
Смотрите также пример «Передача строки даты по последовательному порту».<br />
<br />
=== Функции для синхронизации с другими временными сервисами ===<br />
<br />
* Функция '''timeStatus()''' сообщает, было ли задано время, а также было ли оно недавно синхронизировано. Возвращает одно из следующих значений: '''timeNotSet''' (время задано не было, отсчет начат с 1 января 1970 года), '''timeNeedsSync''' (время было задано, но попытка синхронизации не удалась) и '''timeSet''' (время было задано и синхронизировано).<br />
Если функция вернула статус '''timeNotSet''', то значения для времени и даты будут некорректными. Если функция вернет один из двух других статусов ('''timeNeedsSync''' и '''timeSet'''), то возвращаемые значения можно использовать, но при статусе '''timeNeedsSync''' время, возможно, будет немного сдвинуто.<br />
* Функция '''setSyncProvider(getTimeFunction)''' настраивает время, автоматически вызывая функцию '''getTimeFunction()'''. Она считывает время у стороннего сервиса и возвращает значение типа '''time_t''' или '''«0»''' (если время неизвестно).<br />
* Функция '''setSyncInterval(interval)''' задает количество секунд между синхронизациями. Другими словами, с ее помощью настраивается, как часто вызывается функция '''getTimeFunction()'''. Аргумент '''interval''' – это, собственно, интервальный период между синхронизациями.<br />
<br />
Также в файле '''«TimeLib.h»''', который идет в комплекте с библиотекой, есть макросы для временных констант и преобразования единиц времени.<br />
<br />
==Примеры==<br />
<br />
* [[Arduino:Примеры/TimeArduinoDue|TimeArduinoDue]] - Синхронизация времени с помощью '''RTC''' (для '''Arduino Due''')<br />
* [[Arduino:Примеры/TimeGPS|TimeGPS]] - Синхронизация времени с помощью '''GPS'''<br />
* [[Arduino:Примеры/TimeNTP|TimeNTP]] - Синхронизация времени с помощью '''NTP'''-сервера<br />
* [[Arduino:Примеры/TimeNTP ESP8266WiFi|TimeNTP ESP8266WiFi]] - Синхронизация времени с помощью '''NTP'''-сервера и '''WiFi'''<br />
* [[Arduino:Примеры/TimeRTC|TimeRTC]] - Синхронизация времени с помощью '''RTC''' (для остальных '''Arduino''')<br />
* [[Arduino:Примеры/TimeRTCLog|TimeRTCLog]] - Учет изменений состояний на контактах с помощью '''RTC'''<br />
* [[Arduino:Примеры/TimeRTCSet|TimeRTCSet]] - Установка '''RTC'''-времени <br />
* [[Arduino:Примеры/TimeSerial|TimeSerial]] - Настройка [[Arduino:Библиотеки/Time|библиотеки Time]] при помощи последовательного порта<br />
* [[Arduino:Примеры/TimeSerialDateStrings|TimeSerialDateStrings]] - Настройка [[Arduino:Библиотеки/Time|библиотеки Time]] при помощи последовательного порта (со строковыми сообщениями)<br />
* [[Arduino:Примеры/TimeTeensy3|TimeTeensy3]] - Синхронизация времени с помощью '''RTC''' на '''Teensy'''<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
{{Навигационная таблица/Портал/Arduino}}<br />
<br />
<br />
<br />
[[Категория:Библиотека Time]]<br />
[[Категория:Time]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/Time&diff=13937691Arduino:Библиотеки/Time2024-02-18T07:43:56Z<p>Myagkij: </p>
<hr />
<div>{{Arduino панель перехода}}<br />
{{Перевод от Сubewriter}}<br />
{{Myagkij-редактор}}<br />
<br />
= Библиотека Time <ref>[http://www.pjrc.com/teensy/td_libs_Time.html www.pjrc.com - Time Library]</ref><ref>[http://playground.arduino.cc/Code/Time playground.arduino.cc - Arduino Time library]</ref>=<br />
<br />
Эта библиотека позволяет '''Arduino''' следить за временем, не используя для этого стороннее оборудование. Она позволяет скетчу получать информацию о текущем времени и дате: секунде, минуте, часе, дне, месяце и годе. Кроме того, она использует временной тип данных '''time_t''' (стандартный для языка '''C'''), что позволяет без труда рассчитать истекшее время и использовать полученные временные значения на разных платформах.<br />
<br />
{{Примечание1|Теперь доступны новые версии библиотек [http://www.pjrc.com/teensy/td_libs_Time.html Time], [http://www.pjrc.com/teensy/td_libs_TimeAlarms.html TimeAlarms] и [http://www.pjrc.com/teensy/td_libs_DS1307RTC.html DS1307RTC], которые были обновлены для новых версий '''Arduino''' и совместимости с '''Arduino Due'''. Код библиотеки '''Time''' обновлен и отличается от старой библиотеки '''DateTime''', которая не работала с '''Arduino 1.6.1'''. В папке библиотеки '''Time''' также есть несколько скетчей-примеров, демонстрирующих ее использование, но для некоторых из них может потребоваться библиотека '''UDPbitewise''', скачать которую можно [https://bitbucket.org/bjoern/arduino_osc/get/tip.zip здесь].}}<br />
<br />
Дополнительную документацию ищите в файле '''«readme.txt»''', идущем в комплекте с библиотекой.<br />
<br />
== Загрузка ==<br />
<br />
Чтобы загрузить библиотеку, пройдите по [https://github.com/PaulStoffregen/Time этой ссылке], кликните на зеленую кнопку '''Clone or download''', а затем на '''Download ZIP'''. Когда '''ZIP'''-файл скачается, распакуйте его, а получившуюся папку переименуйте в '''«Time»'''. Проверьте эту папку на наличие файлов '''«Time.cpp»''' и '''«Time.h»'''.<br />
<br />
== Установка ==<br />
<br />
Чтобы использовать библиотеку, поместите распакованный '''ZIP'''-файл в папку для [[Arduino:Библиотеки|библиотек IDE Arduino]]. Чтобы узнать, где находится эта папка на '''PC''', откройте '''IDE Arduino''', кликните на '''Файл > Настройки (File > Preferences)''' – адрес папки будет указан в самом верху, в поле '''«Размещение папки скетчей» (Sketchbook location)'''. Затем перезапустите '''IDE Arduino'''. Если папки '''«libraries»''' нет, ее нужно создать. <br />
<br />
== Функции ==<br />
<br />
=== Базовые функции ===<br />
<br />
* Функция '''hour()''' считывает текущий час. Диапазон доступных значений: '''0-23'''.<br />
* Функция '''minute()''' считывает текущую минуту. Диапазон доступных значений: '''0-59'''.<br />
* Функция '''second()''' считывает текущую секунду. Диапазон доступных значений: '''0-59'''.<br />
* Функция '''day()''' считывает текущий день. Диапазон доступных значений: '''0-31'''.<br />
* Функция '''weekday()''' считывает текущий день недели. Воскресенье – это '''«1» и т.д'''.<br />
* Функция '''month()''' считывает текущий месяц. Диапазон доступных значений: '''1-12'''.<br />
* Функция '''year()''' считывает текущий год. Возвращает четырехзначную цифру ('''«2009»''', '''«2012»''' и т.д.)<br />
* Функция '''setTime(t)''' выставляет системное время на время, сохраненное в переменной '''t'''. Эту функцию можно использовать в варианте '''setTime(hr,min,sec,day,month,yr)''', где шесть аргументов в скобочках – это значения, отвечающие за час, минуту, секунду, день, месяц и год.<br />
* Функция '''adjustTime(adjustment)''' настраивает системное время при помощи добавления определенного значения.<br />
<br />
'''Внимание:''' Функция '''adjustTime()''' несовместима с функцией '''setSyncProvider()''', поскольку настраивает только системное время, но не время в синхронизаторе. То есть смещение времени при использовании '''adjustTime()''' будет потеряно при следующем использовании синхронизатора. Если время сместилось вперед, то вызов '''now()''', скорее всего, причитает время от синхронизатора, чем системное время, настроенное библиотекой. Таким образом, если вы используете синхронизатор и вам нужно сосчитать настроенное время, то надеяться на '''now()''' не стоит, даже если вы вызываете эту функцию сразу после '''adjustTime()'''.<br />
<br />
=== Функции для работы с 12-часовым форматом ===<br />
<br />
* Функция '''hourFormat()''' переключает библиотеку в слежение за временем в 12-часовом формате.<br />
* Функция '''isAM()''' возвращает [[Arduino:Справочник языка Arduino/Константы/true|true]], если текущее время – до полудня ('''AM''').<br />
* Функция '''isPM()''' возвращает [[Arduino:Справочник языка Arduino/Константы/true|true]], если текущее время – после полудня ('''PM''').<br />
<br />
=== Для 32-битного типа данных «time_t» ===<br />
<br />
Для времени используется специальный тип данных '''time_t''', в котором хранится количество секунд, прошедших с 1 января 1970 года. Этот тип данных, состоящий из одного числа, упрощает хранение и сравнение данных о времени, потому что вам уже не приходится иметь дело с несколькими числами вроде количества дней в месяце, количества месяцев в году и т.д.<br />
<br />
Работа с этими данными осуществляется через опциональный аргумент t, который указывается в функциях для считывания времени и даты. Это предотвращает ошибки в ситуациях, к примеру, когда между считыванием минуты и секунды начинается новая минута, и итоговые значения получаются некорректными. Использование опционального параметра устраняет эту проблему.<br />
<br />
* Функция '''now()''' считывает время, прошедшее с 1 января 1970 года (в секундах).<br />
Конструкция '''time_t t = now()''' сохраняет текущее время в переменную '''t'''.<br />
* Функция '''hour(t)''' считывает час, сохраненный в переменной '''t'''.<br />
* Функция '''minute(t)''' считывает минуту, сохраненную в переменной '''t'''.<br />
* Функция '''second(t)''' считывает секунду, сохраненную в переменной '''t'''.<br />
* Функция '''day(t)''' считывает день, сохраненный в переменной '''t'''.<br />
* Функция '''weekday(t)''' считывает день недели, сохраненный в переменной '''t'''.<br />
* Функция '''month()''' считывает месяц, сохраненный в переменной '''t'''.<br />
* Функция '''year()''' считывает год, сохраненный в переменной '''t'''.<br />
<br />
Другими словами, семь функций выше конвертируют переменную типа '''time_t''' в обычную единицу измерения времени (минуту, час, месяц и пр.). Возможно, этими функциями будет пользоваться проще, чем '''BreakTime()''' и '''7'''-фрагментным аргументом '''tm''' (см. ниже).<br />
<br />
* Функция '''makeTime(tm)''' конвертирует обычные дату и время в тип данных '''time_t'''. Соответственно, возвращаемое значение – тип данных '''time_t'''. Аргумент '''tm''' – переменная типа '''TimeElements''', которая имеет следующие поля:<br />
<br />
<syntaxhighlight lang="c"><br />
tm.Second Секунды 0-59<br />
tm.Minute Минуты 0-59<br />
tm.Hour Часы 0-23<br />
tm.Wday Дни недели 0-6 (не нужно для mktime)<br />
tm.Day Дни 1-31<br />
tm.Month Месяцы 1-12<br />
tm.Year Годы 0-99 (отсчет начинается с 1970)<br />
</syntaxhighlight><br />
<br />
* Функция '''breakTime(t, tm)''' конвертирует тип данных '''time_t''' в обычные дату и время. Аргумент '''tm''' – переменная типа '''TimeElements''', имеющая 7 полей и рассчитывающаяся на основе аргумента t.<br />
<br />
=== Строковые функции ===<br />
<br />
* '''monthStr()'''<br />
* '''monthShortStr()'''<br />
* '''dayStr()'''<br />
* '''dayShortStr()'''<br />
<br />
Обратите внимание, что для этих строковых функций нужен аргумент. Он не должен быть временной меткой (к примеру, '''time_t'''), а чем-то вроде '''month()'''. То есть в итоге у вас должно получиться что-то вроде '''monthStr(month())''' или '''dayStr(weekday())'''.<br />
<br />
Смотрите также пример «Передача строки даты по последовательному порту».<br />
<br />
=== Функции для синхронизации с другими временными сервисами ===<br />
<br />
* Функция '''timeStatus()''' сообщает, было ли задано время, а также было ли оно недавно синхронизировано. Возвращает одно из следующих значений: '''timeNotSet''' (время задано не было, отсчет начат с 1 января 1970 года), '''timeNeedsSync''' (время было задано, но попытка синхронизации не удалась) и '''timeSet''' (время было задано и синхронизировано).<br />
Если функция вернула статус '''timeNotSet''', то значения для времени и даты будут некорректными. Если функция вернет один из двух других статусов ('''timeNeedsSync''' и '''timeSet'''), то возвращаемые значения можно использовать, но при статусе '''timeNeedsSync''' время, возможно, будет немного сдвинуто.<br />
* Функция '''setSyncProvider(getTimeFunction)''' настраивает время, автоматически вызывая функцию '''getTimeFunction()'''. Она считывает время у стороннего сервиса и возвращает значение типа '''time_t''' или '''«0»''' (если время неизвестно).<br />
* Функция '''setSyncInterval(interval)''' задает количество секунд между синхронизациями. Другими словами, с ее помощью настраивается, как часто вызывается функция '''getTimeFunction()'''. Аргумент '''interval''' – это, собственно, интервальный период между синхронизациями.<br />
<br />
Также в файле '''«TimeLib.h»''', который идет в комплекте с библиотекой, есть макросы для временных констант и преобразования единиц времени.<br />
<br />
==Примеры==<br />
<br />
* [[Arduino:Примеры/TimeArduinoDue|TimeArduinoDue]] - Синхронизация времени с помощью '''RTC''' (для '''Arduino Due''')<br />
* [[Arduino:Примеры/TimeGPS|TimeGPS]] - Синхронизация времени с помощью '''GPS'''<br />
* [[Arduino:Примеры/TimeNTP|TimeNTP]] - Синхронизация времени с помощью '''NTP'''-сервера<br />
* [[Arduino:Примеры/TimeNTP ESP8266WiFi|TimeNTP ESP8266WiFi]] - Синхронизация времени с помощью '''NTP'''-сервера и '''WiFi'''<br />
* [[Arduino:Примеры/TimeRTC|TimeRTC]] - Синхронизация времени с помощью '''RTC''' (для остальных '''Arduino''')<br />
* [[Arduino:Примеры/TimeRTCLog|TimeRTCLog]] - Учет изменений состояний на контактах с помощью '''RTC'''<br />
* [[Arduino:Примеры/TimeRTCSet|TimeRTCSet]] - Установка '''RTC'''-времени <br />
* [[Arduino:Примеры/TimeSerial|TimeSerial]] - Настройка [[Arduino:Библиотеки/Time|библиотеки Time]] при помощи последовательного порта<br />
* [[Arduino:Примеры/TimeSerialDateStrings|TimeSerialDateStrings]] - Настройка [[Arduino:Библиотеки/Time|библиотеки Time]] при помощи последовательного порта (со строковыми сообщениями)<br />
* [[Arduino:Примеры/TimeTeensy3|TimeTeensy3]] - Синхронизация времени с помощью '''RTC''' на '''Teensy'''<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
{{Навигационная таблица/Портал/Arduino}}<br />
<br />
<br />
<br />
[[Категория:Библиотека Time]]<br />
[[Категория:Time]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/Tone&diff=13937664Arduino:Библиотеки/Tone2024-02-18T07:43:16Z<p>Myagkij: </p>
<hr />
<div>{{Arduino панель перехода}}<br />
{{Перевод от Сubewriter}}<br />
{{Myagkij-редактор}}<br />
<br />
=Библиотека Tone<ref>[https://code.google.com/archive/p/rogue-code/wikis/ToneLibraryDocumentation.wiki code.google.com - ToneLibraryDocumentation.wiki]</ref>=<br />
<br />
Это библиотека для '''Arduino''', которая генерирует на любом контакте платы '''Arduino''' прямоугольные волны заданной частоты (с коэффициентом заполнения 50%). Также есть возможность задать продолжительность волны, но если этого параметра задано не будет, волна будет активна, пока в скетче не появится функция '''stop()'''. Этот контакт можно подключить к пьезодинамику или другому устройству, способному проигрывать звук. Обязательно попробуйте скетч «RTTTL»!<br />
<br />
== «Родная» библиотека Tone ==<br />
<br />
В '''Arduino''' уже есть упрощенная версия '''библиотеки Tone''', которая была внедрена вместе с версией '''0018'''. Впрочем, она позволяет сыграть лишь одну ноту (потому что используется только один таймер). Соответствующую документацию можно почитать [https://www.arduino.cc/en/Reference/Tone тут].<br />
<br />
Также имеет смысл ознакомиться с [http://itp.nyu.edu/physcomp/labs/labs-arduino-digital-and-analog/tone-output-using-an-arduino руководством], написанным '''Томом Иго (Tom Igoe)'''. В нем демонстрируется, как использовать функции tone() и noTone().<br />
<br />
{{Внимание1|Не подключайте контакт напрямую к устройствам звукового ввода. Их напряжение гораздо выше, чем у стандартных устройств с сигналом линейного уровня, поэтому может повредить входные контакты звуковой карты и прочих похожих устройств. Чтобы снизить напряжение, можно использовать делитель напряжения, но это по-прежнему не гарантирует, что оборудование останется в целости и сохранности.}}<br />
<br />
Кроме того, на одной линии с динамиком '''ДОЛЖЕН БЫТЬ''' резистор. В противном случае контроллер будет поврежден.<br />
<br />
== Загрузка и установка ==<br />
<br />
Последнюю версию библиотеки можно скачать [https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/rogue-code/Arduino-Library-Tone.zip отсюда]. Об установке библиотек читайте [[Arduino:Знакомство_с_Arduino/Установка_дополнительных_библиотек|тут]].<br />
<br />
== Подключение ==<br />
<br />
* Просто подключите цифровой контакт к динамику (к той же линии должен быть подключен резистор примерно на '''1 кОм'''), а другую сторону динамика – к '''«земле» (GND)'''.<br />
* Для регулирования громкости можно использовать потенциометр (регулируемый резистор). Для этих целей подойдет потенциометр номиналом '''10 кОм'''. Подключите его к той же линии, что и резистор на '''1 кОм''', подключенный к динамику.<br />
* Использование этой библиотеки повлияет и на выходную '''ШИМ''', так что будьте осторожны.<br />
* Хотя библиотека использует последний таймер, ее работа повлияет и на '''timer0''', который, помимо прочего, используется для функции millis().<br />
<br />
== Функции ==<br />
<br />
* Функция '''begin(pin)''' подготавливает контакт для проигрывания ноты. Аргумент '''pin''' – это номер подготавливаемого контакта.<br />
* Функция '''isPlaying()''' проверяет, проигрывается ли нота. Если проигрывается, функция возвращает [[Arduino:Справочник языка Arduino/Константы/true|true]], если нет – [[Arduino:Справочник языка Arduino/Константы/false|false]].<br />
* Функция '''play(frequency, duration)''' проигрывает ноту. Аргумент '''frequency''' – это частота ноты, а '''duration''' – это продолжительность проигрывания ноты в миллисекундах (когда это время закончится, звук автоматически замолкнет). Второй аргумент опционален, и если он не задан, нота будет проигрываться, пока в скетче не будет вызвана функция '''stop()'''. Функция '''play()''' – это неблокирующая функция. Будучи вызванной, она сразу же исполнит свою задачу.<br />
* Функция '''stop()''' останавливает проигрывание ноты.<br />
<br />
== Константы ==<br />
<br />
Ниже список констант, отвечающих за частоты нот. Они идут в комплекте с библиотекой. Эти константы указываются в качестве аргументов в функции '''play()'''. <br />
<br />
Вот сам список (здесь первая запись – это название константы, а вторая – частота ноты):<br />
<br />
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"><br />
| NOTE_B2 | 123 | | NOTE_C3 | 131 | | NOTE_CS3 | 139 | | NOTE_D3 | 147 | | NOTE_DS3 | 156 | | NOTE_E3 | 165 | | NOTE_F3 | 175 | | NOTE_FS3 | 185 | | NOTE_G3 | 196 | | NOTE_GS3 | 208 | | NOTE_A3 | 220 | | NOTE_AS3 | 233 | | NOTE_B3 | 247 | | NOTE_C4 | 262 | | NOTE_CS4 | 277 | | NOTE_D4 | 294 | | NOTE_DS4 | 311 | | NOTE_E4 | 330 | | NOTE_F4 | 349 | | NOTE_FS4 | 370 | | NOTE_G4 | 392 | | NOTE_GS4 | 415 | | NOTE_A4 | 440 | | NOTE_AS4 | 466 | | NOTE_B4 | 494 | | NOTE_C5 | 523 | | NOTE_CS5 | 554 | | NOTE_D5 | 587 | | NOTE_DS5 | 622 | | NOTE_E5 | 659 | | NOTE_F5 | 698 | | NOTE_FS5 | 740 | | NOTE_G5 | 784 | | NOTE_GS5 | 831 | | NOTE_A5 | 880 | | NOTE_AS5 | 932 | | NOTE_B5 | 988 | | NOTE_C6 | 1047 | | NOTE_CS6 | 1109 | | NOTE_D6 | 1175 | | NOTE_DS6 | 1245 | | NOTE_E6 | 1319 | | NOTE_F6 | 1397 | | NOTE_FS6 | 1480 | | NOTE_G6 | 1568 | | NOTE_GS6 | 1661 | | NOTE_A6 | 1760 | | NOTE_AS6 | 1865 | | NOTE_B6 | 1976 | | NOTE_C7 | 2093 | | NOTE_CS7 | 2217 | | NOTE_D7 | 2349 | | NOTE_DS7 | 2489 | | NOTE_E7 | 2637 | | NOTE_F7 | 2794 | | NOTE_FS7 | 2960 | | NOTE_G7 | 3136 | | NOTE_GS7 | 3322 | | NOTE_A7 | 3520 | | NOTE_AS7 | 3729 | | NOTE_B7 | 3951 | | NOTE_C8 | 4186 | | NOTE_CS8 | 4435 | | NOTE_D8 | 4699 | | NOTE_DS8 | 4978 |<br />
</syntaxhighlight><br />
<br />
К примеру, чтобы проиграть '''440 Гц''' (четвертую ноту октавы A) на '''13-ом''' контакте, понадобится следующий код:<br />
<br />
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"><br />
Tone tone1;<br />
void setup() { tone1.begin(13); tone1.play(NOTE_A4); }<br />
void loop() { }<br />
</syntaxhighlight><br />
<br />
== Подробнее о принципе работы библиотеки ==<br />
<br />
Чтобы генерировать прямоугольно-волновые ноты слышимого диапазона, '''библиотека Tone''' использует аппаратные таймеры микроконтроллера '''Arduino'''.<br />
<br />
Генерировать ноты можно на любом контакте '''Arduino'''. Количество нот, которые можно проигрывать одновременно, зависит от количества аппаратных таймеров (совместимых с '''CTC'''), имеющихся у контроллера.<br />
* '''ATmega8''': два таймера (2 и 1)<br />
* '''ATmega168/328''': три таймера (2, 1 и 0)<br />
* '''ATmega1280''': 6 таймеров (2, 3, 4, 5, 1 и 0)<br />
<br />
В скобках указан порядок распределения таймеров. Кроме того, '''timer0''' – это очень чувствительный таймер, поскольку отвечает за функцию [[Arduino:Справочник языка Arduino/Функции/Работа со временем/millis()|millis()]] и '''ШИМ'''.<br />
<br />
Диапазон частот, которые может генерировать библиотека, зависит от тактовой частоты микроконтроллера и используемого таймера. Расчет этого диапазона осуществляется следующим образом (здесь первая запись – это частота микроконтроллера, вторая – нижняя граница диапазона для '''8-битного таймера''', третья – нижняя граница для '''16-битного таймера''', а четвертая – верхняя граница частотного диапазона):<br />
<br />
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"><br />
|8 MHz |16 Hz |1 Hz (1/16 Hz) |4 MHz | <br />
|16 MHz |31 Hz |1 Hz (1/8 Hz) |8 MHz |<br />
</syntaxhighlight><br />
<br />
Хотя верхней границей частотного диапазона может быть и '''8 МГц''', верхняя граница диапазона человеческого слуха, как правило, не превышает '''20 КГц'''.<br />
<br />
Точность ноты зависит от значения, заданного для предварительного делителя частоты. Благодаря этому делению происходит квантование частоты.<br />
<br />
Если вы используете '''16-битный таймер''' (например, '''timer1''' или '''timer3''', '''timer4''', '''timer5''' на '''1280'''), то можете генерировать '''«ноты»''' до '''1/8 Гц''' (один цикл каждые 8 секунд), но '''библиотека Tone''', задавая частоты, принимает только целочисленные значения.<br />
<br />
Поскольку функция '''play()''' принимает только беззнаковые целочисленные значения, максимальной частотой, которую можно сгенерировать, будет '''65535 Гц'''. Кроме того, после округления эта цифра превращается в '''«ноту»''' с частотой '''65573,77 Гц''' (на платах с тактовой частотой в '''16 МГц'''). Следовательно, если в функции '''play()''' указать для частоты более высокие значения, вы все равно не сможете достичь результата лучше '''80 rГц''', потому что переключение контактов осуществляется на программном уровне. Причем каждое такое переключение требует '''КАК МИНИМУМ 50 с лишним циклов'''.<br />
<br />
== Сайты с рингтонами ==<br />
<br />
* http://merwin.bespin.org/db/rts/index.php<br />
* http://www.cellringtones.com/<br />
* http://nokiatone.ifrance.com/nokiatone/rtttf.htm<br />
* http://www.ringtones4all.com/index.php?page=freetone&catr=20&cnt=0<br />
* http://ringtones.frostzone.com/<br />
* http://www.2thumbswap.com/members/tones/nokia/tones_nokia_main.html<br />
* http://hem.passagen.se/klas2/vgtones/<br />
* http://arcadetones.emuunlim.com/<br />
<br />
==Примеры==<br />
<br />
* [[Arduino:Примеры/DTMFTest|DTMFTest]] - Тональный сигнал<br />
* [[Arduino:Примеры/RTTTL|RTTTL]] - '''RTTTL'''<br />
* [[Arduino:Примеры/ToneTest|ToneTest]] - Одновременное проигрывание нот<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
{{Навигационная таблица/Портал/Arduino}}<br />
<br />
<br />
<br />
[[Категория:Библиотека Tone]]<br />
[[Категория:Tone]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/LedDisplay&diff=13937640Arduino:Библиотеки/LedDisplay2024-02-18T07:42:14Z<p>Myagkij: </p>
<hr />
<div>{{Arduino панель перехода}}<br />
{{Перевод от Сubewriter}}<br />
{{Myagkij-редактор}}<br />
<br />
=Библиотека LedDisplay<ref>[http://playground.arduino.cc/Main/LedDisplay playground.arduino.cc - LedDisplay]</ref>=<br />
<br />
Эта библиотека позволяет отправлять текст на '''LED'''-дисплеи типа [http://sigma.octopart.com/23295/datasheet/Avago-HCMS-2973.pdf Avago HCMS-29xx]. Это очень маленькие дисплеи, которые состоят из одного ряда светодиодных матриц, обладающих размерами 5 на 7 светодиодов.<br />
<br />
[[File:HCMs297x_1.png|center]]<br />
<br />
Этот дисплей работает через синхронный последовательный интерфейс. Чтобы управлять им, понадобится пять выходных линий. Вот они:<br />
* '''Данные (DATA)''' – передача данных от микроконтроллера<br />
* '''Выбор регистра (RS)''' – здесь указывается регистр (для инструкций или данных)<br />
* '''Тактовая частота (CLOCK)''' – задается микроконтроллером<br />
* '''Вкл/Выкл (ENABLE)''' – включение/выключение дисплея<br />
* '''Сброс (RESET)''' – сброс дисплея<br />
<br />
Всю необходимую работу по управлению контактами и передаче данных библиотека '''LedDisplay''' делает за вас.<br />
<br />
Чтоб использовать библиотеку, скачайте [http://www.pjrc.com/teensy/arduino_libraries/LedDisplay.zip этот ZIP-файл], распакуйте его, а затем поместите в папку для библиотек '''IDE Arduino'''. Чтобы узнать, где находится эта папка, откройте '''IDE Arduino''', кликните на '''Файл > Настройки (File > Preferences)''' – адрес папки будет указан в самом верху, в поле '''«Размещение папки скетчей» (Sketchbook location)'''. Затем перезапустите '''IDE Arduino'''.<br />
<br />
{{Примечание1|Файл библиотеки зашифрован, поэтому перед использованием его нужно расшифровать. В противном случае вам будет выдавать ошибку «can not load Keyword.txt».}}<br />
<br />
Начните со скетчей-примеров, идущих вместе с библиотекой.<br />
<br />
Ниже пример цепи для использования библиотеки '''LedDisplay'''. На этой картинке, впрочем, есть ошибка: красные провода на '''3-ем''' и '''10-ом''' контактах должны быть подключены к '''+5 VDC''', а не к '''«земле»'''.<br />
<br />
[[File:HCMs297x-bb_2.png|center]]<br />
<br />
Вот схема:<br />
<br />
[[File:HCMs297x-schematic_3.png|center]]<br />
<br />
Кроме того, '''ZIP'''-файл с библиотекой также содержит файл для программы [http://fritzing.org/home/ Fritzing] со схемой '''HCMS-29xx''', который называется '''«HCMS-29xx.fzpz»'''. Пользуйтесь на здоровье.<br />
<br />
== Несколько дисплеев ==<br />
<br />
Начиная с версии 0.3 и благодаря Марку Либману (Mark Liebman) библиотека '''LedDisplay''' позволяет управлять несколькими дисплеями.<br />
<br />
Для этого соедините все линии дисплеев (кроме '''DATA''') параллельно. Линию для передачи данных можно подключить как гирлянду справа налево – чтобы данные от первого дисплея шли к данным от второго и так далее. <br />
<br />
Также убедитесь, что '''DATA'''-линия первого дисплея подключена к '''Arduino'''. Картинка ниже показывает схему подключения для трех дисплеев.<br />
<br />
[[File:HCMs297x_multiple_bb_4.png|center]]<br />
<br />
Теперь, когда все подключено, осталось лишь изменить в коде аргумент, отвечающий за длину дисплея: он должен быть суммой символов на всех дисплеях. К примеру, если у вас три дисплея, и у каждого по восемь символов, то эта сумма будет '''«24»'''.<br />
<br />
== Функции библиотеки LedDisplay ==<br />
<br />
Функция <br />
<br />
<syntaxhighlight lang="c"><br />
LedDisplay myDisplay = LedDisplay(dataPin, registerSelect, clockPin, chipEnable, resetPin, displayLength)<br />
</syntaxhighlight><br />
<br />
Создает экземпляр класса '''LedDisplay'''. Первые пять аргументов – это номера контактов '''Arduino''', подключенных к дисплею. Последний аргумент – это длина дисплея (для '''HCMS-291x''' и '''HCMS-297x''' это '''«8»''', для '''HCMS-290x''' и '''HCMS-296x''' это '''«4»'''). Тип данных – [[Arduino:Справочник языка Arduino/Типы данных/int|int]].<br />
<br />
Функция <br />
<br />
<syntaxhighlight lang="c"><br />
myDisplay.begin()<br />
</syntaxhighlight><br />
<br />
инициализирует и сбрасывает дисплей. <br />
<br />
=== Для печати ===<br />
<br />
Функция <br />
<br />
<syntaxhighlight lang="c"><br />
myDisplay.write(whatCharacter, whatPosition)<br />
</syntaxhighlight><br />
<br />
печатает указанный символ в указанной позиции дисплея. Тип данных первого аргумента – [[Arduino:Справочник языка Arduino/Типы данных/char|char]], второго – [[Arduino:Справочник языка Arduino/Типы данных/byte|byte]]. <br />
<br />
Пример: <br />
<br />
<syntaxhighlight lang="c"><br />
myDisplay.write('A', 4)<br />
</syntaxhighlight><br />
<br />
Кроме того, поскольку '''LedDisplay''' наследует у библиотеки Print функции print() и println(), их можно использовать и для печати на дисплей, но до тех пор, пока то, что вы печатаете, в него умещается. К примеру, ниже показано, как напечатать на дисплее миллисекунды и титульную строку.<br />
<br />
<syntaxhighlight lang="c"><br />
myDisplay.print("ms:");<br />
myDisplay.print(millis());<br />
</syntaxhighlight><br />
<br />
Кроме того, с их помощью можно делать и обычные для класса Print вещи:<br />
<br />
<syntaxhighlight lang="c"><br />
int myInt = 12;<br />
myDisplay.print(myInt, DEC);<br />
// или<br />
myDisplay.print(myInt, HEX);<br />
</syntaxhighlight><br />
<br />
=== Для перемещения строки ===<br />
<br />
Если вы хотите автоматически двигать текстовую строку, то вам для начала понадобится функция setString(). Этот метод сохраняет символьную строку в объекте LedControl, после чего вы можете воспользоваться функцией scroll(), чтобы двигать строку влево и вправо.<br />
<br />
Функция <br />
<br />
<syntaxhighlight lang="c"><br />
setString(stringToDisplay)<br />
</syntaxhighlight><br />
<br />
отображает строку на дисплее. Аргумент stringToDisplay – собственно, строка, которую нужно показать. Тип данных – [[Arduino:Справочник языка Arduino/Типы данных/char|char]]. Если строка длиннее дисплея, то показывается только начало строки. Затем эту строку можно двигать при помощи функции scroll().<br />
<br />
Функция <br />
<br />
<syntaxhighlight lang="c"><br />
getString()<br />
</syntaxhighlight><br />
<br />
считывает строку, показанную на дисплее. Пример: <br />
<br />
<syntaxhighlight lang="c"><br />
// считываем строку, показанную на дисплее (для отладки):<br />
Serial.println(myDisplay.getString());<br />
</syntaxhighlight><br />
<br />
Функция <br />
<br />
<syntaxhighlight lang="c"><br />
stringLenght()<br />
</syntaxhighlight><br />
<br />
считывает длину строки, показанной на дисплее. Более подробно смотрите в фрагменте ниже.<br />
<br />
Функция <br />
<br />
<syntaxhighlight lang="c"><br />
scroll(direction)<br />
</syntaxhighlight><br />
<br />
двигает изображение на экране при помощи строки, заданной функцией setString(). Тип данных – [[Arduino:Справочник языка Arduino/Типы данных/int|int]]. Если в качестве аргумента указать отрицательное число, строка будет двигаться влево, а если положительное, то вправо.<br />
<br />
Пример:<br />
<br />
<syntaxhighlight lang="c"><br />
...<br />
<br />
void setup() { <br />
<br />
...<br />
<br />
// двигаем строку, которая длиннее дисплея:<br />
myDisplay.setString("This is a very long string"); // "Это очень длинная строка"<br />
}<br />
<br />
void loop() {<br />
<br />
// если строка выходит за пределы экрана, меняем направление <br />
// движения; если строка вышла за пределы правой части экрана,<br />
// то меняем направление, когда курсор достигает 8-ой позиции,<br />
// а если влево, то когда курсор стоит на позиции, которая <br />
// меньше длины строки.<br />
if ((myDisplay.cursorPosition() > displayLength) ||<br />
(myDisplay.cursorPosition() <= -(myDisplay.stringLength()))) {<br />
myDirection = -myDirection;<br />
delay(1000);<br />
}<br />
<br />
// двигаем строку:<br />
myDisplay.scroll(myDirection);<br />
delay(100);<br />
}<br />
</syntaxhighlight><br />
<br />
=== Для управления курсором ===<br />
<br />
* Функция clear() очищает дисплей. <br />
* Функция home() ставит курсор в самую левую позицию.<br />
* Функция setCursor(whichPosition) ставит курсор в заданную позицию. Аргумент whichPosition – позиция, в которую нужно поставить курсор. Тип данных – int.<br />
* Функция getCursor() считывает позицию курсора.<br />
<br />
=== Для управления дисплеем ===<br />
<br />
* Функция setBrightness(bright) позволяет задавать яркость в диапазоне от «0» до «15». Тип данных – int. <br />
* Функция loadControlRegister(dataByte) отправляет 8 бит одному из контрольных регистров. Тип данных – int. Другими словами, напрямую передает дисплею код определенной команды (о них можно почитать в «даташите» дисплея). <br />
* Функция loadDotRegister() отправляет 320 бит регистру для хранения данных. Тип данных – int. <br />
<br />
=== Чтобы узнать версию ===<br />
<br />
Функция version() считывает номер версии библиотеки.<br />
<br />
==Примеры==<br />
<br />
* [[Arduino:Примеры/LedDisplay fade|LedDisplay fade]] - Печать функцией print() и изменение яркости дисплея<br />
* [[Arduino:Примеры/LedDisplay print|LedDisplay print]] - Печать функцией print()<br />
* [[Arduino:Примеры/LedDisplay printAnalog|LedDisplay printAnalog]] - Печать аналоговых данных<br />
* [[Arduino:Примеры/LedDisplay scroll|LedDisplay scroll]] - Перемещение строки влево/вправо<br />
* [[Arduino:Примеры/LedDisplay scroll multiple|LedDisplay scroll multiple]] - Печать на трех '''LED'''-дисплеях<br />
* [[Arduino:Примеры/LedDisplay scroll serial|LedDisplay scroll serial]] - Печать данных из последовательного порта<br />
* [[Arduino:Примеры/LedDisplay writeCharacters|LedDisplay writeCharacters]] - Печать функцией write()<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
{{Навигационная таблица/Портал/Arduino}}<br />
<br />
<br />
<br />
[[Категория:Функция]]<br />
[[Категория:Библиотека LedDisplay]]<br />
[[Категория:LedDisplay]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/GLCD&diff=13937605Arduino:Библиотеки/GLCD2024-02-18T07:40:57Z<p>Myagkij: /* Библиотека GLCD-Arduinoplayground.arduino.cc - GLCDks0108 */</p>
<hr />
<div>{{Arduino панель перехода}}<br />
{{Перевод от Сubewriter}}<br />
{{Myagkij-редактор}}<br />
<br />
<br />
<br />
=Библиотека GLCD-Arduino<ref>[http://playground.arduino.cc/Code/GLCDks0108 playground.arduino.cc - GLCDks0108]</ref>=<br />
<br />
'''Библиотека GLCD-Arduino (GLCDv3)''' – это неофициальная [[Arduino:Библиотеки|библиотека Arduino]], поддерживающая '''LCD'''-мониторы, в которых используется чип '''KS0108''' (или эквивалентный ему).<br />
<br />
{{Примечание1|Библиотека GLCDv3 больше не является рекомендуемой библиотекой.}}<br />
<br />
Разработка '''GLCDv3''' не ведется с 2012 года, и авторы не выпускали официальных релизов с декабря 2011 года. Кроме того, '''GLCDv3''' не работает на новых моделях '''Arduino''' и новых версиях '''IDE Arduino'''. Образно говоря, срок жизни '''GLCDv3''' подошел к концу.<br />
<br />
Главный автор '''GLCDv3''' теперь работает над библиотекой [https://bitbucket.org/bperrybap/openglcd/wiki/Home openGLCD]. Она более функциональна и имеет более широкую поддержку устройств. У нее есть режим совместимости с '''GLCDv3''', и она использует ту же схему соединения, что и '''GLCDv3'''.<br />
<br />
Кроме того, репозиторий на '''Google Code''', где хранится '''GLCDv3''', '''Google''' больше не поддерживает. Проекты, хранящиеся на этом сайте, были заархивированы, но функции сайта '''Google Code''' со временем будут выключаться, после чего прекратит работу и сам сайт.<br />
<br />
Поэтому использовать библиотеку '''GLCDv3''' больше не рекомендуется.<br />
<br />
На [http://code.google.com/p/glcd-arduino/ главной странице проекта] в '''Google Code''' есть упоминание насчет устаревания '''GLCDv3''', но поскольку сайт грозит исчезнуть, мы повторим его здесь:<br />
<br />
«Эта библиотека больше не поддерживается авторами, и ее не обновляли с декабря 2011 года. Кроме того, она не работает с новыми версиями '''IDE Arduino''' (вроде 1.0 и выше), потому что они используют обновленные инструменты '''AVR-GCC''', а код библиотеки '''GLCDv3''' с ними не совместим.<br />
<br />
== Альтернативы библиотеке GLCDv3 ==<br />
<br />
Если вы не против библиотеки, лицензированной '''GPL 3.0''' (то есть, если ваш проект с открытым кодом), то одной из альтернатив может стать [https://bitbucket.org/bperrybap/openglcd/wiki/Home библиотека openGLCD]. Она поддерживается разработчиками и совместима с '''GLCDv3'''.<br />
<br />
Еще одна альтернатива – это [https://code.google.com/archive/p/u8glib/ u8glib]. Она распространяется по модифицированной лицензии '''BSD''' (т.е. '''«New BSD License»''' или '''«The BSD 3-Clause License»''').<br />
<br />
Дополнительную информацию о '''GLCDv3''' можно найти по [http://forum.arduino.cc/index.php?topic=56705.msg1509585#msg1509585 этой ссылке].<br />
<br />
== О библиотеке ==<br />
<br />
Последнюю версию библиотеки '''GLCD-Arduino''' можно найти [https://code.google.com/archive/p/glcd-arduino/downloads здесь]. В комплекте с ней идет несколько скетчей-примеров и файл '''readme.txt''', которые объясняет, как добавить библиотеку, а также содержит развернутую документацию. Самую актуальную и наиболее полную документацию читайте в '''HTML'''-файле (по адресу glcd/doc/GLCDref.htm в распакованной папке библиотеки).<br />
<br />
Библиотека '''GLCD-Arduino''' обладает следующими функциями:<br />
* Поддержка '''Arduino 1.x''' (по-прежнему работает с '''IDE Arduino''' в версиях до '''1.x''')<br />
* Поддержка плат '''Mega 2560''', '''Sanguino''' и '''Teensy'''<br />
* Упрощенное назначение контактов. Любую функцию '''GLCD''' можно назначить для любого контакта платы<br />
* Аккуратная и корректная визуализация шрифтов всех размеров и в каждом пикселе<br />
* Текстовые области, определяемые пользователем<br />
* Возможность скроллинга текста вверх/вниз<br />
* Функции для кругов<br />
* Дополнительные скетчи-примеры, включая диагностический скетч<br />
* Полная документация в '''HTML'''-формате и с функцией поиска<br />
* Назначать контакты также можно при помощи '''AVR'''-порта и номера контакта (то есть в формате '''PIN_D3''') вместо номера контакта на самой '''Arduino'''<br />
* Поддержка шрифтов с фиксированной шириной (до размеров '''8 x 21''')<br />
* Функция '''CursorTo()''', которая ставит курсор в указанном месте (работает только со шрифтами с фиксированной шириной)<br />
* Функция '''DrawBitmap()''', которая показывает растровые изображения, хранящиеся во '''flash'''-памяти. В комплекте с библиотекой идет утилита на '''Processing''', которая конвертирует монохромный растровый файл в заголовочный файл и сохраняет это изображение во '''flash'''-памяти, чтобы его затем можно было использовать в функции '''DrawBitmap()'''.<br />
<br />
[[File:ks0108-small.jpg|center|Тестовый скетч, запущенный на плате max232 Freeduino, к которой подключена GLCD-панель]]<br />
<br />
Тестовый скетч, запущенный на плате '''max232 Freeduino''', к которой подключена '''GLCD'''-панель<br />
<br />
'''Библиотека GLCD''' основана на графических функциях для дисплеев с чипами '''ks0108''', написанных Фабианом Максимилианом Тьелем (Fabian Maximilian Thiele). Тьель также владеет правами на эти функции. Ссылка на сайт в его коде не работает, но вы можете приобрести копию его оригинальной работы в разделе '''«Загрузки»''' в конце этой статьи.<br />
<br />
'''Библиотека GLCD''' создана именно на основе функций Тьеля, но в результате доработки стала гибче в назначении портов и быстрее при работе с '''I/O''' контактами. Кроме того, было добавлено несколько вспомогательных функций, а интерфейс был адаптирован под '''Arduino'''. Названия функций в большинстве своем остались без изменений, чтобы облегчить портирование кода, написанного для оригинальной версии. Некоторые функции теперь используют аргументы по умолчанию – ради простоты использования.<br />
<br />
== Функции ==<br />
<br />
Ниже – список функций библиотеки '''GLCD'''. Более полную, подробную и актуальную информацию о функциях читайте в '''HTML'''-документации.<br />
<br />
* '''GLCD.Init(invert)'''. Инициализирует библиотеку. Аргумент invert отвечает за инвертирование при рисовании: если вместо него будет стоять [[Arduino:Справочник языка Arduino/Константы/false|false]], это включит режим рисования, а если [[Arduino:Справочник языка Arduino/Константы/true|true]], то режим '''«стерки»'''. Смотрите также функцию '''SetInverted()'''.<br />
* '''GLCD.GotoXY(x,y)'''. Располагает курсор на заданных координатах по x и y. Если аргументами указать '''«0»''' и '''«0»''', курсор будет выставлен в верхний левый угол экрана.<br />
* '''GLCD.ClearScreen()'''. Очищает экран '''LCD'''-дисплея.<br />
<br />
=== Рисующие функции (цвет WHITE означает стирание, а цвет BLACK – рисование; указывается вместо аргумента color): ===<br />
<br />
* '''GLCD.DrawCircle(x, y, radius, color)'''. Рисует круг с центром, расположенным по координатам '''x''' и '''y'''.<br />
* '''GLCD.DrawLine(x1,y1,x2,y2,color)'''. Рисует линию, один конец которой находится по координатам '''x1''' и '''y1''', а второй – по координатам '''x2''' и '''y2'''.<br />
* '''GLCD.DrawVertLine(x, y, length, color)'''. Рисует вертикальную линию.<br />
* '''GLCD.DrawHoriLine(x, y, length, color)'''. Рисует горизонтальную линию.<br />
* '''GLCD.DrawRect(x, y, width, height, color)'''. Рисует прямоугольник.<br />
* '''GLCD.DrawRoundRect(x, y, width, height, radius, color)'''. Тоже рисует прямоугольник, но с закругленными краями.<br />
* '''GLCD.FillRect(x, y, width, height, color)'''. Рисует закрашенный прямоугольник.<br />
* '''GLCD.InvertRect(x, y, width, height)'''. Инвертирует пиксели у заданного прямоугольника.<br />
* '''GLCD.SetInverted(invert)'''. Инвертирует режим рисования. <br />
* '''GLCD.SetDot(x, y, color)'''. Рисует точку указанного цвета в указанной локации.<br />
* '''GLCD.DrawBitmap(bitmap, x, y, color)'''. Рисует растровое изображение по указанным координатам.<br />
<br />
=== Функции для шрифтов ===<br />
<br />
* '''GLCD.SelectFont(font, color )'''. Выбирает шрифт. Если никакой цвет указан не будет, то по умолчанию будет выставлен '''BLACK'''.<br />
* '''GLCD.PutChar(character)'''. Печатает заданный символ на текущей позиции курсора.<br />
* '''GLCD.Puts(string)'''. Печатает указанную строку на текущей позиции курсора.<br />
* '''GLCD.Puts_P(string)'''. Печатает строку из программной памяти на текущей позиции курсора.<br />
* '''GLCD.PrintNumber(number)'''. Печатает десятичное значение указанного числа на текущей позиции курсора.<br />
* '''GLCD.CursorTo(x, y)'''. Базовые координаты для шрифтов с фиксированной шириной (например, для системного шрифта).<br />
<br />
== Схема соединения и настройка ==<br />
<br />
Настройка в библиотеке '''GLCD''' бывает трех типов:<br />
* Настройка библиотеки<br />
* Настройка дисплея<br />
* Настройка контактов<br />
<br />
Настройка библиотеки выполняется в файле '''«glcd_Config.h»''' (он находится в корне распакованного '''ZIP'''-архива). Ею определяется вещи вроде типа дисплея и ряда других опций. Это самый главный конфигурационный файл.<br />
<br />
Настройка дисплея отвечает за конфигурацию опций, которые характерны для разных типов дисплеев – вроде геометрии экрана, '''CS'''-линий и низкоуровневой синхронизации. Какой именно использовать файл для настройки дисплея, указывается в файле для настройки библиотеки, т.е. в '''«glcd_Config.h»'''.<br />
<br />
Настройка контактов выполняется в одном из заголовочных файлов, находящихся по адресу '''«glcd/config»'''. Каждый из этих файлов отвечает за определенный контроллер. Типы контроллеров, которые поддерживаются в текущей версии:<br />
* '''ks0108_arduino.h''' <- это для плат ATmega168 и ATmega328 <br />
* '''ks0108_mega.h''' <- это для Arduino Mega (ATmega1280/2560)<br />
* '''ks0108_Sanguino.h''' <- для Sanguino (ATmega644)<br />
* '''ks0108_Teensy.h''' <- для Teensy/Teensy++<br />
<br />
Более подробно о настройке читайте в файлах '''«readme.txt»''' и '''«glcd_Config.h»''', а также в '''HTML'''-документации. Таблица ниже построена исходя из того, что контакты у вашего дисплея назначены по умолчанию.<br />
<br />
'''Важно:''' Соединения с контактами дисплея должны быть припаяны. Если просто просунуть провода или 20-контактный гребешок в отверстия (без спайки), то правильного электрического соединения создано не будет.<br />
<br />
== Схемы соединения на самых распространенных GLCD-панелях ==<br />
<br />
{| class="wikitable"<br />
|-<br />
! Arduino 168 !! Mega !! Функция !! Распиновка A !! Распиновка B !! Распиновка C !! Распиновка D !!Инф.<br />
|-<br />
|5V || 5V || +5 вольт || 1 || !2! || !2! || 4 || <br />
|-<br />
|GND || GND || «Земля» || 2 || !1! || !1! || 3 || <br />
|-<br />
|n/a || n/a || Vo (изменение контраста; входной контакт) || 3 || 3 || 3 || 5 || Подключите к движку контрастного потенциометра (т.е. к среднему контакту)<br />
|-<br />
|8 || 22 || D0 || 4 || 7 || 7 || 9 || <br />
|-<br />
|9 || 23 || D1 || 5 || 8 || 8 || 10 || <br />
|-<br />
|10 || 24 || D2 || 6 || 9 || 9 || 11 || <br />
|-<br />
|11 || 25 || D3 || 7 || 10 || 10 || 12 || <br />
|-<br />
|4 || 26 || D4 || 8 || 11 || 11 || 13 || <br />
|-<br />
|5 || 27 || D5 || 9 || 12 || 12 || 14 || <br />
|-<br />
|6 || 28 || D6 || 10 || 13 || 13 || 15 || <br />
|-<br />
|7 || 29 || D7 || 11 || 14 || 14 || 16 || <br />
|-<br />
|14 (alog0) || 33 || CSEL1 || 12 || 15 || 16 || 1 || Выбор чипа 1<br />
|-<br />
|15 (alog1) || 34 || CSEL2 || 13 || 16 || 15 || 2 || Выбор чипа 2<br />
|-<br />
| || || Reset || 14 || 17 || 17 || || (См. примечание о контакте Reset ниже)<br />
|-<br />
|16 (alog2) || 35 || R_W || 155 || 5 || 5 || 7 || Запись / Считывание<br />
|-<br />
|17 (alog3) || 36 || D_I || 16 || 4 || 4 || 6 || Данные / Инструкция (он же RS)<br />
|-<br />
|18 (alog4) || 37 || EN || 17 || 6 || 6 || 8 || Контакт, сообщающий о том, что данные готовы для считывания<br />
|-<br />
|n/a || n/a || Vee/Vout (изменение контраста; выходной контакт) || 18 || 18 || 18 || || Подключите к одной из ножек потенциометра на 10 или 20 кОм<br />
|-<br />
|n/a || n/a || Подсветка, +5V || 19 || 19 || 19 || || Резистор на 100 или 330 ом, подключенный к +5V<br />
|-<br />
|Gnd || Gnd || Подсветка, «земля» || 20 || 20|| 20 || || <br />
|-<br />
|n/a || n/a || n/a || n/a || n/a || n/a || n/a || Подключите другую ножку контрастного потенциометра к Gnd (т.е. к «земле»)<br />
|}<br />
<br />
'''Примечание насчет сброса.''' Если '''IDE Arduino''' не может загрузить '''Arduino''', когда '''Reset'''-линия '''GLCD'''-модуля подключена к '''Reset'''-контакту '''Arduino''', смотрите раздел '''«Решение проблем»''' в конце статьи.<br />
<br />
== Дисплеи с распиновкой A ==<br />
<br />
* '''HDM64GS12L-4'''<br />
* '''Crystalfontz CFAG12864B''' (протестирован пользователем '''biomed'''). У модели '''CFAG12864B-YYH-N 18-ый''' контакт – это '''NC'''-контакт (у этой модели нет встроенного генератора отрицательного напряжения). Таким образом, в результате '''3-ий''' контакт должен быть по-прежнему подключен к центральному контакту потенциометра (на '''20 кОм'''), одна ножка которого должна быть подключена к '''+5V''' на '''Arduino''' (не к '''GND'''), а другая – к '''-5V''', которые генерируются внешним источником питания (не '''18-ым''' контактом). Кроме того, '''CSEL1''' и '''CSEL2''' нужно поменять местами, иначе левая и правая половины изображения будут перевернуты.<br />
* '''Sparkfun LCD-00710CM''' (протестирован пользователем '''biomed''')<br />
* '''NKC Electronics LCD-0022''' (тестирован пользователем '''NKC Electronics''')<br />
* '''Longtech LGM128164H''' (тестирован пользователем '''mr_lanza''')<br />
<br />
==Дисплеи с распиновкой B==<br />
<br />
* '''HDM64GS12L-5'''<br />
* '''Lumex LCM-S12864GSF''' (протестирован пользователем '''jowan''')<br />
* '''Futurlec BLUE128X64LCD''' (протестирован пользователем '''tyggerjai''')<br />
* '''AZ Displays AGM1264F''' (протестирован пользователем '''santy''')<br />
* '''Displaytech 64128A BC''' (протестирован Удо Клейном)<br />
* '''Adafruit GLCD''' (протестирован пользователем '''Things'''). Контакт '''RESET''' оставьте неподключенным, иначе будете испытывать проблемы с загрузкой.<br />
* '''DataVision DG12864-88''' (протестирован пользователем '''wglover''')<br />
* '''Topway LM12864LDW''' (протестирован пользователем '''zandaa''')<br />
* '''Satistronics RT12864J-1''' (протестирован пользователем '''doublet''')<br />
* '''Digitron SG12864J4'''. По всей видимости, '''RESET''' нужно оставить неподключенным и здесь – чтобы не было проблем с загрузкой.<br />
* '''QY-12864F''', производитель неизвестен (протестирован пользователем '''SphiNx''')<br />
* '''TM12864L-2''', производитель неизвестен (протестирован пользователем '''frantorres''')<br />
* '''12864J-1''', производитель неизвестен (протестирован пользователем '''pixelk''')<br />
* '''Huahong Technology Ltd LMG12864''' (протестирован пользователем '''yxskaft'''). У модели '''LMG-SSC12A64DRY(-H)''' желто-зеленая подсветка.<br />
* '''Sure Electronics DE-LM105''' (протестирован пользователем '''imode''')<br />
* '''Wide.hk "LCD Shield Pro + GLCD 128x64 LCD"''' (протестирован пользователем '''universam'''). '''6-контактная клавишная панель''' должна быть подключена к '''CS1 (A0)''' и '''«земле»'''!<br />
* '''NAN YA Plastics Corp LMC97S005C''' (протестирован пользователем '''serisman''')<br />
* '''SYT-12864''', производитель неизвестен (протестирован пользователем '''serisman''')<br />
<br />
==Дисплеи с распиновкой C==<br />
<br />
* '''Shenzhen Jinghua Displays Co Ltd. JM12864''' (протестирован пользователем '''macpod'''). '''3-ий''' контакт ('''Vo''') должен быть отключен. Потенциометр на дисплее управляет контрастом. К светодиоду подсветки резисторы, возможно, уже добавлены.<br />
<br />
==Дисплеи с распиновкой D==<br />
<br />
Несколько дисплеев с разрешением '''192х64''':<br />
<br />
{| class="wikitable"<br />
|-<br />
!Бренд !! Модель !! Чип !! Контраст<br />
|-<br />
|Wintek - Cascades ||WD-G1906G ||KS0108B ||От -7,5 до -10 вольт<br />
|-<br />
|Wintek – GEN ||WD-G1906G ||KS0108B ||От -7,5 до -10 вольт<br />
|-<br />
|Wintek ||WD-G1906G ||S6B0108A ||От -9,5 до -12 вольт<br />
|-<br />
|TECDIS ||Y19061 ||HD61202 ||От -7,5 до -10 вольт<br />
|-<br />
|Varitronix ||MGLS19264 ||HD61202 ||От -8,5 до -10,5 вольт<br />
|}<br />
<br />
Контрастное напряжение отрицательно по отношению к '''«земле»'''. Напряжение для подсветки – '''4,7 вольт'''. Кроме того, она требует резистор на '''10-12 ом''', подключенный к '''+5V'''. Файл '''«ks0108_Manual_Config.h»''' должен быть настроен следующим образом:<br />
<br />
<syntaxhighlight lang="c"><br />
define DISPLAY_WIDTH 192<br />
define DISPLAY_HEIGHT 64<br />
</syntaxhighlight><br />
<br />
и<br />
<br />
<syntaxhighlight lang="c"><br />
elif glcd_CHIP_COUNT == 3<br />
define glcd_CHIP0 glcdCSEL1,LOW, glcdCSEL2,LOW<br />
define glcd_CHIP1 glcdCSEL1,LOW, glcdCSEL2,HIGH<br />
define glcd_CHIP2 glcdCSEL1,HIGH, glcdCSEL2,LOW<br />
</syntaxhighlight><br />
<br />
(Будем рады, если вы добавите к этим спискам другие модели дисплеев, протестированных для работы с библиотекой '''GLCD'''. Но если вы захотите добавить к этой таблице столбец для нового типа распиновки ('''«E»''', '''«F»''', '''«G»''' и т.д.), то пожалуйста используйте буквы, идущие следующими по алфавиту и не переставляте буквы местами.)<br />
<br />
[[File:KS0108_wiring.jpg|center]]<br />
<br />
На этой картинке изображен самый распространенный тип распиновки – '''тип A'''. Ее можно использовать, чтобы проверить, как '''«даташит»''' вашего дисплея соответствует назначению контактов, перед тем, как начинать пайку. Особое внимание обратите на правильность подключения '''+5V''' и '''«земли»'''.<br />
<br />
== Подключение внешних устройств ==<br />
<br />
Большинству '''GLCD'''-панелей требуются внешний подстроечный потенциометр (для настройки контраста) и обычный резистор (чтобы ограничивать напряжение для подсветки). Схема соединения и список требуемых компонентов обычно указывается в '''«даташите»''' к '''GLCD'''-панели. Чтобы упростить подключение, можно использовать, к примеру, маленькую макетную плату с гребешком контактов и подключить ее к '''5V''', '''«земле»''' и '''Reset''', тем самым создав соединение между '''GLCD'''-панелью и '''Arduino'''. Подробнее смотрите на картинке выше.<br />
<br />
===Примечание насчет контрастного потенциометра.===<br />
<br />
Обратите особое внимание на то, как подключен контрастный потенциометр. На модулях с '''ks0108''' от подключается не так, как на обычных '''LCD'''-дисплеях типа '''hd44780'''. На них ножки контрастного потенциометра подключаются, как правило, к '''+5V''' и '''GND'''. Но на модулях с '''ks0108''' этот потенциометр (как правило, номиналом в пределах '''10-20 кОм''') используется, чтобы создать варьирующееся отрицательное напряжение от '''Vee''' к '''GND''' и тем самым питать входной сигнал на '''Vo'''. Для этого одну ножку потенциометра нужно подсоединить к '''«земле»''' (т.е. к '''GND'''), а другую – к '''Vee''' (т.е. к выходному контакту с отрицательным напряжением), благодаря чему движок (средний контакт потенциометра) получит изменямое напряжение, питающее контакт '''Vo''', управляющий контрастом '''GLCD'''-дисплея.<br />
<br />
==Изменения в назначении контактов для Arduino==<br />
<br />
Чипу '''ks0108''' нужно много контактов. Помимо линий, отвечающих за питание, ему требуется 8 контактов для передачи информации и 5 контактов для передачи команд. В идеале командные контакты должны быть на одном порту, а информационные – на другом. Впрочем, на стандартной '''Arduino''' реализовать это не так-то просто.<br />
<br />
Однако в '''3-ей''' версии библиотеки '''GLCD''' (т.е. '''GLCDv3''') процесс назначения контактов стал гибче – теперь любую команду библиотеки и любой информационный контакт можно подключить к любому контакту '''Arduino'''. Если информационные контакты будут разведены по разным портам, то код будет работать слегка медленнее, но в большинстве случаев это не так уж важно. Чтобы поменять назначение контактов, вам нужно отредактировать соответствующий конфигурационный файл, расположенный по адресу '''«glcd/config»''' (если используете '''Arduino''' на базе '''m328''', то файл называется '''ks0108.h'''). Найдите секцию, которая начинается следующим образом:<br />
<br />
<syntaxhighlight lang="c"><br />
/********************************************************/<br />
/* Configuration for assigning LCD bits to Arduino Pins */<br />
/********************************************************/<br />
</syntaxhighlight><br />
<br />
Это переводится как '''«Назначение контактов LCD для контактов Arduino»'''. Ниже указано, какие контакты будут отвечать за передачу информации, а какие-за передачу команд:<br />
<br />
<syntaxhighlight lang="c"><br />
Name Arduino pin number <br />
#define glcdData0Pin 8<br />
#define glcdData1Pin 9<br />
#define glcdData2Pin 10<br />
#define glcdData3Pin 11<br />
#define glcdData4Pin 4<br />
#define glcdData5Pin 5<br />
#define glcdData6Pin 6<br />
#define glcdData7Pin 7<br />
#define glcdCSEL1 14 (Analog pin 0)<br />
#define glcdCSEL2 15 (Analog pin 1) <br />
#define glcdRW 16 (Analog pin 2) <br />
#define glcdDI 17 (Analog pin 3) <br />
#define glcdEN 18 (Analog pin 4)<br />
</syntaxhighlight><br />
<br />
Все эти контакты и команды можно назначить для любого контакта '''Arduino''' (если только они не используются для чего-то еще). В процессоре '''m328''' контакты распределены по портам следующим образом:<br />
* '''Порт B''' – c 8 по 13<br />
* '''Порт C''' – с 14 по 19 (аналоговые контакты)<br />
* '''Порт D''' – с 0 по 7 (обратите внимание, что 0-ой и 1-ый контакты используются для аппаратного последовательного порта)<br />
<br />
Хотя любой контакт '''Arduino''' можно использовать для любого информационного контакта '''GLCD''', если контакты '''Arduino''' находятся в одном порте и в последовательном порядке, то работают чуть более эффективно. <br />
<br />
Назначение контактов, указанное в конфигурационном файле по умолчанию, как раз оптимизировано под эту эффективность.<br />
<br />
Впрочем, в ряде случаев переназначение контактов все же имеет смысл. Так, для '''glcdEN''' можно назначить не '''18-ый''', а какой-то другой контакт, чтобы на '''m328'''-плате можно было задействовать интерфейс '''I2C'''.<br />
<br />
==Решение проблем==<br />
<br />
===На дисплее не видны пиксели:===<br />
* Проверьте подключения '''+5V''' и '''GND''' между '''Arduino''' и '''GLCD'''-панелью<br />
* Проверьте, правильно ли подключены контакты для передачи информации и команд<br />
* Проверьте напряжение (оно должно быть, как правило, между '''-3''' и '''-4''' вольтами) на контакте, при помощи которого меняется контраст на '''GLCD'''-панели. Когда скетч будет запущен, попробуйте постепенно настраивать диапазон контрастного потенциометра. Некоторые дисплеи очень чувствительны к этой настройке.<br />
* Проверьте, хорошо ли скомпилировался скетч и загрузился ли он на '''Arduino'''<br />
<br />
=== Левая и правая стороны изображения инвертированы. ===<br />
<br />
* Поменяйте местами провода '''CSEL1''' и '''CSEL2''' (или поменяйте местами эти контакты в конфигурационном файле)<br />
<br />
=== Искаженное изображение. ===<br />
<br />
* Проверьте, правильно ли подключены контакты для передачи информации и команд, а также соответствуют ли эти подключения настройкам в конфигурационном файле.<br />
<br />
===Не загружается скетч.===<br />
<br />
* Попробуйте запустить '''GLCD'''-панель, но ничего не подключайте к ее '''Reset'''-линии<br />
* Попробуйте подключить '''Reset'''-линию '''GLCD'''-дисплея к '''Vсс'''<br />
* Включите '''Reset'''-функционал библиотеки<br />
<br />
==Примечание насчет Reset-контакта у GLCD-панели.==<br />
<br />
Если подключить '''GLCD'''-панель к '''Reset'''-линии '''Arduino''', это может вызвать конфликт между '''Reset'''-контактом '''GLCD'''-панели и цепью '''Arduino''', отвечающей за автосброс. Дело в том, что эта цепь довольно нестабильна. В результате у большинства '''GLCD'''-панелей при запуске будет происходить автоматический сброс, и в таком случае '''Reset'''-линию '''GLCD'''-панели лучше оставить неподключенной. Все остальные '''GLCD'''-панели будут работать нормально, если подключить их '''Reset'''-линию к '''Vcc'''. Кроме того, есть и третья группа – небольшой процент '''GLCD'''-панелей, которым все же нужен импульс сброса. В этом случае нужно воспользоваться библиотекой, и с ее помощью назначить для сброса другой контакт '''Arduino'''. Для этого отредактируйте конфигурационный файл для контактов и уберите комментирующие слеши у этой строчки:<br />
<br />
<syntaxhighlight lang="c"><br />
// Reset Bit - uncomment the next line if reset is connected to an output pin //#define glcdRES 19 // Reset Bit<br />
</syntaxhighlight><br />
<br />
Затем подключите контакт '''Aruino''', указанный как '''glcdRES''', к '''Reset'''-контакту '''GLCD'''-панели.<br />
<br />
Если у вас по-прежнему какие-то проблемы, об их решении можно спросить на форумах (ссылки см. ниже).<br />
<br />
==Использование и модификация библиотек==<br />
<br />
Об установке библиотек читайте [http://wikihandbk.com/wiki/Arduino:Знакомство_с_Arduino/Установка_дополнительных_библиотек тут], о модификации – [https://www.arduino.cc/en/Hacking/LibraryTutorial тут].<br />
<br />
==Создание собственных иконок и шрифтов==<br />
<br />
Есть бесплатная программа на '''Java''', позволяющая конвертировать любой из '''PC'''-шрифтов в формат, используемый библиотекой '''GLCD'''. Она называется '''FontCreator2''' и создает заголовочный файл со шрифтом, который при подключении к скетчу сохраняется в программной памяти. Более подробно читайте в '''HTML'''-документации. Дополнительные шрифты можно найти в интернете.<br />
<br />
==Добавление изображений в прошивку==<br />
<br />
Скетч на '''Processing''', идущий в комплекте с библиотекой, предназначен для конвертации растровых файлов в изображения, которые библиотека '''GLCD''' может отображать на '''GLCD'''-панели. Более подробно читайте в документации, которая идет в комплекте с библиотекой.<br />
<br />
==Загрузки==<br />
<br />
* [http://www.lcdinfo.com/lcd/datasheets/ks0108b.pdf «Даташит» с характеристиками чипа KS0108]<br />
* [https://code.google.com/archive/p/glcd-arduino/downloads Программа FontCreator2 для создания шрифтов и символов, используемых библиотекой GLCD]<br />
* [http://www.scienceprog.com/wp-content/uploads/2007/07/glcd_ks0108.zip Оригинальный код, написанный Фабианом Максимилианом Тьелем]<br />
* [https://code.google.com/archive/p/m2tklib/ Библиотека m2tklib – библиотека, расширяющая GUI (графический пользовательский интерфейс) для GLCD]<br />
<br />
==Вопросы, комментарии и предложения==<br />
<br />
* [http://forum.arduino.cc/index.php/topic,20137.0.html#0 Дискуссия на форуме Arduino, посвященная ks0108/GLCDv2]<br />
* [http://forum.arduino.cc/index.php/topic,56705.0.html Дискуссия на форуме Arduino, посвященная GLCDv3]<br />
* [https://code.google.com/archive/p/glcd-arduino/ Страница GLCDv3 на Google Code]<br />
<br />
==Примеры==<br />
<br />
* [[Arduino:Примеры/BigNums|BigNums]] - Использование текстовых областей<br />
* [[Arduino:Примеры/clockFace|clockFace]] - Аналоговые часы<br />
* [[Arduino:Примеры/GLCDdemo|GLCDdemo]] - Пример работы нескольких графических функций<br />
* [[Arduino:Примеры/GLCDdiags|GLCDdiags]] - Тест памяти и интерфейса '''GLCD'''-модуля<br />
* [[Arduino:Примеры/HelloWorld|HelloWorld]] - '''«Привет, мир!»'''<br />
* [[Arduino:Примеры/ks0108example|ks0108example]] - Пример работы нескольких графических функций (версия для '''ks0108''')<br />
* [[Arduino:Примеры/life|life]] - Игра '''«Жизнь»''' <br />
* [[Arduino:Примеры/Rocket|Rocket]] - Игра '''«Ракета»''' <br />
* [[Arduino:Примеры/Serial2GLCD|Serial2GLCD]] - Показ символов, введенных через монитор порта<br />
* [[Arduino:Примеры/GLCD BigDemo|GLCD BigDemo]] - Большое демо<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
{{Навигационная таблица/Портал/Arduino}}<br />
<br />
<br />
<br />
[[Категория:Функция]]<br />
[[Категория:Библиотека GLCD]]<br />
[[Категория:GLCD]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/CapacitiveSensing&diff=13937580Arduino:Библиотеки/CapacitiveSensing2024-02-18T07:39:57Z<p>Myagkij: /* Загрузка */</p>
<hr />
<div>{{Arduino панель перехода}}<br />
{{Перевод от Сubewriter}}<br />
{{Myagkij-редактор}}<br />
<br />
=Библиотека CapacitiveSensor<ref>[http://playground.arduino.cc/Main/CapacitiveSensor?from=Main.CapSense playground.arduino.cc - CapacitiveSensor]</ref>=<br />
<br />
'''Библиотека CapacitiveSensor''' позволяет сделать из двух (или более) контактов '''Arduino''' емкостный датчик, способный определять электроемкость человеческого тела. Для создания такого датчика понадобятся резистор, провод и алюминиевая фольга. Будучи настроенным на наибольшую чувствительность, этот датчик начнет определять близость руки или человеческого тела в нескольких сантиметрах от себя.<br />
<br />
'''Версия 04''' добавляет поддержку '''Arduino 1.0''', а также исправляет ошибку с малопонятным состоянием гонки, которое может возникнуть с [[Arduino:Библиотеки/Tone|Tone]], [[Arduino:Библиотеки/Servo|Servo]] и другими библиотеками, использующими прерывания.<br />
<br />
'''Версия 03''' была обновлена до '''C++''' и поддерживает работу нескольких входных контактов. Она также добавляет несколько вспомогательных функций, которые упрощают изменение таймаута. <br />
<br />
== Загрузка ==<br />
<br />
'''Версию 05''', поддерживающую '''Arduino Due''' и другие платы без '''AVR''', можно скачать [https://github.com/PaulStoffregen/CapacitiveSensor отсюда].<br />
<br />
{{Примечание1|<br />
Измерение электроемкости применяется в ситуациях, когда желательно, чтобы человек не прикасался к определенной поверхности. Таким образом, при помощи Arduino, библиотеки CapacitiveSensor и изоляционного материала (пластика, дерева, керамики и пр., но не металла) можно сделать так, чтобы датчик чувствовал прикосновение за полсантиметра от себя. Кроме того, это позволяет замаскировать датчик. <br />
<br />
Емкостный датчик, покрытый бумагой или другим изолятором, также может работать в качестве неплохого датчика давления (с примерно экспоненциальным откликом). В некоторых приложениях он даже превосходит даже силоизмерительные резисторы.<br />
}}<br />
<br />
== Как это работает ==<br />
<br />
[[File:CapSense.jpg|center]]<br />
<br />
Функция '''capasitiveSensor()''' переключает отправляющий контакт платы в новое состояние, а затем ждет, пока принимающий контакт не примет то же состояние, что и отправляющий контакт. Чтобы синхронизировать изменение состояния у принимающего контакта, внутри цикла [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while()]] увеличивается специальная переменная. После этого функция возвращает значение переменной (в произвольных единицах измерения).<br />
<br />
[https://www.youtube.com/watch?v=BHQPqQ_5ulc Короткое демонстрационное видео (YouTube)]<br />
<br />
Чтобы сконструировать датчик, потребуется резистор (номиналом '''от 100 кОм до 50 МОм'''), стоящий между отправляющим и принимающим (сенсорным) контактами. Принимающий контакт – это крайняя часть датчика. Датчик можно усовершенствовать, подключив к принимающему контакту кусочек алюминиевой фольги (при помощи провода). В большинстве приложений датчик лучше покрыть бумагой, пластиком или другим изоляционным материалом – это обеспечит наилучший диапазон значений, определяемых датчиком, и позволит сделать так, чтобы пользователи не касались металлической фольги. Как показывает практика, для стабильности работы системы и повторяемости результатов между сенсорным контактом и «землей» имеет смысл поставить небольшой конденсатор (на '''100 пФ''').<br />
<br />
Если изменится состояние у отправляющего контакта, то оно в конце концов изменится и у принимающего контакта. Задержка между изменениями значений у отправляющего и принимающего контактов определяется константой '''RC (R х C)''', где '''R''' – это значение резистора, а '''C''' – электроемкость принимающего контакта плюс любая другая электроемкость (например, от взаимодействия с человеческим телом), представленная на сенсорном (принимающем) контакте. Крайне желательно также подключить параллельно с человеческим телом маленький конденсатор ('''20-400 пФ''') – это должно стабилизировать считываемые значения. <br />
<br />
== Функции ==<br />
<br />
Библиотека содержит три главных функции и несколько вспомогательных функций.<br />
<br />
<syntaxhighlight lang="c"><br />
CapacitiveSensor CapacitiveSensor(byte sendPin, byte receivePin)<br />
</syntaxhighlight><br />
<br />
Создает экземпляр библиотеки. Пожалуйста, обратите внимание на заглавные буквы – этим настоящая функция отличается от функции ниже.<br />
<br />
<syntaxhighlight lang="c"><br />
long capacitiveSensorRaw(byte samples)<br />
</syntaxhighlight><br />
<br />
Требует всего один параметр ('''samples''') и возвращает значение типа [[Arduino:Справочник языка Arduino/Типы данных/long|long]] – абсолютную электроемкость (в произвольных единицах измерения). Параметр '''samples''' используется, чтобы увеличить разрешение возвращаемого значения (т.е. повысить частоту считывания данных), но в ущерб снижения производительности. Кроме того, возвращаемое значение – это не среднее от всех значений (т.е. '''samples'''), а их общая сумма.<br />
<br />
Если значение с электроемкостью будет выше значения '''CS_Timeout_Millis''' (в миллисекундах), то '''capacitiveSensorRaw()''' вернет значение '''«-2»'''. По умолчанию значение для '''CS_Timeout_Millis''' составляет '''2000 миллисекунд (2 секунды)'''.<br />
<br />
<syntaxhighlight lang="c"><br />
long capacitiveSensor(byte samples)<br />
</syntaxhighlight><br />
<br />
Требует всего один параметр ('''samples''') и возвращает значение типа [[Arduino:Справочник языка Arduino/Типы данных/long|long]] – добавленную (измеренную) электроемкость (в произвольных единицах измерения). Отслеживает нижайшее значение базовой (т.е. когда на датчик ничего не влияет) электроемкости, а затем вычитает ее из добавленной (т.е. когда на датчик начинает что-то влиять) электроемкости. Следовательно, если на датчик ничто не влияет, эта функция должна показывать низкие значения.<br />
<br />
'''Базовая электроемкость''' – это значение, которое постоянно калибруется по интервалам, заданным в значении '''CS_Autocal_Millis'''. По умолчанию это значение составляет '''200000 миллисекунд (20 секунд)'''. Эту рекалибровку можно выключить, задав в '''CS_Autocal_Millis''' максимальное значение при помощи функции '''set_CS_Autocal_Millis()'''.<br />
<br />
<syntaxhighlight lang="c"><br />
void set_CS_Timeout_Millis(unsigned long timeout_millis)<br />
</syntaxhighlight><br />
<br />
Используется, чтобы задать значение '''CS_Timeout_Millis''', то есть таймаут, который запускается, когда принимающего (сенсорного) контакта не получается переключиться в то же состояние, что и отправляющий контакт. Этот таймаут необходим, потому что если его не будет, то цикл [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while()]] заблокирует работу скетча. По умолчанию значение '''CS_Timeout_Millis''' составляет '''2000 миллисекунды (2 секунды)'''.<br />
<br />
<syntaxhighlight lang="c"><br />
void reset_CS_AutoCal()<br />
</syntaxhighlight><br />
<br />
Используется, чтобы запустить принудительную калибровку функции '''capacitiveSensor()'''.<br />
<br />
<syntaxhighlight lang="c"><br />
void set_CS_Autocal_Miilis(unsigned long autoCal_millis)<br />
</syntaxhighlight><br />
<br />
Используется, чтобы задать интервал для рекалибровки базового значения, используемого в функции '''long capacitiveSensor()'''. Рекалибровку можно выключить, выставив значение '''CS_AutocaL_Millis''' на '''«0xFFFFFFFF»'''.<br />
<br />
==Выбор резистора==<br />
<br />
Ниже небольшое руководство для выбора резистора, но для достижения наилучшего результата также есть смысл поэкспериментировать самостоятельно.<br />
* Чтобы датчик чувствовал прикосновение, используйте резистор на '''1 МОм''' (или меньше)<br />
* Чтобы датчик чувствовал человеческое тело на расстоянии в '''10-15 см''', используйте резистор на '''40 МОм'''<br />
* Чтобы датчик чувствовал человеческое тело на расстоянии в '''30-60 см''', используйте резистор на '''40 МОм''' (зависит от размера фольги). Впрочем, резисторы на '''40 МОм''' встречаются нечасто, поэтому вы можете просто припаять четыре резистора на '''10 МОм'''<br />
* Один из негативных побочных эффектов больших резисторов заключается в том, что повышение чувствительности замедляет работу датчика. Кроме того, если измеряющая часть датчика – это ничем не прикрытый металл, то может случиться так, что отправляющий контакт никогда не сможет поменять состояние на принимающем (сенсорном) контакте. В результате датчик будет постоянно находиться в состоянии ожидания.<br />
* Также имеет смысл поэкспериментировать с подключением между «землей» и принимающим (сенсорным) контактом маленького конденсатора ('''100 пФ – 1 мкФ'''). Он должен повысить стабильность датчика.<br />
Обратите внимание, что принимающих контактов может быть несколько (для оперирования несколькими датчиками), а отправляющий – только один. Более подробно смотрите в скетче-примере.<br />
<br />
==Заземление и другие известные проблемы==<br />
<br />
Создавая конструкцию для измерения электроемкости, очень важно заземлить плату '''Arduino'''. Достаточно даже цепи с низким сопротивлением вроде провода, подключенного к водопроводной трубе.<br />
<br />
Кроме того, измерению электроемкости может помешать ноутбук, не подключенный к сети энергопитания. Ноутбук сам становится чем-то вроде датчика, поэтому поднесение руки к ноутбуку будет влиять на возвращаемое значение.<br />
<br />
Чтобы все работало правильно, обычно достаточно просто подключить к ноутбуку зарядный шнур. Другое решение – подключить '''«землю»''' '''Arduino''' к грунтовому заземлению (например, к водопроводной трубе). <br />
<br />
Еще одно решение (по крайней мере, на один раз) – это подложить под сенсорной фольгой (изолированной пластиком, бумагой и т.д.) другой кусочек фольги, а затем подключить его проводом к '''«земле»'''. Это должно стабилизировать значения датчика и резко увеличить его чувствительность.<br />
<br />
==Потенциометры типа «scroll wheel»==<br />
<br />
Для успешной работы с так называемыми '''«scroll wheel»''' (можно перевести как '''«колесиковые потенциометры»'''; это разновидность линейных потенциометров) достаточно двух контактов и цепи транзисторов. Базовую схему можно наблюдать в даташите датчика '''Quantum Scrollwheel'''.<br />
<br />
Код выстраивается примерно так:<br />
<br />
<syntaxhighlight lang="c"><br />
CapacitiveSensor Left32 = CapacitiveSensor(3, 2); // провод от 2-ого контакта к левой стороне цепи резисторов<br />
CapacitiveSensor Right23 = CapacitiveSensor(2, 3); // провод от 3-его контакта к правой стороне цепи резисторов<br />
</syntaxhighlight><br />
<br />
То есть здесь '''2-ой''' и '''3-ий''' контакты меняются своими ролями, становясь то принимающими, то отправляющими. Кроме того, мы имеем дело с цепью линейно подключенных резисторов, поэтому приближение пальца к отправляющему контакту будет давать более низкие значения – дело в снижении сопротивления из-за того, что источник электроемкости находится, как правило, вне цепи.<br />
<br />
Таким образом, если мы будем двигать палец от одного контакта к другому и два раза вызовем функцию '''capacitiveSensorRaw()''', то получим два дополнительных значения. Сложность в том, что когда вы пытаетесь измерить электроемкость (т.е. определить, насколько близким и сильным был контакт с человеческим телом), из-за влияния которой два этих значения уменьшаются или увеличиваются, то это изменение не обязательно будет происходить линейно.<br />
<br />
В скором времени разработчики обещают выложить скетч, иллюстрирующий этот пример.<br />
<br />
==Сообщения об ошибках==<br />
<br />
Если указать неправильный параметр с контактом, то '''capacitiveSensor()''' и '''capacitiveSensorRaw()''' должны вернуть '''«-1»''', но на момент написания этой статьи эта функция еще не работает.<br />
<br />
Если запустится таймаут, то '''capacitiveSensor()''' и '''capacitiveSensorRaw()''' должны вернуть '''«-2»'''. Это происходит при превышении ограничения, заданного в '''CS_Timeout_Millis''', которое по умолчанию составляет '''2000 миллисекунд (2 секунды)'''. Зачастую это происходит из-за недостающего резистора или резистора, подключенного к неправильному контакту. Кроме того, это может быть вызвано самим датчиком, который заземлен или подключен к '''+5V'''.<br />
<br />
Таймаут необходим, поскольку цикл [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while()]], осуществляющий синхронизацию функции '''CapacitiveSensor()''', заблокирует скетч (функция никогда ничего не вернет), если, к примеру, между отправляющим и принимающим контактом не будет подключено резистора.<br />
<br />
==Установка==<br />
<br />
Загрузите '''ZIP'''-файл с библиотекой по [https://github.com/PaulStoffregen/CapacitiveSensor/archive/master.zip этой ссылке]. Распакуйте библиотеку и поместите ее по адресу '''«Документы/Arduino/libraries»'''. Далее, чтобы добавить в новый скетч библиотеку '''CapacitiveSensor''', кликните в '''IDE Arduino''' на '''Скетч > Подключить библиотеку > CapacitiveSensor (Sketch > Include Library > CapacitiveSensor)'''.<br />
<br />
==Примеры==<br />
<br />
* [[Arduino:Примеры/Demo Sketch|Demo Sketch]] - Демо-скетч [[Arduino:Библиотеки/CapacitiveSensing|библиотеки CapacitiveSensor]]<br />
* [[Arduino:Примеры/Threshold|Threshold]] - Установление порога для запуска события<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
{{Навигационная таблица/Портал/Arduino}}<br />
<br />
<br />
<br />
[[Категория:Функция]]<br />
[[Категория:Библиотека CapacitiveSensing]]<br />
[[Категория:CapacitiveSensing]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/CapacitiveSensing&diff=13937495Arduino:Библиотеки/CapacitiveSensing2024-02-18T07:35:39Z<p>Myagkij: /* Загрузка */</p>
<hr />
<div>{{Arduino панель перехода}}<br />
{{Перевод от Сubewriter}}<br />
{{Myagkij-редактор}}<br />
<br />
=Библиотека CapacitiveSensor<ref>[http://playground.arduino.cc/Main/CapacitiveSensor?from=Main.CapSense playground.arduino.cc - CapacitiveSensor]</ref>=<br />
<br />
'''Библиотека CapacitiveSensor''' позволяет сделать из двух (или более) контактов '''Arduino''' емкостный датчик, способный определять электроемкость человеческого тела. Для создания такого датчика понадобятся резистор, провод и алюминиевая фольга. Будучи настроенным на наибольшую чувствительность, этот датчик начнет определять близость руки или человеческого тела в нескольких сантиметрах от себя.<br />
<br />
'''Версия 04''' добавляет поддержку '''Arduino 1.0''', а также исправляет ошибку с малопонятным состоянием гонки, которое может возникнуть с [[Arduino:Библиотеки/Tone|Tone]], [[Arduino:Библиотеки/Servo|Servo]] и другими библиотеками, использующими прерывания.<br />
<br />
'''Версия 03''' была обновлена до '''C++''' и поддерживает работу нескольких входных контактов. Она также добавляет несколько вспомогательных функций, которые упрощают изменение таймаута. <br />
<br />
== Загрузка ==<br />
<br />
'''Версию 05''', поддерживающую '''Arduino Due''' и другие платы без '''AVR''', можно скачать [https://github.com/PaulStoffregen/CapacitiveSensor отсюда].<br />
<br />
{{Примечание1|<br />
Измерение электроемкости применяется в ситуациях, когда желательно, чтобы человек не прикасался к определенной поверхности. Таким образом, при помощи '''Arduino''', '''библиотеки CapacitiveSensor''' и изоляционного материала (пластика, дерева, керамики и пр., но не металла) можно сделать так, чтобы датчик чувствовал прикосновение за полсантиметра от себя. Кроме того, это позволяет замаскировать датчик. <br />
<br />
Емкостный датчик, покрытый бумагой или другим изолятором, также может работать в качестве неплохого датчика давления (с примерно экспоненциальным откликом). В некоторых приложениях он даже превосходит даже силоизмерительные резисторы.<br />
}}<br />
<br />
== Как это работает ==<br />
<br />
[[File:CapSense.jpg|center]]<br />
<br />
Функция '''capasitiveSensor()''' переключает отправляющий контакт платы в новое состояние, а затем ждет, пока принимающий контакт не примет то же состояние, что и отправляющий контакт. Чтобы синхронизировать изменение состояния у принимающего контакта, внутри цикла [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while()]] увеличивается специальная переменная. После этого функция возвращает значение переменной (в произвольных единицах измерения).<br />
<br />
[https://www.youtube.com/watch?v=BHQPqQ_5ulc Короткое демонстрационное видео (YouTube)]<br />
<br />
Чтобы сконструировать датчик, потребуется резистор (номиналом '''от 100 кОм до 50 МОм'''), стоящий между отправляющим и принимающим (сенсорным) контактами. Принимающий контакт – это крайняя часть датчика. Датчик можно усовершенствовать, подключив к принимающему контакту кусочек алюминиевой фольги (при помощи провода). В большинстве приложений датчик лучше покрыть бумагой, пластиком или другим изоляционным материалом – это обеспечит наилучший диапазон значений, определяемых датчиком, и позволит сделать так, чтобы пользователи не касались металлической фольги. Как показывает практика, для стабильности работы системы и повторяемости результатов между сенсорным контактом и «землей» имеет смысл поставить небольшой конденсатор (на '''100 пФ''').<br />
<br />
Если изменится состояние у отправляющего контакта, то оно в конце концов изменится и у принимающего контакта. Задержка между изменениями значений у отправляющего и принимающего контактов определяется константой '''RC (R х C)''', где '''R''' – это значение резистора, а '''C''' – электроемкость принимающего контакта плюс любая другая электроемкость (например, от взаимодействия с человеческим телом), представленная на сенсорном (принимающем) контакте. Крайне желательно также подключить параллельно с человеческим телом маленький конденсатор ('''20-400 пФ''') – это должно стабилизировать считываемые значения. <br />
<br />
== Функции ==<br />
<br />
Библиотека содержит три главных функции и несколько вспомогательных функций.<br />
<br />
<syntaxhighlight lang="c"><br />
CapacitiveSensor CapacitiveSensor(byte sendPin, byte receivePin)<br />
</syntaxhighlight><br />
<br />
Создает экземпляр библиотеки. Пожалуйста, обратите внимание на заглавные буквы – этим настоящая функция отличается от функции ниже.<br />
<br />
<syntaxhighlight lang="c"><br />
long capacitiveSensorRaw(byte samples)<br />
</syntaxhighlight><br />
<br />
Требует всего один параметр ('''samples''') и возвращает значение типа [[Arduino:Справочник языка Arduino/Типы данных/long|long]] – абсолютную электроемкость (в произвольных единицах измерения). Параметр '''samples''' используется, чтобы увеличить разрешение возвращаемого значения (т.е. повысить частоту считывания данных), но в ущерб снижения производительности. Кроме того, возвращаемое значение – это не среднее от всех значений (т.е. '''samples'''), а их общая сумма.<br />
<br />
Если значение с электроемкостью будет выше значения '''CS_Timeout_Millis''' (в миллисекундах), то '''capacitiveSensorRaw()''' вернет значение '''«-2»'''. По умолчанию значение для '''CS_Timeout_Millis''' составляет '''2000 миллисекунд (2 секунды)'''.<br />
<br />
<syntaxhighlight lang="c"><br />
long capacitiveSensor(byte samples)<br />
</syntaxhighlight><br />
<br />
Требует всего один параметр ('''samples''') и возвращает значение типа [[Arduino:Справочник языка Arduino/Типы данных/long|long]] – добавленную (измеренную) электроемкость (в произвольных единицах измерения). Отслеживает нижайшее значение базовой (т.е. когда на датчик ничего не влияет) электроемкости, а затем вычитает ее из добавленной (т.е. когда на датчик начинает что-то влиять) электроемкости. Следовательно, если на датчик ничто не влияет, эта функция должна показывать низкие значения.<br />
<br />
'''Базовая электроемкость''' – это значение, которое постоянно калибруется по интервалам, заданным в значении '''CS_Autocal_Millis'''. По умолчанию это значение составляет '''200000 миллисекунд (20 секунд)'''. Эту рекалибровку можно выключить, задав в '''CS_Autocal_Millis''' максимальное значение при помощи функции '''set_CS_Autocal_Millis()'''.<br />
<br />
<syntaxhighlight lang="c"><br />
void set_CS_Timeout_Millis(unsigned long timeout_millis)<br />
</syntaxhighlight><br />
<br />
Используется, чтобы задать значение '''CS_Timeout_Millis''', то есть таймаут, который запускается, когда принимающего (сенсорного) контакта не получается переключиться в то же состояние, что и отправляющий контакт. Этот таймаут необходим, потому что если его не будет, то цикл [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while()]] заблокирует работу скетча. По умолчанию значение '''CS_Timeout_Millis''' составляет '''2000 миллисекунды (2 секунды)'''.<br />
<br />
<syntaxhighlight lang="c"><br />
void reset_CS_AutoCal()<br />
</syntaxhighlight><br />
<br />
Используется, чтобы запустить принудительную калибровку функции '''capacitiveSensor()'''.<br />
<br />
<syntaxhighlight lang="c"><br />
void set_CS_Autocal_Miilis(unsigned long autoCal_millis)<br />
</syntaxhighlight><br />
<br />
Используется, чтобы задать интервал для рекалибровки базового значения, используемого в функции '''long capacitiveSensor()'''. Рекалибровку можно выключить, выставив значение '''CS_AutocaL_Millis''' на '''«0xFFFFFFFF»'''.<br />
<br />
==Выбор резистора==<br />
<br />
Ниже небольшое руководство для выбора резистора, но для достижения наилучшего результата также есть смысл поэкспериментировать самостоятельно.<br />
* Чтобы датчик чувствовал прикосновение, используйте резистор на '''1 МОм''' (или меньше)<br />
* Чтобы датчик чувствовал человеческое тело на расстоянии в '''10-15 см''', используйте резистор на '''40 МОм'''<br />
* Чтобы датчик чувствовал человеческое тело на расстоянии в '''30-60 см''', используйте резистор на '''40 МОм''' (зависит от размера фольги). Впрочем, резисторы на '''40 МОм''' встречаются нечасто, поэтому вы можете просто припаять четыре резистора на '''10 МОм'''<br />
* Один из негативных побочных эффектов больших резисторов заключается в том, что повышение чувствительности замедляет работу датчика. Кроме того, если измеряющая часть датчика – это ничем не прикрытый металл, то может случиться так, что отправляющий контакт никогда не сможет поменять состояние на принимающем (сенсорном) контакте. В результате датчик будет постоянно находиться в состоянии ожидания.<br />
* Также имеет смысл поэкспериментировать с подключением между «землей» и принимающим (сенсорным) контактом маленького конденсатора ('''100 пФ – 1 мкФ'''). Он должен повысить стабильность датчика.<br />
Обратите внимание, что принимающих контактов может быть несколько (для оперирования несколькими датчиками), а отправляющий – только один. Более подробно смотрите в скетче-примере.<br />
<br />
==Заземление и другие известные проблемы==<br />
<br />
Создавая конструкцию для измерения электроемкости, очень важно заземлить плату '''Arduino'''. Достаточно даже цепи с низким сопротивлением вроде провода, подключенного к водопроводной трубе.<br />
<br />
Кроме того, измерению электроемкости может помешать ноутбук, не подключенный к сети энергопитания. Ноутбук сам становится чем-то вроде датчика, поэтому поднесение руки к ноутбуку будет влиять на возвращаемое значение.<br />
<br />
Чтобы все работало правильно, обычно достаточно просто подключить к ноутбуку зарядный шнур. Другое решение – подключить '''«землю»''' '''Arduino''' к грунтовому заземлению (например, к водопроводной трубе). <br />
<br />
Еще одно решение (по крайней мере, на один раз) – это подложить под сенсорной фольгой (изолированной пластиком, бумагой и т.д.) другой кусочек фольги, а затем подключить его проводом к '''«земле»'''. Это должно стабилизировать значения датчика и резко увеличить его чувствительность.<br />
<br />
==Потенциометры типа «scroll wheel»==<br />
<br />
Для успешной работы с так называемыми '''«scroll wheel»''' (можно перевести как '''«колесиковые потенциометры»'''; это разновидность линейных потенциометров) достаточно двух контактов и цепи транзисторов. Базовую схему можно наблюдать в даташите датчика '''Quantum Scrollwheel'''.<br />
<br />
Код выстраивается примерно так:<br />
<br />
<syntaxhighlight lang="c"><br />
CapacitiveSensor Left32 = CapacitiveSensor(3, 2); // провод от 2-ого контакта к левой стороне цепи резисторов<br />
CapacitiveSensor Right23 = CapacitiveSensor(2, 3); // провод от 3-его контакта к правой стороне цепи резисторов<br />
</syntaxhighlight><br />
<br />
То есть здесь '''2-ой''' и '''3-ий''' контакты меняются своими ролями, становясь то принимающими, то отправляющими. Кроме того, мы имеем дело с цепью линейно подключенных резисторов, поэтому приближение пальца к отправляющему контакту будет давать более низкие значения – дело в снижении сопротивления из-за того, что источник электроемкости находится, как правило, вне цепи.<br />
<br />
Таким образом, если мы будем двигать палец от одного контакта к другому и два раза вызовем функцию '''capacitiveSensorRaw()''', то получим два дополнительных значения. Сложность в том, что когда вы пытаетесь измерить электроемкость (т.е. определить, насколько близким и сильным был контакт с человеческим телом), из-за влияния которой два этих значения уменьшаются или увеличиваются, то это изменение не обязательно будет происходить линейно.<br />
<br />
В скором времени разработчики обещают выложить скетч, иллюстрирующий этот пример.<br />
<br />
==Сообщения об ошибках==<br />
<br />
Если указать неправильный параметр с контактом, то '''capacitiveSensor()''' и '''capacitiveSensorRaw()''' должны вернуть '''«-1»''', но на момент написания этой статьи эта функция еще не работает.<br />
<br />
Если запустится таймаут, то '''capacitiveSensor()''' и '''capacitiveSensorRaw()''' должны вернуть '''«-2»'''. Это происходит при превышении ограничения, заданного в '''CS_Timeout_Millis''', которое по умолчанию составляет '''2000 миллисекунд (2 секунды)'''. Зачастую это происходит из-за недостающего резистора или резистора, подключенного к неправильному контакту. Кроме того, это может быть вызвано самим датчиком, который заземлен или подключен к '''+5V'''.<br />
<br />
Таймаут необходим, поскольку цикл [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while()]], осуществляющий синхронизацию функции '''CapacitiveSensor()''', заблокирует скетч (функция никогда ничего не вернет), если, к примеру, между отправляющим и принимающим контактом не будет подключено резистора.<br />
<br />
==Установка==<br />
<br />
Загрузите '''ZIP'''-файл с библиотекой по [https://github.com/PaulStoffregen/CapacitiveSensor/archive/master.zip этой ссылке]. Распакуйте библиотеку и поместите ее по адресу '''«Документы/Arduino/libraries»'''. Далее, чтобы добавить в новый скетч библиотеку '''CapacitiveSensor''', кликните в '''IDE Arduino''' на '''Скетч > Подключить библиотеку > CapacitiveSensor (Sketch > Include Library > CapacitiveSensor)'''.<br />
<br />
==Примеры==<br />
<br />
* [[Arduino:Примеры/Demo Sketch|Demo Sketch]] - Демо-скетч [[Arduino:Библиотеки/CapacitiveSensing|библиотеки CapacitiveSensor]]<br />
* [[Arduino:Примеры/Threshold|Threshold]] - Установление порога для запуска события<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
{{Навигационная таблица/Портал/Arduino}}<br />
<br />
<br />
<br />
[[Категория:Функция]]<br />
[[Категория:Библиотека CapacitiveSensing]]<br />
[[Категория:CapacitiveSensing]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/CapacitiveSensing&diff=13937486Arduino:Библиотеки/CapacitiveSensing2024-02-18T07:35:05Z<p>Myagkij: </p>
<hr />
<div>{{Arduino панель перехода}}<br />
{{Перевод от Сubewriter}}<br />
{{Myagkij-редактор}}<br />
<br />
=Библиотека CapacitiveSensor<ref>[http://playground.arduino.cc/Main/CapacitiveSensor?from=Main.CapSense playground.arduino.cc - CapacitiveSensor]</ref>=<br />
<br />
'''Библиотека CapacitiveSensor''' позволяет сделать из двух (или более) контактов '''Arduino''' емкостный датчик, способный определять электроемкость человеческого тела. Для создания такого датчика понадобятся резистор, провод и алюминиевая фольга. Будучи настроенным на наибольшую чувствительность, этот датчик начнет определять близость руки или человеческого тела в нескольких сантиметрах от себя.<br />
<br />
'''Версия 04''' добавляет поддержку '''Arduino 1.0''', а также исправляет ошибку с малопонятным состоянием гонки, которое может возникнуть с [[Arduino:Библиотеки/Tone|Tone]], [[Arduino:Библиотеки/Servo|Servo]] и другими библиотеками, использующими прерывания.<br />
<br />
'''Версия 03''' была обновлена до '''C++''' и поддерживает работу нескольких входных контактов. Она также добавляет несколько вспомогательных функций, которые упрощают изменение таймаута. <br />
<br />
== Загрузка ==<br />
<br />
'''Версию 05''', поддерживающую '''Arduino Due''' и другие платы без '''AVR''', можно скачать [https://github.com/PaulStoffregen/CapacitiveSensor отсюда].<br />
<br />
{{Применение1|<br />
Измерение электроемкости применяется в ситуациях, когда желательно, чтобы человек не прикасался к определенной поверхности. Таким образом, при помощи '''Arduino''', '''библиотеки CapacitiveSensor''' и изоляционного материала (пластика, дерева, керамики и пр., но не металла) можно сделать так, чтобы датчик чувствовал прикосновение за полсантиметра от себя. Кроме того, это позволяет замаскировать датчик. <br />
<br />
Емкостный датчик, покрытый бумагой или другим изолятором, также может работать в качестве неплохого датчика давления (с примерно экспоненциальным откликом). В некоторых приложениях он даже превосходит даже силоизмерительные резисторы.<br />
}}<br />
<br />
== Как это работает ==<br />
<br />
[[File:CapSense.jpg|center]]<br />
<br />
Функция '''capasitiveSensor()''' переключает отправляющий контакт платы в новое состояние, а затем ждет, пока принимающий контакт не примет то же состояние, что и отправляющий контакт. Чтобы синхронизировать изменение состояния у принимающего контакта, внутри цикла [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while()]] увеличивается специальная переменная. После этого функция возвращает значение переменной (в произвольных единицах измерения).<br />
<br />
[https://www.youtube.com/watch?v=BHQPqQ_5ulc Короткое демонстрационное видео (YouTube)]<br />
<br />
Чтобы сконструировать датчик, потребуется резистор (номиналом '''от 100 кОм до 50 МОм'''), стоящий между отправляющим и принимающим (сенсорным) контактами. Принимающий контакт – это крайняя часть датчика. Датчик можно усовершенствовать, подключив к принимающему контакту кусочек алюминиевой фольги (при помощи провода). В большинстве приложений датчик лучше покрыть бумагой, пластиком или другим изоляционным материалом – это обеспечит наилучший диапазон значений, определяемых датчиком, и позволит сделать так, чтобы пользователи не касались металлической фольги. Как показывает практика, для стабильности работы системы и повторяемости результатов между сенсорным контактом и «землей» имеет смысл поставить небольшой конденсатор (на '''100 пФ''').<br />
<br />
Если изменится состояние у отправляющего контакта, то оно в конце концов изменится и у принимающего контакта. Задержка между изменениями значений у отправляющего и принимающего контактов определяется константой '''RC (R х C)''', где '''R''' – это значение резистора, а '''C''' – электроемкость принимающего контакта плюс любая другая электроемкость (например, от взаимодействия с человеческим телом), представленная на сенсорном (принимающем) контакте. Крайне желательно также подключить параллельно с человеческим телом маленький конденсатор ('''20-400 пФ''') – это должно стабилизировать считываемые значения. <br />
<br />
== Функции ==<br />
<br />
Библиотека содержит три главных функции и несколько вспомогательных функций.<br />
<br />
<syntaxhighlight lang="c"><br />
CapacitiveSensor CapacitiveSensor(byte sendPin, byte receivePin)<br />
</syntaxhighlight><br />
<br />
Создает экземпляр библиотеки. Пожалуйста, обратите внимание на заглавные буквы – этим настоящая функция отличается от функции ниже.<br />
<br />
<syntaxhighlight lang="c"><br />
long capacitiveSensorRaw(byte samples)<br />
</syntaxhighlight><br />
<br />
Требует всего один параметр ('''samples''') и возвращает значение типа [[Arduino:Справочник языка Arduino/Типы данных/long|long]] – абсолютную электроемкость (в произвольных единицах измерения). Параметр '''samples''' используется, чтобы увеличить разрешение возвращаемого значения (т.е. повысить частоту считывания данных), но в ущерб снижения производительности. Кроме того, возвращаемое значение – это не среднее от всех значений (т.е. '''samples'''), а их общая сумма.<br />
<br />
Если значение с электроемкостью будет выше значения '''CS_Timeout_Millis''' (в миллисекундах), то '''capacitiveSensorRaw()''' вернет значение '''«-2»'''. По умолчанию значение для '''CS_Timeout_Millis''' составляет '''2000 миллисекунд (2 секунды)'''.<br />
<br />
<syntaxhighlight lang="c"><br />
long capacitiveSensor(byte samples)<br />
</syntaxhighlight><br />
<br />
Требует всего один параметр ('''samples''') и возвращает значение типа [[Arduino:Справочник языка Arduino/Типы данных/long|long]] – добавленную (измеренную) электроемкость (в произвольных единицах измерения). Отслеживает нижайшее значение базовой (т.е. когда на датчик ничего не влияет) электроемкости, а затем вычитает ее из добавленной (т.е. когда на датчик начинает что-то влиять) электроемкости. Следовательно, если на датчик ничто не влияет, эта функция должна показывать низкие значения.<br />
<br />
'''Базовая электроемкость''' – это значение, которое постоянно калибруется по интервалам, заданным в значении '''CS_Autocal_Millis'''. По умолчанию это значение составляет '''200000 миллисекунд (20 секунд)'''. Эту рекалибровку можно выключить, задав в '''CS_Autocal_Millis''' максимальное значение при помощи функции '''set_CS_Autocal_Millis()'''.<br />
<br />
<syntaxhighlight lang="c"><br />
void set_CS_Timeout_Millis(unsigned long timeout_millis)<br />
</syntaxhighlight><br />
<br />
Используется, чтобы задать значение '''CS_Timeout_Millis''', то есть таймаут, который запускается, когда принимающего (сенсорного) контакта не получается переключиться в то же состояние, что и отправляющий контакт. Этот таймаут необходим, потому что если его не будет, то цикл [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while()]] заблокирует работу скетча. По умолчанию значение '''CS_Timeout_Millis''' составляет '''2000 миллисекунды (2 секунды)'''.<br />
<br />
<syntaxhighlight lang="c"><br />
void reset_CS_AutoCal()<br />
</syntaxhighlight><br />
<br />
Используется, чтобы запустить принудительную калибровку функции '''capacitiveSensor()'''.<br />
<br />
<syntaxhighlight lang="c"><br />
void set_CS_Autocal_Miilis(unsigned long autoCal_millis)<br />
</syntaxhighlight><br />
<br />
Используется, чтобы задать интервал для рекалибровки базового значения, используемого в функции '''long capacitiveSensor()'''. Рекалибровку можно выключить, выставив значение '''CS_AutocaL_Millis''' на '''«0xFFFFFFFF»'''.<br />
<br />
==Выбор резистора==<br />
<br />
Ниже небольшое руководство для выбора резистора, но для достижения наилучшего результата также есть смысл поэкспериментировать самостоятельно.<br />
* Чтобы датчик чувствовал прикосновение, используйте резистор на '''1 МОм''' (или меньше)<br />
* Чтобы датчик чувствовал человеческое тело на расстоянии в '''10-15 см''', используйте резистор на '''40 МОм'''<br />
* Чтобы датчик чувствовал человеческое тело на расстоянии в '''30-60 см''', используйте резистор на '''40 МОм''' (зависит от размера фольги). Впрочем, резисторы на '''40 МОм''' встречаются нечасто, поэтому вы можете просто припаять четыре резистора на '''10 МОм'''<br />
* Один из негативных побочных эффектов больших резисторов заключается в том, что повышение чувствительности замедляет работу датчика. Кроме того, если измеряющая часть датчика – это ничем не прикрытый металл, то может случиться так, что отправляющий контакт никогда не сможет поменять состояние на принимающем (сенсорном) контакте. В результате датчик будет постоянно находиться в состоянии ожидания.<br />
* Также имеет смысл поэкспериментировать с подключением между «землей» и принимающим (сенсорным) контактом маленького конденсатора ('''100 пФ – 1 мкФ'''). Он должен повысить стабильность датчика.<br />
Обратите внимание, что принимающих контактов может быть несколько (для оперирования несколькими датчиками), а отправляющий – только один. Более подробно смотрите в скетче-примере.<br />
<br />
==Заземление и другие известные проблемы==<br />
<br />
Создавая конструкцию для измерения электроемкости, очень важно заземлить плату '''Arduino'''. Достаточно даже цепи с низким сопротивлением вроде провода, подключенного к водопроводной трубе.<br />
<br />
Кроме того, измерению электроемкости может помешать ноутбук, не подключенный к сети энергопитания. Ноутбук сам становится чем-то вроде датчика, поэтому поднесение руки к ноутбуку будет влиять на возвращаемое значение.<br />
<br />
Чтобы все работало правильно, обычно достаточно просто подключить к ноутбуку зарядный шнур. Другое решение – подключить '''«землю»''' '''Arduino''' к грунтовому заземлению (например, к водопроводной трубе). <br />
<br />
Еще одно решение (по крайней мере, на один раз) – это подложить под сенсорной фольгой (изолированной пластиком, бумагой и т.д.) другой кусочек фольги, а затем подключить его проводом к '''«земле»'''. Это должно стабилизировать значения датчика и резко увеличить его чувствительность.<br />
<br />
==Потенциометры типа «scroll wheel»==<br />
<br />
Для успешной работы с так называемыми '''«scroll wheel»''' (можно перевести как '''«колесиковые потенциометры»'''; это разновидность линейных потенциометров) достаточно двух контактов и цепи транзисторов. Базовую схему можно наблюдать в даташите датчика '''Quantum Scrollwheel'''.<br />
<br />
Код выстраивается примерно так:<br />
<br />
<syntaxhighlight lang="c"><br />
CapacitiveSensor Left32 = CapacitiveSensor(3, 2); // провод от 2-ого контакта к левой стороне цепи резисторов<br />
CapacitiveSensor Right23 = CapacitiveSensor(2, 3); // провод от 3-его контакта к правой стороне цепи резисторов<br />
</syntaxhighlight><br />
<br />
То есть здесь '''2-ой''' и '''3-ий''' контакты меняются своими ролями, становясь то принимающими, то отправляющими. Кроме того, мы имеем дело с цепью линейно подключенных резисторов, поэтому приближение пальца к отправляющему контакту будет давать более низкие значения – дело в снижении сопротивления из-за того, что источник электроемкости находится, как правило, вне цепи.<br />
<br />
Таким образом, если мы будем двигать палец от одного контакта к другому и два раза вызовем функцию '''capacitiveSensorRaw()''', то получим два дополнительных значения. Сложность в том, что когда вы пытаетесь измерить электроемкость (т.е. определить, насколько близким и сильным был контакт с человеческим телом), из-за влияния которой два этих значения уменьшаются или увеличиваются, то это изменение не обязательно будет происходить линейно.<br />
<br />
В скором времени разработчики обещают выложить скетч, иллюстрирующий этот пример.<br />
<br />
==Сообщения об ошибках==<br />
<br />
Если указать неправильный параметр с контактом, то '''capacitiveSensor()''' и '''capacitiveSensorRaw()''' должны вернуть '''«-1»''', но на момент написания этой статьи эта функция еще не работает.<br />
<br />
Если запустится таймаут, то '''capacitiveSensor()''' и '''capacitiveSensorRaw()''' должны вернуть '''«-2»'''. Это происходит при превышении ограничения, заданного в '''CS_Timeout_Millis''', которое по умолчанию составляет '''2000 миллисекунд (2 секунды)'''. Зачастую это происходит из-за недостающего резистора или резистора, подключенного к неправильному контакту. Кроме того, это может быть вызвано самим датчиком, который заземлен или подключен к '''+5V'''.<br />
<br />
Таймаут необходим, поскольку цикл [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while()]], осуществляющий синхронизацию функции '''CapacitiveSensor()''', заблокирует скетч (функция никогда ничего не вернет), если, к примеру, между отправляющим и принимающим контактом не будет подключено резистора.<br />
<br />
==Установка==<br />
<br />
Загрузите '''ZIP'''-файл с библиотекой по [https://github.com/PaulStoffregen/CapacitiveSensor/archive/master.zip этой ссылке]. Распакуйте библиотеку и поместите ее по адресу '''«Документы/Arduino/libraries»'''. Далее, чтобы добавить в новый скетч библиотеку '''CapacitiveSensor''', кликните в '''IDE Arduino''' на '''Скетч > Подключить библиотеку > CapacitiveSensor (Sketch > Include Library > CapacitiveSensor)'''.<br />
<br />
==Примеры==<br />
<br />
* [[Arduino:Примеры/Demo Sketch|Demo Sketch]] - Демо-скетч [[Arduino:Библиотеки/CapacitiveSensing|библиотеки CapacitiveSensor]]<br />
* [[Arduino:Примеры/Threshold|Threshold]] - Установление порога для запуска события<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
{{Навигационная таблица/Портал/Arduino}}<br />
<br />
<br />
<br />
[[Категория:Функция]]<br />
[[Категория:Библиотека CapacitiveSensing]]<br />
[[Категория:CapacitiveSensing]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/SSerial2Mobile&diff=13937459Arduino:Библиотеки/SSerial2Mobile2024-02-18T07:34:00Z<p>Myagkij: </p>
<hr />
<div>{{Arduino панель перехода}}<br />
{{Перевод от Сubewriter}}<br />
{{Myagkij-редактор}}<br />
<br />
=Библиотека SSerial2Mobile<ref>[https://code.google.com/archive/p/sserial2mobile/ code.google.com - sserial2mobile]</ref><ref>[https://code.google.com/archive/p/sserial2mobile/wikis/sserial2mobileLibDoc.wiki code.google.com - sserial2mobile - sserial2mobileLibDoc.wiki]</ref><ref>[https://code.google.com/archive/p/sserial2mobile/wikis/SelectingThePhoneAndCarrier.wiki code.google.com - sserial2mobile - SelectingThePhoneAndCarrier.wiki]</ref>=<br />
<br />
Эта библиотека позволяет отправлять электронные письма и '''SMS''' при помощи мобильного телефона, выступающего в качестве передатчика. Последовательная коммуникация с мобильным телефоном осуществляется при помощи [[Arduino:Библиотеки/NewSoftSerial|библиотеки NewSoftSerial]]. Кроме того, в основе некоторых функций этой библиотеки лежат команды '''AT+''', и с их помощью, собственно, и осуществляется отправка '''SMS''' и имейлов, а также ряд других задач.<br />
<br />
Команды '''AT+''' хранятся в заголовочном файле. Благодаря этому '''библиотеку SSerial2Mobile''' относительно просто заставить работать с другими телефонами. <br />
<br />
Чтобы поменять модель телефона, воспользуйтесь файлом '''MOT-C168i.h'''. Команды для отправки '''SMS''' и имейлов на большинстве телефонов примерно одинаковы. <br />
<br />
Чтобы поменять оператора связи, воспользуйтесь файлом '''ATT.h'''. В нем указывается номер оператора, шлюз которого используется для отправки имейлов. То есть, если вы используете другой шлюз (по умолчанию выставлен '''+121'''), этот номер нужно поменять.<br />
<br />
{{Примечание1|Чтобы изменения, внесенные в файлы библиотеки, вступили в силу, вам нужно удалить SSerial2Mobile.o и перезапустить IDE Arduino – это запустит принудительную повторную компиляцию библиотеки.}}<br />
<br />
==Функции==<br />
<br />
* <syntaxhighlight lang="c">SSerial2Mobile phone = SSerial2Mobile(rxPin, txPin)</syntaxhighlight> Создает новый экземпляр класса '''SSerial2Mobile'''. Здесь '''phone''' – название экземпляра, '''rxPin''' – контакт, принимающий данные по последовательному соединению, а '''txPin''' – контакт, передающий данные по последовательному соединению.<br />
* <syntaxhighlight lang="c">phone.off()</syntaxhighlight> Выключает передатчик телефона, тем самым экономя батарею.<br />
* <syntaxhighlight lang="c">phone.off()</syntaxhighlight> Включает передатчик телефона. У некоторых телефонов это функция сброса. Он спрятан от пользователя библиотеки в заголовочных файлах, содержащих команды '''AT+''' для всех функций. <br />
* <syntaxhighlight lang="c">phone.reset()</syntaxhighlight> Перезагружает (сбрасывает) телефон. Сброс может занять довольно продолжительное время ('''около 10 секунд''', но зависит от модели телефона).<br />
* <syntaxhighlight lang="c">phone.sendTxt("+15555550125","Lib SMS Test1")</syntaxhighlight> Отправляет '''SMS''' на другой телефон. Здесь первый параметр – это номер телефона, а второй – само сообщение. Длина сообщения '''не может превышать 160 символов'''.<br />
* <syntaxhighlight lang="c">phone.sendEmail("sserial2mobile@example.com", "Lib email test1")</syntaxhighlight> Отправляет имейл на указанный почтовый ящик. Здесь первый параметр – это почтовый ящик, на который отправляется письмо, а второй – само письмо. Длина письма '''не может превышать 160 символов'''.<br />
* <syntaxhighlight lang="c">phone.println("AT+")</syntaxhighlight> Передает данные на контакт передатчика по программно-последовательному порту, ставя в конце символы возврата каретки и перевода строки. Работает аналогично функции Serial.println()</syntaxhighlight> Эта функция для продвинутых пользователей, т.е. для тех, кто точно знает, какую команду хочет отправить телефону. Аргумент здесь – это, собственно, команда, отправляемая телефону.<br />
* <syntaxhighlight lang="c">phone.batt()</syntaxhighlight> Считывает процент заряда батареи у телефона. Как правило, используется вместе с другими функциями, к примеру, так: <br />
<syntaxhighlight lang="c"><br />
Serial.print("Batt: ");<br />
Serial.print(phone.batt());<br />
Serial.println("%");<br />
</syntaxhighlight><br />
* <syntaxhighlight lang="c">phone.rssi()</syntaxhighlight> Считывает мощность сигнала. Как правило, используется вместе с другими функциями, к примеру, так: <br />
<syntaxhighlight lang="c"><br />
Serial.print("RSSI: "); <br />
Serial.println(phone.rssi()); <br />
</syntaxhighlight> <br />
Чтобы отправить сообщение, этот показатель должен быть '''«5»''' или больше.<br />
<br />
==Примеры==<br />
<br />
* [[Arduino:Примеры/SSerial2Mobile Example1|SSerial2Mobile Example1]] - Отправка SMS и имейлов<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
{{Навигационная таблица/Портал/Arduino}}<br />
<br />
<br />
<br />
<br />
<br />
[[Категория:Функция]]<br />
[[Категория:Библиотека SimpleMessageSystem]]<br />
[[Категория:SimpleMessageSystem]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/SimpleMessageSystem&diff=13937435Arduino:Библиотеки/SimpleMessageSystem2024-02-18T07:33:15Z<p>Myagkij: /* Функции */</p>
<hr />
<div>{{Arduino панель перехода}}<br />
{{Перевод от Сubewriter}}<br />
{{Myagkij-редактор}}<br />
<br />
<br />
<br />
=Библиотека SimpleMessageSystem<ref>[http://sweb.cityu.edu.hk/sm2240/11/read_me.pdf sweb.cityu.edu.hk - read_me.pdf]</ref><ref>[http://playground.arduino.cc/Code/SimpleMessageSystem playground.arduino.cc - SimpleMessageSystem]</ref>=<br />
<br />
'''Библиотека SimpleMessageSystem''' упрощает коммуникацию с терминалами и программами, которыми можно управлять при помощи сообщений (к примеру, '''Max/Msp''' или '''Pure Data'''). Поддерживает платы '''Arduino''' версий '''0004''' и выше. Все данные, входящие и исходящие через последовательную коммуникацию, интерпретируются как сообщения формата '''ASCII'''.<br />
<br />
Саму библиотеку, а также примеры и инструкции к ней [http://playground.arduino.cc/uploads/Code/SimpleMessageSystem.zip можно скачать отсюда].<br />
<br />
'''Главные преимущества библиотеки SimpleMessageSystem''':<br />
* Возможность отправлять, получать и обрабатывать списки символов и целых чисел, присылаемых и отсылаемых платой '''Arduino'''<br />
* Терминальная программа, '''Max/Msp''' и '''Pure Data''' могут коммуницировать при помощи одного и того же кода, используемого для '''Arduino'''<br />
* Может быть адаптирована для отправки, получения и обработки строк <br />
* Пересылаемая информация удобочитаема<br />
<br />
'''Главный недостаток''':<br />
* Медленней, чем специализированный последовательный протокол, который обращается с битами и байтами, как с числами, а не '''ASCII'''-символами<br />
<br />
==Что такое сообщение?==<br />
<br />
'''Сообщение''' – это серия слов, которая заканчивается символом возврата каретки (опционально – символом перевода строки); слова состоят из символов формата '''ASCII''' и разделены пробелами. Выглядит все это следующим образом:<br />
<br />
<syntaxhighlight lang="c"><br />
слово 1 (пробел) слово2 (пробел) слово3 (возврат каретки)<br />
</syntaxhighlight><br />
<br />
В текущей версии '''SimpleMessageSystem''' слова могут быть либо одним символом, либо целым числом. Сообщение считается завершенным, если в конце поставлен символ возврата каретки. Это также значит, что теперь его можно обрабатывать в скетче '''Arduino'''.<br />
<br />
==Пример кода Arduino номер 1==<br />
<br />
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"><br />
if (messageBuild()) { // проверяем, завершено ли сообщение <br />
firstChar = messageGetChar()) { // берем первое присланное слово и в виде символа сохраняем его в переменную firstChar <br />
if (firstChar = 'r') { // проверяем, является ли он символом «r»<br />
secondChar = messageGetChar() // берем следующее слово и в виде символа сохраняем его в secondChar<br />
if (firstChar = 'd') // чтобы продолжить, следующим символом должен быть «d»<br />
messageSendChar('d'); // отправляем обратно считанный символ <br />
for (char i=2;i<14;i++) {<br />
messageSendInt(digitalRead(i)); // считываем контакты 2-13<br />
}<br />
messageEnd(); // завершаем сообщение, чтобы отправить его<br />
}<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Если этот код получит сообщение '''rd CR''' ('''CR''' означает возврат каретки), то вернет значения всех цифровых контактов в сообщении, имеющем следующую структуру:<br />
<br />
<syntaxhighlight lang="c"><br />
d кон2 кон3 кон4 кон5 кон6 кон7 кон8 кон9 кон10 кон11 кон12 кон13 CR<br />
</syntaxhighlight><br />
<br />
==Пример кода Arduino номер 2==<br />
<br />
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"><br />
if (messageBuild()) { // проверяем, завершено ли сообщение<br />
firstChar = messageGetChar()) { // берем первое присланное слово и в виде символа сохраняем его в переменную firstChar<br />
if (firstChar = 'w') { // проверяем, является ли он символом «w»<br />
int pin = messageGetInt(); // берем следующее слово и в виде целого числа сохраняем его в pin<br />
int state = messageGetInt(); // берем следующее слово и в виде целого числа сохраняем его в state<br />
pinMode(pin,OUTPUT); <br />
digitalWrite(pin,state); <br />
}<br />
</syntaxhighlight><br />
<br />
Если этот код получит сообщение '''w 13 1 CR''' ('''CR''' означает возврат каретки), то выставит '''13'''-ый контакт в состояние [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]], в результате чего последняя строчка будет выглядеть как [[Arduino:Справочник языка Arduino/Функции/Цифровой ввод/вывод/digitalWrite()|digitalWrite]](13, [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]]). В языке '''Arduino''' [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]] – это '''«1»''', а [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]] – это '''«0»'''.<br />
<br />
==Как импортировать/установить библиотеку==<br />
<br />
# Скачайте '''ZIP'''-файл с '''библиотекой SimpleMessageSystem''' (ссылку смотрите выше).<br />
# Откройте '''IDE Arduino''', кликните на '''Скетч > Подключить библиотеку > Добавить .ZIP библиотеку (Sketch > Include Library > Add .ZIP Library…)''', в появившемся окне укажите путь к скачанному '''ZIP'''-файлу и нажмите '''Open'''.<br />
# Создайте новый скетч (или откройте уже существующий) и кликните на '''Скетч > Подключить библиотеку > SimpleMessageSystem (Sketch > Include Library > SimpleMessageSystem)'''. Когда библиотека будет импортирована, в верхней части скетча появится строчка <syntaxhighlight lang="c">#inlcude SimpleMessageSystem.h</syntaxhighlight><br />
# Когда вы запустите (скомпилируете) свой код, он также скомпилирует библиотеку '''SimpleMessageSystem'''. Вы получите предупреждающие сообщения, но это «нормально».<br />
<br />
==Примеры использования==<br />
<br />
Запустите в '''IDE Arduino''' следующий скетч-пример: '''Файл > Примеры > SimpleMessageSystem > SimpleMessageSystem_example_1 (File > Examples > SimpleMessageSystem > SimpleMessageSystem_example_1)'''.<br />
<br />
Теперь откройте патч для '''Max/Msp''' или '''Pure Data''', чтобы начать коммуникацию с платой '''Arduino'''.<br />
<br />
=== Max/Msp ===<br />
<br />
Откройте файл '''SimpleMessageSystem.mxb''' в папке '''MaxMsp Example'''. Используйте абстракции '''max2asciimessage''' и '''asciimessage2max''' в своих патчах '''Max/Msp''', чтобы коммуницировать с платой '''Arduino''', в которую загружена '''библиотека SimpleMessageSystem'''.<br />
<br />
=== Pure Data === <br />
<br />
Откройте файл '''SimpleMessageSystem.pd''' в папке '''Pure Data Example'''. Используйте абстракции '''pd2ascii''' и '''ascii2pd''' в своих патчах '''Pure Data''', чтобы коммуницировать с платой '''Arduino''', в которую загружена '''библиотека SimpleMessageSystem'''. Если вы работаете на '''Linux''' и не знаете номер порта, к которому подключена '''Arduino''', воспользуйтесь следующей терминальной командой:<br />
<br />
<syntaxhighlight lang="c"><br />
i=0; for f in `ls /dev/tty[US]*`; do echo $i $f; i=$(( $i + 1 )); done <br />
</syntaxhighlight><br />
<br />
==Как пользоваться библиотекой==<br />
<br />
===Получение сообщения===<br />
<br />
# Вызовите функцию messageBuilt(). Если она возвращает '''«1»''' или больше, это значит, что в конце сообщения стоит символ возврата каретки, то есть оно считается законченным. По сути, функция messageBuilt() возвращает количество символов в сообщении, включая пробелы.<br />
# Извлекаем первое слово, используя функцию messageGetChar() или messageGetInt().<br />
# Повторяем второй шаг для всех входящих слов.<br />
<br />
===Отправка сообщения===<br />
<br />
# Вызываем функцию messageSendChar() или messageSendInt(), чтобы отправить символ или целое число.<br />
# Повторяем второй шаг для всех символов и чисел, которые хотим отправить. Между вызовами этих функций автоматически ставятся пробелы.<br />
# Вызываем функцию messageEnd(), чтобы отправить символ возврата каретки и тем самым просигнализировать, что сообщение завершено и готово к обработке.<br />
<br />
==Функции==<br />
<br />
===Получение сообщения===<br />
<br />
* <syntaxhighlight lang="c">int messageBuild()</syntaxhighlight> Проверяет, завершено ли сообщение. Если завершено, возвращает размер сообщения, включая пробелы. <br />
{{Внимание1|Если вы вызовите эту функцию второй раз, это сбросит предыдущее сообщение!}}<br />
* <syntaxhighlight lang="c">char messageGetChar()</syntaxhighlight> Если имеется доступное слово, возвращает его в качестве символа. Если доступных слов нет, возвращает '''«0»'''. <br />
{{Внимание1|Если вы отправите что-то вроде «foo», она вернет «f» и проигнорирует «oo».}}<br />
* <syntaxhighlight lang="c">int messageGetInt()</syntaxhighlight> Если имеется доступное слово, возвращает его в качестве целого числа. Если доступных слов нет, возвращает '''«0»'''.<br />
<br />
===Отправка сообщения===<br />
<br />
* <syntaxhighlight lang="c">void messageSendChar(char value)</syntaxhighlight> Отправляет символ (автоматически вставляет пробелы в сообщении между каждым отправляемым символом).<br />
* <syntaxhighlight lang="c">void messageSendInt(int value)</syntaxhighlight> Отправляет целое число (автоматически вставляет пробелы в сообщении между каждым отправляемым целым числом).<br />
* <syntaxhighlight lang="c">void messageEnd()</syntaxhighlight> Завершает сообщение, сигнализируя цели, что сообщение готово к обработке.<br />
<br />
==Примеры==<br />
<br />
* [[Arduino:Примеры/SimpleMessageSystem example 1|SimpleMessageSystem example 1]] - Управление функциями '''Arduino''' при помощи сообщений<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
{{Навигационная таблица/Портал/Arduino}}<br />
<br />
<br />
<br />
<br />
<br />
[[Категория:Функция]]<br />
[[Категория:Библиотека SimpleMessageSystem]]<br />
[[Категория:SimpleMessageSystem]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/NewSoftSerial&diff=13937370Arduino:Библиотеки/NewSoftSerial2024-02-18T07:31:19Z<p>Myagkij: </p>
<hr />
<div>{{Arduino панель перехода}}<br />
{{Перевод от Сubewriter}}<br />
{{Myagkij-редактор}}<br />
<br />
=Библиотека NewSoftwareSerial<ref>[http://arduiniana.org/libraries/NewSoftSerial arduiniana.org - NewSoftSerial]</ref>=<br />
<br />
'''Библиотека NewSoftSerial''' – это библиотека '''Arduino''' для работы с «программными» последовательными портами, и она является прямым потомком библиотеки [http://www.ladyada.net/make/eshield/AFSoftSerial.zip AFSoftSerial], разработанной '''Лимор Фрид'''. Ее главное отличие от оригинальной SoftwareSerial заключается в том, что она обрабатывает входящие данные при помощи прерываний, а не опросов.<br />
<br />
Если прерывания не использовать, возможности скетча становятся весьма ограниченными, т.к. ему нужно постоянно делать опросы последовательного порта – короткими и регулярными интервалами. По этой причине практически невозможно использовать SoftwareSerial, к примеру, для получения '''GPS'''-данных и их дальнейшей переработки в приемлемую форму. Ваш скетч слишком занят тем, что пытается успеть за прибывающими '''NMEA''' символами, поэтому у него не хватает времени, чтобы собрать из них что-то толковое. Тут-то на помощь и приходит '''AFSoftSerial''' (и ''NewSoftSerial'') со своими прерываниями. С их помощью скетч записывает только что присланные данные в буфер, одновременно с этим обрабатывая данные, присланные чуть ранее. <br />
<br />
{{Примечание1|''С декабря 2011 года (т.е. начиная с '''IDE Arduino версии 1.0''') библиотека '''NewSoftSerial''' официально заменяет оригинальную SoftwareSerial. Это значит, что если вы работаете с '''IDE Arduino версии 1.0 и выше''', то вам эту библиотеку загружать не нужно – она уже будет в комплекте с '''IDE Arduino'''. Таким образом, чтобы переделать код под '''IDE Arduino 1.0''', просто поменяйте все отсылки к SoftwareSerial на NewSoftSerial.''}}<br />
<br />
==Улучшения==<br />
<br />
Вот список улучшений библиотеки '''NewSoftSerial''':<br />
* Наследует от встроенного класса '''Print''', что позволяет избавиться '''от 4-600 байтов''' дублирующего кода<br />
* Использует кольцевой буфер, что делает обработку данных на '''RX''' более эффективной<br />
* Поддерживает все (т.е. '''с 0-ого по 19-ый''') контакты '''Arduino''' (на '''Arduino Mini''' – '''с 0-ого по 21-ый'''), а не только '''с 0-ого по 13-ый'''<br />
* Поддерживает одновременную коммуникацию с несколькими девайсами, подключенными через программные последовательные порты. Впрочем, тут есть ограничение, связанное с использованием нескольких экземпляров, читайте о нем в разделе ниже<br />
* Поддерживает более широкий диапазон скоростей передачи данных. Впрочем, при использовании скоростей «300» и «1200» нужно быть осторожнее. На этих скоростях обработчик прерываний становится слишком объемным, из-за чего прерывания начинают зависать, а функция [[Arduino:Справочник языка Arduino/Функции/Работа со временем/millis()|millis()]], в свою очередь, перестает работать во время получения данных<br />
* Внедряет функцию '''overflow()''', определяющую переполнение буфера. Тип данных – [[Arduino:Справочник языка Arduino/Типы данных/boolean|boolean]]<br />
* Высокие скорости передачи данных были отрегулированы – в целях повышения корректности<br />
* Поддерживает '''ATMega328''' и '''168'''<br />
* Поддерживает процессоры на '''8 МГц'''<br />
* Использует прямой '''порт I/O''' – чтобы операции выполнялись быстрее и корректней<br />
* Поддерживает программную инверсию сигнала (начиная с '''версии 10''')<br />
* Поддерживает процессоры на '''20 МГц'''<br />
* Может работать на '''Teensy''' и '''Teensy++'''<br />
* Поддерживает функцию '''end()''' – в дополнение к '''begin()'''<br />
<br />
==Использование нескольких экземпляров==<br />
<br />
Хотя в описании библиотеки заявлено, что она поддерживает одновременно коммуникацию с несколькими девайсами, у этой функции все же есть ограничения. Обработка данных, асинхронно присылаемых от двух, трех, четырех и более устройств, подключенных через программные последовательные порты, может оказаться очень сложной, а то и вовсе неразрешимой проблемой. Представьте, что к '''Arduino''' подключено четыре устройства, и все передают данные на '''скорости 38400 бод'''. У процессора '''Arduino''' есть всего '''26 микросекунд''', чтобы обработать каждый из '''4 входящих битов''', иначе они будут попросту потеряны. <br />
<br />
Впрочем, пользователь все же может воспользоваться несколькими экземплярами '''библиотеки NewSoftSerial''', но лишь в том случае, если пойдет на небольшую уступку. Эта библиотека создавалась на принципе, что вы можете подключить столько девайсов, сколько будут позволять ограничения по ресурсам – до тех пор, пока одновременно используется только один из них. Если вы сможете переработать свой код в соответствии с этим требованием, то никаких проблем возникнуть не должно.<br />
<br />
Выражаясь более понятным языком, вам нужно, чтобы устройства передавали данные по очереди. Примерно вот так:<br />
<br />
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"><br />
#include <NewSoftSerial.h><br />
<br />
// это GPS-девайс, подключенный к контактам 3 и 4:<br />
NewSoftSerial gps(4,3);<br />
<br />
// это термометр, подключенный к контактам 5 и 6:<br />
NewSoftSerial therm(6,5);<br />
<br />
// это LCD, подключенный к контактам 7 и 8:<br />
NewSoftSerial LCD(8,7); <br />
<br />
void loop()<br />
{<br />
...<br />
// несколько секунд собираем данные от GPS-устройства:<br />
gps.listen();<br />
read_gps_data(); // в качестве активного устройства используем GPS-устройство<br />
// собираем температурные данные от термометра:<br />
therm.listen();<br />
read_thermometer_data(); // теперь используем термометр<br />
// здесь активным устройством становится LCD:<br />
LCD.listen();<br />
LCD.print("Data gathered..."); // "Данные собраны..."<br />
...<br />
}<br />
</syntaxhighlight><br />
<br />
В данном примере функция '''read_gps_data()''' использует объект '''gps''', а функция '''read_thermometer_data()''' – объект '''therm'''. Объект, вызываемый с функцией '''listen()''', становится '''«активным»''', в то время как предыдущий объект деактивируется, а его буфер опустошается. Важный момент в том, что если объект неактивен, то функция '''available()''' всегда возвращает '''«0»'''. Это значит, что вы не можете написать код типа такого:<br />
<br />
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"><br />
void loop()<br />
{<br />
device1.listen();<br />
if (device1.available() > 0)<br />
{<br />
int c = device1.read();<br />
...<br />
}<br />
device2.listen();<br />
if (device2.available() > 0)<br />
{<br />
int c = device2.read();<br />
...<br />
}<br />
}<br />
</syntaxhighlight><br />
<br />
Этот код не способен сделать ничего, кроме переключения с одного объекта на другой.<br />
<br />
==Инверсия сигнала==<br />
<br />
В '''«нормальной»''' транзисторно-транзисторной логике (или '''ТТЛ''') стартовым битом является '''«0»''' (или [[Arduino:Справочник языка Arduino/Константы/LOW|LOW]]), а стоповым – '''«1»''' (или [[Arduino:Справочник языка Arduino/Константы/HIGH|HIGH]]). Однако у некоторых девайсов, работающих через последовательный порт, эта логика перевернута, что называют '''«инверсией сигнала»'''. '''Библиотека NewSoftSerial''' поддерживает такие устройства, начиная '''с 10 версии''' – инвертированная логика включается через указание третьего [[Arduino:Справочник языка Arduino/Типы данных/boolean|boolean]]-параметра при создании экземпляра.<br />
<br />
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"><br />
NewSoftSerial myInvertedConn(7, 5, true); // у этого девайса инвертированный сигнал<br />
NewSoftSerial myGPS(3, 2); // у этого – нет<br />
</syntaxhighlight><br />
<br />
==Версия библиотеки==<br />
<br />
Информацию о версии библиотеки можно получить, вызвав статический член '''library_version()'''.<br />
<br />
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"><br />
int ver = NewSoftSerial::library_version();<br />
</syntaxhighlight><br />
<br />
==Потребление ресурсов==<br />
<br />
Ссылка на '''библиотеку NewSoftSerial''' добавляет размеру вашего скетча '''примерно 2000 байт'''.<br />
<br />
==Загрузка==<br />
<br />
Последняя версия '''NewSoftSerial''' доступна [http://arduiniana.org/NewSoftSerial/NewSoftSerial12.zip здесь]. Не загружайте ее, если у вас установлен '''IDE Arduino версии 1.0''' и выше – '''NewSoftSerial''' уже включена в ядро '''Arduino''', где называется '''SoftwareSerial'''.<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
{{Навигационная таблица/Портал/Arduino}}<br />
<br />
<br />
<br />
[[Категория:Функция]]<br />
[[Категория:Библиотека NewSoftSerial]]<br />
[[Категория:NewSoftSerial]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Arduino:%D0%91%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8/FFT&diff=13932203Arduino:Библиотеки/FFT2024-02-18T05:05:49Z<p>Myagkij: /* Скорость */</p>
<hr />
<div>{{Arduino панель перехода}}<br />
{{Перевод от Сubewriter}}<br />
{{Myagkij-редактор}}<br />
<br />
<br />
<br />
=Библиотека FFT<ref>[http://wiki.openmusiclabs.com/wiki/ArduinoFFT wiki.openmusiclabs.com - ArduinoFFT]</ref>=<br />
<br />
Примечания:<br />
* Если вам нужна более быстрая библиотека для анализа частоты, попробуйте [http://wiki.openmusiclabs.com/wiki/ArduinoFHT FHT]<br />
* Выходные данные, получаемые библиотекой '''FFT''', представлены не в '''ASCII''', а в двоичном формате. То есть данные, которые будут приходить по последовательному порту, удобочитаемыми не будут. Чтобы исправить это, поменяйте serial.write() на serial.print(). Кроме того, если вы хотите видеть каждый выходной отсчет, возможно, понадобится цикл [[Arduino:Справочник языка Arduino/Управляющие операторы/for|for()]].<br />
<br />
==О библиотеке==<br />
<br />
'''Библиотека FFT''' – программное воплощение стандартного алгоритма '''FFT''' (от '''«fast Fourier transform»''', что значит '''«быстрое преобразование Фурье»'''; далее – '''БПФ'''), который может оперировать только действительными числами. Функционал библиотеки способен выдавать '''от 16 до 256''' выходных отсчетов разрешением '''от 8 до 16 бит''' и минимальной скоростью обновления, равной примерно '''7 миллисекунд'''. Кроме того, выдача результата может быть в четырех разных форматах: линейном ('''16''' и '''8 бит'''), логарифмическом ('''8 бит''') и октавном ('''8 бит'''). Подробнее о каждом из этих четырех режимов читайте в разделе '''«Функции»'''. Поскольку исходные данные для алгоритма имеют '''16-битный формат''' (т.е. являются числом с фиксированной точкой), на низких частотах порог шума будет '''-72 дБ''', а на высоких он будет '''-76 дБ'''. Если вы будете использовать встроенный АЦП, то его порог шума рассчитывается по тому же принципу, что и порог шума для '''БПФ''', что дает '''ОСШ''' (отношение сигнал/шум) где-то между '''9''' и '''10''' битами ('''-55 дБ''').<br />
<br />
==Скорость==<br />
<br />
{| class="wikitable"<br />
|-<br />
! Функция !! Запуск !! Реорганизация !! Функция-окно !! Линейный формат (16 бит) !! Линейный формат (8 бит)* !! Логарифмический формат<br />
|-<br />
| '''N ''' ||'''мс''' || '''мкс ''' ||'''мкс ''' ||'''мкс ''' ||'''мкс ''' ||'''мкс'''<br />
|-<br />
| 256 ||6,32 ||412 ||608 ||588 ||470 ||608<br />
|-<br />
| 128 ||2,59 ||193 ||304 ||286 ||234 ||290<br />
|-<br />
| 64 ||1,02 ||97 ||152 ||145 ||114 ||144<br />
|-<br />
| 32 ||0,37 ||41 ||76 ||80 ||59 ||74<br />
|-<br />
| 16 ||0,12 ||21 ||37 ||46 ||30 ||39<br />
|}<br />
<br />
{{Примечание1|Значения для линейного формата ('''8 бит''') – приблизительные, т.к. могут немного варьироваться из-за директивы '''SCALE'''. Более подробно читайте ниже.}}<br />
<br />
==Память==<br />
<br />
{| class="wikitable"<br />
|-<br />
! Функция !! Запуск !!Реорганизация !!Функция-окно !!Линейный формат (16 бит) !!Линейный формат (8 бит) !!Логарифмический формат<br />
|-<br />
| '''N '''|| '''S/F (байты)''' ||'''F (байты)''' ||'''F (байты)''' ||'''S/F (байты)'''||'''S/F (байты)'''||'''S/F (байты)'''<br />
|-<br />
| 256 ||6,32 ||412 ||608 ||588 ||470 ||608<br />
|-<br />
| 128 || 2,59 || 193 || 304 || 286 || 234 || 290<br />
|-<br />
| 64 || 1,02 || 97 || 152 || 145 || 114 || 144<br />
|-<br />
| 32 || 0,37 || 41 || 76 || 80 || 59 || 74<br />
|-<br />
| 16 || 0,12 || 21 || 37 || 46|| 30 ||39<br />
|}<br />
<br />
* '''S''' – '''SRAM'''-память, '''F''' – '''flash'''-память.<br />
<br />
==Загрузка==<br />
<br />
* [http://wiki.openmusiclabs.com/wiki/ArduinoFFT?action=AttachFile&do=view&target=ArduinoFFT2.zip Версия для Arduino 1.05 (новая)]. Исправлена [[Arduino:Справочник языка Arduino/PROGMEM|PROGMEM]] для новой версии '''AVR-GCC''' (благодаря форумчанину '''kirill9617'''), добавлен пример с передачей данных по последовательному порту.<br />
* [http://wiki.openmusiclabs.com/wiki/ArduinoFFT?action=AttachFile&do=view&target=ArduinoFFT.zip Версия для Arduino 1.0 или Arduino-0022 (старая)]. Должна работать с обеими.<br />
<br />
==Установка ==<br />
<br />
Чтобы использовать библиотеку, скачайте '''ZIP'''-файл, распакуйте его, а затем поместите в папку для [[Arduino:Библиотеки|библиотек IDE Arduino]]. <br />
<br />
Чтобы узнать, где находится эта папка на '''PC''', откройте '''IDE Arduino''', кликните на '''Файл > Настройки (File > Preferences)''' – адрес папки будет указан в самом верху, в поле '''«Размещение папки скетчей» (Sketchbook location)'''. Затем перезапустите '''IDE Arduino'''. Если папки '''«libraries»''' нет, ее нужно создать. <br />
<br />
На '''Mac''' эта папка находится по адресу '''«/Пользователи/<Имя пользователя>/Документы/Arduino»''', или '''«/Пользователи/<Имя пользователя>/Документы/Maple»''' (если используете '''Maple'''). Если папки '''«libraries»''' нет, ее нужно создать.<br />
<br />
==Функции==<br />
<br />
'''Библиотека FFT''' состоит из нескольких функций – для того, чтобы пользователь мог приспособить ее под собственные нужды. То есть, если вам не нужны какие-то фрагменты библиотеки, их можно попросту удалить. <br />
<br />
Всего в библиотеке семь функций: две предварительные '''fft_reorder()''' и '''fft_window()''', одна главная '''fft_run()''' и четыре амплитудные, отвечающие за разные форматы выходных данных: для 16-битного линейного, 8-битного линейного, 8-битного логарифмического и 8-битного октавного.<br />
<br />
===fft_run()===<br />
<br />
Функция '''fft_run()''' – главная функция '''библиотеки FFT'''. Ей не нужны никакие аргументы, и она ничего не возвращает. Если вы запускаете эту функцию, то предполагается, что нужные данные уже реорганизованы и находятся в '''SRAM'''-памяти. Эти данные хранятся в архиве под названием '''fft_input[]''', который содержит два 16-битных значения – действительное и комплексное. Если вы заполняете этот массив самостоятельно, то действительные значения сохраняйте в четные выходные отсчеты, а комплексные – нечетные. <br />
<br />
Таким образом, '''fft_input[0]''' – это первое действительное значение, '''fft_input[1]''' – это первое комплексное значение, '''fft_input[2]''' – это второе действительное значение, '''fft_input[3]''' – это второе комплексное значение и т.д.<br />
<br />
Следовательно, получается удвоение, поэтому количество отсчетов в массиве будет в два раза больше, чем, собственно, реальных '''ПБФ'''-отсчетов. Если вы используете только действительные числа (т.е. значения, полученные от '''АЦП'''), то сохраняйте их в четные отсчеты, а в нечетные отсчеты вписывайте '''«0»'''.<br />
<br />
Результат сохраняется в '''fft_input[]''', где четные отсчеты отвечают за действительные амплитуды, а нечетные – за комплексные. Сами отсчеты являются диапазонами частоты (по возрастающей). <br />
<br />
Таким образом, '''fft_input[0]''' и '''fft_input[1]''' – это амплитуда для первого отсчета ('''0hz -> Fs/N'''), '''fft_input[2]''' и '''fft_input[3]''' – это амплитуда для второго отсчета ('''Fs/N -> 2Fs/N''') и т.д.<br />
<br />
Чтобы получить из этих отсчетов какие-либо полезные данные, понадобится запустить одну из четырех амплитудных функций (о них ниже).<br />
<br />
===fft_reorder()===<br />
<br />
Функция '''fft_reorder()''' реорганизовывает входные данные, подготавливая их к обработке алгоритмом '''БПФ'''. Возможно, это функция не понадобится, т.к. эта реорганизация может быть выполнена вручную. Функция '''fft_reorder()''' запускается перед '''fft_run()'''. Ей не нужны никакие аргументы, и она ничего не возвращает. Кроме того, перед вызовом этой функции нужно заполнить массив '''fft_input[]''', т.к. она берет исходные данные именно оттуда.<br />
<br />
===fft_window()===<br />
<br />
Функция '''fft_window()''' умножает входные данные при помощи функции-окна, чтобы увеличить частотное разрешение данных для '''ПБФ'''. Ей не нужны никакие аргументы, и она ничего не возвращает. Кроме того, перед вызовом этой функции нужно заполнить массив '''fft_input[]''', т.к. она берет исходные данные именно оттуда. Функция '''fft_reorder()''' запускается перед '''fft_run()''' и '''fft_reorder()'''.<br />
<br />
===fft_mag_lin8()===<br />
<br />
Функция '''fft_mag_lin8()''' дает амплитуду для каждого отсчета '''БПФ'''. Она суммирует действительные и комплексные значения, возведенные в квадрат, а потом извлекает квадратный корень, округляя результат до 8-битного значения (она использует таблицу поиска, подгоняя эти значения к полному 8-битному диапазону). Ей не нужны никакие аргументы, и она ничего не возвращает. Исходными данными для нее служат данные из массива '''fft_input[]''', а результат сохраняется в массив '''fft_lin_out8[]''', после чего эти данные можно использовать для других целей. Амплитуда рассчитывается только для первой половины выходных отсчетов ('''N/2'''), поскольку вторая половина '''БПФ''' идентична первой для всего диапазона исходных значений. Следовательно, количество 8-битных значений в массиве '''fft_lin_out8[]''' будет составлять '''N/2''', где каждый индекс будет соответствовать номеру выходного отсчета ('''минус «1»''').<br />
<br />
То есть '''fft_lin_out8[0]''' – это амплитуда для первого отсчета ('''0hz -> Fs/N'''), '''fft_lin_out8[1]''' – это амплитуда для второго отсчета ('''Fs/N -> 2Fs/N''') и т.д.<br />
<br />
Чтобы подогнать итоговые данные к используемому разрешению, воспользуйтесь директивой '''SCALE'''. Более подробно читайте ниже.<br />
<br />
===fft_mag_lin()===<br />
<br />
Функция '''fft_mag_lin()''' дает амплитуду для каждого отсчета '''БПФ'''. Она суммирует действительные и комплексные значения, возведенные в квадрат, а потом извлекает квадратный корень. Для извлечения квадратного корня используется таблица поиска, поэтому точность имеет некоторые ограничения. Функция охватывает полный 16-битный диапазон, но в любой отдельной точке этого диапазона разрешение все же будет 8-битным. <br />
<br />
Это 8-битное значение, где 4 бита отведено под порядок (т.е. под экспоненту). Исходными данными для нее служат данные из массива '''fft_input[]''', а результат сохраняется в массив '''fft_lin_out[]'''. Итоговые данные расположены в последовательном порядке, а их общее количество составляет '''N/2''', поскольку вторая половина '''БПФ''' идентична первой для всего диапазона исходных значений. <br />
<br />
===fft_mag_log()===<br />
<br />
Функция '''fft_mag_log()''' дает амплитуду для каждого отсчета '''БПФ'''. Она суммирует действительные и комплексные значения, возведенные в квадрат, затем извлекает квадратный корень. Далее функция рассчитывает логарифм полученного числа по отношению к двум. Результат будет представлен в логарифмическом формате – фактически, в децибелах. Функции '''fft_mag_log()''' не нужны никакие аргументы, и она ничего не возвращает. <br />
<br />
Для извлечения квадратного корня используется таблица поиска, а результат подгоняется под полный 8-битный диапазон. То есть уравнение функции будет следующим: '''16*(log2((комплексн2 + действ2)1/2))'''. Исходными данными для функции служат данные из массива '''fft_input[]''', а результат сохраняется в массив '''fft_log_out[]'''. Итоговые значения имеют тот же порядок, что и выходные отсчеты '''БПФ''', а общее количество отсчетов составляет '''N/2''', поскольку вторая половина '''БПФ''' идентична первой для всего диапазона исходных значений. <br />
<br />
===fft_mag_octave()===<br />
<br />
Функция '''fft_mag_octave()''' дает среднее квадратичное значение всех выходных отсчетов, представляя это все в октавном (удвоение частоты) формате. Этот формат, как правило, более полезен, потому что близок к тому, как люди воспринимают звук. Ей не нужны никакие аргументы, и она ничего не возвращает. Исходными данными для функции служат данные из массива '''fft_input[]''', а результат сохраняется в массив '''fft_oct_out[]'''. Итоговые данные представляют собой 8-битное значение, рассчитанное по формуле '''16*log2(квадр(ампл))'''. Количество выходных отсчетов рассчитывается следующим образом:<br />
<br />
<syntaxhighlight lang="c"><br />
FFT_N = 256 : отсчеты = [0, 1, 2:4, 5:8, 9:16, 17:32, 3:64, 65:128]<br />
FFT_N = 128 : отсчеты = [0, 1, 2:4, 5:8, 9:16, 17:32, 3:64]<br />
</syntaxhighlight><br />
<br />
Здесь, к примеру, '''5:8''' – это сумма всех отсчетов, расположенных '''с 5-го по 8-ой'''. Данные в каждом отсчете возводятся в квадрат (и действительные, и комплексные значения), а затем суммируются со всеми амплитудами (тоже возведенными в квадрат), находящимися в этом диапазоне. Затем берется количество выходных отсчетов и делится на полученное число (это, впрочем, можно отключить – смотрите следующий раздел) после чего извлекается квадратный корень и рассчитывается логарифм.<br />
<br />
==Подробнее о принципе работы библиотеки==<br />
<br />
Хотите '''«заглянуть под капот»'''? Окей, попробую объяснить, по каким принципам это все работает. За ускорение вычислений в библиотеке '''FFT''' отвечают две вещи. <br />
<br />
Во-первых, в каждом '''БПФ''' вам нужно умножать множество исходных значений на синусные и косинусные константы. На '''ATmega''' это требует больших вычислительных ресурсов, поскольку '''умножение 16 бит на 16 бит''' требует '''18 тактовых циклов'''. С другой стороны, '''сложение 16 бит и 16 бит''' требует только '''2 тактовых цикла.''' Отсюда вывод, что лучше складывать, чем умножать. Дело в том, что синусные и косинусные константы, используемые в '''БПФ''' – это просто '''«0»''' и '''«1»''', поэтому вам не обязательно использовать операцию умножения, т.к. достаточно и сложения. К примеру, если '''БПФ''' имеет '''256 выходных отсчетов''', то в нем нужно выполнить 1024 сложных умножения, из которых '''382''' – это '''«0»''' или '''«1»'''. Почти половина!<br />
<br />
'''Библиотека FFT''' для '''Arduino''' ищет условия, где используются эти '''«0»''' и '''«1»''', и попросту делает там сложение. Дело в том, что эти константы появляются с регулярными интервалами, поэтому искать их довольно просто. Впрочем, с увеличением количества выходных отсчетов преимущества этого метода снижаются. Если за количество выходных отсчетов в '''БПФ''' представить '''N''', то экономия времени будет составлять ('''1.5*N - 2'''), а общим количеством умножений будет '''(N/2)*log2(N'''). Таким образом, формулой, по которой рассчитываются экономия, будет '''3/log2(N)''', и чем выше '''N''', тем меньше времени можно сэкономить.<br />
<br />
Второй метод, направленный на ускорение работы '''БПФ''' – это таблицы поиска, с помощью которых рассчитываются квадратные корни амплитуд. Сложность этого метода в том, что исходных данных гораздо больше, чем содержимое таблицы поиска. Таким образом, чтобы не тратить зря программную память, исходные данные нужно сжать. К примеру, если извлечь квадратный корень из '''16-битного значения''', мы получим '''64 тысячи входных значений''', которые нужно как-то подогнать к '''256 выходным значениям'''. В программной памяти '''Arduino''' невозможно провести такой объем вычислений, поэтому в библиотеке ко всему массиву входных данных применяется линейная интерполяция, в результате которой для разных участков будут рассчитаны разные линии. К примеру, для линейного 8-битного формата будет достаточно '''3-4 линейных секций''', причем без потери разрешения. <br />
<br />
Таким образом, библиотека вычисляет входное значение для одной из этих линейных секций, затем извлекает квадратный корень, и это занимает примерно '''12 тактовых циклов'''. Это гораздо меньше тех '''150 циклов''', которые требуются в стандартной библиотеке для извлечения квадратного корня.<br />
<br />
Версия с '''32-битными входными данными''' немного сложнее, потому что теперь выходные данные нужно подогнать к '''16 битам''', а линейная интерполяция здесь не поможет, потому что не умеет сжимать значения, разрешение которых больше '''16 бит'''. Поэтому здесь применяется гибридный подход, при котором входное значение конвертируется в 16-битное значение с '''8-битным порядком.''' Это можно сделать очень быстро с основанием '''«2»''', что позволяет использовать таблицу поиска квадратного корня и для значений с разрешением выше '''16 бит'''. Если при сжатии входного значения выполнен '''сдвиг на 2 бита вправо''', то выходное значение может быть реконструировано со '''сдвигом на 1 бит влево'''. Как правило, после создания порядок (т.е. экспоненту) округляют до четного числа, в результате чего квадратный корень может вернуть целочисленное значение. <br />
<br />
Разумеется, '''32-битная версия''' не так точна, как библиотека для вычисления квадратного корня, но требует всего '''40 циклов''', тогда как эта библиотека требует '''500'''. Таблица поиска возвращает значение, где точными являются только первые '''8 бит''', но для этого '''БПФ''' такой точности вполне достаточно. Общая битовая глубина '''БПФ''' не сильно уступает '''12 битам''', поскольку в нем используется фиксированная точка (во избежание переполнения перед сложением каждое значение должно быть поделено на '''2'''; если '''БПФ''' имеет '''256 выходных отсчетов''', это в конце концов дает '''деление на 256'''). Точность зависит от разрешения выходных данных. Если это '''8-битное значение''', то точность будет максимальной. Если это '''9-битное значение''', то один младший бит, возможно, будет неправильным. Если это '''10-битное значение''', то два младших бита, возможно, будут неправильными и т.д. То есть самый худший сценарий – это '''16-битное значение''' с точностью '''+/- 0,5%'''.<br />
<br />
==Директивы==<br />
<br />
Эти значения позволяют вам модифицировать код '''FFT''' под собственные нужды. Большинство из них включают и выключают определенные функции библиотеки. По умолчанию большинство функций выключены, поэтому чтобы использовать, их нужно сначала включить. Эти директивы вписываются при помощи конструкции [[Arduino:Справочник языка Arduino/Синтаксис/define|#define]] и делать это нужно перед подключением библиотек, что делается конструкцией [[Arduino:Справочник языка Arduino/Синтаксис/include|#include]].<br />
<br />
* Директива '''FFT_N''' задает размер '''БПФ'''. Возможные варианты: '''16''', '''32''', '''64''', '''128''' и '''256'''. По умолчанию выставлен вариант '''256'''.<br />
* Директива '''SCALE''' отвечает за масштабирование в функции '''fft_mag_lin8()'''. Поскольку '''8 бит''' – это довольно слабое разрешение, пользователь, возможно, захочет масштабировать данные, чтобы максимизировать их до полного диапазона. <br />
* Директива '''SCALE''' умножает выходные данные на константу перед извлечением квадратного корня, в результате чего на выходе получается максимизированное разрешение. Это потребует чуть больше ресурсов, чем обычно, но излишний расход будет очень невелик. В директиве '''SCALE''' можно указать любое число в диапазоне '''от 1 до 255'''. По умолчанию выставлено '''1'''. Наименьшее количество ресурсов расходуется при использовании '''1''', '''2''', '''4''', '''128''' и '''256'''.<br />
* Директива '''WINDOW''' включает и выключает функцию-окно. Если вы не используете '''fft_window()''', то нужно вписать '''WINDOW 0 (выкл)'''. По умолчанию стоит '''WINDOW 1 (вкл)'''.<br />
* Директива '''REORDER''' включает и выключает функцию реорганизации. Если вы не используете '''fft_reorder()''', то нужно вписать '''REORDER 0 (выкл)'''. По умолчанию стоит '''REORDER 1 (вкл)'''.<br />
* Директива '''LOG_OUT''' включает и выключает функцию для логарифмического формата. Если вы используете '''fft_mag_log()''', то нужно вписать '''LOG_OUT 1 (вкл)'''. По умолчанию стоит '''LOG_OUT 0 (выкл)'''.<br />
* Директива '''LIN_OUT''' включает и выключает функцию для линейного ('''16 бит''') формата. Если вы используете '''fft_mag_lin()''', то нужно вписать '''LIN_OUT 1 (вкл)'''. По умолчанию стоит '''LIN_OUT 0 (выкл)'''.<br />
* Директива '''LIN_OUT8''' включает и выключает функцию для линейного ('''8 бит''') формата. Если вы используете '''fft_mag_lin8()''', то нужно вписать '''LIN_OUT8 1 (вкл)'''. По умолчанию стоит '''LIN_OUT8 0 (выкл)'''.<br />
* Директива '''OCTAVE''' включает и выключает функцию для октавного формата. Если вы используете '''fft_mag_octave()''', то нужно вписать '''OCTAVE 1 (вкл)'''. По умолчанию стоит '''OCTAVE 0 (выкл)'''.<br />
* Директива '''OCT_NORM''' включает и выключает у октавного формата функцию нормализации. Она является частью функции '''fft_mag_octave()''', которая делит каждый сгруппированный отсчет на среднее количество отсчетов. Поскольку многие источники звука издают так называемый '''«розовый шум»''' (это падение амплитуды при увеличении частоты), это приводит и к уменьшению масштаба. Будучи выключенной ('''OCT_NORM 0'''), эта директива искусственно повышает амплитуду на высоких частотах. По умолчанию нормализация включена ('''OCT_NORM 1''').<br />
<br />
==Примеры==<br />
<br />
* [[Arduino:Примеры/fft adc|fft adc]] - Применение '''БПФ''' на данных от '''АЦП''' и отправка результата посредством [[Arduino:Справочник языка Arduino/Библиотеки/Serial/write()|write()]] <br />
* [[Arduino:Примеры/fft adc serial|fft adc serial]] - Применение '''БПФ''' на данных от '''АЦП''' и отправка результата посредством [[Arduino:Справочник языка Arduino/Библиотеки/Serial/println()|println()]]<br />
* [[Arduino:Примеры/fft codec|fft codec]] - Применение '''БПФ''' на данных от модуля '''Codec Shield'''<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
{{Навигационная таблица/Портал/Arduino}}<br />
<br />
<br />
<br />
[[Категория:Библиотека FFT]]<br />
[[Категория:FFT]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Linux:%D0%A0%D0%B5%D1%86%D0%B5%D0%BF%D1%82%D1%8B/%D0%92%D1%8B%D0%B2%D0%BE%D0%B4_%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0_%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D1%84%D0%B5%D0%B9%D1%81%D0%BE%D0%B2_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D1%8B%D1%85_%D0%B4%D0%BB%D1%8F_%D0%B7%D0%B0%D1%85%D0%B2%D0%B0%D1%82%D0%B0_%D0%B2_tshark&diff=13459600Linux:Рецепты/Вывод списка интерфейсов доступных для захвата в tshark2024-02-07T16:12:01Z<p>Myagkij: Новая страница: «{{Панель управления/Linux}} {{Myagkij-редактор}} =Вывод списка интерфейсов доступных для захвата в tshark= ==Проблема== Вывести списка интерфейсов доступных для захвата в tshark. ==Решение== <syntaxhighlight lang="bash"> tshark -D </syntaxhighlight> =См.также= =Внешние ссылки= <references /> {{Навига...»</p>
<hr />
<div>{{Панель управления/Linux}}<br />
{{Myagkij-редактор}}<br />
<br />
=Вывод списка интерфейсов доступных для захвата в tshark=<br />
<br />
==Проблема==<br />
<br />
Вывести списка интерфейсов доступных для захвата в tshark.<br />
<br />
==Решение==<br />
<br />
<syntaxhighlight lang="bash"><br />
tshark -D<br />
</syntaxhighlight><br />
<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
<br />
{{Навигационная таблица/Портал/Linux}}<br />
[[категория:Рецепт]]<br />
[[категория:Рецепты]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Linux/%D0%A0%D0%B5%D1%86%D0%B5%D0%BF%D1%82%D1%8B&diff=13459577Шаблон:Linux/Рецепты2024-02-07T16:11:26Z<p>Myagkij: /* Не отсортирванно */</p>
<hr />
<div>==Рецепты==<br />
<br />
===Не отсортирванно===<br />
<br />
* [[Linux:Рецепты/Определить тип файла|Определить тип файла]]<br />
* [[Linux:Рецепты/Вернуться в предыдущую директорию|Вернуться в предыдущую директорию]]<br />
* [[Linux:Рецепты/Перенаправление стандартного вывода и стандартного вывода ошибок в один файл|Перенаправление стандартного вывода и стандартного вывода ошибок в один файл]]<br />
* [[Linux:Рецепты/Наблюдение за изменением содержимого файла в режиме реального времени|Наблюдение за изменением содержимого файла в режиме реального времени]]<br />
* [[Linux:Рецепты/Создание группы каталогов с номером года и месяца|Создание группы каталогов с номером года и месяца]]<br />
* [[Linux:Рецепты/Найти и удалить файлы по критерию|Найти и удалить файлы по критерию]]<br />
* [[Linux:Рецепты/Преобразовать файл формата PostScript в PDF|Преобразовать файл формата PostScript в PDF]]<br />
* [[Linux:Рецепты/Поиск программ формат2формат или форматtoформат|Поиск программ формат2формат или форматtoформат]]<br />
* [[Linux:Рецепты/Добавить каталог в PATH|Добавить каталог в PATH]]<br />
* [[Linux:Рецепты/Узнать ID текущего пользователя|Узнать ID текущего пользователя]]<br />
* [[Linux:Рецепты/Восстановить ключ продукта OEM для Windows 8 или Windows 10|Восстановить ключ продукта OEM для Windows 8 или Windows 10]]<br />
* [[Linux:Рецепты/Перевести программу в фоновый режим|Перевести программу в фоновый режим]]<br />
* [[Linux:Рецепты/Проверить текущий путь поиска конфигурации systemd|Проверить текущий путь поиска конфигурации systemd]]<br />
* [[Linux:Рецепты/Посмотреть каталог системного юнита(systemd)|Посмотреть каталог системного юнита(systemd)]]<br />
* [[Linux:Рецепты/Посмотреть каталог конфигурации системы(systemd)|Посмотреть каталог системного юнита(systemd)]]<br />
* [[Linux:Рецепты/Посмотреть список активных юнитов|Посмотреть список активных юнитов]]<br />
* [[Linux:Рецепты/Установить RTC на часы UTC для ядра|Установить RTC на часы UTC для ядра]]<br />
* [[Linux:Рецепты/Количество секунд с 12:00 полуночи 1 января 1970 года по UTC|Количество секунд с 12:00 полуночи 1 января 1970 года по UTC]]<br />
* [[Linux:Рецепты/Планирование разовых задач|Планирование разовых задач]]<br />
* [[Linux:Рецепты/Запуск юнита таймера при выходе пользователя|Запуск юнита таймера при выходе пользователя]]<br />
* [[Linux:Рецепты/Узнать размер страницы системы|Узнать размер страницы системы]]<br />
* [[Linux:Рецепты/Запуск sshd при загрузке системы|Запуск sshd при загрузке системы]]<br />
* [[Linux:Рецепты/Посмотреть список доменных сокетов Unix|Посмотреть список доменных сокетов Unix]]<br />
* [[Linux:Рецепты/Исключение файлов и каталогов при использовании rsync|Исключение файлов и каталогов при использовании rsync]]<br />
* [[Linux:Рецепты/Запуск SAMBA сервера вручную|Запуск SAMBA сервера вручную]]<br />
* [[Linux:Рецепты/Определить является ли оболочка оболочкой входа в систему|Определить является ли оболочка оболочкой входа в систему]]<br />
* [[Linux:Рецепты/Узнать используется ли у вас Wayland|Узнать используется ли у вас Wayland]]<br />
* [[Linux:Рецепты/Узнать, какие разделяемые библиотеки использует программа|Узнать, какие разделяемые библиотеки использует программа]]<br />
* [[Linux:Рецепты/Использует ли ваш дистрибутив Linux систему инициализации systemd|Использует ли ваш дистрибутив Linux систему инициализации systemd]]<br />
* [[Linux:Рецепты/Список запущенных программ ввиде дерева|Список запущенных программ ввиде дерева]]<br />
* [[Linux:Рецепты/Список служб и их состояний с помощью команды systemctl|Список служб и их состояний с помощью команды systemctl]]<br />
* [[Linux:Рецепты/Определение состояния выбранных служб с помощью команды systemctl|Определение состояния выбранных служб с помощью команды systemctl]]<br />
* [[Linux:Рецепты/Запуск и остановка служб с помощью systemd|Запуск и остановка служб с помощью systemd]]<br />
* [[Linux:Рецепты/Включение и выключение служб|Включение и выключение служб]]<br />
* [[Linux:Рецепты/Остановка неисправных процессов|Остановка неисправных процессов]]<br />
* [[Linux:Рецепты/Управление уровнями запуска с помощью systemd|Управление уровнями запуска с помощью systemd]]<br />
* [[Linux:Рецепты/Диагностика медленного запуска|Диагностика медленного запуска]]<br />
* [[Linux:Рецепты/Определение UID и GID пользователя|Определение UID и GID пользователя]]<br />
* [[Linux:Рецепты/Создание учетной записи для пользователя-человека|Создание учетной записи для пользователя-человека]]<br />
* [[Linux:Рецепты/Создание системной учетной записи|Создание системной учетной записи]]<br />
* [[Linux:Рецепты/Изменение настроек по умолчанию для команды useradd|Изменение настроек по умолчанию для команды useradd]]<br />
* [[Linux:Рецепты/Настройка каталогов для документов, музыки, видео, изображений и загрузок|Настройка каталогов для документов, музыки, видео, изображений и загрузок]]<br />
* [[Linux:Рецепты/Создание пользовательской группы с помощью команды groupadd|Создание пользовательской группы с помощью команды groupadd]]<br />
* [[Linux:Рецепты/Создание системной группы с помощью команды groupadd|Создание системной группы с помощью команды groupadd]]<br />
* [[Linux:Рецепты/Добавление пользователя в группу с помощью команды usermod|Добавление пользователя в группу с помощью команды usermod]]<br />
* [[Linux:Рецепты/Создание пользователей с помощью команды adduser в дистрибутивах на основе Debian|Создание пользователей с помощью команды adduser в дистрибутивах на основе Debian]]<br />
* [[Linux:Рецепты/Создание системного пользователя с помощью команды adduser в дистрибутивах на основе Debian|Создание системного пользователя с помощью команды adduser в дистрибутивах на основе Debian]]<br />
* [[Linux:Рецепты/Создание пользовательских групп с помощью команды addgroup|Создание пользовательских групп с помощью команды addgroup]]<br />
* [[Linux:Рецепты/Создание системных групп с помощью команды addgroup|Создание системных групп с помощью команды addgroup]]<br />
* [[Linux:Рецепты/Проверка целостности файла паролей|Проверка целостности файла паролей]]<br />
* [[Linux:Рецепты/Отключение учетной записи пользователя|Отключение учетной записи пользователя]]<br />
* [[Linux:Рецепты/Удаление пользователя с помощью команды userdel|Удаление пользователя с помощью команды userdel]]<br />
* [[Linux:Рецепты/Удаление пользователя с помощью команды deluser в дистрибутивах на основе Debian|Удаление пользователя с помощью команды deluser в дистрибутивах на основе Debian]]<br />
* [[Linux:Рецепты/Удаление группы с помощью команды delgroup в дистрибутивах на основе Debian|Удаление группы с помощью команды delgroup в дистрибутивах на основе Debian]]<br />
* [[Linux:Рецепты/Поиск всех файлов пользователя|Поиск всех файлов пользователя]]<br />
* [[Linux:Рецепты/Использование su для получения привилегий root|Использование su для получения привилегий root]]<br />
* [[Linux:Рецепты/Получение ограниченных привилегий root с помощью команды sudo|Получение ограниченных привилегий root с помощью команды sudo]]<br />
* [[Linux:Рецепты/Настройка времени кэширования пароля в sudo|Настройка времени кэширования пароля в sudo]]<br />
* [[Linux:Рецепты/Создание отдельных конфигураций для пользователей sudo|Создание отдельных конфигураций для пользователей sudo]]<br />
* [[Linux:Рецепты/Настройка sudo для использования без ввода пароля root|Настройка sudo для использования без ввода пароля root]]<br />
* [[Linux:Рецепты/Создание каталогов|Создание каталогов]]<br />
* [[Linux:Рецепты/Создание файлов|Создание файлов]]<br />
* [[Linux:Рецепты/Создание пакетов файлов|Создание пакетов файлов]]<br />
* [[Linux:Рецепты/Удаление файлов и каталогов|Удаление файлов и каталогов]]<br />
* [[Linux:Рецепты/Копирование, перемещение и переименование файлов и каталогов|Копирование, перемещение и переименование файлов и каталогов]]<br />
* [[Linux:Рецепты/Настройка разрешений файлов с помощью команды chmod с использованием восьмеричного представления|Настройка разрешений файлов с помощью команды chmod с использованием восьмеричного представления]]<br />
* [[Linux:Рецепты/Настройка разрешений каталогов с помощью команды chmod с использованием восьмеричного представления|Настройка разрешений каталогов с помощью команды chmod с использованием восьмеричного представления]]<br />
* [[Linux:Рецепты/Особые режимы разрешений|Особые режимы разрешений]]<br />
* [[Linux:Рецепты/Удаление особых режимов с помощью восьмеричного представления|Удаление особых режимов с помощью восьмеричного представления]]<br />
* [[Linux:Рецепты/Исправить ошибку "An error occurred during the signature verification..."|Исправить ошибку "An error occurred during the signature verification..."]]<br />
* [[Linux:Рецепты/При записи в файл tshark выдаёт ошибку|При записи в файл tshark выдаёт ошибку]]<br />
* [[Linux:Рецепты/Вывод списка интерфейсов доступных для захвата в tshark|Вывод списка интерфейсов доступных для захвата в tshark]]<br />
<br />
===Работа с электропитанием системы===<br />
<br />
* [[Linux:Рецепты/Выключение с помощью команды systemctl|Выключение с помощью команды systemctl]]<br />
* [[Linux:Рецепты/Выключение с помощью команды shutdown|Выключение с помощью команды shutdown]]<br />
* [[Linux:Рецепты/Управление режимом энергосбережения с помощью команды systemctl|Управление режимом энергосбережения с помощью команды systemctl]]<br />
* [[Linux:Рецепты/Настройка комбинации Ctrl+Alt+Del в системах Linux без systemd|Настройка комбинации Ctrl+Alt+Del в системах Linux без systemd]]<br />
* [[Linux:Рецепты/Настройка комбинации Ctrl+Alt+Del в системах Linux с systemd|Настройка комбинации Ctrl+Alt+Del в системах Linux с systemd]]<br />
* [[Linux:Рецепты/Автоматическое включение с помощью часов реального времени|Автоматическое включение с помощью часов реального времени]]<br />
* [[Linux:Рецепты/Удаленное включение по сети с помощью проводного Ethernet|Удаленное включение по сети с помощью проводного Ethernet]]<br />
* [[Linux:Рецепты/Удаленное включение через Wi-Fi (WoWLAN)|Удаленное включение через Wi-Fi (WoWLAN)]]<br />
<br />
===Работа с cron===<br />
<br />
* [[Linux:Рецепты/Выключение по cron|Выключение по cron]]<br />
<br />
===Работа с текстом===<br />
<br />
* [[Linux:Рецепты/Найти слово из кроссворда|Найти слово из кроссворда]]<br />
* [[Linux:Рецепты/Преобразовать текст из нижнего регистра в вверхний|Преобразовать текст из нижнего регистра в вверхний]]<br />
* [[Linux:Рецепты/Шифрование текста по алгоритму ROT13|Шифрование текста по алгоритму ROT13]]<br />
* [[Linux:Рецепты/Глобальный поиск и замена в vi|Глобальный поиск и замена в vi]]<br />
<br />
===Работа с сетью===<br />
<br />
* [[Linux:Рецепты/Узнать, MAC-адрес вашего Ethernet-адаптера|Узнать, MAC-адрес вашего Ethernet-адаптера]]<br />
* [[Linux:Рецепты/Узнать, MAC-адрес вашего WiFi-адаптера|Узнать, MAC-адрес вашего WiFi-адаптера]]<br />
* [[Linux:Рецепты/Узнать публичный IP-адрес|Узнать публичный IP-адрес]]<br />
* [[Linux:Рецепты/Узнать IP-адрес, скрывающийся за доменным именем|Узнать IP-адрес, скрывающийся за доменным именем]]<br />
* [[Linux:Рецепты/Настройка IP-адреса и подсети для сетевого интерфейса|Настройка IP-адреса и подсети для сетевого интерфейса]]<br />
* [[Linux:Рецепты/Настроить шлюз по умолчанию|Настроить шлюз по умолчанию]]<br />
* [[Linux:Рецепты/Удалить шлюз по умолчанию|Удалить шлюз по умолчанию]]<br />
* [[Linux:Рецепты/Включение маршрутизации пакетов между подсетями|Включение маршрутизации пакетов между подсетями]]<br />
* [[Linux:Рецепты/Посмотреть кэш ARP|Посмотреть кэш ARP]]<br />
* [[Linux:Рецепты/Узнать какие службы RPC есть на вашем компьютере|Узнать какие службы RPC есть на вашем компьютере]]<br />
* [[Linux:Рецепты/Быстрое копирование данных по сети|Быстрое копирование данных по сети]]<br />
<br />
===Работа с консолью/терминалом===<br />
<br />
* [[Linux:Рецепты/Продолжение работы программы при закрытии терминала|Продолжение работы программы при закрытии терминала]]<br />
* [[Linux:Рецепты/Получить доступ к виртуальному терминалу|Получить доступ к виртуальному терминалу]]<br />
* [[Linux:Рецепты/Переключение между виртуальными консолями|Переключение между виртуальными консолями]]<br />
* [[Linux:Рецепты/Вернуться из виртуального терминала в графический интерфейс|Вернуться из виртуального терминала в графический интерфейс]]<br />
<br />
===Работа с BASH===<br />
<br />
* [[Linux:Рецепты/Вывод номеров строк при включённой трассировке BASH скрипта|Вывод номеров строк при включённой трассировке BASH скрипта]]<br />
* [[Linux:Рецепты/Обработать большое количество аргументов в BASH скрипте|Обработать большое количество аргументов в BASH скрипте]]<br />
* [[Linux:Рецепты/Сортировка массива в BASH скрипте|Сортировка массива в BASH скрипте]]<br />
* [[Linux:Рецепты/Создание временных файлов|Создание временных файлов]]<br />
* [[Linux:Рецепты/Удаление временных файлов|Удаление временных файлов]]<br />
* [[Linux:Рецепты/Удалить расширение файла из имени файла|Удалить расширение файла из имени файла]]<br />
* [[Linux:Рецепты/Избавиться от названий каталогов из полного пути|Избавиться от названий каталогов из полного пути]]<br />
* [[Linux:Рецепты/Выбрать одно поле из входного потока|Выбрать одно поле из входного потока]]<br />
<br />
===Работа с HDD, SSD, USB-флешки===<br />
<br />
* [[Linux:Рецепты/Перечислить устройства SCSI|Перечислить устройства SCSI]]<br />
* [[Linux:Рецепты/Посмотреть таблицу разделов|Посмотреть таблицу разделов]]<br />
* [[Linux:Рецепты/Узнать UUID подключенных устройств|Узнать UUID подключенных устройств]]<br />
* [[Linux:Рецепты/Создание загрузочного USB-накопителя с Linux|Создание загрузочного USB-накопителя с Linux]]<br />
* [[Linux:Рецепты/Создание установочного USB-носителя с Linux с помощью dd|Создание установочного USB-носителя с Linux с помощью dd]]<br />
* [[Linux:Рецепты/Как просмотреть нагрузку на диск в Linux|Как просмотреть нагрузку на диск в Linux]]<br />
<br />
===Работа с архивами===<br />
<br />
* [[Linux:Рецепты/Создание tar-архива|Создание tar-архива]]<br />
* [[Linux:Рецепты/Распаковка tar-архива|Распаковка tar-архива]]<br />
<br />
===Работа с принтерами===<br />
<br />
* [[Linux:Рецепты/Получить список принтеров, известных системе|Получить список принтеров, известных системе]]<br />
* [[Linux:Рецепты/Посмотреть конфигурацию принтера через браузер|Посмотреть конфигурацию принтера через браузер]]<br />
<br />
===Работа с компакт дисками===<br />
<br />
* [[Linux:Рецепты/Очистка перезаписываемых компакт-дисков|Очистка перезаписываемых компакт-дисков]]<br />
<br />
===Работа с ISO===<br />
<br />
* [[Linux:Рецепты/Запись образа|Запись образа]]<br />
* [[Linux:Рецепты/Смонтировать ISO-образ|Смонтировать ISO-образ]]<br />
* [[Linux:Рецепты/Создание образа из коллекции файлов|Создание образа из коллекции файлов]]<br />
<br />
===Работа с swap===<br />
<br />
* [[Linux:Рецепты/Очистить swap в Linux|Очистить swap в Linux]]<br />
* [[Linux:Рецепты/Узнать, используется ли swap|Узнать, используется ли swap]]<br />
* [[Linux:Рецепты/Использование файла в качестве области подкачки|Использование файла в качестве области подкачки]]<br />
<br />
===Работа с GRUB===<br />
<br />
* [[Linux:Рецепты/Повторная сборка конфигурационного файла GRUB|Повторная сборка конфигурационного файла GRUB]]<br />
* [[Linux:Рецепты/При загрузке нет меню GRUB|При загрузке нет меню GRUB]]<br />
* [[Linux:Рецепты/Отображение скрытого меню GRUB|Отображение скрытого меню GRUB]]<br />
* [[Linux:Рецепты/Настроить фоновое изображение меню GRUB|Настроить фоновое изображение меню GRUB]]<br />
* [[Linux:Рецепты/Изменение цвета шрифтов в меню GRUB|Изменение цвета шрифтов в меню GRUB]]<br />
* [[Linux:Рецепты/Применение темы оформления к меню GRUB|Применение темы оформления к меню GRUB]]<br />
* [[Linux:Рецепты/Восстановление незагружающейся системы из приглашения grub|Восстановление незагружающейся системы из приглашения grub]]<br />
* [[Linux:Рецепты/Восстановление незагружающейся системы из приглашения grub rescue|Восстановление незагружающейся системы из приглашения grub rescue]]<br />
* [[Linux:Рецепты/Переустановка конфигурации GRUB|Переустановка конфигурации GRUB]]<br />
* [[Linux:Рецепты/|Рецепты/]]<br />
* [[Linux:Рецепты/|Рецепты/]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=Linux:%D0%A0%D0%B5%D1%86%D0%B5%D0%BF%D1%82%D1%8B/%D0%9F%D1%80%D0%B8_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D0%B8_%D0%B2_%D1%84%D0%B0%D0%B9%D0%BB_tshark_%D0%B2%D1%8B%D0%B4%D0%B0%D1%91%D1%82_%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D1%83&diff=13459527Linux:Рецепты/При записи в файл tshark выдаёт ошибку2024-02-07T16:09:53Z<p>Myagkij: Новая страница: «{{Панель управления/Linux}} {{Myagkij-редактор}} =При записи в файл tshark выдаёт ошибку= ==Проблема== При записи в файл tshark выдаёт ошибку: <syntaxhighlight lang="bash"> Running as user "root" and group "root". This could be dangerous. Capturing on 'eth0' tshark: The file to which the capture would be saved ("test.pcap") could not be opened: Permission denied. </syntax...»</p>
<hr />
<div>{{Панель управления/Linux}}<br />
{{Myagkij-редактор}}<br />
<br />
=При записи в файл tshark выдаёт ошибку=<br />
<br />
==Проблема==<br />
<br />
При записи в файл tshark выдаёт ошибку:<br />
<br />
<syntaxhighlight lang="bash"><br />
Running as user "root" and group "root". This could be dangerous.<br />
Capturing on 'eth0'<br />
tshark: The file to which the capture would be saved ("test.pcap") could not be opened: Permission denied.<br />
</syntaxhighlight><br />
<br />
==Решение==<br />
<br />
Необходимо писать в папку tmp:<br />
<br />
<syntaxhighlight lang="bash"><br />
tshark -i eth0 -w /tmp/test.pcap<br />
</syntaxhighlight><br />
<br />
<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
<br />
{{Навигационная таблица/Портал/Linux}}<br />
[[категория:Рецепт]]<br />
[[категория:Рецепты]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Linux/%D0%A0%D0%B5%D1%86%D0%B5%D0%BF%D1%82%D1%8B&diff=13459483Шаблон:Linux/Рецепты2024-02-07T16:08:15Z<p>Myagkij: /* Не отсортирванно */</p>
<hr />
<div>==Рецепты==<br />
<br />
===Не отсортирванно===<br />
<br />
* [[Linux:Рецепты/Определить тип файла|Определить тип файла]]<br />
* [[Linux:Рецепты/Вернуться в предыдущую директорию|Вернуться в предыдущую директорию]]<br />
* [[Linux:Рецепты/Перенаправление стандартного вывода и стандартного вывода ошибок в один файл|Перенаправление стандартного вывода и стандартного вывода ошибок в один файл]]<br />
* [[Linux:Рецепты/Наблюдение за изменением содержимого файла в режиме реального времени|Наблюдение за изменением содержимого файла в режиме реального времени]]<br />
* [[Linux:Рецепты/Создание группы каталогов с номером года и месяца|Создание группы каталогов с номером года и месяца]]<br />
* [[Linux:Рецепты/Найти и удалить файлы по критерию|Найти и удалить файлы по критерию]]<br />
* [[Linux:Рецепты/Преобразовать файл формата PostScript в PDF|Преобразовать файл формата PostScript в PDF]]<br />
* [[Linux:Рецепты/Поиск программ формат2формат или форматtoформат|Поиск программ формат2формат или форматtoформат]]<br />
* [[Linux:Рецепты/Добавить каталог в PATH|Добавить каталог в PATH]]<br />
* [[Linux:Рецепты/Узнать ID текущего пользователя|Узнать ID текущего пользователя]]<br />
* [[Linux:Рецепты/Восстановить ключ продукта OEM для Windows 8 или Windows 10|Восстановить ключ продукта OEM для Windows 8 или Windows 10]]<br />
* [[Linux:Рецепты/Перевести программу в фоновый режим|Перевести программу в фоновый режим]]<br />
* [[Linux:Рецепты/Проверить текущий путь поиска конфигурации systemd|Проверить текущий путь поиска конфигурации systemd]]<br />
* [[Linux:Рецепты/Посмотреть каталог системного юнита(systemd)|Посмотреть каталог системного юнита(systemd)]]<br />
* [[Linux:Рецепты/Посмотреть каталог конфигурации системы(systemd)|Посмотреть каталог системного юнита(systemd)]]<br />
* [[Linux:Рецепты/Посмотреть список активных юнитов|Посмотреть список активных юнитов]]<br />
* [[Linux:Рецепты/Установить RTC на часы UTC для ядра|Установить RTC на часы UTC для ядра]]<br />
* [[Linux:Рецепты/Количество секунд с 12:00 полуночи 1 января 1970 года по UTC|Количество секунд с 12:00 полуночи 1 января 1970 года по UTC]]<br />
* [[Linux:Рецепты/Планирование разовых задач|Планирование разовых задач]]<br />
* [[Linux:Рецепты/Запуск юнита таймера при выходе пользователя|Запуск юнита таймера при выходе пользователя]]<br />
* [[Linux:Рецепты/Узнать размер страницы системы|Узнать размер страницы системы]]<br />
* [[Linux:Рецепты/Запуск sshd при загрузке системы|Запуск sshd при загрузке системы]]<br />
* [[Linux:Рецепты/Посмотреть список доменных сокетов Unix|Посмотреть список доменных сокетов Unix]]<br />
* [[Linux:Рецепты/Исключение файлов и каталогов при использовании rsync|Исключение файлов и каталогов при использовании rsync]]<br />
* [[Linux:Рецепты/Запуск SAMBA сервера вручную|Запуск SAMBA сервера вручную]]<br />
* [[Linux:Рецепты/Определить является ли оболочка оболочкой входа в систему|Определить является ли оболочка оболочкой входа в систему]]<br />
* [[Linux:Рецепты/Узнать используется ли у вас Wayland|Узнать используется ли у вас Wayland]]<br />
* [[Linux:Рецепты/Узнать, какие разделяемые библиотеки использует программа|Узнать, какие разделяемые библиотеки использует программа]]<br />
* [[Linux:Рецепты/Использует ли ваш дистрибутив Linux систему инициализации systemd|Использует ли ваш дистрибутив Linux систему инициализации systemd]]<br />
* [[Linux:Рецепты/Список запущенных программ ввиде дерева|Список запущенных программ ввиде дерева]]<br />
* [[Linux:Рецепты/Список служб и их состояний с помощью команды systemctl|Список служб и их состояний с помощью команды systemctl]]<br />
* [[Linux:Рецепты/Определение состояния выбранных служб с помощью команды systemctl|Определение состояния выбранных служб с помощью команды systemctl]]<br />
* [[Linux:Рецепты/Запуск и остановка служб с помощью systemd|Запуск и остановка служб с помощью systemd]]<br />
* [[Linux:Рецепты/Включение и выключение служб|Включение и выключение служб]]<br />
* [[Linux:Рецепты/Остановка неисправных процессов|Остановка неисправных процессов]]<br />
* [[Linux:Рецепты/Управление уровнями запуска с помощью systemd|Управление уровнями запуска с помощью systemd]]<br />
* [[Linux:Рецепты/Диагностика медленного запуска|Диагностика медленного запуска]]<br />
* [[Linux:Рецепты/Определение UID и GID пользователя|Определение UID и GID пользователя]]<br />
* [[Linux:Рецепты/Создание учетной записи для пользователя-человека|Создание учетной записи для пользователя-человека]]<br />
* [[Linux:Рецепты/Создание системной учетной записи|Создание системной учетной записи]]<br />
* [[Linux:Рецепты/Изменение настроек по умолчанию для команды useradd|Изменение настроек по умолчанию для команды useradd]]<br />
* [[Linux:Рецепты/Настройка каталогов для документов, музыки, видео, изображений и загрузок|Настройка каталогов для документов, музыки, видео, изображений и загрузок]]<br />
* [[Linux:Рецепты/Создание пользовательской группы с помощью команды groupadd|Создание пользовательской группы с помощью команды groupadd]]<br />
* [[Linux:Рецепты/Создание системной группы с помощью команды groupadd|Создание системной группы с помощью команды groupadd]]<br />
* [[Linux:Рецепты/Добавление пользователя в группу с помощью команды usermod|Добавление пользователя в группу с помощью команды usermod]]<br />
* [[Linux:Рецепты/Создание пользователей с помощью команды adduser в дистрибутивах на основе Debian|Создание пользователей с помощью команды adduser в дистрибутивах на основе Debian]]<br />
* [[Linux:Рецепты/Создание системного пользователя с помощью команды adduser в дистрибутивах на основе Debian|Создание системного пользователя с помощью команды adduser в дистрибутивах на основе Debian]]<br />
* [[Linux:Рецепты/Создание пользовательских групп с помощью команды addgroup|Создание пользовательских групп с помощью команды addgroup]]<br />
* [[Linux:Рецепты/Создание системных групп с помощью команды addgroup|Создание системных групп с помощью команды addgroup]]<br />
* [[Linux:Рецепты/Проверка целостности файла паролей|Проверка целостности файла паролей]]<br />
* [[Linux:Рецепты/Отключение учетной записи пользователя|Отключение учетной записи пользователя]]<br />
* [[Linux:Рецепты/Удаление пользователя с помощью команды userdel|Удаление пользователя с помощью команды userdel]]<br />
* [[Linux:Рецепты/Удаление пользователя с помощью команды deluser в дистрибутивах на основе Debian|Удаление пользователя с помощью команды deluser в дистрибутивах на основе Debian]]<br />
* [[Linux:Рецепты/Удаление группы с помощью команды delgroup в дистрибутивах на основе Debian|Удаление группы с помощью команды delgroup в дистрибутивах на основе Debian]]<br />
* [[Linux:Рецепты/Поиск всех файлов пользователя|Поиск всех файлов пользователя]]<br />
* [[Linux:Рецепты/Использование su для получения привилегий root|Использование su для получения привилегий root]]<br />
* [[Linux:Рецепты/Получение ограниченных привилегий root с помощью команды sudo|Получение ограниченных привилегий root с помощью команды sudo]]<br />
* [[Linux:Рецепты/Настройка времени кэширования пароля в sudo|Настройка времени кэширования пароля в sudo]]<br />
* [[Linux:Рецепты/Создание отдельных конфигураций для пользователей sudo|Создание отдельных конфигураций для пользователей sudo]]<br />
* [[Linux:Рецепты/Настройка sudo для использования без ввода пароля root|Настройка sudo для использования без ввода пароля root]]<br />
* [[Linux:Рецепты/Создание каталогов|Создание каталогов]]<br />
* [[Linux:Рецепты/Создание файлов|Создание файлов]]<br />
* [[Linux:Рецепты/Создание пакетов файлов|Создание пакетов файлов]]<br />
* [[Linux:Рецепты/Удаление файлов и каталогов|Удаление файлов и каталогов]]<br />
* [[Linux:Рецепты/Копирование, перемещение и переименование файлов и каталогов|Копирование, перемещение и переименование файлов и каталогов]]<br />
* [[Linux:Рецепты/Настройка разрешений файлов с помощью команды chmod с использованием восьмеричного представления|Настройка разрешений файлов с помощью команды chmod с использованием восьмеричного представления]]<br />
* [[Linux:Рецепты/Настройка разрешений каталогов с помощью команды chmod с использованием восьмеричного представления|Настройка разрешений каталогов с помощью команды chmod с использованием восьмеричного представления]]<br />
* [[Linux:Рецепты/Особые режимы разрешений|Особые режимы разрешений]]<br />
* [[Linux:Рецепты/Удаление особых режимов с помощью восьмеричного представления|Удаление особых режимов с помощью восьмеричного представления]]<br />
* [[Linux:Рецепты/Исправить ошибку "An error occurred during the signature verification..."|Исправить ошибку "An error occurred during the signature verification..."]]<br />
* [[Linux:Рецепты/При записи в файл tshark выдаёт ошибку|При записи в файл tshark выдаёт ошибку]]<br />
<br />
===Работа с электропитанием системы===<br />
<br />
* [[Linux:Рецепты/Выключение с помощью команды systemctl|Выключение с помощью команды systemctl]]<br />
* [[Linux:Рецепты/Выключение с помощью команды shutdown|Выключение с помощью команды shutdown]]<br />
* [[Linux:Рецепты/Управление режимом энергосбережения с помощью команды systemctl|Управление режимом энергосбережения с помощью команды systemctl]]<br />
* [[Linux:Рецепты/Настройка комбинации Ctrl+Alt+Del в системах Linux без systemd|Настройка комбинации Ctrl+Alt+Del в системах Linux без systemd]]<br />
* [[Linux:Рецепты/Настройка комбинации Ctrl+Alt+Del в системах Linux с systemd|Настройка комбинации Ctrl+Alt+Del в системах Linux с systemd]]<br />
* [[Linux:Рецепты/Автоматическое включение с помощью часов реального времени|Автоматическое включение с помощью часов реального времени]]<br />
* [[Linux:Рецепты/Удаленное включение по сети с помощью проводного Ethernet|Удаленное включение по сети с помощью проводного Ethernet]]<br />
* [[Linux:Рецепты/Удаленное включение через Wi-Fi (WoWLAN)|Удаленное включение через Wi-Fi (WoWLAN)]]<br />
<br />
===Работа с cron===<br />
<br />
* [[Linux:Рецепты/Выключение по cron|Выключение по cron]]<br />
<br />
===Работа с текстом===<br />
<br />
* [[Linux:Рецепты/Найти слово из кроссворда|Найти слово из кроссворда]]<br />
* [[Linux:Рецепты/Преобразовать текст из нижнего регистра в вверхний|Преобразовать текст из нижнего регистра в вверхний]]<br />
* [[Linux:Рецепты/Шифрование текста по алгоритму ROT13|Шифрование текста по алгоритму ROT13]]<br />
* [[Linux:Рецепты/Глобальный поиск и замена в vi|Глобальный поиск и замена в vi]]<br />
<br />
===Работа с сетью===<br />
<br />
* [[Linux:Рецепты/Узнать, MAC-адрес вашего Ethernet-адаптера|Узнать, MAC-адрес вашего Ethernet-адаптера]]<br />
* [[Linux:Рецепты/Узнать, MAC-адрес вашего WiFi-адаптера|Узнать, MAC-адрес вашего WiFi-адаптера]]<br />
* [[Linux:Рецепты/Узнать публичный IP-адрес|Узнать публичный IP-адрес]]<br />
* [[Linux:Рецепты/Узнать IP-адрес, скрывающийся за доменным именем|Узнать IP-адрес, скрывающийся за доменным именем]]<br />
* [[Linux:Рецепты/Настройка IP-адреса и подсети для сетевого интерфейса|Настройка IP-адреса и подсети для сетевого интерфейса]]<br />
* [[Linux:Рецепты/Настроить шлюз по умолчанию|Настроить шлюз по умолчанию]]<br />
* [[Linux:Рецепты/Удалить шлюз по умолчанию|Удалить шлюз по умолчанию]]<br />
* [[Linux:Рецепты/Включение маршрутизации пакетов между подсетями|Включение маршрутизации пакетов между подсетями]]<br />
* [[Linux:Рецепты/Посмотреть кэш ARP|Посмотреть кэш ARP]]<br />
* [[Linux:Рецепты/Узнать какие службы RPC есть на вашем компьютере|Узнать какие службы RPC есть на вашем компьютере]]<br />
* [[Linux:Рецепты/Быстрое копирование данных по сети|Быстрое копирование данных по сети]]<br />
<br />
===Работа с консолью/терминалом===<br />
<br />
* [[Linux:Рецепты/Продолжение работы программы при закрытии терминала|Продолжение работы программы при закрытии терминала]]<br />
* [[Linux:Рецепты/Получить доступ к виртуальному терминалу|Получить доступ к виртуальному терминалу]]<br />
* [[Linux:Рецепты/Переключение между виртуальными консолями|Переключение между виртуальными консолями]]<br />
* [[Linux:Рецепты/Вернуться из виртуального терминала в графический интерфейс|Вернуться из виртуального терминала в графический интерфейс]]<br />
<br />
===Работа с BASH===<br />
<br />
* [[Linux:Рецепты/Вывод номеров строк при включённой трассировке BASH скрипта|Вывод номеров строк при включённой трассировке BASH скрипта]]<br />
* [[Linux:Рецепты/Обработать большое количество аргументов в BASH скрипте|Обработать большое количество аргументов в BASH скрипте]]<br />
* [[Linux:Рецепты/Сортировка массива в BASH скрипте|Сортировка массива в BASH скрипте]]<br />
* [[Linux:Рецепты/Создание временных файлов|Создание временных файлов]]<br />
* [[Linux:Рецепты/Удаление временных файлов|Удаление временных файлов]]<br />
* [[Linux:Рецепты/Удалить расширение файла из имени файла|Удалить расширение файла из имени файла]]<br />
* [[Linux:Рецепты/Избавиться от названий каталогов из полного пути|Избавиться от названий каталогов из полного пути]]<br />
* [[Linux:Рецепты/Выбрать одно поле из входного потока|Выбрать одно поле из входного потока]]<br />
<br />
===Работа с HDD, SSD, USB-флешки===<br />
<br />
* [[Linux:Рецепты/Перечислить устройства SCSI|Перечислить устройства SCSI]]<br />
* [[Linux:Рецепты/Посмотреть таблицу разделов|Посмотреть таблицу разделов]]<br />
* [[Linux:Рецепты/Узнать UUID подключенных устройств|Узнать UUID подключенных устройств]]<br />
* [[Linux:Рецепты/Создание загрузочного USB-накопителя с Linux|Создание загрузочного USB-накопителя с Linux]]<br />
* [[Linux:Рецепты/Создание установочного USB-носителя с Linux с помощью dd|Создание установочного USB-носителя с Linux с помощью dd]]<br />
* [[Linux:Рецепты/Как просмотреть нагрузку на диск в Linux|Как просмотреть нагрузку на диск в Linux]]<br />
<br />
===Работа с архивами===<br />
<br />
* [[Linux:Рецепты/Создание tar-архива|Создание tar-архива]]<br />
* [[Linux:Рецепты/Распаковка tar-архива|Распаковка tar-архива]]<br />
<br />
===Работа с принтерами===<br />
<br />
* [[Linux:Рецепты/Получить список принтеров, известных системе|Получить список принтеров, известных системе]]<br />
* [[Linux:Рецепты/Посмотреть конфигурацию принтера через браузер|Посмотреть конфигурацию принтера через браузер]]<br />
<br />
===Работа с компакт дисками===<br />
<br />
* [[Linux:Рецепты/Очистка перезаписываемых компакт-дисков|Очистка перезаписываемых компакт-дисков]]<br />
<br />
===Работа с ISO===<br />
<br />
* [[Linux:Рецепты/Запись образа|Запись образа]]<br />
* [[Linux:Рецепты/Смонтировать ISO-образ|Смонтировать ISO-образ]]<br />
* [[Linux:Рецепты/Создание образа из коллекции файлов|Создание образа из коллекции файлов]]<br />
<br />
===Работа с swap===<br />
<br />
* [[Linux:Рецепты/Очистить swap в Linux|Очистить swap в Linux]]<br />
* [[Linux:Рецепты/Узнать, используется ли swap|Узнать, используется ли swap]]<br />
* [[Linux:Рецепты/Использование файла в качестве области подкачки|Использование файла в качестве области подкачки]]<br />
<br />
===Работа с GRUB===<br />
<br />
* [[Linux:Рецепты/Повторная сборка конфигурационного файла GRUB|Повторная сборка конфигурационного файла GRUB]]<br />
* [[Linux:Рецепты/При загрузке нет меню GRUB|При загрузке нет меню GRUB]]<br />
* [[Linux:Рецепты/Отображение скрытого меню GRUB|Отображение скрытого меню GRUB]]<br />
* [[Linux:Рецепты/Настроить фоновое изображение меню GRUB|Настроить фоновое изображение меню GRUB]]<br />
* [[Linux:Рецепты/Изменение цвета шрифтов в меню GRUB|Изменение цвета шрифтов в меню GRUB]]<br />
* [[Linux:Рецепты/Применение темы оформления к меню GRUB|Применение темы оформления к меню GRUB]]<br />
* [[Linux:Рецепты/Восстановление незагружающейся системы из приглашения grub|Восстановление незагружающейся системы из приглашения grub]]<br />
* [[Linux:Рецепты/Восстановление незагружающейся системы из приглашения grub rescue|Восстановление незагружающейся системы из приглашения grub rescue]]<br />
* [[Linux:Рецепты/Переустановка конфигурации GRUB|Переустановка конфигурации GRUB]]<br />
* [[Linux:Рецепты/|Рецепты/]]<br />
* [[Linux:Рецепты/|Рецепты/]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%90%D0%BD%D0%B5%D0%BA%D0%B4%D0%BE%D1%82:1345&diff=13026796Анекдот:13452024-01-11T18:23:15Z<p>Myagkij: </p>
<hr />
<div>{{Панель управления/Анекдот}}<br />
{{Анекдот<br />
|Заголовок=#1345<br />
|Назад=1344<br />
|Вперед=1346<br />
|Текст анекдота=<br />
Война в Корее. Во время воздушного боя сбивают американский самолет, но пилоту удается спастись. На допросе его начальство и спрашивает:<br />
- Чей пилот тебя сбил, корейский или русский? Тот подумал-подумал, и говорит:<br />
- IMHO корейский. Мне удалось перехватить их разговор по рации, так там один говорит другому: ``Вась, прикрой, я х##ну!`` Вот этот Х##ну меня и сбил!<br />
}}<br />
=См.также=<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
<br />
{{Навигационная таблица/Портал/Анекдот}}</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%9A%D0%BD%D0%B8%D0%B3%D0%B0:%D0%A1%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D0%BD%D0%B8%D0%B5&diff=13026557Книга:Содержание2024-01-02T17:05:07Z<p>Myagkij: </p>
<hr />
<div>__NOTOC__<br />
{{Панель управления/Книга}}<br />
{{Книга/Верхний блок}}<br />
{{Книга/Средний блок}}<br />
<br />
=См.также=<br />
<br />
{{ads}}<br />
<br />
=Внешние ссылки=<br />
<br />
<references /><br />
<br />
{{Навигационная таблица/Книга}}<br />
{{Навигационная таблица/Телепорт}}<br />
<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t1.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t2.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t3.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t4.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t5.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t6.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t7.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t8.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t9.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t10.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t11.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t12.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t13.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t14.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t15.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t16.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t17.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t18.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t19.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t20.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t21.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t22.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t23.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t24.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t25.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t26.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t27.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t28.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t29.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t30.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t31.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t32.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t33.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t34.pdf]]<br />
* [[File:bolshaja_medicinskaja_enciklopedija_t35.pdf]]</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t35.pdf&diff=13026466Файл:Bolshaja medicinskaja enciklopedija t35.pdf2024-01-02T17:02:18Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t34.pdf&diff=13026461Файл:Bolshaja medicinskaja enciklopedija t34.pdf2024-01-02T17:01:52Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t33.pdf&diff=13026454Файл:Bolshaja medicinskaja enciklopedija t33.pdf2024-01-02T17:01:22Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t32.pdf&diff=13026447Файл:Bolshaja medicinskaja enciklopedija t32.pdf2024-01-02T17:00:52Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t31.pdf&diff=13026434Файл:Bolshaja medicinskaja enciklopedija t31.pdf2024-01-02T17:00:16Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t30.pdf&diff=13026424Файл:Bolshaja medicinskaja enciklopedija t30.pdf2024-01-02T16:59:44Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t29.pdf&diff=13026420Файл:Bolshaja medicinskaja enciklopedija t29.pdf2024-01-02T16:59:10Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t28.pdf&diff=13026411Файл:Bolshaja medicinskaja enciklopedija t28.pdf2024-01-02T16:58:36Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t27.pdf&diff=13026407Файл:Bolshaja medicinskaja enciklopedija t27.pdf2024-01-02T16:58:03Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t26.pdf&diff=13026400Файл:Bolshaja medicinskaja enciklopedija t26.pdf2024-01-02T16:57:30Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t25.pdf&diff=13026392Файл:Bolshaja medicinskaja enciklopedija t25.pdf2024-01-02T16:57:02Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t24.pdf&diff=13026384Файл:Bolshaja medicinskaja enciklopedija t24.pdf2024-01-02T16:56:33Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t23.pdf&diff=13026376Файл:Bolshaja medicinskaja enciklopedija t23.pdf2024-01-02T16:56:05Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t22.pdf&diff=13026369Файл:Bolshaja medicinskaja enciklopedija t22.pdf2024-01-02T16:55:35Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t21.pdf&diff=13026362Файл:Bolshaja medicinskaja enciklopedija t21.pdf2024-01-02T16:55:07Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t20.pdf&diff=13026355Файл:Bolshaja medicinskaja enciklopedija t20.pdf2024-01-02T16:54:44Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t19.pdf&diff=13026348Файл:Bolshaja medicinskaja enciklopedija t19.pdf2024-01-02T16:54:16Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t18.pdf&diff=13026338Файл:Bolshaja medicinskaja enciklopedija t18.pdf2024-01-02T16:53:52Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t17.pdf&diff=13026329Файл:Bolshaja medicinskaja enciklopedija t17.pdf2024-01-02T16:53:21Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t16.pdf&diff=13026317Файл:Bolshaja medicinskaja enciklopedija t16.pdf2024-01-02T16:52:44Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t15.pdf&diff=13026302Файл:Bolshaja medicinskaja enciklopedija t15.pdf2024-01-02T16:52:12Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t14.pdf&diff=13026290Файл:Bolshaja medicinskaja enciklopedija t14.pdf2024-01-02T16:51:40Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t13.pdf&diff=13026279Файл:Bolshaja medicinskaja enciklopedija t13.pdf2024-01-02T16:51:12Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkijhttp://wikihandbk.com/ruwiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Bolshaja_medicinskaja_enciklopedija_t12.pdf&diff=13026266Файл:Bolshaja medicinskaja enciklopedija t12.pdf2024-01-02T16:50:44Z<p>Myagkij: Файл, загруженный с помощью MsUpload</p>
<hr />
<div>Файл, загруженный с помощью MsUpload</div>Myagkij