Помогите написать программу по алгоритму
- Войдите на сайт для отправки комментариев
Вс, 18/01/2015 - 15:11
Ждать 40 цифровых импульсов(с 50 например), затем считывать показания с аналогово входа (с А3 например) от 0,38 до 3,78 вольта и строить отношение (от 0 до 1024(напряжение аналогово) как 0 до 10 (миллисекунды)) и затем открывать выход 13 на это значение (от 0 до 10). И повторять цикл,то есть это всё в void loop. Нужно составить эту программу (для запуска газотурбинного двигателя).
Денежных средств к сожалению на данный момент не имеется т.к. 9 класс (сами понимаете), все свободные деньги на проект уходят... Благодарю за любую помощь и поддержку.
// Arduino Nano #define imp 2 #define signal A0 #define out 13 volatile byte N; int tImp; //================================================================== void setup() { pinMode( imp , INPUT ); pinMode( out , OUTPUT ); attachInterrupt( 0 , isRout , CHANGE ); N = 0; } //================================================================== void isRout() { N++; } //================================================================== void loop() { if ( N > 79 ) { detachInterrupt( 0 ); N = 0; digitalWrite( out , HIGH ); byte n = analogRead( signal ); tImp = map( n , 0 , 1023 , 0 , 10000 ); delayMicroseconds( tImp ); digitalWrite( out , LOW ); attachInterrupt( 0 , isRout , CHANGE ); } } //==================================================================// Arduino Nano #define imp 2 #define signal A0 #define out 13 volatile byte N; int tImp; //================================================================== void setup() { pinMode( imp , INPUT ); pinMode( out , OUTPUT ); attachInterrupt( 0 , isRout , CHANGE ); N = 0; } //================================================================== void isRout() { N++; } //================================================================== void loop() { if ( N > 79 ) { detachInterrupt( 0 ); N = 0; digitalWrite( out , HIGH ); byte n = analogRead( signal ); tImp = map( n , 0 , 1023 , 0 , 10000 ); delayMicroseconds( tImp ); digitalWrite( out , LOW ); attachInterrupt( 0 , isRout , CHANGE ); } } //==================================================================Ну тебе же bwn уже написал, что нужно толково написать техзадание (а это половина успеха).
По твоим записям вряд ли помощь можно ожидать.
добавте строку #10A - pinMode( signal , INPUT );
если входной сигнал действительно от 0,38 до 3,78 - строку #29 нужно переделать....
0,38 / 5 * 1024 = 72
3,78 / 5 * 1024 = 774
tImp = map( n , 0 , 1023 , 0 , 10000 ); >>>>>>>>>>>> tImp = map( n , 72 , 774 , 0 , 10000 );
БЛАГОДАРЮ ВАС! ВЫ НАСТОЯЩИЙ ЧЕЛОВЕК!
пожста; я самолёт :)
не просто человек, а человек-истребитель. SU-27-16MAN
Хорошо, самолет (:
SU-27-16 помоги мне пожалуйста в этои теме
http://arduino.ru/forum/ishchu-ispolnitelya/nuzhna-pomsh-v-napisanii-prgrammy-0
Прошу прлшения что ни в своей теме но там похоже помоши нидождаться
БЛАГОДАРЮ ЗА СОДЕЙСТВИЕ) Вот что получилось на моей программе http://www.youtube.com/watch?v=aVZctLVeJV8 Завтра будет на Вашей...
Еще один вопрос: Вы случайно не две программы написали...?
Ну ты даешь! А сжечь комнату не боялся?
// Arduino Nano #define imp 2 #define signal A0 #define out 13 volatile byte N; int tImp; //================================================================== void setup() { pinMode( imp , INPUT ); pinMode( out , OUTPUT ); attachInterrupt( 0 , isRout , CHANGE ); N = 0; } //================================================================== void isRout() { N++; } //================================================================== void loop() { if ( N > 79 ) { detachInterrupt( 0 ); N = 0; digitalWrite( out , HIGH ); byte n = analogRead( signal ); tImp = map( n , 0 , 1023 , 0 , 10000 ); delayMicroseconds( tImp ); digitalWrite( out , LOW ); attachInterrupt( 0 , isRout , CHANGE ); } } //==================================================================// Arduino Nano #define imp 2 #define signal A0 #define out 13 volatile byte N; int tImp; //================================================================== void setup() { pinMode( imp , INPUT ); pinMode( out , OUTPUT ); attachInterrupt( 0 , isRout , CHANGE ); N = 0; } //================================================================== void isRout() { N++; } //================================================================== void loop() { if ( N > 79 ) { detachInterrupt( 0 ); N = 0; digitalWrite( out , HIGH ); byte n = analogRead( signal ); tImp = map( n , 0 , 1023 , 0 , 10000 ); delayMicroseconds( tImp ); digitalWrite( out , LOW ); attachInterrupt( 0 , isRout , CHANGE ); } } //==================================================================Что значит "N" и "79"?
БЛАГОДАРЮ ЗА СОДЕЙСТВИЕ) Вот что получилось на моей программе http://www.youtube.com/watch?v=aVZctLVeJV8 Завтра будет на Вашей...
Хрена себе опыты(((. Сочувствую соседям, они и не догадываются, что у них Чернобыль под боком строят.
У чела башню снесло.
Если бы у меня за стенкой такие эксперименты делали - яйца оторвал бы.
N переменная для хранения колва фронтов импульсов пришедших на пин 2
79 = 40 имп * 2 фронта , по логарифмической линейке получилось 79 , я ей верю :)
1. В какой программе писали программу?
2. Можете ли каждый этап описать..?
Благодарю..
Среда разработки Arduino
что значит - каждый этап ? каждую строку ? - неееееее, вам самим надо всё изучить.... на мелкие воросы - отвечу :)
А что это такое и зачем ?
это у них смотри #10 - может быть свиную тушку так хотят опалить ?
реактивный ВЫЛЫСЫПЕД !
Приветствую!!! Помогите написать код! Ни в какаую не хочет думать моя голова(
Устройство будет автоматически запускать двигатель автомобиля.
Есть 2 кнопки: первая с фиксацией (как предохранитель), а вторая непосредственно "ВКЛ/ВЫКЛ". Назовем их "КНОПКА1" и "КНОПКА2"
Есть 2 выхода, которые будут управлять зажиганием и сартером автомобиля. Назовем их "ВЫХОД_З" и "ВЫХОД_С"
В реальности выглядит так: Фиксация КНОПКА1 (она замыкает контакт на землю) обеспечивает работоспособность устройства, если контакта нет - устройство не срабатывает. Далее по однократном нажатии на КНОПКА2 (так же замыкается на землю) включается зажигание (на ВЫХОД_З подается HIGH), далее следует пауза в 4 секунды, что бы бензонасос успел закачать топливо, и запускаеться стартер ровно на 6 секунд (на ВЫХОД_С подается HIGH). Далее зажигание остается включеным (на ВЫХОД_З остается HIGH) до тех пор пока ещё раз не нажмем на КНОПКА2.
Так же если в процессе работы устройства размыкается контакт на КНОПКА1 устройство сразу же выключается (или переходит в начало цикла программы)
Вот как-то так...
для начала нарисуйте граф состояния системы ( это кружочки с кратким описанием ), потом нарисуйте стрелочками из какого в какое состояние возможен переход системы ( с указанием по какому событию ) - потом голова начнёт думать :)
топливный насос контролируется по достижению некоторого давления в рампе - на это есть датчик
стартер включается до начала генерирования генератором тока заряда ( но не более, например 10 сек )
реально что делаете-то ?
какое авто ?
SU-27-16
Устройство очень простое (без всяких вмешательств в штатные датчики и топливную систему), оно по сути эмитирует запуск двигателя с ключа (я собирал подобное устройство на 555NE, и оно прекрасно у меня работает на ВАЗ 2110 в виде запуска двигателя от доп. канала брелка сигнализации). Теперь решил собрать на микроконтроллере, и мне нужен сам код для выполнения конкретной задачи которую я описал, поскольку я новичек в процессинге, многие моменты мне не понятны. Простые программы типа основыных примеров скетчей мне даются без проблем, а вот как описать именно эту задачу опыта не хватает, хотя я уверен там 2-3 конструкций if...else будет достаточно, задача впринципе проста, но не для меня, как оказалось))) Буду признаетелен если кто-то поможет и подробно прокомментирует код. Спасибо)
P.S. Это мне наверное лучше блок схему нарисовать, что бы нагляднее было?
#define pinPower 8 // пин кнопка1 НЕФИКСИРУЕМАЯ ! #define pinStartStop 9 // пин кнопка2 НЕФИКСИРУЕМАЯ ! // параллельно кнопкам конденсаторы по 0,47 мкФ #define pinZagh 10 // пин на реле зажигания, реле включается от +5 V #define pinStarter 11 // пин на реле стартера, реле включается от +5 V #define tPump 4000 // насос - 4 секунды #define tStarter 6000 // стартер - 6 секунд boolean power=0; boolean startStop=0; boolean work=0; //================================================================================== void setup() { pinMode(pinPower,INPUT); // входной пин digitalWrite(pinPower,HIGH); // подтяжка пина резистором 20 kOm к +5 V pinMode(pinStartStop,INPUT); // входной пин digitalWrite(pinStartStop,HIGH); // подтяжка пина резистором 20 kOm к +5 V pinMode(pinZagh,OUTPUT); // выходной пин digitalWrite(pinZagh,0); // зажигание выкл. pinMode(pinStarter,OUTPUT); // выходной пин digitalWrite(pinStarter,0); // стартер выкл. } //================================================================================== void loop() { if(!analogRead(pinPower) power=!power; if(!analogRead(pinStartStop) startStop=!startStop; if(power&&!work) // если питание вкл. и мотор не работает - вкл. зажигание { digitalWrite(pinZagh,1); } if(power&&work) // если питание вкл. и мотор работает - выкл. зажигание { digitalWrite(pinZagh,1); work=0; } if(startStop&&!work) // если нажата кнопка2 и мотор не работает - ЗАПУСК { delay(tPump); digitalWrite(pinStarter,1); delay(tStarter); digitalWrite(pinStarter,0); work=1; } if(startStop&&work) // если нажата кнопка2 и мотор работает - выкл. зажигание { digitalWrite(pinZagh,0); work=0; } delay(500); } //==================================================================================вам нужна вот такая штука http://www.ebay.com/itm/12V-2-Channel-Relay-Module-with-Optocoupler-H-L-Level-Triger-for-Arduino-Raspber-/131419293412?pt=LH_DefaultDomain_0&hash=item1e993346e4
R1 и R2 - внутренние резисторы МК
с двумя кнопками нужно два допканала на брелке.... зачем ? вот всё от одной кнопки
#define pinStartStop 9 // пин кнопка НЕФИКСИРУЕМАЯ ! // параллельно кнопке конденсатор на 0,47 мкФ #define pinZagh 10 // пин на реле зажигания, реле включается от +5 V #define pinStarter 11 // пин на реле стартера, реле включается от +5 V #define tPump 4000 // насос - 4 секунды #define tStarter 6000 // стартер - 6 секунд boolean power=0; boolean startStop=0; boolean work=0; //================================================================================== void setup() { pinMode(pinStartStop,INPUT); // входной пин digitalWrite(pinStartStop,HIGH); // подтяжка пина резистором 20 kOm к +5 V pinMode(pinZagh,OUTPUT); // выходной пин digitalWrite(pinZagh,0); // зажигание выкл. pinMode(pinStarter,OUTPUT); // выходной пин digitalWrite(pinStarter,0); // стартер выкл. } //================================================================================== void loop() { if(!analogRead(pinStartStop) startStop=!startStop; if(startStop&&!work) // если нажата кнопка и мотор не работает - ЗАПУСК { digitalWrite(pinZagh,1); delay(tPump); digitalWrite(pinStarter,1); delay(tStarter); digitalWrite(pinStarter,0); work=1; } if(startStop&&work) // если нажата кнопка и мотор работает - СТОП { digitalWrite(pinZagh,0); work=0; } delay(500); } //==================================================================================строка 7 - лишняя :)
вместо кнопки на пин можно подать сигнал с приёмника охрсигнализации, НО - полярность сигнала нужна отрицательная, длительность импкльса > 500 mS ( или уменьшить задержку в строке 41, или строку 41 вообще убрать ), амплитуда < 5 V.
дайте параметры сигнала с приёмника охрсигнализации при нажатии на брелке кнопки допканала - я переделаю программу....
:( в строке 23 забыл поставить закрывающую скобку
SU-27-16
Спасибо за пример) Но все же хотелось бы понять сам код на моем примере, и что я делаю не так, потому как суть не именно в устройстве а в программировании подобных схем, я почти достиг цели, всё срабатывает как мне нужно, но только при повторном нажатии на кнопку устройство не отключается а просто заново начинает цыкл, вот тут я и не нашел решения. Вот пример кода:
const int control = 2; //переключатель "предохранитель" const int on = 3; //кнопка запуска const int engine = 4; //выход на "зажигание" const int starter = 5; //выход на "запуск стартера" int flag = 0; //переменная состояния кнопки запуска void setup() { pinMode(control, INPUT); //обьявляем вход для пин2 pinMode(on, INPUT); //обьявляем вход для пин3 pinMode(engine, OUTPUT); //обьявляем выход для пин4 pinMode(starter, OUTPUT); //обьявляем выход для пин5 } void loop() { if(digitalRead(control)==LOW) //Если на пин2 НИЗКИЙ уровень, выполняем программу: { if(digitalRead(on)==LOW&&flag==0) //При первом нажатии на кнопку запуска выполняем программу: { digitalWrite(engine, HIGH); //Подаем высокий уровень на пин4 (включаем зажигание) delay(4000); //Ждем 4 секунды digitalWrite(starter, HIGH); //Подаем высокий уровень на пин5 (запускаем двигатель) delay(6000); //Ждем 6 секунд digitalWrite(starter, LOW); //Подаем низкий уровень на пин5 (включаем зажигание) flag=1; //Запоминаем состояние кнопки запуска } if(digitalRead(on)==LOW&&flag==1) //При следующем нажатии на кнопку запуска: { digitalWrite(engine, LOW); //Подаем низкий уровень на пин4 (выключаем зажигание) flag=0; //Запоминаем состояние кнопки запуска } } }Что именно я делаю не так?
вместо кнопки на пин можно подать сигнал с приёмника охрсигнализации, НО - полярность сигнала нужна отрицательная, длительность импкльса > 500 mS ( или уменьшить задержку в строке 41, или строку 41 вообще убрать ), амплитуда < 5 V.
дайте параметры сигнала с приёмника охрсигнализации при нажатии на брелке кнопки допканала - я переделаю программу....
всё намного проще, при нажатии на кнопку доп канала, сам контролеер сигнализации просто замыкает один из своих контактов на землю, к которому я и собраюсь подключить так называемую "кнопку запуска" (пин3)
1...4 - #define - так принято
5 - хватит byte
как подключены переключатель и кнопка ? если на пин и на землю, то надо пины 2 и 3 подтянуть к питанию - в строке 9А digitalWrite(control, HIGH); , аналогично в строке 10А
Пины 2 и 3 подтянуты к +5В через 10КОм
зачем внешние ? для этого придуманы внутренние :)
смотрите как сделать чтобы стартер не перетруживался
const int control = 2; //переключатель "предохранитель" const int on = 3; //кнопка запуска const int engine = 4; //выход на "зажигание" const int starter = 5; //выход на "запуск стартера" #define zarjad 6 int flag = 0; //переменная состояния кнопки запуска void setup() { Serial.begin(9600); pinMode(control, INPUT); //обьявляем вход для пин2 digitalWrite(control,HIGH); pinMode(on, INPUT); //обьявляем вход для пин3 digitalWrite(on,HIGH); pinMode(zarjad, INPUT); //обьявляем вход для пин6 digitalWrite(zarjad,HIGH); pinMode(engine, OUTPUT); //обьявляем выход для пин4 digitalWrite(engine,HIGH); pinMode(starter, OUTPUT); //обьявляем выход для пин5 digitalWrite(starter,HIGH); } void loop() { if(digitalRead(control)==LOW) //Если на пин2 НИЗКИЙ уровень, выполняем программу: { if(digitalRead(on)==LOW&&flag==0) //При первом нажатии на кнопку запуска выполняем программу: { digitalWrite(engine, LOW); //Подаем высокий уровень на пин4 (включаем зажигание) delay(4000); //Ждем 4 секунды digitalWrite(starter, LOW); //Подаем высокий уровень на пин5 (запускаем двигатель) // delay(6000); //Ждем 6 секунд unsigned long T=millis(); while(digitalRead(zarjad)==HIGH) { if((millis()-T)>6000) break; //ждем пока не потухнет лампа генератора, но не более 6 секунд } digitalWrite(starter, HIGH); //Подаем низкий уровень на пин5 (включаем зажигание) flag=1; //Запоминаем состояние кнопки запуска } if((digitalRead(on)==LOW)&&(flag==1)) //При следующем нажатии на кнопку запуска: { digitalWrite(engine, HIGH); //Подаем низкий уровень на пин4 (выключаем зажигание) flag=0; //Запоминаем состояние кнопки запуска } } delay(500); }ниже - почему не работало
прога правильная, вас мучал эффект "дребезг контактов" :(
это устранено задержкой в строке 49
но правильнее :
- по железному - параллельно кнопке кондёр 0,01.....0,47 мкФ ( опытным путём )
- по программному - читайте http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
Спасибо за совет по "штатным" подтяжкам!!! не знал этого, теперь буду знать)
Да, действительно, добавил задержку и всё заработало как нужно)) спасибо тебе добрый человек!!!
реле будут срабатывать если включены зажигание и стартер ! а что они подключают ?
схема подключения из #29 - с минимальными затратами при подключении