Официальный сайт компании Arduino по адресу arduino.cc
4 аналоговых датчика и 6 светодиодов помогите написать программу
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Прошу помощи в написании программы, так как сам новичок и полностью ничего не получается - совсем мало практики.
Пробовал прописать максимум два датчика и и четыре светодиода, можго сказать, что все получается, но как то где-то не до конца и скорее всего с ошибками.
Вот примерное (близкое к основной задаче) видение устройства:
Устройство
Ардуино
4 аналоговых датчика, назовем их сенсоры — на аналоговых входах
6 исполнительных элементов ввиде светодиодной индикации — на цифровых входах
Построение
4 аналоговых датчика подключены на аналоговые входы Ардуино Нано и подразумевают две группы считывающих устройств, назовем их, соответственно по групно AD1 и AD2, BD1 и BD2. Показания считывают (к примеру) в условном диапазоне от 500 до 600. Значение покоя равно среднему значению между 500 и 600, соответственно 550.
6 элементов индикации разделены на две группы, где первая заключает в себя 4 светодиода и работает (включается) совместно с аналоговыми датчиками, если есть изменение по диапазону показаний в меньшую или большую сторону, и каждый из этих диодов соответствует своему датчику — AL1, AL2, BL1 и BL2. Другая группа индикации (обработки), назовем их СL1 и СL2, может работать с первой группой светодиодов.
Алгоритм
В общем устройстве есть две основные группы «А» и «В».
В группу «А» входят датчики AD1, AD2 и светодиоды AL1, AL2 и распределяются на подгруппы AD1, AL1 и AD2, AL2.
Группа «В» построена таким же способом.
В группе «С» есть светодиоды СL1 и CL2, в дальнейшем — исполнительные устройства.
При включении устойства есть задержка в 20 сек., до начала описанного ниже цикла.
Рассмотрим алгоритм работы устройства на одной из групп — группу «А»:
при изменениии показаний на датчике или датчиках в сторону < 500 и находясь в диапазоне более 3 секунд без перерыва, загорается светодиод(ы), соответствующий данному датчику(ам) и включается светодиод группы «С» CL1 (в дальнейшем исполнительное устройство), начинается изменение показаний на датчике и когда оно достигнет 550 гаснет светодиод(ы) группы «А» и CL1.
при изменениии показаний на датчике или датчиках в сторону > 600 и находясь в диапазоне более 3 секунд без перерыва, загорается светодиод(ы), соответствующий данному датчику(ам) и включается светодиод группы «С» CL2 (в дальнейшем исполнительное устройство), начинается изменение показаний на датчике и когда оно достигнет 550 гаснет светодиод(ы) группы «А» и CL2.
в группе «В» все происходит аналогично.
Разрешения и запреты:
Состояние «покоя» - все датчики находятся п диапазонах считывания между значениями 500 и 600.
Светодиоды в группе «С» не могут работать одновременно, не зависимо какой из групп «А» или «В» они заняты, работает или CL1 или CL2.
Группа «А» имеет приоритет работать первой, если процесс не занят группой «В».
В группе «А» могут быть комбинации:
AD1 + AD2 + AL1 + AL2 + CL1;
AD1 + AD2 + AL1 + AL2 + CL2;
AD1 + AL1 + CL1;
AD1 + AL1 + CL2;
AD2 +AL2 + CL1;
AD2 +AL2 + CL2;
В группе «В» комбинации аналогичные группе «А».
В группе «С» приоритетов нет, работает тот который включается первым и совместно СL1 и СL2 не работают.
Буду благодарен откликнувшимся и отвечу на любой вопрос для проеснения
С ув
Игорь
Брать лист большой бумаги и рисовать полную блок-схему алгоритма работы программы до самого конца, и когда вы увидите размеры вашего алгоритма то поймёте почему никто (к сожалению) вам столько времени не отвечал.
Много проверок и условий я прочитав ваш пост аж сам зашел в тупик. Сделайте проще - создайте пока алгоритм (и программу) работы на 1 датчик, потом на группу из двух датчиков, а вконце уже на 2 группы.
А в реальности задача не из простых. Но вполне решаемая.
Хотябы словесный алгоритм составте грамотно. А это не алгоритм а постановка задачи.
Ок!
Сделаю как посоветовал модеретор, а то я уж совсем отчаялся.
Завтра же попробую прописать алгоритм, если что то не так - поправляйте.
С ув ко всем откликнувшимся
Игорь
Попытка написать алгоритм для одного датчика.
Апаратная часть:
Ардуино
Аналоговый датчик - A_1
Светодиод-1 (после эксперимента заменяем на реле) положения значений с датчика - D_1
Светодиод-2 (после эксперимента заменен на реле исполнительного механизма одностороннего направления) превышения значения датчика - D_2
Светодиод-3 (после эксперимента заменен на реле исполнительного механизма одностороннего направления) понижения значения датчика - D_3
*Исполнительные механизмы (светодиод-2 и светодиод-3 - разнонаправленые)
Условия:
А_1 работает во всем спектре аналогового сигнала от 0 до 1023, но диапазон работы в моем случае 450 - 550 (взят условно)
При снижениии ниже значения А_1 - 450 и задержки в данном положении более 3 секунд - подключается D_1 и D_2 (исполнительный механизм), приводя рычаг датчика в точку соответствующую значению А_1 - 500, после чего D_1 и D_2 отключаются.
При повышении выше значения А_1 - 550 и задержки в данном положении более 3 секунд - подключается D_1 и D_3(исполнительный механизм), приводя рычаг датчика в точку соответствующую значению А_1 - 500, после чего D_1 и D_3 отключаются.
Вот примерный алгоритм работы с одним датчиком.
С ув
Игорь
Первое может как-то так. Не проверял.
Спасибо, завтра соберу макетку и опробую, результат опишу.
С ув
Игорь
Скетч проверил - работает не коректно, а именно D_1 не загорается вообще, мерцает где-то глубоко. Паузу времени не выдерживает и D_2, D_3 включаются сразу после преодоления рабочего диапазона. Отключение по порогу 500 делает коректно.
Что можно поправить в скетче?
Спасибо
С ув
Игорь
Код мне не очень и сам нравится. Значит не горит D_1 (мерцает) это говорит о том что он включается и сразу выключается. Я разделил обработку времени на 2 независимых «потока». Попробуй так короче.
Для понимания что происходит и отладки используй Serial.println
И проверь схему правильно ли всё подсоединил.
ДД
Подсоединения правильны, их немного. Сериалом проверял. Мерцание практически еле заметное на 11 порту. Нет задержки.
Сейчас попробую.
С ув
Игорь
ДД
Положение поменялось так
D_1 загорается но не в полную яркость а с D_3 еще слабее. Задержки так и нет. После прохождения диапазона загорается попарно но в возвратном положении гаснет сначала D_1 (после прохождения границ 450 и 550) а затем D_2 или D_3 (по достижению 500)
Сув
Игорь
Ддаааа…. Могу предложить пойти от простого к сложному. Сначала сделать без задержки чтобы понять правильно ли всё загорается.
Вроде я нашел ошибку. Она была в обработке выключения. Если всё заработает то попробуй убери комментарии.
ДД
Ок
Сейчас все включается коректно, но не выполняет функцию задержки.
При снижениии ниже значения А_1 - 450 и задержки в данном положении более 3 секунд - подключается D_1 и D_2 (исполнительный механизм), приводя рычаг датчика в точку соответствующую значению А_1 - 500, после чего D_1 и D_2 отключаются.
При повышении выше значения А_1 - 550 и задержки в данном положении более 3 секунд - подключается D_1 и D_3(исполнительный механизм), приводя рычаг датчика в точку соответствующую значению А_1 - 500, после чего D_1 и D_3 отключаются.
С ув
Игорь
Ты убирал комментарии как я говорил?
ДД
Работает без изменений, задержки нет. Коментарии убирались и в последнем тоже.
С ув
Игорь
У вас есть соображения по поводу кода?
Можно сделать и так: если А_1 меньше 450 то пауза 3 секунды. Потом опять смотрим что стало с А_1 и если ничего не изменилось (по-прежнему меньше 450) то включаем D –шки
И попробуйте убрать комментарий с previousMillis1 = currentMillis1;
И previousMillis2 = currentMillis2;
Сделал я совсем по тупому. Если не заработает прошу чертёж подключения и фото.
ДД
Сейчас задержка работает с одним плечомD_1 D_2 , второе вообще не работает D_1 D_3.
С ув
Игорь
исправил.
ДД
Без изменений, если исправлял в пост №16
Сув
Игорь
исправил)))) Разбирайся тоже сам. Ошибки то глупейшие. Я сам их не замечаю по началу от невнимательности)))
ДД
Да сейчас все работает.
Признателен.
Я то поправлял сам для себя, но хотелось понять верность автора.
Спасибо, буду пробовать следующий этап с подключением второго датчика и создания группы.
С ув
Игорь
>>У вас есть соображения по поводу кода?
Можно сделать и так: если А_1 меньше 450 то пауза 3 секунды. Потом опять смотрим что стало с А_1 и если ничего не изменилось (по-прежнему меньше 450)<<
Так и нужно было делать изначально.
italius , а вы случайно не пневмоподвеску делаете ?
А то у меня сейчас похожий проект заказали.
Четыре пневмоподушки , на каждой два клапана (впуск/выпуск) и датчик положения , с выводом на LCD
дисплей и кнопочным управлением (три предустановленных положения) и т.д..
Программа готова , но полностью я ее выкладывать не буду (не разберетесь).
Если нужно выложу кусок программы который удерживает пневмоподушку в заданном положении.
и еще вопрос.
Для каких целей задержка 3сек. ?
Не лучше ли выставить диапазон для положения которое нужно удерживать ?
Скажем , не 450 , а от 430 до 470.
могу пообщаться через почтовый ящик
Как угодно heruvim219@mail.ru .
Но на форуме удобней.
я тоже хочу кусок кода.
Позже аккуратно вырежу.
Там нет ничего суперсложного.
LEVV2006
Вы уже кусок написали, чуть исправил и заработало плечо.
nestandart
сложного ничего, согласен, я не програмист просто просил товарища, у него то времени нет то еще что-то..... Вот пытаюсь совместно с вами.
italius , опишите конкретно тот мехнизм которым собираетесь управлять (может чего дельного посоветуем).
Понятно что это (в простом варианте) два сервомеханизма которые должны удерживать заданую точку.
Вопрос , что смещает эту точку ? Вы сами или внешнее воздействие ?
мне тоже очень интересно...
прошу конечно прощения, в програмировании я конечно далек пока, хотя и моск и руки на месте...
>>У вас есть соображения по поводу кода?
Можно сделать и так: если А_1 меньше 450 то пауза 3 секунды. Потом опять смотрим что стало с А_1 и если ничего не изменилось (по-прежнему меньше 450)<<
Так и нужно было делать изначально.
italius , а вы случайно не пневмоподвеску делаете ?
А то у меня сейчас похожий проект заказали.
Четыре пневмоподушки , на каждой два клапана (впуск/выпуск) и датчик положения , с выводом на LCD
дисплей и кнопочным управлением (три предустановленных положения) и т.д..
Программа готова , но полностью я ее выкладывать не буду (не разберетесь).
Если нужно выложу кусок программы который удерживает пневмоподушку в заданном положении.
и еще вопрос.
Для каких целей задержка 3сек. ?
Не лучше ли выставить диапазон для положения которое нужно удерживать ?
Скажем , не 450 , а от 430 до 470.
ага, пневмоподвеску.
только не по два клапана на подушку а по одному и один общий для стравливания.
итого 5 клапанов на 4 контура, плюс клапан ресивера.
>>только не по два клапана на подушку а по одному и один общий для стравливания.
итого 5 клапанов на 4 контура, плюс клапан ресивера. <<
Что то вы , батенька ,чушь несете.
Может вообще два клапана на все четыре стойки ?
То что я делаю сейчас управляет каждой пневмоподушкой НЕЗАВИСИМО.
>>только не по два клапана на подушку а по одному и один общий для стравливания.
итого 5 клапанов на 4 контура, плюс клапан ресивера. <<
Что то вы , батенька ,чушь несете.
Может вообще два клапана на все четыре стойки ?
То что я делаю сейчас управляет каждой пневмоподушкой НЕЗАВИСИМО.
это вы делаете на 8 клапанов, а italius на 5 клапанов. это особенность его блока клапанов. в нем 5 клапанов, 4 для контуров и один для ресивера. клапан сброса на компрессоре.
а вот два клапана на 4 стойки это уже чушь....
задержка в 3 или более секунд нужна для правильного понимания процеса изменения уровня. здесь или выполняется посадка-высадка в авто или авто движется по плохой дороге где происходит измения в показаниях датчиков.
>>это вы делаете на 8 клапанов, а italius на 5 клапанов<<
Вы это точно знаете ?
>>это особенность его блока клапанов. в нем 5 клапанов, 4 для контуров и один для ресивера. клапан сброса на компрессоре<<
При такой особенности , если собьется один датчик , система будет вечно "блуждать" пытаясь выставить
положение всех датчиков вместе. При этом всегда будет либо три датчика выставлены , один -нет либо один выставлен , три - нет.
>>задержка в 3 или более секунд нужна для правильного понимания процеса изменения уровня. здесь или выполняется посадка-высадка в авто или авто движется по плохой дороге где происходит измения в показаниях датчиков.<<
В моей системе все это предусмотрено , но по другому.
При включении всей системы МК отслеживает датчики и выставляет каждую пневмоподушку.
Как только первая пневмоподушка "встала" в заданое положение (режим предустановки) МК прекращает отслеживать датчик этой подушки и отключает ее клапана.
Так все четыре подушки выставляются отдельно (независимо друг от друга) .
Как только все подушки заняли заданое положение система блокируется.
Разблокировка системы происходит при нажатии на кнопку "смена режима" (+или-) и сисстема перестраивает
подушки в другой режим (более низкий или высокий).
Поледний режим сохраняется в энергонезависимую память МК.
Так же есть возможность блокировки кнопок и принудительная (ручная) блокировка системы.
Все это дело выводится на LCD дисплей.
Режимы , показания датчиков и т.д.
да, у вас по самому простому принципу, но здесь неучитывается температурные изменения и дифузия которые присущи пневмомодвеске. оба эти фактора оказывают большое влияние на конечный результат.
поэтому блокировка после выставления уровня и смене режима малоэфективна по сравнению с вводом временной задержки на исполнение в результате изменения уровня.
пример- сейчас зима, и холод. вы запускаете авто в теплом гараже. воздух подается в подухи с учетом температуры помещения. уровень выставлен и вы выезжаете с гаража... спустя несколько минут ваше авто лежит на отбойниках ввиду того что воздух в подухе остыл и уменьшился в обьеме, но ввиду вашей блокировки уровень может и отслеживается но невносится коректировка.
второй пример. опять-же зима. вы запускаете авто на улице. корекция проведена и уровень выставлен. вы поехали. в движении воздух ввиду наличия изменений вызваных дорожным покрытием немного меняется в обьеме. авто приподымается и в результате и вы получаете вовсе не предустановленный уровень. тоже нужна коректировка.
введение задержки исключает эти весьма неприятные моменты. поскольку и я и italius знаем об этих неприятных моментах то и отдаем предпочтение введению задержки. поскольку сам водитель, скажу честно, отвлекаться на то чтобы посмотреть на дисплей неочень удобно особенно в интенсивном потоке. задержка исключает это.
вывод на дисплей это конечно хорошо, но не принципиально. да и что толку в отображении уровня для каждого контура.
если имеется три предустановленых уровня, то достаточно просто светодиода отображающего выбранный уровень, равно как и переключение в ручной режим.
имхо, это суто мое мнение.
в дисплее разве что на уровне настройки имеется смысл, в эксплуатации уже смысла мало.
>>второй пример. опять-же зима. вы запускаете авто на улице. корекция проведена и уровень выставлен. вы поехали. в движении воздух ввиду наличия изменений вызваных дорожным покрытием немного меняется в обьеме. авто приподымается и в результате и вы получаете вовсе не предустановленный уровень. тоже нужна коректировка. <<
Вот это не понял.
Нельзя вот так вот просто "рулить" подвеской во время движения (это опасно).
Пример.
В датчик попал камень и просто оторвал его.
Показания упали в ноль.
Система подождала три секунды и рванула левую переднюю стойку вверх.
А если на скорости , в плотном потоке , в повороте ?
Мне не сложно добавить функцию отслеживания больших отклонений датчиков когда режим установлен и
система заблокирована. А так же оповещать об этом.
Полная блокировка системы во время движения было одним из условий заказчика.
И я с ним согласен.
nestandart
Немного выпал из общения, постоял в московских пробках.
Вопрос - у вас есть пневмоподвеска?
nestandart
Немного выпал из общения, постоял в московских пробках.
Вопрос - у вас есть пневмоподвеска?
>>в дисплее разве что на уровне настройки имеется смысл, в эксплуатации уже смысла мало.<<
Не согласен.
Если присутствует неисправность светодиоды хрен что покажут.
А так есть возможность просматривать состояние каждого датчика в реальном времени.
Хотя бы даже для того чтобы знать что датчик не оторван и работает нормально.
Так же показания датчиков можно конвертировать в сантиметры клиренса (для удобства).
Настройка без вывода аналогового сигнала это танцы с бубном в темноте.
Для отладки системы я написал отдельную программу.
>>Вопрос - у вас есть пневмоподвеска?<<
Нет .
Я пишу программу и собираю электронно - силовой модуль для заказчика.
Установка пневмоподушек , клапанов , компрессора , рессивера и т.д. на стороне заказчика.
>>второй пример. опять-же зима. вы запускаете авто на улице. корекция проведена и уровень выставлен. вы поехали. в движении воздух ввиду наличия изменений вызваных дорожным покрытием немного меняется в обьеме. авто приподымается и в результате и вы получаете вовсе не предустановленный уровень. тоже нужна коректировка. <<
Вот это не понял.
Нельзя вот так вот просто "рулить" подвеской во время движения (это опасно).
Пример.
В датчик попал камень и просто оторвал его.
Показания упали в ноль.
Система подождала три секунды и рванула левую переднюю стойку вверх.
А если на скорости , в плотном потоке , в повороте ?
Мне не сложно добавить функцию отслеживания больших отклонений датчиков когда режим установлен и
система заблокирована. А так же оповещать об этом.
Полная блокировка системы во время движения было одним из условий заказчика.
И я с ним согласен.
Ну попал камень, ну оборвало датчик, ну вы как програмист, что не можете предусмотреть этого как:
при обрыве связи с датчиком в течении каког-то времени - команда - действий не выполнять, включить светодиод сигнализации обрыва!
А так-то надорогах и гвоздей полно, но производитель шины все равно выпускает.
>>Ну попал камень, ну оборвало датчик, ну вы как програмист, что не можете предусмотреть этого<<
Так вот у меня оно и предусмотрено , во время движения датчики не опрашиваются.
>>при обрыве связи с датчиком в течении каког-то времени - команда - действий не выполнять, включить светодиод сигнализации обрыва!<<
Сигнализацию обрыва сделать не сложно. А вот если датчик собьется , то определить это автоматически
(с точностью 95%) будет не просто.
Изначально я говорил о том что не правильно управлять всеми подушками вместе.
Если собьется один датчик система не сможет "выставиться".
Ну, вот.
Пневмоподвески у вас нет! Другими словами вы толком-то не знаете как она работает.
У меня она есть, и есть она у chaytan так как с ним знаком по другому форуму. Знаю тенденцию его и знаю что хочу я.
Предлагаю объеденить усилия и построить грамотную автоматику с различными функциями и возможностью их отключения-включения для пожелания владельца.
Так к слову - конечно по два клапана на подушку немного грубо сказано про бред или чушь, но то что расточительно, так это не опровержимый факт.
И более того, когда говорят про два клапана на подушку, то понятно сразу, что дилетанты (прошу не обижаться).
Я например слова как Беркут, Виаир и т.п. принимаю как ругательство.
Могу вас заверить, что сделаю четырехконтурную систему и всего на 4-х клапанах, и она прекрасно будет работать, а при автоматике, так никто и не определит что она всего на 4-х клапанах.
Ну, так как насчет сотрудничества
>>второй пример. опять-же зима. вы запускаете авто на улице. корекция проведена и уровень выставлен. вы поехали. в движении воздух ввиду наличия изменений вызваных дорожным покрытием немного меняется в обьеме. авто приподымается и в результате и вы получаете вовсе не предустановленный уровень. тоже нужна коректировка. <<
Вот это не понял.
Нельзя вот так вот просто "рулить" подвеской во время движения (это опасно).
Пример.
В датчик попал камень и просто оторвал его.
Показания упали в ноль.
Система подождала три секунды и рванула левую переднюю стойку вверх.
А если на скорости , в плотном потоке , в повороте ?
Мне не сложно добавить функцию отслеживания больших отклонений датчиков когда режим установлен и
система заблокирована. А так же оповещать об этом.
Полная блокировка системы во время движения было одним из условий заказчика.
И я с ним согласен.
чушь полнейшая...
все штатные системы управления пневмоподвеской работают постоянно.... даже при выключеном зажигании. только введены ограничения и система при этом переходит в спящий режим с пробуждением через некоторые временные интервалы. а в режиме движения или стоянки с запущеным двигателем работает постоянно, производителями введены задержки от 5 секунд до 15 минут именно для правильной коректировки положения.
рулить можна... и это делается штатными системами.
ну, при правильном расположении датчика не так просто в него попасть камнем... покрайней мере мне таких примеров на штатных системах не попадалось. производители всегда располагают датчики с максимально возможной защитой от внешних факторов. собственно тоже и рекомендую и при дооснащении авты пневмой.
>>Ну попал камень, ну оборвало датчик, ну вы как програмист, что не можете предусмотреть этого<<
Так вот у меня оно и предусмотрено , во время движения датчики не опрашиваются.
>>при обрыве связи с датчиком в течении каког-то времени - команда - действий не выполнять, включить светодиод сигнализации обрыва!<<
Сигнализацию обрыва сделать не сложно. А вот если датчик собьется , то определить это автоматически
(с точностью 95%) будет не просто.
Изначально я говорил о том что не правильно управлять всеми подушками вместе.
можна вместе или попарно, попарно даже правильнее. здесь задается приоритетность на выполнение изменений.
так например на туареге при автоматическом переходе с одного уровня на другой, например при переходе на более высокий уровень, первыми подыются два задних контура а потом пара передних. при переходе на более низкий уровень, первым опускается перед а потом зад. такая приоритетность задана для исключения ослепления встречных авто при движении ночью, но приоритетность работает все время независимо от времени суток.
Если собьется один датчик система не сможет "выставиться".
nestandart
Я вам только что сослал мануал подвески БМВ, если нада вышлю Ауди или Фаэтон, там все случайности хорошо описаны и набросок алгоритма есть.
да, давайте лучше обьеденим знания и опыт. мы каждый хорошо знаем свое дело и можем просто грамотно все обьеденить.
>>чушь полнейшая...<<
Хорошо.
Удачи.
Ну и что, собьется датчик -команда- при резком изменении показаний в сторону увеличения или уменьшеньшения действий не выполнять, включить индикацию неисправности.
Есть такая функция - бордюрный камень- так там при резком изменениии клиренса на 4см, подъем-опускание только до определенного уровня (БМВ) предустановленного производителем
nestandart
Вы напрасно злитесь, вопрос совсем в другом chaytan вам пересказывает свой опыт, он не со зла.
Поверьте что опыт у него есть.
Я не использую Американские системы доступные на ебэй и т.д. а компоненты Европейского производителя промышленных систем.
И то, что пишу - уже проверено. Давайте лучше что-то вместе сотворим.