Индикатор уровня воды в баке на микроконтроллере PIC16F628A
Индикатор(датчик) уровня воды на микроконтроллере PIC16F628А – устройство, которое позволит визуально контролировать уровень воды в непрозрачной ёмкости. Предлагаемое устройство может пригодиться всем, у кого есть загородный дом с летним душем или дача, огород, да что угодно лишь была бы емкость с водой. После некоторых модернизаций из индикатора получилось реле уровня воды.
Сам индикатор состоит из двух основных частей:
- Датчики уровня воды;
- Электроника, которая обрабатывает информацию, полученную от датчиков.
Теперь подробнее рассмотрим каждую из составных частей индикатора.
О схеме
Схема индикатора собиралась из того, что было под рукой, и разрабатывалась вообще для микроконтроллера PIC16F84, но позже было принято решение добавить поддержку более дешевого и доступного микроконтроллера – PIC16F628A.
Принципиальная схема индикатора уровня воды (рисунок 1) проста, как пять копеек. FM приемник на RDA5807 – проще не бывает!
Рисунок 1 – Принципиальная схема индикатора уровня воды на микроконтроллере PIC16F628A
Рассмотрим основные узлы. Сердцем устройства является микроконтроллер PIC16F628A фирмы Microchip. Для стабильного питания которого, применяется выпрямитель на диодном мосте, конденсаторах и интегральном стабилизаторе L7805.
Для понижения напряжения настоятельно рекомендуется применить понижающий трансформатор, который обеспечит необходимую гальваническую развязку. Гасящие конденсаторы лучше не ставить, так как появляется риск оказаться под опасным потенциалом напряжения.
Датчики подключаются к схеме через барьерные резисторы.
Четыре светодиода отображают текущее количество воды в емкости. В зависимости от того какой датчик замыкает с общим проводом, светодиод того датчика и будет светиться. Весь перечень деталей сведён в таблицу 1.
Таблица 1 – Перечень компонентов для индикатора уровня воды на микроконтроллере PIC16F628АПозиционное обозначение | Наименование | Аналог/замена |
С1, С3 | Конденсатор керамический – 15пФх50В | |
С2 | Конденсатор электролитический – 470мкФх25В | |
С4 | Конденсатор керамический – 0,1мкФмкФх50В | |
С5 | Конденсатор электролитический – 1000мкФх10В | |
DA1 | Интегральный стабилизатор L7805 | L78L05 |
DD1 | Микроконтроллер PIC16F628A | PIC16F648A, PIC16F84 |
HL1-HL4 | Светодиод 3мм | |
R1-R5, R11 | Резистор 0,125Вт 5,1 Ом | SMD типоразмер 0805 |
R6-R9 | Резистор 0,125Вт 510 кОм | SMD типоразмер 0805 |
R10 | Резистор 0,125Вт 1 кОм | SMD типоразмер 0805 |
R12-R15 | Резистор 0,125Вт 180 Ом | SMD типоразмер 0805 |
VD1 | Диодный мост 1А х 1000В 2W10 | |
XP1-XP4 | Штекер платный | |
XT1-XT2 | Клеммник на 2 контакта. | |
XT3 | Клеммник на 3 контакта. | |
ZQ1 | Кварц 4МГц типаразмер HC49 |
О датчиках
В качестве датчиков используются тонкие хомуты из оцинкованной жести, которые, в свою очередь, располагаются на пластиковой трубе, на определенном расстоянии друг от друга. Труба крепится к тяжелому основанию(рисунок 2).
Рисунок 2 – Тяжелое основание для пластиковой трубы с датчиками.
К хомутам подводятся провода, соединяющие датчики и схему (можно использовать витую пару). Вся эта конструкция устанавливается в емкость с водой. Замыкать датчики между собой будет вода.
Расстояния между датчиками выбираются произвольные. В моем случае, емкость была условно разделена на три части, и по уровню каждой части на трубе был установлен хомут.
Если для емкости был предусмотрен перелив, то последний хомут должен быть установлен на уровне перелива.
Конструкция датчиков может быть и иной. Главное соблюдать требуемую последовательность.
Как работает
Работает такая конструкция очень просто. На самом низу трубы (или на основании) крепится общий провод для работы с датчиками. Относительно этого провода будут происходить все измерения. Вода, наполняя емкость, постепенно начнет замыкать общий провод с датчиками. Первый на очереди – датчик 1.
Когда общий провод с ним замкнется тогда включиться первый светодиод. Далее к первому датчику добавится второй датчик, при этом включится второй светодиод, а первый выключиться и т.д. Когда произойдет замыкание с четвертым датчиком – включиться четвертый светодиод.
Который, в свою очередь, будет мерцать с частотой 2 Гц.
Подобный алгоритм работы можно легко организовать на обычной логике. Так поначалу и делалось, однако, из-за частых ошибочных состояний, было принято решение заменить схему на современное микроконтроллерное устройство. Рабочая программа для PIC-микроконтроллера была написана на языке ассемблер и отлажена в программе MPLab 8.8
Моделирование
Работа устройства моделировалась в программе протеус см. рисунок 3. Модель сделана для микроконтроллера PIC16F84A! Внимательно выбираем прошивку.
Рисунок 3 – Модель уровня воды на микроконтроллере.
О печатной плате
Печатная плата получилась размерами 55х50мм (рисунки 4-5 !!! не в масштабе).
Рисунок 4 – Печатная плата индикатора уровня воды в баке на микроконтроллере PIC16F628A (низ) не в масштабе.
Рисунок 5 – Печатная плата индикатора уровня воды в баке на микроконтроллере PIC16F628A (верх) не в масштабе.
Внешний вид индикатора показан на рисунке 6.
Рисунок 6 – Готовая плата индикатора уровня воды.
Корпус
Схему готового индикатора разместил в корпусе небольшого приемника рисунки 7-8.
Рисунок 6 – Готовая плата индикатора уровня воды на микроконтроллере PIC16F628A в корпусе приемника.
Рисунок 7 – Кнопка включения питания.
Отверстия для динамика заклеил клеем, а на лицевую сторону приклеил глянцевую фотография рисунки 8-9
Индикатор, собранный из заведомо рабочих деталей, начинает работать сразу и в наладке не нуждается.
Рисунок 8 – Заклееные отверстия.
Рисунок 9 – Лицевая панель индикатора уровня воды на микроконтроллере PIC16F628A.
Видео работы устройства.
В итоге получился совсем не плохой индикатор уровня воды в баке на микроконтроллере PIC16F628A, который не содержит дефицитных деталей, прост в изготовлении и не требует наладки.
Добавлена поддержка микроконтроллеров PIC16F84, PIC16F648A. Печатная плата получилась 55х50 мм. Емкость, в которой будут размещены датчики, не нужно портить лишними отверстиями.
Исправных компонентов и добра всем!!! Спасибо за внимание.
Файлы к статье:
Индикатор уровня воды в баке на микроконтроллере PIC16F628A(статья в pdf)
Архив с проектом
Фотографии
Источник: https://pichobby.lg.ua/shemu/raznoe/item/16-bak.html
Контроль уровня жидкости ультразвуковым дальномером
Измерительная техника
Главная Радиолюбителю Измерительная техника
Дешёвые ультразвуковые дальномеры (HC-SR04 и им подобные) можно использовать для измерения уровня жидкостей в сосудах. Зачастую это получается проще и надёжнее, чем использование поплавковых, резистивных, ёмкостных и других традиционных датчиков уровня.
Уровнемеры, основанные на контакте измерительных электродов с жидкостью, требуют периодической чистки этих электродов, а для непроводящих жидкостей они непригодны.
Поплавковые уровнемеры, основанные как на замыкании и размыкании герконов под действием поля установленного на поплавке магнита, так и на преобразовании перемещений поплавка в сопротивление переменного резистора, плохо работают в вязких средах.
Многие уровнемеры сигнализируют лишь о достижении жидкостью нескольких фиксированных уровней.
Я разработал блок измерения и поддержания уровня жидкости в баке на базе ультразвукового измерителя дальности HC-SR04, принцип работы которого подробно изложен в [1]. Этот блок применён на дачном участке для поддержания уровня воды в баке умывальника и бочке для полива растений.
На одном из предприятий он поддерживает необходимый уровень дизельного топлива в расходной ёмкости и нормально работает более года.
К сожалению, блок не сертифицирован, поскольку процедура сертификации занимает очень много времени, а затраты на неё гораздо больше, чем на приобретение любого зарубежного аналога.
Рис. 1. Схема блока
Схема блока изображена на рис. 1.
В каждом рабочем цикле, повторяющемся каждую секунду, микроконтроллер DD1 трижды запускает измеритель дальности B1, генерируя импульсы Trig длительностью 15 мкс, и получает импульсы Echo с задержкой, пропорциональной длительности распространения ультразвукового импульса от передатчика до поверхности жидкости в баке и обратно к приёмнику. Программа измеряет задержку с помощью таймера TMR1, настроенного так, что по окончании счёта число в его регистрах TMR1H и TMR1L равно длительности задержки отражённого импульса в микросекундах. Зная его, можно определить заполненность бака Q в процентах по формуле
где NTMR1 – результат счёта (число в регистрахTMR1H и TMR1L); Ht – глубина бака(расстояние от места установки измерителя до дна), мм; k -коэффициент, пропорциональный скорости звука в воздухе, при скорости 331,8 м/с он равен 16,59. Но контрольные измерения показали, что более точные результаты получаются при k=17.
Программа рассчитывает коэффициент заполнения бака после каждого из трёх измерений, выполняемых с интервалами 200 мс. Их результаты она присваивает переменным Q1, Q2 и Q3.
Затем проводит их мажоритарный отбор для выявления ошибочного результата.
Такая обработка показала свою надёжность при контроле заполнения открытой бочки, когда влияние на результаты оказывают насекомые, падающие листья и механические воздействия на бочку. Для измерений в закрытых баках этот алгоритм избыточен.
Полученное в каждом цикле значение Q при работе в автоматическом режиме сравнивается с нижним порогом Qmin (при Q
Блок питается постоянным напряжением 12 В и потребляет ток не более 95 мА. Микроконтроллер DD1 управляет ЖКИ HG1 (одна строка из 16 символов) через сдвиговый регистр DD2. Это дало возможность занять управлением ЖКИ минимальное число выводов микроконтроллера.
Программа написана на языке ассемблера и отлажена в среде MPLABX4.15. В ней использованы вычисления с плавающей запятой (формат чисел с плавающей запятой – один байт порядок и два байта мантисса). Нажатия на кнопки SB1 и SB2 обрабатываются по прерываниям.
Поскольку в знакогенераторе ЖКИ PC1601BC нет символов кириллицы, сообщения выводятся на английском языке. Общение с оператором происходит через систему меню ME_0- ME_5. Их перебирают нажатиями на
кнопку SB1, выбирая нужное меню нажатием на кнопку SB2, при этом на экране ЖКИ появляется курсор. Выходят из меню МЕ_0 и МЕ_1 нажатием на кнопку SB2, из МЕ_2-МЕ_4 – одновременным нажатием на кнопки SB1 и SB2. Из МЕ_5 программа выходит автоматически по окончании записи в EEPROM.
В меню МЕ_2-МЕ_4 значение параметра увеличивается при нажатии на кнопку SB1 (с ускорением после восьмого шага), а при нажатии на кнопку SB2 оно уменьшается (также с ускорением после восьмого шага).
Меню имеют следующие функции и вид:
МЕ_0 – ручное управление насосом. На экран ЖКИ выводится сообщение “Pump OFF Qw=XX%” (насос выключен) или “Pump ON Qw=XX%” (насос включён), где XX – измеренный коэффициент заполнения бака. Каждое нажатие на кнопку SB1 включает или выключает насос.
МЕ_1 – автоматическое управление насосом. На экран выводится сообщение “AutoQwYQw=XX%”. Буква “Y” означает, что насос включён. В противном случае она отсутствует.
МЕ_2 – установка порога включения насоса. На экран ЖКИ выводится сообщение “Set min Qw=XX%”, где XX – значение коэффициента заполнения при уровне жидкости, меньше которого насос будет включён.
МЕ_3 – установка порога выключения насоса. На экран выводится сообщение “Set max Qw=XX%” , где XX – значение коэффициента заполнения при уровне жидкости, больше которого насос будет выключен.
МЕ_4 – установка глубины бака. На экран выводится сообщение “Set Ht = ZZZmm “, где ZZZ – глубина бака, мм.
МЕ_5 – запись параметров в EEPROM микроконтроллера. На экран ЖКИ выводится сообщение “EEPROM Set OFF”. По окончании записи вместо OFF будет выведено YYY
Блок смонтирован на печатной плате из фольгированного с одной стороны стеклотекстолита, чертёж которой показан на рис. 2. Её помещают в пластмассовый корпус подходящего размера с вырезанным в нём окном для экрана индикатора HG1.
На одной из стенок корпуса размещают кнопки SB1 и SB2. Излучатель и приёмник ультразвука модуля HC-SR04 должны выступать из корпуса.
Прибор необходимо зафиксировать в верхней части бака (выше максимально возможного уровня жидкости), направив излучателем и приёмником ультразвука вниз.
Рис. 2. Чертёж печатной платы блока
Реле K1 – 4117-C-Z с обмоткой на 12 В. Предельный коммутируемый его контактами ток – 10 А, максимальное коммутируемое переменное напряжение – 380 В. У меня такое реле управляет электродвигателем насоса мощностью 1,5 кВт. При необходимости это реле можно заменить на 51.9.012.0000, но печатную плату под него придётся корректировать.
Резистор R1 и конденсатор C2 – для поверхностного монтажа типоразмеров соответственно 1206 и 0805. Оксидный конденсатор C1 – К50-6, К50-35 или импортный.
Транзистор КТ315Г можно заменить другим структуры n-p-n с допустимым током коллектора не менее 0,15 А и коэффициентом передачи тока базы больше 40.
Диод Шотки SS14 можно заменить любым, в том числе обычным кремниевым диодом с допустимым прямым током больше рабочего тока обмотки применённого реле и обратным напряжением не менее 15…20 В.
Так как АЦП микроконтроллера программа не использует, микроконтроллер PIC16F676-I/P можно заменить на PIC16F630-I/P, но потребуется небольшая корректировка программы. Сдвиговый регистр 74HC164N можно заменить на К561ИР2.
ЖКИ PC1601BC при необходимости может быть без изменения схемы подключения заменён одним из более распространённых символьных ЖКИ, имеющих две строки по 16 символов. Это позволит выводить на его экран более информативные сообщения. При наличии в знакогенераторе ЖКИ русских букв англоязычные сообщения можно заменить русскоязычными.
Запас программной памяти для подобных усовершенствований в применённом микроконтроллере есть (используется 77 %).
Перед началом использования блока нужно установить в меню ME_2-ME_4 значения верхнего порога, нижнего порога и глубины бака. Затем записать их в EEPROM, выбрав меню ME_5.
Программа микроконтроллера имеется здесь.
Литература
1. Нечаев И. Ультразвуковой дальномер HC-SR04 без микроконтроллера. Часть 1. Сигнализаторы присутствия. – Радио, 2018, № 4, с. 59-62.
2. Кухлинг Х. Справочник по физике. – М.: МИР, 1983.
Источник: http://www.radioradar.net/radiofan/measuring_technics/liquid_level_contro_ultrasonic_range_finder.html
Ультразвуковые датчики жидкости и воды
Ультразвуковые датчики уровня жидкости в своем большинстве устройства экономичные и используемые в широком спектре задач. К ультразвуковым датчикам уровня жидкости не предъявляется специальных требований, что сказывается на их цене.
Модели приборов и аналоги
Хорошо адаптирована к жидкостным приложениям серия датчиков Pepperl+Fuchs F65. Модели данной серии работают в диапазонах до 2500 мм и оснащаются тремя типами выходов – аналоговым, дискретным или частотным.
Запитываются от источника постоянного напряжения 12…30 В. Транзисторные выходы нагружаются на ток до 300 мА, защищены от КЗ и перегрузки по напряжению. Корпус – PBT.
Такой ультразвуковой датчик жидкости оптимален по цене и функционалу.
Области применения
Ультразвуковые датчики уровня жидкости и воды широко используются в разных сферах:
- Нефтяная и нефтегазовая отрасли (топливные и нефтяные продукты)
- Химпродукты, фармацевтическая продукция
- ЖКХ и водоочистка, сельское хозяйство
- Агропромышленный комплекс
- Пищевая промышленность
- Заправочные станции
- Жидкости разного уровня токсичности, вязкости, агрессивности, горючие жидкости, вода
Назначение
Ультразвуковые датчики уровня воды и иных жидкостей используются для задач, связанных с контролем уровня. Основные приложения:
- Непрерывное отслеживание количественного значения воды и иных жидкостей в промышленных и естественных емкостях/резервуарах
- Регулирование и сигнализация
- Контроль качества очистки, учет продукции в АПК, с/х, на предприятиях сферы питания, учет продуктов топлива, АЗС
Преимущества
Главные достоинства:
- Широкая применяемость и универсальность
- Независимость измерений от свойств жидкостей
- Компактность и неприхотливость датчиков
- Экономичность
Недостатки
Основные ограничения:
- Узкая специализация (ограничения на работу с сыпучими и твердыми материалами)
- Некоторое влияние возмущающих факторов внешней среды
Компенсировать внешние возмущения в виде, например, порывов ветра возможно правильной установкой или подбором частоты излучения. В остальных ситуациях возможно применение датчиков на других принципах работы. Например – волноводных или гидростатических.
Принцип работы прибора
На примере датчика из серии Pepperl+Fuchs F65 принцип работы описывается таким образом:
Излучатель (сенсор) устанавливается над поверхностью жидкости наверху резервуара. Излученные импульсы отражаются от границ между воздушной средой и жидкостью и возвращаются к сенсору. По измеренным данным сигнала (времени распространения) рассчитывается расстояние до продукта и его уровень. 2 типа выходов устанавливаются в соответствующее настройке положение.
Источник: https://RusAutomation.ru/datchiki_urovnya/ultrazvukovie-datchiki-zhidkosti
Датчик уровня воды
Источник: http://elwo.ru/publ/skhemy_avtomatiki/datchik_urovnja_vody/28-1-0-738
AVR: подключаем ультразвуковой дальномер HC-SR04 к atmega8
Характеристики ультразвукового дальномера HC-SR04
- Измеряемый диапазон: 2 см — 500 см
- Точность: 0,3 см
- Угол обзора:
- Напряжение питания 5V
Принцип работы ультразвукового дальномера HC-SR04
В составе дальномера два пьезоэлемента, один работает как излучатель сигнала, другой как приемник. Излучатель генерирует сигнал, который отразившись от препятствия попадает на приёмник. Измерив время за которое сигнал проходит до объекта и обратно можно оценить расстояние.
Модуль датчика расстояния HC-SR04 имеет 4 вывода:
- VCC: питание 5 вольт
- Trig: вход триггера, запускающего измерения
- Echo: выход, на котором генерируется импульс, длительность которого пропорциональна расстоянию
- GND: земля
В документации на модуль датчика расстояния HC-SR04 указано, что для запуска измерений на вход Trig надо подать импульс длительностью 10-15 микросекунд. После чего на выходе Echo появится импульс длительностью 150мкс — 25мс.
Длительность этого импульса пропорциональна расстоянию до объекта, от которого отразился ультразвуковой сигнал.
Для того что бы из длительности сигнала в микросекундах получить расстояние в сантиметрах используется формула:
D = T/58
где: T — длительности сигнала в микросекундах
D — расстояние в сантиметрах
Если же отраженный сигнал не дошёл до приёмника, то на выходе Echo будет импульс длительностью 38 попугаев миллисекунд,
Пример использования ультразвукового дальномера HC-SR04 с микроконтроллером AVR atmega
Описание программы для avr atmega: программа запускает измерения, генерируя импульс 10 мкс. на выходе PD3, соединённого с входом Trig. Выход Echo подключён к PD2, который используется как внешнее прерывание. По переднему фронту на PD2 сбрасываем в ноль таймер счетчик timer1.
По заднему фронту на PD2 запоминается значение таймера счетчика timer1. Далее, полученная длина импульса переводится в сантиметры и выводится в uart. Через 1 секунду цикл измерений повторяется. Так как timer1 настроен так, что длительность тика равна 8.
68 мкс ( 1/(7372800/64) ), то используется пересчитанный коэффициент для перевода в сантиметры 58/8.68 = 6.68, округляем до 7;
Далее приведён исходный текст только основных функций для avr atmega, целиком исходники проекта avr-gcc (WinAvr) можно скачать тут.
Для изготовления датчика, или индикатора уровня воды в баке, цистерне, бассейне и другой ёмкости, можно применить микросхему 4093 (отечественная 561ТЛ1) либо на микроконтроллере Ардуино. Начнём с первого варианта. Схема датчика уровня на CD4093Необходимые для датчика материалы
Итак, основа – это CI4093, что имеет четыре элемента. В этом проекте использовано две микросхемы. Тут мы имеем порты с одним входом на высоком уровне, а другие подключенные через резистор, обеспечивая высокий логический уровень. При помещении в эту логику нулевого входного сигнала, выход инвертора будет на высоком уровне и включает светодиод. Всего использовано семь из восьми элементов, из-за ограничений в кабельной сети. Сбоку размещена линейка светодиодов разных цветов, указывающая на уровень воды. Красные индикаторы – воды совсем мало, жёлтые – бак наполовину пуст, зелёные – полный. Центральная большая кнопка используется для подключения насоса и накачки бака. Схема работает только при нажатии на центральную кнопку. Остальное время она находится в дежурном режиме. Но даже при срабатывании цепи индикации, ток минимален и батарейки хватит на долго. Схема подключения датчикаПровода проходят внутри труб. Старайтесь расположить датчики таким образом, чтоб вода, попадающая в поле с помощью поплавкового клапана, никак не могла пройти мимо датчиков. Внутри трубы с датчиками, чтобы сделать нужный вес, был насыпан песок. В собранном виде схема находится в коробке и установлена на стене. Второй вариант схемы датчика уровняЭто полностью функциональный контроллер уровня воды, управляемый МК Arduino. Схема отображает уровень воды в баке и переключает двигатель, когда уровень воды опускается ниже заданного уровня. Она автоматически отключает мотор, когда бак полный. Уровень воды и другие важные данные отображаются на ЖК-дисплее 16х2 точек. В авторском варианте схема контролирует уровень воды в дренажном баке (резервуаре). Если уровень бака низкий, электродвигатель насоса не включится, что обеспечивает защиту двигателя от холостого хода. Дополнительно звуковой сигнал генерируется, когда уровень в дренажном баке слишком низкий.
Сухой конец провода подключен к +5V DC. Когда вода касается конкретного зонда, происходит электрическое соединение между зондом и +5V, потому что вода обладает некоторой электропроводностью. В результате ток течет через зонд и этот ток преобразуется в пропорциональное ему напряжение. Arduino читает падении напряжения по каждому из входных резистор для зондирования уровня воды в баке. Транзистор Q1 включает зуммер, резистор R5 ограничивает ток базы Q1. Транзистор Q2 управляет реле. Резистор R3 ограничивает ток базы Q2. Переменник R2 используется для регулировки контрастности ЖК-дисплея. резистор R1 ограничивает ток через его LED подсветку. Резистор R4 ограничивает ток через светодиодный индикатор питания. Полную программу для контроллера на Arduino можно загрузить тут. Схемы автоматики |
#include #include #include #include “uart.h” #include “ext_int.h” #include “timer1.h” //порт для генерирования сигнала TRIG #define HC_SR04_TRIG_PORT PORTD #define HC_SR04_TRIG_DDR DDRD #define HC_SR04_TRIG_BIT _BV(3) //порт для измерения длительности импульса #define HC_SR04_ETHO_PIN PIND #define HC_SR04_ECHO_BIT _BV(2) //состояние измерения #define HC_SR04_START 0 //запуск #define HC_SR04_MEAS 1 //в процессе #define HC_SR04_END 2 //окончено volatile unsigned char hc_sr04_status; //измеренная длительность импульса volatile unsigned short hc_sr04_cnt; //функция обработчик внешнего прерывания INT0 void hc_sr04_int_handler( void ) { //проверяем уровень сигнала PD2( ECHO ) if( HC_SR04_ETHO_PIN & HC_SR04_ECHO_BIT ) { //передний фронт – сбрасываем в 0 таймер timer1_clr(); hc_sr04_status = HC_SR04_MEAS; } else { //задний фронт – запоминаем значение таймера hc_sr04_cnt = timer1_cnt(); hc_sr04_status = HC_SR04_END; } } void hc_sr04_init( void ) { //устанавливаем функцию для обработки внешнего прерывания INT0 int0_set_handler( hc_sr04_int_handler ); //разрешаем внешнее прерывание INT0 int0_enable(); //настраиваем внешнее прерывание INT0 на срабатывание любому изменению int0_set_source( INT0_ANY_CHANGE ); //настраиваем timer1д timer1_init(); //настраиваем PD3(TRIG) на выход HC_SR04_TRIG_PORT |= ~HC_SR04_TRIG_BIT; HC_SR04_TRIG_DDR |= HC_SR04_TRIG_BIT; } //измерение дальности, возвращает значение в см unsigned short hc_sr04_meas( void ) { //состояние – начало измерений hc_sr04_status = HC_SR04_START; //генерируем импульс 10 мкс на входе trig HC_SR04_TRIG_PORT |= HC_SR04_TRIG_BIT; _delay_us( 10 ); HC_SR04_TRIG_PORT &= ~HC_SR04_TRIG_BIT; //ждем окончания измерения while( hc_sr04_status != HC_SR04_END ); // 58/8.68 = 6.68 ~ 7 //переводим в сантиметры return hc_sr04_cnt/7; } FILE uart_stream = FDEV_SETUP_STREAM( uart_putc, NULL, _FDEV_SETUP_WRITE ); int main( ) { unsigned short sm; //настройка uart uart_init(); //инициализация датчика hc_sr04_init(); stdout = &uart_stream; sei(); while( 1 ) { //измерение sm = hc_sr04_meas(); printf( “sm = %u “, sm ); //задержка 1 сек _delay_ms( 1000 ); } return 0; } |
#include #include
h” //порт для генерирования сигнала TRIG #define HC_SR04_TRIG_PORT PORTD #define HC_SR04_TRIG_DDR DDRD #define HC_SR04_TRIG_BIT _BV(3) //порт для измерения длительности импульса #define HC_SR04_ETHO_PIN PIND #define HC_SR04_ECHO_BIT _BV(2) //состояние измерения #define HC_SR04_START 0 //запуск #define HC_SR04_MEAS 1 //в процессе #define HC_SR04_END 2 //окончено volatile unsigned char hc_sr04_status; //измеренная длительность импульса volatile unsigned short hc_sr04_cnt; //функция обработчик внешнего прерывания INT0 void hc_sr04_int_handler( void ) { //проверяем уровень сигнала PD2( ECHO ) if( HC_SR04_ETHO_PIN & HC_SR04_ECHO_BIT ) { //передний фронт – сбрасываем в 0 таймер timer1_clr(); hc_sr04_status = HC_SR04_MEAS; } else { //задний фронт – запоминаем значение таймера hc_sr04_cnt = timer1_cnt(); hc_sr04_status = HC_SR04_END; } } void hc_sr04_init( void ) { //устанавливаем функцию для обработки внешнего прерывания INT0 int0_set_handler( hc_sr04_int_handler ); //разрешаем внешнее прерывание INT0 int0_enable(); //настраиваем внешнее прерывание INT0 на срабатывание любому изменению int0_set_source( INT0_ANY_CHANGE ); //настраиваем timer1д timer1_init(); //настраиваем PD3(TRIG) на выход HC_SR04_TRIG_PORT |= ~HC_SR04_TRIG_BIT; HC_SR04_TRIG_DDR |= HC_SR04_TRIG_BIT; } //измерение дальности, возвращает значение в см unsigned short hc_sr04_meas( void ) { //состояние – начало измерений hc_sr04_status = HC_SR04_START; //генерируем импульс 10 мкс на входе trig HC_SR04_TRIG_PORT |= HC_SR04_TRIG_BIT; _delay_us( 10 ); HC_SR04_TRIG_PORT &= ~HC_SR04_TRIG_BIT; //ждем окончания измерения while( hc_sr04_status != HC_SR04_END ); // 58/8.68 = 6.68 ~ 7 //переводим в сантиметры return hc_sr04_cnt/7; } FILE uart_stream = FDEV_SETUP_STREAM( uart_putc, NULL, _FDEV_SETUP_WRITE ); int main( ) { unsigned short sm; //настройка uart uart_init(); //инициализация датчика hc_sr04_init(); stdout = &uart_stream; sei(); while( 1 ) { //измерение sm = hc_sr04_meas(); printf( “sm = %u
“, sm ); //задержка 1 сек _delay_ms( 1000 ); } return 0; }
Запись опубликована в рубрике Микроконтроллеры avr с метками atmega, avr. Добавьте в закладки постоянную ссылку.
Источник: http://mainloop.ru/avr-atmega/avr-ultrasonic-sensor-hc-sr04.html
Ультразвуковой дальномер HC-SR04
Источник: http://AVRproject.ru/publ/kak_podkljuchit/ultrasonic_sonar_hc_sr04/2-1-0-51
Ультразвуковой датчик уровня УДМ-110
Источник: http://kseon.info/datchiki_udm110.html
Adblockdetector