![]() |
HELP!! Arduino
Подскажите пожалуйста как зациклить программу, чтобы она читалась постоянно по кругу?
|
перерыл все...
void loop() { тело программы } вроде это, но программа доходит до конца и не стартует заново :( |
Другой вопрос, когда на входе появляется HIGH, на выходе тоже HIGH и программа не идет дальше... как только вход переходит в LOW программа начинает выполнятся дальше... что не правильно делаю?
int Vhod=2; //вход int Vihod=13 //выход void setup() { pinMode(VhodPin, INPUT); pinMode(VihodPin,OUTPUT); } if (digitalRead(VhodPin) == HIGH) { digitalWrite(VihodPin, HIGH); delay(100); digitalWrite(VihodPin, LOW); delay(100); digitalWrite(VihodPin, HIGH); delay(100); digitalWrite(VihodPin, LOW); delay(100); } |
Цитата:
// Неудачное название переменных. Отличаются одной буквой, да она еще в середине и не особо видна. // Код становится хреново читаемый, появляется большая вероятность ошибки // Обычно вход именуют от слова input, выход от output. Типа inPin и outPin будет much better :) int VhodPin=2; //вход int VihodPin=13 //выход void setup() { pinMode(VhodPin, INPUT); pinMode(VihodPin,OUTPUT); } void loop() //эта функция нужна, она собственно и вызывается в цикле { up_dn(); } // Этот код надо оформлять в функцию и вызывать из loop() // правда я не уверен, что ее нужно вызывать в цикле :) // к примеру: void up_dn() { if (digitalRead(VhodPin) == HIGH) // насколько я понимаю интересует переход из LOW в HIGH, для этого есть функция PulseIn() { digitalWrite(VihodPin, HIGH); delay(100); digitalWrite(VihodPin, LOW); delay(100); digitalWrite(VihodPin, HIGH); delay(100); digitalWrite(VihodPin, LOW); delay(100); } } Вообщем для начала читать: http://www.freeduino.ru/arduino/lang.html и http://arduino.cc/en/Reference/HomePage |
это скинул пример... void loop() забыл поставить...
вот собственно программа сама... за ссылки спасибо, но уже все давно распечатано и по 1000000 раз штудировано :) отладку веду в Proteus... когда нажимаю 2 кнопки StartPin и TormPin программа отрабатывает на ура весь цикл до (выделенного красным) потом если нажать кнопку StartPin, то программа все правильно тушит, если нажать сначала TormPin а потом StartPin, то ничего больше не происходит! если корректно все выполнить то она через раз возвращается в начало программы... int StartPin=0; //вход для кнопки start stop engine int TormPin=1; //вход для лягушки педали тормоза int CamPin=2; //вход для камеры заднего вида int ACCPin=8; //выход на реле зажигания АСС int StPin=9; //выход на реле стартера int MBPin=10; //выход на Блок питания ноутбука int RemPin=11; //выход на включение усилителя (remote) int CmPin=12; //выход кнопки переключения камеры заднего вида int RSPin=13; //Выход кнопки для старта ноутбука void setup() { /*Объявляем входы и выходы*/ pinMode(StartPin, INPUT); pinMode(TormPin, INPUT); pinMode(CamPin, INPUT); pinMode(ACCPin, OUTPUT); pinMode(StPin, OUTPUT); pinMode(MBPin, OUTPUT); pinMode(RemPin, OUTPUT); pinMode(CmPin, OUTPUT); pinMode(RSPin, OUTPUT); } void loop() { if (digitalRead(StartPin) == HIGH && digitalRead(TormPin) == HIGH) //сравнение 2 входов { digitalWrite(ACCPin, HIGH); //включаем зажигание delay(150); digitalWrite(StPin, HIGH); //включаем стартер delay(200); digitalWrite(StPin, LOW); //выключаем стартер через 10 сек delay(50); digitalWrite(MBPin, HIGH); //Подаем напряжение на блок питания ноутбука delay(40); digitalWrite(RSPin, HIGH); //нажатие кнопки ноутбука delay(20); digitalWrite(RSPin, LOW); //отпускаем кнопку delay(1200); digitalWrite(RemPin, HIGH); //remote усилителя } if (digitalRead(StartPin) == HIGH) //сравниваем значение кнопки { digitalWrite(ACCPin, LOW); //выключаем АСС delay(100); digitalWrite(RemPin, LOW); //Усилители digitalWrite(RSPin, HIGH); //кнопка ноутбука delay(100); digitalWrite(RSPin, LOW); //отпускаем delay(1200); digitalWrite(MBPin, LOW); //глушим блок питания бука } } |
if (digitalRead(VhodPin) == HIGH) // насколько я понимаю интересует переход из LOW в HIGH, для этого есть функция PulseIn()
если честно интересует немного другое... а именно авто переключение на камеру заднего вида... но как заставить выполняться программу когда она стопорится пока на входе HIGH, как писал выше... |
Цитата:
Пример можно посмотреть тут. И вообще, на компкаре по ардуино много интерестного, целый раздел с подразделами. |
Попробуй вот так:
PHP код:
|
Цитата:
|
Цитата:
Она может зациклится или тупо стоять и ждать определенного события (считай тот же цикл). |
пробовал так))) схема перестает вообще работать! :( если void loop() зацикливает программу, то почему она после когда все потушили не запускается по новой?
|
Код ТС работать не будет. Условия некорректны ;)
|
Цитата:
void loop() { if (digitalRead(VhodPin) == HIGH) digitalWrite(VihodPin, HIGH); // вот первое, на котором останавливается delay(100); //вот дальше digitalWrite(VihodPin, LOW); delay(100); digitalWrite(VihodPin, HIGH); delay(100); digitalWrite(VihodPin, LOW); delay(100); } } |
Цитата:
|
уже вешаться хочется от arduino этого.... вроде все просто, а вроде.....
|
У тебя оба условия будут выполняться. Пофиг, нажат тормоз или нет. Условия не исключающие. Поэтому, я тебе показал, что тормоз надо опрашивать в обоих случаях.
Так еще попробуй. PHP код:
|
Вложений: 1
вот отладочная схема...
|
Таблицу соответствия пинов ардуины и атмеги имеешь перед глазами? Ничего не перепутано?
|
Цитата:
|
Вложений: 1
Цитата:
|
может тогда надо else if????
Оператор If..else Конструкция if..else предоставляет больший контроль над процессом выполнения кода, чем базовый оператор if, позволяя осуществлять несколько проверок, объединенных вместе. Например, аналоговый вход может быть проверен и выполнено одно действие, если на входе меньше 500, или другой действие, если на входе 500 или больше. Код при этом может выглядеть так: if (pinFiveInput < 500) { // действие A } else { // действие B } Другой способ создания переходов со взаимоисключающими проверками использует оператор switch case. Else позволяет делать отличную от указанной в if проверку, чтобы можно было осуществлять сразу несколько взаимоисключающих проверок. Каждая проверка позволяет переходить к следующему за ней оператору не раньше, чем получит логический результат ИСТИНА. Когда проверка с результатом ИСТИНА найдена, запускается вложенная в нее блок операторов, и затем программа игнорирует все следующие строки в конструкции if..else. Если ни одна из проверок не получила результат ИСТИНА, по умолчанию выполняется блок операторов в else, если последний присутствует, и устанавливается действие по умолчанию. Отметим, что конструкция else if может быть использована с или без заключительного else и наоборот. Допускается неограниченное число таких переходов else if. if (pinFiveInput < 500) { // выполнять действие A } else if (pinFiveInput >= 1000) { // выполнять действие B } else { // выполнять действие C } |
Мы твое видение задачи не представляем, поэтому и советуем, считай, на ощупь. Но смысл ты улавливаешь - эт хорошо. Не спеши, разбирайся, понимание не сразу приходит ;)
|
смысл простой...
1. Сделать запуск двигателя по кнопке. 2. Управление питанием усилителей, мониторов, компа. Включение и выключение компа по кнопке. 3. Переключение на камеру заднего вида и назад. значит... 1 и 2. нажимаем кнопку. Включается АСС. включаем стартер на 10 секунд. через 1 сек подаем питание на блок питания ноутбука и монитора. нажатие кнопки ноутбука. через 30 сек включение усилителей. нажимаем кнопку еще раз... выключение АСС, усилителей. нажатие на кнопку выключения компа. через 1 минуту выключение блока питания ноутбука... 3. при включении задней передачи, нажатие на кнопку один раз, при выключении нажатие на кнопку 2 раза.. вот весь алгоритм... |
я не прошу написать за меня, мне самому не интересен проект будет... Просто ткнуть как говорится носом :) Пересмотрел по 10 раз весь справочник arduino, перечитал, не могу понять что не так... может протеус глючит... пишу даже простой бегущий огонь на 8 светодиодов с кнопкой... нажимаю кнопку пробегает все и стопорится... нажимаю опять тоже самое... читаю инфу.. loop зацикливает программу... т.е. должны по нажатию кнопки бегать постоянно пока ресет не нажмешь или питание не сдернешь...
|
все, для камеры переключение, написал... спасибо Hamster за толчок носом в нужную сторону)))) остальное остается актуальным..
|
Уважаемые Гуру. Работаю в эмуляторе proteus. на atmege328P попробовал поставить atmega8 подключил все так же... загружаю скетч, и не тут то было... не работает.. ставлю назад 328Р все ок... в чем может быть трабл?... от ардуины решил отказаться и усложнить себе задачу))) купить атмегу и самому печатку сделать... 8 атмега просто дешевле)))
|
Вложений: 1
вот схема подключения
|
На вскидку могу сказать отличаются адреса и количество регистров у процов и тд. Поставь мегу 48,88,168 по идее это её братья, только с меньшей памятью программ.
|
не идет все равно... на 6 выходе постоянно HIGH...
|
Тоже задумал сделать систему Start/Stop по кнопке с помощью ардуино уно, но, ёптель, я никак не помышлял о том, чтобы тупо стартером 200мс крутить :) Я думал, что нужно для запуска двигателя по кнопке следующее:
1. Контрольный вход кнопки Start/Stop 2. Контрольный вход "Состояние сигнализации" (т.е. проверить на охране или нет) 3. Контрольный вход "ключ зажигания" (т.е. наличие разрешающего сигнала с некоего контрольного устройства, активируемого дистанционно или посредством вставки ключа или совмещённое с ним). 4. Контрольный вход "тахометр". 5. Контрольный вход "спидометр". 6. Управляющий выход "Зажигание". 7. Управляющий выход "Стартер". Логику работы этого дела представлял себе так: 1. Ардуино без ключа работать не должно. Включаться и запускать циклическую программу должно только при вставке ключа (грубо говоря это дублирует контрольный вход 3. Можно от него отказаться заменив просто подачей питания на ардуино). 2. Далее при вставке ключа циклическая программа запускается и начинает опрашивать контрольные входы. Главным условием для разрешения является состояние "снято в охраны" на входе "состояние сигнализации". 3. Затем каким-то образом требуется проконтролировать состояние скорости. Если на входе "спидометра" нет импульсов (машина стоит на месте), то кнопка старт/стоп сработает... Если авто в движении - кнопка старт/стоп блокирована и не реагирует на нажатия. 4. Также необходимо как-то проконтролировать обороты двигателя. Притом там несколько функций: с одной стороны отсутствие оборотов должно при нажатии кнопки старт/стоп режим запуска двигателя. Если обороты уже есть до нажатия на кнопку, то должна быть выполнена остановка двигателя и через секунду отключение зажигания. Но помимо этого в цикле запуска двигателя этот вход должен помимо всего прочего проконтролировать нарастание оборотов двигателя. Т.е., скажем, ардуина крутит стартером 2,5-3 секунды ИЛИ пока на входе "тахометр" не появятся обороты выше, скажем, 400-500 об/мин. Вот это я вообще пока не знаю как можно реализовать... какими циклами, чтобы и интервал измерений небольшой был, и при этом нормальная разрешающая способность (т.е. чтоб уж обороты не сотнями считать, а хотя бы десятки различать). Притом, скажем, постоянно контролировать обороты двигателя и реализовать такую функцию, чтобы, скажем, если на ходу сигнал на входе "тахометр" пропал (двигатель заглох) не зависимо от скорости (может заглох при трогании), то ардуина автоматически должна вырубить зажигание, чтобы дать возможность повторно запустить движок. Короче, может быть кто-нибудь уже сделал нормальный старт/стоп на ардуине? Или может вообще без неё!? |
Часовой пояс GMT +4, время: 14:30. |
Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot