Официальный сайт компании Arduino по адресу arduino.cc
Хитрое реле задержки
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 07/01/2019 - 00:14
Задача:
Есть датчик потока воды ГВС в котле. Он 3-х проводной: +5В,Общий, Выход.
Когда потока воды нет, на выходе либо 0В, либо +5В. Когда есть - импульсы, частота которых пропорциональна потоку.
Надо:
В разрыв сигнального провода поставить Arduino Nano, которая будет вырезать первые N секунд каждой серии импульсов.
Это раздел для проектов, а не для задач.
Это раздел для готовых проектов.
Вам надо перепостить вот сюда - это специальный раздел для заказа работы за деньги.
Он хотел нахалтай, Скифу нежно маякнуть)))
Я прошу помочь советом как это алгоритмически правильно реализовать, а программу я сам напишу.
Пока для повтора входа на выход следующий алгоритм:
init:
1. TRANSMIT == 0
2. Устанавливаем прерывание по фронту на входе.
Обработчик прерывания:
if TRANSMIT {OUT == IN}
Осталось выполнить условие и установить TRANSMIT в 1. Сейчас подумаю как это сделать.
Это раздел для готовых проектов.
Вам надо перепостить...
Я думаю мне сюда
Как перепостить?
Устанавливаем условие прекращения серии импульсов на входе когда TRANSMIT становится равным 1:
1. Запускаем таймер по кругу на 1 секунду.
Обработка прерывания окончания счета от таймера :
1. Если аппаратный счетчик по входу = 0, то TRANSMIT == 0 и остановить таймер;
2.
2. Обнуляем аппаратный счетчик по входу
Осталось определиться когда TRANSMIT станет 1
Вот что получилось:
Начальная инициализация:
1. TRANSMIT = 0; // Разрешение передачи
2. TransmitDelay = 0; // Задержка передачи в секундах
3. Разрешить только прерывание по фронту на входе;
-----------------------------------------------------------------------------------
Обработчик прерывания по фронту на входе:
if TRANSMIT then OUT = IN
else if TransmitDelay == 0
then 1. Запретить прерывание по фронту на входе
2. Обнулить аппаратный счетчик по входу
3. Разрешить прерывание по окончанию счета таймера (переполнения?);
4. Запустить таймер по кругу на 1 секунду.
-----------------------------------------------------------------------------------
Обработчик прерывания окончания счета от таймера:
1. Если аппаратный счетчик по входу == 0,
то TRANSMIT = 0
TransmitDelay = 0
запретить прерывания от таймера
остановить таймер
Разрешить прерывание по фронту на входе
иначе TransmitDelay++;
2. if TransmitDelay == N
then TRANSMIT = 1
Разрешить прерывание по фронту на входе
3. Обнулить аппаратный счетчик по входу
В разрыв сигнального провода поставить Arduino Nano, которая будет вырезать первые N секунд каждой серии импульсов.
Я думаю мне сюда
Напрасно думаете. У Вас нет скетча и нет конкретных вопросов, потому Вам именно туда, куда я написал.
В такой постановке задача неразрешима, т.к. отсутствуют критерии начала и окончания серии.
Вы правы. Я к этому сразу пришёл. Критерий окончания серии: В течении 1 секунды(например) не было изменений уровня на входе. Я это представил в вышеизложенном алгоритме.
У Вас нет скетча и нет конкретных вопросов
Скорее бы... я прямо заинтригован программной реализацией пункта "Запустить таймер по кругу на 1 секунду".
Критерий окончания серии: В течении 1 секунды(например) не было изменений уровня на входе. Я это представил в вышеизложенном алгоритме.
Кроме того, прерывание - это элемент реализации, а потому вряд ли его следует упоминать на этапе изложения алгоритма. Я бы Вам порекомендовал сначала изложить алгоритм без прерываний и именно по-русски, потом реализовать точно так же - без прерываний (лично я вообще не вижу смысла в применении прерываний в Вашей задаче), и только если возникнут какие-то проблемы, преодолению которых могут способствовать прерывания, пытаться их использовать.
я прямо заинтригован программной реализацией пункта "Запустить таймер по кругу на 1 секунду".
Поэтому и прощу помощи в аппаратно-програмных возможностях Arduino
я вообще не вижу смысла в применении прерываний в Вашей задаче
Котел включен круглосуточно, горячую воду открывают редко, контроллер будет все время спать и просыпаться только по необходимости.
Вот код для повтора входа на выход (без условий пока):
объясните куда идёт этот сигнал от датчика и зачем вырезать часть импульсов.
объясните куда идёт этот сигнал от датчика и зачем вырезать часть импульсов.
Пожалуйста! Это датчик потока воды в двухконтурном котле. Сигнал от него идет на плату управления котла. Наличие импульсов с него переводит котёл в режим приготовления горячей воды. Вырезать N секунд из серии импульсов нужно, чтобы исключить срабатывание котла на кратковременные открытия крана горячей воды.
p.s. Котёл подключен последовательно с электрическим бойлером.
алгоритм принято излагать на каком-либо понятном языке. У Вас, увы, это не так.
Кроме того, прерывание - это элемент реализации, а потому вряд ли его следует упоминать на этапе изложения алгоритма. Я бы Вам порекомендовал сначала изложить алгоритм без прерываний и именно по-русски, потом реализовать точно так же - без прерываний (лично я вообще не вижу смысла в применении прерываний в Вашей задаче), и только если возникнут какие-то проблемы, преодолению которых могут способствовать прерывания, пытаться их использовать.
Алгоритмы принято излагать в виде блок-схем. То что я написал - текстовое изложение блок-схемы, чтобы не рисовать её. Посмотрите, пожалуйста, код. Правильна ли основа программы?
Скорее бы... я прямо заинтригован программной реализацией пункта "Запустить таймер по кругу на 1 секунду".
Запускать таймер по кругу на 1 секунду так:
Для остановки таймера использовать вызов timer_stop_ISR, для повторного запуска — timer_init_ISR_1Hz(TIMER_DEFAULT), как и раньше.
Возьми любой таймер и сделай его таймером с нужным тебе интервалом. Возьми другой таймер и сделай его СЧЁТЧИКОМ с нужным тебе количеством импульсов. Пока счётчик считает импульсы а таймер не переполнился - молчим. Как только счётчик ДОСЧИТАЛ нужное а таймер НЕ переполнился - вырубаем нафиг таймера и делаем проброс с входа на выход. Как только импульсы прекратились - запускаем таймеры снова. Вуаля!
Возьми любой таймер и сделай его таймером с нужным тебе интервалом. Возьми другой таймер и сделай его СЧЁТЧИКОМ с нужным тебе количеством импульсов. Пока счётчик считает импульсы а таймер не переполнился - молчим. Как только счётчик ДОСЧИТАЛ нужное а таймер НЕ переполнился - вырубаем нафиг таймера и делаем проброс с входа на выход. Как только импульсы прекратились - запускаем таймеры снова. Вуаля!
У меня нет количества импульсов, которые нужно считать
Скорее бы... я прямо заинтригован программной реализацией пункта "Запустить таймер по кругу на 1 секунду".
Запускать таймер по кругу на 1 секунду так:
Адриано прав - не мудрили бы вы сразу прерывания/таймеры... Длительность импульса какова?
Адриано прав - не мудрили бы вы сразу прерывания/таймеры... Длительность импульса какова?
Не вижу в прерываниях премудрости. Всю жизнь писал через прерывания. Это главное преимущество микроконтроллера. Вечные циклы были только в школе. Макс. частота импульсов пара килогерц, я думаю, в датчике турбинка с магнитиком крутится в потоке воды.
Ну, если всю жись - тогда чего у нас спрашиваете... Тут даже можно релюшкой щелкать, которая импульсы напрямую запустит в котел, через секунду после подлова фронта.
Ну, если всю жись - тогда чего у нас спрашиваете... Тут даже можно релюшкой щелкать, которая импульсы напрямую запустит в котел, через секунду после подлова фронта.
Так это было уже 11 лет назад. А Arduino я даже в руках еще не держал. Релюшка не наш метод. Подловить фронт мало, надо установить что имульсы не кончались, и не секунда, а N секунд.
Ваша заинтрегованность по таймеру прошла? Как Вам код?
Спрашиваю у Вас, потому что нет практики программирования Arduino, мне неизвестны её нюансы и аппаратные возможности, не писал для Atmela код на С++
Нет, не прошла. Ни одного функционального действия я в нем не вижу - только странные декларации.
Для этой задачи прерывание нужно максимум на просыпание. Питание не батарейное - на спичках экономить в сон процессор посылать.
А алгоритм простой. Заводим два флага начало пачки импульсов и разрешение на выдачу. В лупе ждем когда изменится уровень на входе. при изменении уровня выставляем флаг начала пачки, запоминаем время и начинаем считать импульсы по перепаду уровня. Это надо для того, что бы понять что импульсы действительно идут, а не произошёл просто перекид уровня из небльшого колебания воды. Ждем время задержки и если импульсов больше какого то предела, типа 10, то выставляем флаг разрешения выдачи и просто передаем входной сигнал на выход. Иначе сбрасываем флаг. На каждой передаче запоминаем время и сравниваем с предыдущим. Если время между импульсами превысило уставку, то сбрасываем все флаги. Я б такое устройство на attiny25 делал. Прицепил прямо на датчик тремя проводками и выход на четвёртую ногу.
только странные декларации.
Проект arduino-timer-api
на спичках экономить в сон процессор посылать
Если процессору целый день нечего делать - пусть спит
В лупе ждем когда изменится уровень на входе. при изменении уровня выставляем флаг начала пачки
Лучше через прерывание это делать, согласитесь, заодно и проснемся. Луп - это детский сад или вы боитесь прерываний?
запоминаем время и начинаем считать импульсы по перепаду уровня. Это надо для того, что бы понять что импульсы действительно идут, а не произошёл просто перекид уровня из небльшого колебания воды. Ждем время задержки и если импульсов больше какого то предела, типа 10, то выставляем флаг разрешения выдачи и просто передаем входной сигнал на выход. Иначе сбрасываем флаг. На каждой передаче запоминаем время и сравниваем с предыдущим. Если время между импульсами превысило уставку, то сбрасываем все флаги.
я ж так и делаю, только я не считаю импульсы, а проверяю не пропадали ли они больше, чем на секунду с момента их начала
Я не боюсь прерываний. Я не вижу в них смысла, если это не прерывание алгоритма на стороннюю задачу, а только хитрый способ плучить фронт импульса, который и так отлично ловится, тем более что дребезг ни кто не отменял и его тоже надо обрабатывать.
Пока мой алгоритм преобразован вот в такой код:
Алгоритмы принято излагать в виде блок-схем.
Было. Лет 50-60 назад.
Даже програмировать блоксхемами можно. Я в начале знакомства с AVR для attiny15 программу строил в http://cxem.net/software/algorithm_builder.php . Для тиньки 15 только ассемблер был доступен. У неё нет оперативной памяти и компиляторы си не поддерживали.
Позвольте поитересоваться:
Даже програмировать блоксхемами можно.
Программировать можно чем угодно. Это ещё не повод тем же и алгоритмы излагать. Цель программы - быть выполненой машиной, а цель описания алгоритма - быть понятым человеком. Разные цели - разные средства.
Программа написанная блоксхемами наглядна, особенно если много ветвлений, и это не мешает ей генерить машинный код. Про то, что програмировать можно чем угодно согласен.
Программа написанная блоксхемами наглядна, особенно если много ветвлений, и это не мешает ей генерить машинный код. Про то, что програмировать можно чем угодно согласен.
ПС: Удивительно, но знаки на письме у разных народов отличатся. Видно тупые иностанцы так и не доумались писать на кириллице. Ведь все ясно и понятно. Вот я же пишу сейчас, а вы читаете.
ПС2: И еще блоксхемы описывают БЛОКИРУЮЩИЕ алгоритмы. Что не рационально для использования мощних процессоров.
Для нашей ардуины любой процесс - блокирующий, так что ОК.
Для нашей ардуины любой процесс - блокирующий, так что ОК.
delay ли, millis или обработчик прерывания - они всё едино блокирующие. Параллельно две операции не выполняются.
И никто никому не рыл ям. Зачем ждать от пилы способности рубить?
Такой вариант.
В разрыв сигнального провода поставить резистор и ключ для замыкания сигнала на землю.
При отсутствии импульсов ключ коротит сигнал на землю.
Пошли импульсы, подождал некоторое время-размыкаем ключ-импульсы пошли дальше.
Для контроля импульсов пин подключить до резистора (к вых. девайса).
Похоже вы не понимаете что такое блокирующие, а что нет. Но жевать и просвещать у меня желания нет. Все равно оффтоп.
ТС, тебе нужны асинхронные таймеры? Ни от чего не зависящие?
Их есть у меня. Спроси меня как.
Неужели автоматы пуха и тут отличились - сделали авр-ку мультиядерной? Cool story.
Задача:
Есть датчик потока воды ГВС в котле. Он 3-х проводной: +5В,Общий, Выход.
Когда потока воды нет, на выходе либо 0В, либо +5В. Когда есть - импульсы, частота которых пропорциональна потоку.
Надо:
В разрыв сигнального провода поставить Arduino Nano, которая будет вырезать первые N секунд каждой серии импульсов.
не вполне понимаю логический смысл всего действа
ведь понятно, что в N секенду может при разном потоке вписаться разный объем.
т.е. зачем здесь вообще фигурирует время, не проще ли и логичней пропускать ХХ импульсов вначале.
Позвольте поитересоваться:
I. Спасибо, исправил.
II. Таймер позволяет каждую секунду проверять не закончилась ли серия, а также позволяет выдержать задержку в N секунд.
...только ассемблер был доступен...
+
Такой вариант.
В разрыв сигнального провода поставить резистор и ключ для замыкания сигнала на землю.
При отсутствии импульсов ключ коротит сигнал на землю.
Пошли импульсы, подождал некоторое время-размыкаем ключ-импульсы пошли дальше.
Для контроля импульсов пин подключить до резистора (к вых. девайса).
Это криво решает задачу передачи импульсов, но не решает задачу правильно выдержать задержку.
ТС, тебе нужны асинхронные таймеры? Ни от чего не зависящие?
Их есть у меня. Спроси меня как.
Нужны, спрашиваю.
Меня интересует всё, что заменит вопросительные знаки в коде.