Работа с датчиками и реле, вопросы
- Войдите на сайт для отправки комментариев
Здравствуйте.
Необходимо изучить программирование устройства ардуино.
Современного опыта програмирования нет (совсем), но лет 30 назад писал на Бейсике игрушку для Агата.
Основой был оператор Если - - > То, то есть если нажата клавиша такая-то, ТО происходит переход на блок такой-то.
Можнот и здесь так же, список операторов я скачал, там есть IF... ELSE и даже GOTO, но 30 лет назад в Бейсике были номера строк, и я писал так - ЕСЛИ нажата клавиша стрелка вверх ТО GОТО на номер строки допустим 1200, а там описание что нарисовать.
ЕСЛИ ничего не нажато, ТО GОТО на блок 1400, где включена рандомная функция выстрела пушки например.
А тут... нет номеров строк
Не понимаю, как организовать структуры ЕСЛИ ТО, когда их много.
А именно, к 4 входам нужно подключить несколько датчиков, по их срабатыванию на 6 выходах должны появляться сигналы (для примера тупо включаться реле, а дальше будет происходить нечто, включаемое этим реле)
(Можно подумать, а нафига тогда контроллер - можно датчики прямо на реле..... - нет, во-первых, если сработал один датчик - надо включить ТАЙМЕР таймаута. Во время таймаута другие датчики игнорируются. ТОЛЬКО ПОСЛЕ срабатывания первого датчика устройство должно начать опрашивать 4-й датчик в течение 50 секунд, иначе он просто игнорируется. И так далее)
Т.е. логическая схема тестового скажем так задания такова:
- ожидание срабатывания датчика 1, 2, 3
- при срабатывании любого из них а) включается таймер на 50 сек и игнорируются другие датчики, кроме 4; б) включается реле 1 (если сработал датчик 1); в) включается ожидание состояния датчика 4. По его нажатии включается реле 2 на 10 секунд, если он не нажат - по окончании таймера 50 сек устройство возвращается в исходное. Реле 1 отключается по истечении 50 сек.
(для 2 и 3 датчика - соответственно 3, 4, 5, 6 реле)
Подскажите, как организовать переходы разных блоков по "Если-То"
В корне неверное решение, но хозяин барин.
Про goto стать здесь
http://arduino.ru/Reference/Goto
Найти книшку Кернигана и Ритчи, сделать её настольной.
Почитайте про конечные автоматы (поиском по форуму)
Спасибо. Пока что надо сделать и так сказать сдать тест.
Но потом думать - а почему неверно и как лучше.
А почему неверно?
Почитайте про конечные автоматы (поиском по форуму)
Я тут нашел тему про 3 кнопки и 3 светодиода. ("работа с кнопками")
Может именно этот скретч взять за основу, просто преобразовать его так, чтобы добавились таймеры и вместо светодиодов - через резисторы ключи, включающие реле?
Я тут нашел тему про 3 кнопки и 3 светодиода. ("работа с кнопками")
Ну вот, к примеру: http://arduino.ru/forum/programmirovanie/pomogite-so-sketchem-dlya-arduino-nano-pozhaluista#comment-345062
В каждом step-е делаете одну операцию, потом переходите к другому. Шаг за шагом продвигаетесь по алгоритму.
Ученик, нужно вместь конструкций <ЕСЛИ ТО идти_туда-то> использовать <ЕСЛИ ТО сделать_то-то>.
Я пытаюсь сопоставить названиям функций - их смысл.
Если / то смысл понятен, гоу ту - смысл понятен, а вот Loop смысл пока не понятен.
На первый взгляд - это цикл. Но... почему я выше написал - пользовался когда-то переходами гоу ту.
Причина: я написал один цикл, второй цикл, третий... десятый цикл. Они должны выполняться не подряд, а по некому условию.
Тогда если в течение выполнения 1 цикла вдруг это условие выполнено (нажата кнопка в данном сегодняшщнем случае), начинает выполняться второй цикл, а если нажата кнопка, которая должна "прослушиваться" только во втором цикле - идет переход на выполнение третьего цикла.
За книгу спасибо, но так как-то... не просто материал подан.
Мне интереснее описание смысла на русском языке - например "int" - это а) написание некой переменной и б) тут же присвоение этой переменной целого значения.
И так по другим операторам.
Тогда я сначала нарисую стрелками и квадратиками логическую схему, в которой каждый квадратик - это опеределенный цикл, а переход из квадратика в квадратик по стрелке определяется условием и оператором GOTO.
Как делать иначе, я тупо не понимаю...
Картинка-пример:
http://post-art.org/foto/2018/bloksh.jpg
Ну так в С другая парадигма программирования, блочная, а не бессмысленные метания по коду с помощью GOTO. Привык к goto, осваивай тогда ассемблер, он почти полностью состоит из проверок условий и условных переходов по коду.
Порылся еще по форуму...
Если взять за основу работу одна кнопка- одно реле готовый текст с форума вот этот
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku?page=13#comment-340418
то как туда вставить ожидание В ТЕЧЕНИЕ ЭТИХ 50 сек нажатия второй кнопки и срабатывания второго реле?
Причем второе реле должно срабатывать ТОЛЬКО, если включено первое.
Можно сделать вот так?
Что-то мне интуиция подсказывает, что нельзя... а почему?
01
15 if (digitalRead(BUTTON3_PIN)==HIGH){ //если кнопка нажата
16 blStatus3 = !blStatus3; // инвертируем значение
17 digitalWrite(RELAY3_PIN, blStatus2); // пишем инвертированное значение в порт
13 delay (1000); // время работы реле - 1 секунда
14 }
15 }
Вопрос в том, что значение кнопки 2 должно анализироваться только после срабатывания таймера в 50 сек, а в таком написании кажется работа второй кнопки будет анализироваться всегда...
Ученик, я думаю, Вам следует начать с начала.
1. Ознакомиться с теорией: Керниган, Ритчи, Язык программирования Си.
2. Начать осваивать это на практике: Для начала посмотреть и запустить "blink". Затем посмотреть и запустить "blink without delay". Сравнить, как одна и та же задача решается разными способами, правильный - второй.
Согласен с andriano, если считаете К&Р слишком академичным, попробуйте это или скачайте какой-нибудь ардуино для чайников, позабивайте ручками примеры (привыкнете к синтаксису), разберитесь как они работают, а там и прояснение потихоньку наступит.
Здесь блинк без делеев поинтереснее описан(другие статьи тоже почитайте), но без выполнения первого пункта бесполезен. ИМХО.
Да, я смотрел всроенный пример блинк и уже переделал его - чтобы мигало медленнол, потом быстрее, быстрее, очень быстро, потом медленее, медленнее и очень медленно, вот так
Да, я смотрел всроенный пример блинк и уже переделал его - чтобы мигало медленнол, потом быстрее, быстрее, очень быстро, потом медленее, медленнее и очень медленно, вот так
Вы сперва почитайте, что вам дали, а потом начинайте свои размышлизмы.
Загнал программу из
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
а она работает не так, как описано.
Описано - по нажатию кнопки пин 2 включается на 5 сек реле пин 3.
Ну для удобства наблюдения я вместо реле поставил светодиод и вижу - вне зависимости от нажатий на пин 2 с пина 3 - выход реле идет какой-то мультивибратор - т.е. если сидеть и вообще ничего не делать - 5 сек светодиод горит, 5 сек не горит, 5 сек горит. 5 сек не горит. На подачу сигнала на пин 2 не реагирует.
Или там текст насчет кнопки относился к другому коду?
Здесь блинк без делеев поинтереснее описан(другие статьи тоже почитайте), но без выполнения первого пункта бесполезен. ИМХО.
Нет не поинтереснее.
Непонятнее.
Для новичка лезть еще и БИБЛИОТЕКИ изучать - вообще голову сломать.
Я ведь не за красотой года гонюсь, а тут именно за красотой кода гонятся.
Мне нужно, чтобы было наглядно понятно - вот в этой строке я зажигаю светодиод, в этой строке - у меня условие, что должна быть нажата кнопка, в этой строке - список действий: включаю реле.
Иначе в ближайшее время я разумеется делать не буду.
А вот через 2 года, когда стану гуру, тогда меня начнет интересовать красота кода.
я так понимаю, чукча не читатель? Тогда вряд ли ему что-то можно абъяснить. Аревуар.
Мне нужно, чтобы было наглядно понятно - вот в этой строке я зажигаю светодиод, в этой строке - у меня условие, что должна быть нажата кнопка, в этой строке - список действий: включаю реле.
Про GOTO откуда узнали - из бейсика? Select Case помните оттуда-же?
Здесь блинк без делеев поинтереснее описан(другие статьи тоже почитайте), но без выполнения первого пункта бесполезен. ИМХО.
Нет не поинтереснее.
Непонятнее.
Для новичка лезть еще и БИБЛИОТЕКИ изучать - вообще голову сломать.
Я ведь не за красотой года гонюсь, а тут именно за красотой кода гонятся.
Мне нужно, чтобы было наглядно понятно - вот в этой строке я зажигаю светодиод, в этой строке - у меня условие, что должна быть нажата кнопка, в этой строке - список действий: включаю реле.
Иначе в ближайшее время я разумеется делать не буду.
А вот через 2 года, когда стану гуру, тогда меня начнет интересовать красота кода.
но без выполнения первого пункта бесполезен. ИМХО.
Да, и там же ссылка на предыдущую статью без библиотек. Но вам похоже виднее.((((
А вот через 2 года, когда стану гуру, тогда меня начнет интересовать красота кода.
Оптимист.
Загнал программу из
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
а она работает не так, как описано.
Описано - по нажатию кнопки пин 2 включается на 5 сек реле пин 3.
Ну для удобства наблюдения я вместо реле поставил светодиод и вижу - вне зависимости от нажатий на пин 2 с пина 3 - выход реле идет какой-то мультивибратор - т.е. если сидеть и вообще ничего не делать - 5 сек светодиод горит, 5 сек не горит, 5 сек горит. 5 сек не горит. На подачу сигнала на пин 2 не реагирует.
Или там текст насчет кнопки относился к другому коду?
Ну а кнопка то как подключена? Т.к. фрагмент аж из 664 сообщения, подозреваю, что нихрена вы там не читали.
Мне нужно, чтобы было наглядно понятно - вот в этой строке я зажигаю светодиод, в этой строке - у меня условие, что должна быть нажата кнопка, в этой строке - список действий: включаю реле.
Иначе в ближайшее время я разумеется делать не буду.
Чтобы было наглядно понятно - надо взять ЛЮБУЮ серьезную книгу по Си и прочитать ее хотя бы до середины. Иначе в ближайшее время вы вообще ничего не сделаете, и через два года будете там же, где сегодня.
Кнопка подключена так: пин через 7,5 кОм на корпус, кнопка подключает пин через 300 Ом к +5.
Пины подписаны на плате, так что ошибиться тут трудно.
Выход: к пину светодиод плюсом, второй контакт светодиода через 510 ом к GND.
да пофиг, он же умеет GOTO да GOSUB-ами крутить да размахивать. Авось да выйдет чо.
Чтобы было наглядно понятно - надо взять ЛЮБУЮ серьезную книгу по Си и прочитать ее хотя бы до середины.
Согласен, что это правильный подход.
Но у меня задача другая, к среде (через полнедели) надо сдать готовую программу, которая описана в 1 посте.
Написал ли ее я сам или стырил с сайта/форума/знакомый написал, никого не интересует.
Т.е. в идеале я беру какую-то похожую и дополняю ее парой операторов - вставляю таймаут например.
А так да, надо засесть за учебники и лет через пять я что-нибуль напишу сам...
(В скобках. Не раньше потому, что опыт с Бейсиком 30 лет назад первый и последний - у меня образное мышление, я думаю картинками, а программирование честно говоря требует другого типа мышления, какого-то математического. Так что один раз попробовал и бросил.)
Но у меня задача другая, к среде (через полнедели) надо сдать готовую программу, которая описана в 1 посте.
в таком случае в платный раздел
Ну так зайдите в ищу исполнителя и закажите скифу за доширак, зачем мозги людям парить? Или вы еще и жадный?
Для начала надо разобраться в физике.
Может я неправильно все-таки подключил кнопку.
Но меня с другой стороны удивляет работа программы в качестве мультивибратора - 5 сек вкл, 5 сек выкл и так по кругу.
Надо внимательно посмотреть на программу, может я где-то знак пропустил при копировании - явно программа работает неправильно.
Но у меня задача другая, к среде (через полнедели) надо сдать готовую программу, которая описана в 1 посте.
Написал ли ее я сам или стырил с сайта/форума/знакомый написал, никого не интересует.
я просто ахудеваю-с, господа.
Но у меня задача другая, к среде (через полнедели) надо сдать готовую программу, которая описана в 1 посте.
Написал ли ее я сам или стырил с сайта/форума/знакомый написал, никого не интересует.
простите, судя по увлечению бейсиком 30 лет назад - вам не менее 45-ти. Нафига "человеку с образным мышлением" на старости лет программирование, да еще на каких-то дебильных (судя по второй цитированной фразе) курсах?
Но у меня задача другая, к среде (через полнедели) надо сдать готовую программу, которая описана в 1 посте.
Написал ли ее я сам или стырил с сайта/форума/знакомый написал, никого не интересует.
Вы только иногда представляйте себе как где-то так же "обучается" хирург, который Вас оперировать будет. В деталях представляйте - у Вас же мышление образное!
у меня образное мышление, я думаю картинками, а программирование честно говоря требует другого типа мышления, какого-то математического.
Мышление картинками - самое оно, блок-схему алгоритма представить - милое дело. Я вам открою бооольшущий секрет: для того, чтобы программировать - математику знать вовсе не надо: у меня куча знакомых программистов, которые не могут в полярные координаты простейшие, сиречь, в синусы и косинусы - и ничего, программируют. Задачи просто выполняют такие, где не надо математики. Ессно, программировать чего-нибудь, связанное с 3D, или прочими задачами, где нужен серьёзный мат.скилл - они не полезут, но, тем не менее - они программисты.
Так что на самооправдание - не прокатит процитированная фраза, по опыту скажу - точно не прокатит.
простите, судя по увлечению бейсиком 30 лет назад - вам не менее 45-ти. Нафига "человеку с образным мышлением" на старости лет программирование, да еще на каких-то дебильных (судя по второй цитированной фразе) курсах?
Ща угадаю. В свете пенсионной реформы, программа "вторая молодость", шахтеров, крановщиц и сталеваров переучим на погромистов и финансистов, а че?
Ща угадаю. В свете пенсионной реформы, программа "вторая молодость", шахтеров, крановщиц и сталеваров переучим на погромистов и финансистов, а че?
Кроме шуток - вполне себе грозящая вероятность. И так уже, за последний пяток лет - по факту многие направления уже превратились в ремесло, взять тот же веб - туева хуча фреймворков, бери любой, изучай, и быдлокодь. Не успел изучить как следует - а в мейнстриме уже какой-то новый фреймворк - бросай курить, вставай на лыжи, быдлокодь на новом. По этой причине бросил веб, ибо - тошнит от этого зоопарка.
[i]В свете пенсионной реформы, программа "вторая молодость", шахтеров, крановщиц и сталеваров переучим на погромистов и финансистов, а че?[/i]
Типа того.
Похоже, пока проблемы с физикой.
Я скачал скретч из 1 поста "Работа с кнопками", подал на вход 0 и... светодиод замерцал.
А должен погаснуть.
Ну тупо если 0 на входе, проргамма в три строки вход=выход, встроенный диод должен не гореть. А он мерцает с высокой частотой, выше 25 гц примерно.
Мы уже выяснили, что кроме того, что вы не хотите учиться, вы еще и жадный, а значит с вами неинтересно.
Засим, диалог с вами, заканчиваю.
А, кажется догадался.
Шнур длиной до кнопки два метра, кабелем для 220в (0,7 кубика), он тупо дает наводки из воздуха (такие наводки??? кошмар).
Укоротил шнур до полметра и убрал резистор между входом и корпус или 5v с 1 кОм до 200 Ом - стало стабатывать очень четко.
Ну я не дома, это производство, просто не думал, что такое ОГРОМНЫЕ наводки идут.
Это кстати в таких электромагнитных полях может и работать вредно (кошмарный смайлик)
PS Откуда жадный? Сказали бы ленивый - можно так подумать. Почему жадный
Учиться-то буду, но сделать надо "вчера".
Конечно вредно - мозги отказываются логически мыслить.
Ща угадаю. В свете пенсионной реформы, программа "вторая молодость", шахтеров, крановщиц и сталеваров переучим на погромистов и финансистов, а че?
Кроме шуток - вполне себе грозящая вероятность. И так уже, за последний пяток лет - по факту многие направления уже превратились в ремесло, взять тот же веб - туева хуча фреймворков, бери любой, изучай, и быдлокодь. Не успел изучить как следует - а в мейнстриме уже какой-то новый фреймворк - бросай курить, вставай на лыжи, быдлокодь на новом. По этой причине бросил веб, ибо - тошнит от этого зоопарка.
Не удивлюсь, хотя, бред полнейший. Невозможно в 45+ основную массу переучить на что то иное, требующее более высокого уровня мышления. Хотя те, которые будут это решать, судят по себе: "сижу на мегасложной работе, а ведь на нее можно обычную мартышку выучить."((((
Обычно путают опыт и знания с (!!) профессиональной деформацией. И чем больше человек работает на одном мечте тем больше профессиональная деформация и меньше знаний и опыта.
Но теперь по теме.Ну не может ТС понять новое и свое забытое старое обучение. Даже если бы на Бейсике писали, точно так же тупил. Если не больше.
А все потому что картинками думает. Был бы мозг математикой отполирован - умел бы абстрагироватся от незначащих в данный момент подробностей и был бы ему что бейсик, что плюсы.. Это кстати и какбы программистов без математики тоже касается. Не потому что нада помнить все "интригалы", а потому что в процессе их изучения мозги развиваются в правильную сторону. А уж в 45 - позно, старого пса новым трюкам не научиш. Уже пора бежать из IT не оглядываясь, а не заходить эникейщиком.
Тс чё о тебе там написать то надо ?
За недорого сделаю.
Не как скиф , однозначно, но по пути попытаюсь объяснить и мордой тыкнуть как и что.
Сам на бейсике рулил лет 30 назад.
С Ардуино за год более менее разобрался.
В твои потребности два дня учебника уложатся. Но если тебе лень то , любой каприз за ваши деньги.
Написал вот так
Эта часть - определение момента включения реле 2 - ТОЛЬКО после того, как уже сработало реле 1.
Отправил на Ардуино, это работает.
Но затем надо вставить таймер и выключить оба реле или одно реле, если вторую кнопку никто не нажал.
Написал так
А вот это не работает, более того, вообще перестали срабатывать кнопки (выходы не включают св-диоды)
Где ошибка?
Таймер подсмотрел в книжке Белока листинг Бегущих огней, там указано, что ++ означает увеличение переменной на единицу.
Вот надо мордой тыкнуть, правильно ли я понял, что увеливение численного значения переменной на единицу за итерацию цикла достигается написанием ++. То есть loopStep++;
Или надо loopStep = ... чему?
И второй момент, написание достижения переменной критического значения, после чего наступает конец цикла - скорее всего там тоже ошибка, неправильно именно if(loopStep = 10000), но как правильно, я пока не уяснил.
Во втором куске кода в строке 33 - ошибка, там оператор присваивания вместо оператора сравнения.
- ожидание срабатывания датчика 1, 2, 3
- при срабатывании любого из них а) включается таймер на 50 сек и игнорируются другие датчики, кроме 4; б) включается реле 1 (если сработал датчик 1); в) включается ожидание состояния датчика 4. По его нажатии включается реле 2 на 10 секунд, если он не нажат - по окончании таймера 50 сек устройство возвращается в исходное. Реле 1 отключается по истечении 50 сек.
(для 2 и 3 датчика - соответственно 3, 4, 5, 6 реле)
Подскажите, как организовать переходы разных блоков по "Если-То"
Во втором куске кода в строке 33 - ошибка, там оператор присваивания вместо оператора сравнения.
Спасибо, написал
if(loopStep == 10000) // если цикл окончен, время кончилось
Всё равно неправильно - теперь светодиоды по кнопке загораются и через примерно 0,5 сек тухнут вне зависимости от изменения цифры 10000 (что 100, что 1000, что 10000 - время потухания около полсекунды).
Пробовал увеличить - до 35000 те же полсекунды, после 38000 вообще не выключается... в течение минуты, дальше не проверял
А-а-а, сабака страшная, забыл обнулись значение
А вот всё равно не работает. Т.е. при любых значениях в 33 строке меньше 35000 после включения выход отключается через менее полсекунды...
Таймер написан неправильно, где-то еще ошибка.
Повторно спрошу - select case помните как работает?
Нет конечно, я вчера вообще начал первый день читать, что такое урезанный Си. А неурезанного в глаза не видел никогда.
Программу в предыдущем посте насписал конечно не с нуля - это надерганные копи-паст фрагменты текста из форума и особенно описания кнопок в теме Работа с кнопками.
Текст насчет таймера - из книги Белова, пункт Бегущие огни на Ардуино.
Но почитаю сейчас по ключевому слову select case.
Как же вы на бейсике писали, если select case не знаете... Сложно вам придется в Си. Тут до датчиков еще с полгода учебы...