audiohobby.ru audiohobby.ru

Индикатор уровня на основе платы Arduino DUE с 3,5-дюймовым TFT-дисплем для RPi

Вид с первоначальным вариантом программы:

Внешний вид

Вид с другим вариантом программы:

vu-meter v2

Меня в своё время заинтересовала идея реализации такого индикатора, которую предложил Артём (getsket), правда он рассматривал возможность использовать для этого микрокомпьютер Raspberry Pi 3 и дисплей большего размера. У меня же лежал без надобности 3,5-дюймовый сенсорный дисплей, который я безуспешно пытался подключить к плееру RuneAudio (а его использование совместно с системой Raspbian, на мой взгляд, лишено всякого смысла, хотя с ней он заработал).

Рассматриваемый дисплей имеет разрешение 480x320 точек и активные размеры экрана 75x50 мм (следует заметить, что рабочая область экрана смещена несколько влево — это видно на фотографии, но это просто нужно учесть при монтаже дисплея). Он управляется по последовательной шине SPI, но, несмотря на это, совместно с платой Arduino DUE обладает достаточным быстродействием, высокой яркостью и контрастностью. Подсветка экрана — равномерная, без пятен и засветов,  с отличной прорисовкой мелких деталей (очень хорошо читается текст из символов высотой 1,5 мм), приличные углы обзора (имеющаяся фотография всего этого передать не может). На основе используемой графической библиотеки GxTFT нетрудно реализовать и другие подобные проекты, например для «Умного дома», или для автомобиля, где требуется наглядное представление информации от различных датчиков. Можно использовать дисплеи с другими размерами экрана, главное, чтобы они поддерживались указанной библиотекой. Дальше — что, где и как отображать — зависит от фантазии программиста. Мне пришлось вспоминать школьный курс тригонометрии и преобразование координат.

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

Решение использовать плату Arduino DUE было совершенно не очевидным. Мне помогла статья Александра Жорника Соединяем несоединимое.  3.5" TFT цветной дисплей на чипе ILI9486 от Raspberry Pi подключаем к Arduino DUE. В этой статье довольно доходчиво расписано, как можно в принципе реализовать такую связку, правда за подробностями пришлось обращаться к автору — большое ему спасибо за оказанную помощь. Для меня вообще было открытием, что существует такая плата Arduino с 32-разрядным микроконтроллером ARM (AT91SAM3X8E), работающим на тактовой частоте 84 МГц! При работе с описываемой платой необходимо учитывать, что напряжение её питания и логические уровни сигналов составляют +3.3В.

На мой взгляд, приобретать оригинальную плату Arduino DUE не имеет никакого смысла — её стоимость может в несколько раз превышать стоимость китайского клона, который прекрасно работает. Единственное, что нужно сделать — провести небольшую доработку, которая устраняет возможный неустойчивый запуск после включения — без доработки для нормального запуска может потребоваться нажатие кнопки Reset. На оригинальных платах эта доработка R3 уже проведена, на китайских клонах — обычно нет. Здесь подробно описан способ решения этой проблемы. Суть доработки сводится к тому, что нужно запаять резистор 10 кОм типоразмера 0603 между истоком и затвором полевого транзистора T3 рядом с 6-контактным разъёмом ICSP. Я не стал проверять работоспособность своего экземпляра китайского клона платы Arduino DUE без этого резистора, и сразу запаял его, и никаких проблем в работе замечено не было.

Arduino DUE

Можно подключить дисплей к плате Arduino DUE с помощью обычных проводов со штырьками, которые используются на макетных платах Arduino. Поначалу, для первой проверки, я так и сделал, но это очень неудобно, так как провода перекручиваются, штырьки выскакивают и даже обламываются. Поэтому для дальнейших экспериментов для дисплея был сделан переходник на основе 7-проводного ленточного кабеля — именно столько контактов используются дисплеем для отображения информации (функции сенсорного экрана мы не используем). На одном конце кабеля распаивается 26-контактный разъём «папа» для подключения непосредственно к дисплею:

Плата переходника сверху

Плата переходника снизу

а на другом конце кабеля — 7-контактный разъём CHU-7 (с ответной частью для монтажа на плату CWF-7), или другой подходящий:

Переходник

Контакты дисплея, используемые для вывода информации:

Контакт переходника
Контакт дисплеяСигнал дисплеяСигнал ArduinoПримечание
12+5V+5VНа плате дисплея уже имеется стабилизатор +3,3V
26,9,20,25GndGnd 
322RSTD5 
418DCD6 
524CSD10 
619MOSID75Разъём SPI, контакт 4
723SCKD76Разъём SPI, контакт 3

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

Дисплей с переходником

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

Для защиты дисплея от внешних воздействий, а также для возможности его крепления, из оргстекла для него был изготовлен корпус, состоящий из 6 частей: переднее тонированное серое стекло толщиной 2 мм размерами 104x73 мм, задняя крышка такого же размера из прозрачного оргстекла толщиной 2 мм с вырезом, и 4 бортика шириной 8 мм из оргстекла толщиной 6 мм (покупалось когда-то в Чип и Дип), прикреплённые к переднему стеклу клеем B7000. По углам конструкции просверлены 4 отверстия под винты M2x12 с потайными головками. Во вложении вместе с рисунком печатной платы переходника для дисплея приведена разметка корпуса для дисплея. Оргстекло я резал на станке, установив в него пильный диск для стеклотекстолита.

Для выполнения функций измерителя уровня необходимо собрать узел полуволновых пиковых детекторов, преобразующих звуковые сигналы с (линейного) выхода усилителя к уровням до +3,3В, которые будут подаваться на аналоговые входы A0, A1 платы Arduino (являющиеся на самом деле входами АЦП):

Пиковые детекторы V1.0

Схемы пиковых детекторов «подсмотрены» в статье ATmega8 — VU5 Светодиодный индикатор уровня. Их особенностью является использование однополярного питания с  сохранением достаточной линейности и практическим отсутствием начального напряжения смещения на выходах, что обеспечивает нормальную работу в диапазоне сигналов примерно до 30..40 дБ. При слишком малых уровнях сигнала возможно влияние помех по цепям питания и проявление разбаланса каналов. Ввиду последнего обстоятельства желателен подбор диодов VD1, VD2 по прямому падению напряжения (с помощью мультиметра). Может быть также потребуется подбор микросхемы компаратора LM393 (из-за заметной разницы в отображении каналов на малых уровнях мне пришлось заменить свой первоначальный экземпляр LM393 на другой, более «удачный»).  Выбор такой схемы пиковых детекторов является компромиссным: он в целом обеспечивает приемлемую точность измерений при относительной простоте схемы (этот вариант пиковых детекторов хорошо подойдёт для второй версии программы, которая точнее имитирует поведение аналоговых измерителей и имеет меньший диапазон). Лучших результатов можно достичь применением пиковых детекторов на основе ОУ с двухполярным питанием, при этом диапазон фиксируемых уровней расширится до 50..60 дБ:

Пиковые детекторы V2

На приведённой схеме от стабилитронов VD5 и VD6 пришлось отказаться, так как они, с одной стороны, начинают слишком рано ограничивать выходное напряжение (уже при уровнях порядка +2В), а с другой стороны, выходное напряжение в любом случае не превышает величину +3,3В (вследствие ограниченности уровня выходного напряжения у применённых ОУ DA1,DA2 и за вычетом прямого падения напряжения на диодах VD1,VD3). В качестве формирователя отрицательного напряжения -5В я применил готовый миниатюрный DC-DC преобразователь HLK-1D0505A с гальванической развязкой (можно приобрести: здесь, здесь или здесь). Чувствительность пиковых детекторов можно повысить уменьшением номиналов резисторов R3 и R6. Подстроечные резисторы  VR1 и VR2 служат для плавной регулировки чувствительности, а VR3 и VR4 — для точной подстройки нуля и выравнивания показаний каналов на малых уровнях.

Для сборки воедино необходимых узлов можно изготовить отдельную печатную плату, которая устанавливается сверху платы Arduino DUE. Однако, мне приглянулся другой вариант — использовать для этих целей готовую макетную плату для Arduino MEGA 2560 — по размерам и распиновке она подходит для Arduino DUE. На ней мы скоммутируем разъём для подключения дисплея и соберём пиковые детекторы.

Для первого варианта пиковых детекторов плата может выглядеть так:

Вид сверху

Рядом с разъёмом для дисплея к шинам питания +5В необходимо подключить фильтрующий электролитический конденсатор номиналом 100 мкФ — без него возможны сбои в работе.

Для монтажа пиковых детекторов с двухполярным питанием я изготовил отдельную печатную плату, которая стыкуется с основной макетной платой через штыревые (PLS) и гнездовые (PBS) разъёмы (преобразователь для формирования отрицательного напряжения размещён отдельно на макетной плате):

Монтаж сверху V2

Здесь на макетной плате по шинам питания +5В установлен ещё один электролитический конденсатор с низким ESR номиналом 100 мкФ, снижающий уровень помех от преобразователя напряжения.

Вид печатной платы пиковых детекторов снизу:

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

Монтаж соединений на макетной плате удобно выполнять с помощью тонкого лужёного одножильного провода в цветной изоляции — можно сразу приобрести катушку с проводами 8 цветов (Multi). Во вложении приведён файл архива с рисунками печатных плат в формате программы Sprint Layout, а также схема монтажа проводов на макетной плате для обоих вариантов пиковых детекторов.

Пример соединений снизу макетной платы для пиковых детекторов V1.0:

Вид снизу

Пример соединений снизу макетной платы для пиковых детекторов V2.0:

Монтаж снизу V2:

Для разводки сигналов SCK (D76) и MOSI (D75), идущих к разъёму SPI Arduino DUE, на макетную плату снизу припаивается разъём PBS-2. Схема всех контактов Arduino DUE приведена ниже:

Arduino DUE

Теперь рассмотрим не менее важную программную часть устройства. Как уже указывалось, она основана на использовании готовой библиотеки GxTFT, автором которой открыт небольшой форум.

Для первоначального запуска графической демо-программы необходимо сначала загрузить и затем распаковать архивный файл библиотеки GxTFT-master.zip в папку Arduino\libraries, расположенную в папке «Мои документы» («Документы» в системе Windows 10) — после этого библиотека будет установлена. То же самое можно сделать через среду Arduino IDE, если зайти в меню Скетч | Подключить библиотеку | Добавить .ZIP библиотеку… и выбрать файл с архивом GxTFT-master.zip. После этого нужно перейти во вложенную папку распакованного архива examples\GxTFT_DUE_HVGA_graphicstest и откорректировать файл скетча GxTFT_DUE_HVGA_graphicstest.ino — в нём необходимо после строки:

// ***> select a pre-configured display header <***

заменить имя файла в заголовке include:

# include «myTFTs/my_3.5_HVGA_480x320_DUE_direct.h»

на имя файла, соответствующего нашему дисплею:

# include «myTFTs/my_3.5_RPi_480x320_DUE.h»

Теперь нужно открыть файл скетча GxTFT_DUE_HVGA_graphicstest.ino в среде Arduino IDE. Далее через меню Инструменты | Платы | Менеджер плат в среде Arduino IDE необходимо добавить плату Arduino DUE, если она отсутствует. Плата Arduino DUE подключается к компьютеру через разъём USB «Programming», находящийся рядом с разъёмом питания платы, а в настройках среды Arduino IDE требуется выбрать соответствующий COM-порт: «Programming Port».

Arduino DUE снизу

Если нажать на кружок со стрелкой в меню Arduino IDE, начнётся компиляция программы с последующей записью полученной прошивки в плату (на это потребуется некоторое время — объём прошивки может составляет порядка 60 кбайт). После этого на экране должны появиться демонстрационные изображения.

Документации на библиотеку нет. Чтобы облегчить её применение, приведу краткий список использованных мной в программе индикатора уровня графических процедур и функций с небольшими пояснениями (или неиспользованных, но понятных). Полный перечень и примеры их использования можно найти в файлах src\GxTFT.cpp и examples\GxTFT_DUE_HVGA_graphicstest\GxTFT_DUE_HVGA_graphicstest.ino. Для доступа к ним необходимо создать в программе экземпляр (объект) класса TFT_Class (или, что то же самое, класса GxTFT): в нашей программе этот объект создаётся в файле src\myTFTs\my_3.5_RPi_480x320_DUE.h и имеет имя tft. После этого в программе можно использовать методы (процедуры и функции) этого объекта:

МетодПояснение
tft.init ();Выполняет сброс и инициализацию дисплея (должно выполняться первым)
tft.setRotation ( r );Устанавливает ориентацию экрана r=0..3 (по умолчанию 1)
tft.width ()Возвращает ширину экрана в пикселях (480)
tft.height ()Возвращает высоту экрана в пикселях (320)
tft.fillScreen (color);Очищает экран заданным цветом color
tft.drawPixel (x,y,color);Рисует точку заданного цвета в позиции (x,y), где 0 <= x <= 479, 0 <= y <= 319, причём координатам (0,0) соответствует верхний левый угол экрана
tft.drawLine (x1,y1,x2,y2,color);Рисует линию заданного цвета между точками (x1,y1) и (x2,y2)
tft.drawFastHLine (x,y,w,color);Рисует горизонтальную линию заданного цвета шириной w от точки (x,y)
tft.drawFastVLine (x,y,h,color);Рисует вертикальную линию заданного цвета высотой h от точки (x,y)
tft.drawTriangle (x1,y1,x2,y2,x3,y3,color);Рисует треугольник заданного цвета по координатам его вершин (x1,y1), (x2,y2), (x3,y3)
tft.fillTriangle (x1,y1,x2,y2,x3,y3,color);Рисует залитый треугольник заданного цвета по координатам его вершин (x1,y1), (x2,y2), (x3,y3)
tft.drawRect (x,y,w,h,color);Рисует прямоугольник заданного цвета с координатами левого верхнего угла (x,y), шириной w и высотой h пикселей
tft.fillRect (x,y,w,h,color);Рисует залитый прямоугольник  заданного цвета с координатами левого верхнего угла (x,y), шириной w и высотой h пикселей
tft.drawRoundRect (x,y,w,h,r,color);Рисует прямоугольник заданного цвета со скругленными углами радиусом r, с координатами левого верхнего угла (x,y), шириной w и высотой h пикселей
tft.fillRoundRect (x,y,w,h,r,color);Рисует залитый прямоугольник заданного цвета со скругленными углами радиусом r, с координатами левого верхнего угла (x,y), шириной w и высотой h пикселей
tft.drawCircle (x,y,r,color);Рисует окружность заданного цвета с центром в точке (x,y) и радиусом r
tft.fillCircle (x,y,r,color);Рисует залитый круг заданного цвета с центром в точке (x,y) и радиусом r
tft.drawEllipse(x,y,rx,ry,color);Рисует эллипс заданного цвета с центром в точке (x,y), радиусами горизонтальной rx и вертикальной ry дуг
tft.fillEllipse(x,y,rx,ry,color);Рисует залитый эллипс заданного цвета с центром в точке (x,y), радиусами горизонтальной rx и вертикальной ry дуг
tft.setTextSize (s);Устанавливает размер шрифта (0..7)
tft.setTextColor ( c );Устанавливает заданный цвет текста c (с прозрачным фоном)
tft.setTextColor (c,b);Устанавливает заданные цвета текста c и фона b
tft.setCursor (x,y);Устанавливает текстовый курсор в графическую позицию (x,y)
tft.print (a); Выводит значение параметра a на экран в текущую позицию текстового курсора

Для цветового  параметра color можно использовать следующие предопределённые названия констант:
BLACK, NAVY, DARKGREEN, DARKCYAN, MAROON, PURPLE, OLIVE, LIGHTGREY, DARKGREY, BLUE, GREEN, CYAN, RED, MAGENTA, YELLOW, WHITE, ORANGE, GREENYELLOW, PINK.

В случае потребности подключения второго дисплея для него необходимо будет создать в программе отдельный объект класса TFT_Class, например, с именем tft1, добавив после строки:

# include «myTFTs/my_3.5_RPi_480x320_DUE.h»

следующие команды (по аналогии с содержимым файла «myTFTs/my_3.5_RPi_480x320_DUE.h»):

GxIO_Class io1(SPI, 8, 6, 5); // Подключаем вывод CS второго дисплея к порту D8 Arduino DUE
GxCTRL_Class controller1(io1);
TFT_Class tft1(io1, controller1, 480, 320);

Вывод информации на второй дисплей осуществляется так же, только вместо имени объекта tft нужно будет указывать tft1. Например, команда инициализации второго дисплея будет выглядеть так:

tft1.init ();

В прилагаемом к статье архивном файле vu-meter.zip содержатся все необходимые материалы: схемы обоих вариантов пиковых детекторов, рисунки печатных плат, схема соединений на макетной плате, список используемых радиоэлементов, а также библиотека GxTFT и самое главное — скетч с текстом программы. Достаточно распаковать загруженные архивы, перейти в папку DUE_3.5_RPi_VU_meter  и открыть файл DUE_3.5_RPi_VU_meter.ino. Библиотека GxTFT-master должна быть предварительно установлена либо через меню Скетч | Подключить библиотеку | Добавить .ZIP библиотеку…, либо путём распаковки в папку Мои документы\Arduino\libraries. После компиляции и заливки скетча в плату Arduino DUE индикатор уровня должен заработать. При желании программы можно изменить по своему усмотрению или написать заново, используя имеющиеся наработки.

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

Вид измерителя V2

В заключение рассмотрим конструкцию сервисного блока для УНЧ. В ней использован второй — улучшенный вариант пиковых детекторов на отдельной печатной плате, в дополнение к которой требуется ещё одна печатная плата — с узлами управления. Внешний вид сервисного блока приведён на фотографии (к сожалению, качество передачи цветов оставляет желать лучшего):

Внешний вид СБ

Возможности рассматриваемого сервисного блока:

  • Выбор с помощью энкодера и отображение одного из 4-х входов с формированием позиционного кода управления селектором входов;
  • Управление уровнем громкости с помощью энкодера и отображение этого уровня в виде линейки и в виде числового значения ослабления в -дБ, с формированием на выходах двоичного кода громкости, также с возможностью управления регулятором «Antecom» с помощью изменения выходного аналогового уровня постоянного напряжения в диапазоне 0..5В;
  • Запись в память (FLASH) текущего номера входа и уровня громкости по нажатию кнопки энкодера селектора входов — эти значения будут восстанавливаться после включения питания;
  • Включение и выключение кнопкой энкодера громкости режима Mute и отображение его состояния с формированием на выходе управляющего сигнала для соответствующего реле;
  • Отображение состояния системы защиты динамиков (ОК — динамики подключены, Alarm — динамики отключены);
  • Управление скоростью вращения компьютерного вентилятора (и её отображение) в зависимости от максимальной температуры, получаемой от 1..3 термодатчиков DS18B20, включённых параллельно;
  • Отображение значения максимальной температуры от указанных датчиков;
  • Формирование сигнала плавного пуска «Soft start» с задержкой порядка 5 секунд после подачи питания для организации пошагового включения питания, что позволяет плавно зарядить конденсаторы большой ёмкости в силовых цепях усилителя;
  • Измерение выходного уровня усилителя (или уровня с линейного выхода) по шкале от -50 до +3 дБ (25 уровней с шагом по 2 и 3 дБ) с отображением так называемых зависающих «поплавков» на пиках сигнала (цвет отображаемых на шкале прямоугольников — зелёный, жёлтый и оранжевый — это зависит от уровня сигнала).

Для полной реализации перечисленных возможностей плата Arduino DUE должна запитываться от внешнего источника питания постоянного напряжения +9..12В, так как это напряжение используется для питания вентилятора. В этом случае также обеспечивается более точная и стабильная величина напряжения +5В, чем при питании через разъём USB.

Функции сервисного блока реализуются с помощью скетча, приведённого в архиве. В тексте скетча содержатся подробные пояснения по его работе и порядку его настройки, включая установку необходимых библиотек (установочные файлы всех необходимых библиотек тоже содержатся в прикреплённом архиве). Перед компиляцией скетча нужно вручную скорректировать некоторые параметры в настройках платы Arduino DUE, обеспечивающие формирование ШИМ на более высокой частоте по сравнению с установленной по умолчанию 1 кГц (как это сделать, также описано в тексте скетча). Также, возможно, потребуется изменение параметров библиотеки, используемой для обработки энкодеров, в зависимости от их типа (см. там же).

Приведём схему сервисного блока, за исключением ранее рассмотренной схемы пиковых детекторов:

Схема сервисного блокаДля аналогового управления громкостью  в регуляторе «Antecom» используется цифровой потенциометр U1 AD5245, который подключается к плате Arduino DUE через преобразователи уровней на полевых транзисторах VT5,VT6 (на плате требуется запаять перемычку Jmp1). К сожалению, альтернативный вариант управления с помощью ШИМ не обеспечивает требуемой точности (линейности) регулировки. Для связи сервисного блока с силовыми цепями усилителя в целях обеспечения безопасности платы Arduino DUE используется гальваническая развязка на оптронах OC1, OC2. Все датчики температуры IC1..IC3 DS18B20 включаются параллельно через клеммник. Остальные необходимые пояснения можно найти в тексте скетча и в прилагаемом списке элементов. В архиве также содержатся принципиальные схемы, рисунки печатных плат, соответствующие гербер-файлы и схема монтажа соединений на макетной плате.

Макетная плата сверху:

Макетная плата сверху

Макетная плата снизу:

Макетная плата снизу

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

Собранная печатная плата сервисного блока сверху:

Плата сервисного блока сверху

Собранная печатная плата сервисного блока снизу:

Плата сервисного блока снизу

Так выглядят «поплавки» индикатора уровня — в отладочном режиме (впоследствии уровни шкалы были изменены):

Тестовый режим поплавков

Примечание: Цвет прямоугольников на шкале для уровней -10..0 дБ на самом деле жёлтый, выше 0дБ — оранжевый.

 

 
 
 
Вложение:
vu-meter.zip 2 Мбскачан 45 раз
Вложение:
service-block.zip 2 Мбскачан 44 раза
+9
+1
caleb caleb 4 месяца назад #

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

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

+1
Pushok62 Pushok62 4 месяца назад #

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

0
caleb caleb 4 месяца назад #

В данном применении его сенсорность я так понимаю не используется ? 

0
Pushok62 Pushok62 4 месяца назад #

Нет, не используется.

0
caleb caleb 3 месяца назад #

Статью потом обновите?

0
Pushok62 Pushok62 3 месяца назад #

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

0
caleb caleb 3 месяца назад #

Ну потом естественно. 

+3
Pushok62 Pushok62 3 месяца назад #

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

+3
Pushok62 Pushok62 2 месяца назад #

По предложению caleb «допилил» устройство до многофункционального сервисного блока для УНЧ, и его описание разместил в конце статьи.

+3
Pushok62 Pushok62 2 месяца назад #

Обновил архив с вложениями: добавил текст программы новой версии V2 измерителя уровня, а также скорректировал текст версии V1 (исправление ошибки).