Итак, мы добрались до завершающего фрагмента этой недели, где мы обобщим все, что изучили в процессе. Мы создадим устройство системы мониторинга. Она будет собирать какие-то данные из внешнего мира и сообщать их нам, причем разными способами. Для чего такая система может быть полезна? Ну самый простой и интересный пример — это собирать данные, например, для научного исследования. Кроме этого, вы можете устроить сигнализацию об изменении какого-то параметра. Мы, кстати, учтем это в нашем проекте. Как мы уже знаем, чтение аналогового сигнала с точки зрения контроллера — это одно и то же, поэтому в качестве примера мы возьмем изучение освещенности и температуры. Давайте представим будущее устройство схематично. У нас будет три входа: два из них — это аналоговые входы от датчиков освещенности и температуры, и один цифровой — вход-кнопка: он будет переключать то, что мы сейчас выводим на шкалу. Шкала — это у нас первое устройство вывода. Мы в этом случае обойдемся без микросхемы, тот пример был и так достаточно сложный. Итак, у нас в качестве устройств вывода есть шкала, есть пьезодинамик и есть обмен данными с компьютерами — это и вход, и выход. Затем, как мы будем проверять, что наше устройство готово? Мы хотим, чтобы оно могло отправлять данные в компьютер, причем по запросу. Если мы запрашиваем температуру символом t, она нам будет направлять температуру. Если мы запрашиваем освещенность с помощью символа l, он будет нам отправлять освещенность — там же, в мониторе порта. А шкала нам будет показывать данные непрерывно: сначала один из показателей, а по нажатию кнопки — переключать на отображение второго показателя. Кроме этого, мы установим некий порог, по превышении которого показателем температуры мы будем издавать звуковой сигнал. Ну, естественно, вы понимаете, что вместо звуковой сигнализации это может быть, например, включение системы охлаждения или любая другая реакция. Но сейчас речь не об этом. Давайте посмотрим, как мы соберем это устройство. Здесь я хочу вас познакомить еще с одним элементом, входящим в нашу экосистему. Я не буду скрывать гордость, что тоже приложил руку к его созданию. Это вот такие вот детальки конструктора, которые позволяют прототипировать устройство еще быстрее. Он сделан из ПВХ, вспененного ПВХ, который легко обрабатывается, то есть из стандартной детальки, которую вы получили, вы можете с помощью ножа, клея, винтов и так далее сделать более подходящую вам деталь. Они удобны, в том числе тем, что в них предусмотрены вырезы под различные стандартные компоненты. В частности, Troyka-модули. Поскольку все Troyka-модули имеют стандартные габариты, вы можете, используя одну и ту же деталь, закреплять все, что вам заблагорассудится. Итак, давайте смотреть, как я собираю это устройство. С одной стороны у нас есть панелька для четырех Troyka-модулей, как раз куда уместились все нужные нам компоненты: датчик освещенности, кнопка, датчик температуры и пьезодинамик. С другой стороны у нас пережитки прошлого — маленькая макетная плата со шкалой. Здесь вы можете наглядно убедиться в том, какой из способов монтажа более простой и эстетичный. Внутри, я не особенно скрывал это, у нас лежит Arduino с Troyka Shield. К колодке Arduino подключены все выводы шкалы, а четыре модуля подключены каждый к своим входам. Когда мы будем разбирать скетч, увидим, что куда подключается. Давайте теперь смотреть, из чего состоит программа. Я бы рекомендовал тем из вас, кто чувствует в себе силы, попробовать по моему описанию создать программу самостоятельно. То есть поставить сейчас на паузу ролик и попробовать свои силы. Ну а мы продолжим и посмотрим, что получилось у меня. За основу скетча я взял один из тех, что мы использовали в течении недели, там где выводили на шкалу показания потенциометра. Здесь у меня остались определения пинов. Затем я добавил пины для датчиков температуры и освещенности. Кроме этого, добавил пин для пищалки и кнопки. Вот в этой строке определен порог, после которого будет появляться звуковая сигнализация, когда температура повысится. Затем я определил несколько нужных нам переменных: для хранения температуры, освещенности, одну служебную переменную для подсчета количества светодиодов, которые будут зажигаться в шкалеTroyka Shield, — сейчас вы увидите, как они работают, — и две переменных, знакомые нам по упражнению с триггером, для хранения предыдущего состояния кнопки и самого триггера. Оба типа bool. В setup у нас тоже остались строчки из примера про шкалу, где у нас выходами делаются все пины, к которым подключена шкала, и выходом делается пин пищалки, а пин кнопки делается входом. Я напомню, что модуль «Кнопка», который мы используем, имеет на борту подтягивающий к питанию резистор, поэтому мы не делаем режим input pull-up и помним, что в нажатом состоянии кнопка будет давать ноль, а единицу — в ненажатом. Также я устанавливаю соединение с компьютером и сразу же вывожу строчку-подсказку, которая говорит о том, что нужно ввести t для получения данных о температуре и l — для получения данных об освещенности. Что же происходит в loop? Вы можете понаблюдать, как я взял куски из разных наших экспериментов и совместил их в один. Для начала в заведенные переменные я сохраняю то, что мы считываем на аналоговых входах. Соответственно, в температуру с датчика температуры и в освещенность с датчика освещенности. Затем идет фрагмент, который отвечает за обмен данными с компьютером. В случае если буфер не пуст, то есть мы с компьютера получили что-то, посмотрим, что это было, сохраним это в переменную mode типа «режим» и посмотрим, что в ней лежит. Если в ней оказалась буква t строчная или буква T заглавная, а ведь пользователь может незаметно нажать Shift или Caps Lock и отправить букву не в том регистре, а устройство должно корректно это распознать, то в последовательный порт мы выводим слово «Температура», табуляцию и само значение температуры. Аналогично мы смотрим, пришел ли символ l строчный или L заглавный и выводим сообщение о освещенности, если пришел l. Дальше мы будем заниматься управлением, выводом на шкалу. Сначала мы считаем кнопку в переменную current, как мы это делали раньше, для того, чтобы можно было сравнить с предыдущим ее значением и перевернуть триггер, если кнопка только что была нажата. После чего предыдущим значением назначить текущее, как это раньше и было. Затем в зависимости от того, истинный триггер или ложный, мы сохраняем в переменную countLeds, которую дальше используем, либо температуру, либо освещенность. А затем мы взяли строчку из недавнего примера про определение последнего горящего в шкале светодиода и в lastLed записали значение от 2 до 11, которое превратилось благодаря map из значений от 0 до 500, которые были сохранены в countLeds. Здесь нам уже все равно, температура или освещенность там хранятся. У нас там просто значение. Здесь я не стал брать полный диапазон до 1023, потому что ни датчик освещенности, ни датчик температуры в наших условиях здесь не дадут значение больше 500. После этого у нас остался тот же цикл, который был в том примере с lastLed. Мы зажигаем столько светодиодов, сколько нужно в текущей обстановке. И выводим, таким образом, либо температуру, либо освещенность. Ну и последнее, что остается из заявленного функционала, — это издать звуковой сигнал в случае, если уровень температуры превзошел заданный граничный уровень, то есть стало слишком тепло. Мы будем пищать на частоте 2 кГц в течение 1 секунды. Хочу сделать оговорку, что я не стал перегружать программу переводом считываемых параметров в систему C, например. Мы работаем с теми условными единицами, которые получаем при считывании аналогового сигнала на входе. При желании вы можете найти или вычислить формулы, по которым превратите температуру в градусы, а освещенность, не знаю, в люмены, например. Давайте теперь смотреть, как все это работает. Для начала посмотрим, как работает шкала. По умолчанию она отображает освещенность, и если я буду закрывать датчик освещенности рукой, мы увидим, что количество светодиодов меняется. Затем мы можем нажать кнопку, переключив таким образом шкалу в режим отображения температуры. Сейчас мы видим, что горит три деления. Ну и быстрый способ нагреть датчик — это «пожарить» его. Кроме того, что у нас выросли деления на шкале, мы услышали звуковой сигнал, потому что температура превзошла заданный порог. Хорошо, режим отображения непосредственно пользователю работает корректно. Теперь запустим монитор порта, и, как мы и написали в setup, он нам вывел подсказку, каким символом нужно запрашивать какой из параметров. Ну давайте попробуем запросить температуру. Она показывает нам эти условные единицы — 162. Проверим, отработает ли заглавная буква. Да, все так же. Давайте проверим освещенность, потом проверим заглавную букву, а заодно освещенность изменим. Да, действительно, она изменилась, причем в сторону увеличения. Ну такова природа данного датчика освещенности: он увеличивает показания с уменьшением освещенности. Вот и все. Наше устройство работает, как заявлено. Оно уже представляет собой целое полезное устройство или фрагмент некоего большего полезного устройства, ну и обобщает практически весь материал, который мы так долго разбирали в ходе этой недели. Теперь я предлагаю вам немножко передохнуть, а затем поупражняться со всеми новыми знаниями, пройти тестирование, ну и ожидать с нетерпением следующей недели. До новых встреч.