Помогите написать программу по алгоритму
- Войдите на сайт для отправки комментариев
Вс, 18/01/2015 - 15:11
Ждать 40 цифровых импульсов(с 50 например), затем считывать показания с аналогово входа (с А3 например) от 0,38 до 3,78 вольта и строить отношение (от 0 до 1024(напряжение аналогово) как 0 до 10 (миллисекунды)) и затем открывать выход 13 на это значение (от 0 до 10). И повторять цикл,то есть это всё в void loop. Нужно составить эту программу (для запуска газотурбинного двигателя).
Денежных средств к сожалению на данный момент не имеется т.к. 9 класс (сами понимаете), все свободные деньги на проект уходят... Благодарю за любую помощь и поддержку.
01
// Arduino Nano
02
#define imp 2
03
#define signal A0
04
#define out 13
05
volatile
byte
N;
06
int
tImp;
07
//==================================================================
08
void
setup
()
09
{
10
pinMode( imp , INPUT );
11
pinMode(
out
, OUTPUT );
12
attachInterrupt( 0 , isRout , CHANGE );
13
N = 0;
14
}
15
//==================================================================
16
void
isRout()
17
{
18
N++;
19
}
20
//==================================================================
21
void
loop
()
22
{
23
if
( N > 79 )
24
{
25
detachInterrupt( 0 );
26
N = 0;
27
digitalWrite(
out
, HIGH );
28
byte
n = analogRead( signal );
29
tImp = map( n , 0 , 1023 , 0 , 10000 );
30
delayMicroseconds( tImp );
31
digitalWrite(
out
, LOW );
32
attachInterrupt( 0 , isRout , CHANGE );
33
}
34
}
35
//==================================================================// Arduino Nano
36
#define imp 2
37
#define signal A0
38
#define out 13
39
volatile
byte
N;
40
int
tImp;
41
//==================================================================
42
void
setup
()
43
{
44
pinMode( imp , INPUT );
45
pinMode(
out
, OUTPUT );
46
attachInterrupt( 0 , isRout , CHANGE );
47
N = 0;
48
}
49
//==================================================================
50
void
isRout()
51
{
52
N++;
53
}
54
//==================================================================
55
void
loop
()
56
{
57
if
( N > 79 )
58
{
59
detachInterrupt( 0 );
60
N = 0;
61
digitalWrite(
out
, HIGH );
62
byte
n = analogRead( signal );
63
tImp = map( n , 0 , 1023 , 0 , 10000 );
64
delayMicroseconds( tImp );
65
digitalWrite(
out
, LOW );
66
attachInterrupt( 0 , isRout , CHANGE );
67
}
68
}
69
//==================================================================
Ну тебе же 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 Завтра будет на Вашей...
Еще один вопрос: Вы случайно не две программы написали...?
Ну ты даешь! А сжечь комнату не боялся?
01
// Arduino Nano
02
#define imp 2
03
#define signal A0
04
#define out 13
05
volatile
byte
N;
06
int
tImp;
07
//==================================================================
08
void
setup
()
09
{
10
pinMode( imp , INPUT );
11
pinMode(
out
, OUTPUT );
12
attachInterrupt( 0 , isRout , CHANGE );
13
N = 0;
14
}
15
//==================================================================
16
void
isRout()
17
{
18
N++;
19
}
20
//==================================================================
21
void
loop
()
22
{
23
if
( N > 79 )
24
{
25
detachInterrupt( 0 );
26
N = 0;
27
digitalWrite(
out
, HIGH );
28
byte
n = analogRead( signal );
29
tImp = map( n , 0 , 1023 , 0 , 10000 );
30
delayMicroseconds( tImp );
31
digitalWrite(
out
, LOW );
32
attachInterrupt( 0 , isRout , CHANGE );
33
}
34
}
35
//==================================================================// Arduino Nano
36
#define imp 2
37
#define signal A0
38
#define out 13
39
volatile
byte
N;
40
int
tImp;
41
//==================================================================
42
void
setup
()
43
{
44
pinMode( imp , INPUT );
45
pinMode(
out
, OUTPUT );
46
attachInterrupt( 0 , isRout , CHANGE );
47
N = 0;
48
}
49
//==================================================================
50
void
isRout()
51
{
52
N++;
53
}
54
//==================================================================
55
void
loop
()
56
{
57
if
( N > 79 )
58
{
59
detachInterrupt( 0 );
60
N = 0;
61
digitalWrite(
out
, HIGH );
62
byte
n = analogRead( signal );
63
tImp = map( n , 0 , 1023 , 0 , 10000 );
64
delayMicroseconds( tImp );
65
digitalWrite(
out
, LOW );
66
attachInterrupt( 0 , isRout , CHANGE );
67
}
68
}
69
//==================================================================
Что значит "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. Это мне наверное лучше блок схему нарисовать, что бы нагляднее было?
01
#define pinPower 8 // пин кнопка1 НЕФИКСИРУЕМАЯ !
02
#define pinStartStop 9 // пин кнопка2 НЕФИКСИРУЕМАЯ !
03
// параллельно кнопкам конденсаторы по 0,47 мкФ
04
#define pinZagh 10 // пин на реле зажигания, реле включается от +5 V
05
#define pinStarter 11 // пин на реле стартера, реле включается от +5 V
06
#define tPump 4000 // насос - 4 секунды
07
#define tStarter 6000 // стартер - 6 секунд
08
boolean power=0;
09
boolean startStop=0;
10
boolean work=0;
11
//==================================================================================
12
void
setup
()
13
{
14
pinMode(pinPower,INPUT);
// входной пин
15
digitalWrite(pinPower,HIGH);
// подтяжка пина резистором 20 kOm к +5 V
16
pinMode(pinStartStop,INPUT);
// входной пин
17
digitalWrite(pinStartStop,HIGH);
// подтяжка пина резистором 20 kOm к +5 V
18
pinMode(pinZagh,OUTPUT);
// выходной пин
19
digitalWrite(pinZagh,0);
// зажигание выкл.
20
pinMode(pinStarter,OUTPUT);
// выходной пин
21
digitalWrite(pinStarter,0);
// стартер выкл.
22
}
23
//==================================================================================
24
void
loop
()
25
{
26
if
(!analogRead(pinPower) power=!power;
27
if
(!analogRead(pinStartStop) startStop=!startStop;
28
29
if
(power&&!work)
// если питание вкл. и мотор не работает - вкл. зажигание
30
{
31
digitalWrite(pinZagh,1);
32
}
33
34
if
(power&&work)
// если питание вкл. и мотор работает - выкл. зажигание
35
{
36
digitalWrite(pinZagh,1);
37
work=0;
38
}
39
40
if
(startStop&&!work)
// если нажата кнопка2 и мотор не работает - ЗАПУСК
41
{
42
delay(tPump);
43
digitalWrite(pinStarter,1);
44
delay(tStarter);
45
digitalWrite(pinStarter,0);
46
work=1;
47
}
48
49
if
(startStop&&work)
// если нажата кнопка2 и мотор работает - выкл. зажигание
50
{
51
digitalWrite(pinZagh,0);
52
work=0;
53
}
54
55
delay(500);
56
}
57
//==================================================================================
вам нужна вот такая штука 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 - внутренние резисторы МК
с двумя кнопками нужно два допканала на брелке.... зачем ? вот всё от одной кнопки
01
#define pinStartStop 9 // пин кнопка НЕФИКСИРУЕМАЯ !
02
// параллельно кнопке конденсатор на 0,47 мкФ
03
#define pinZagh 10 // пин на реле зажигания, реле включается от +5 V
04
#define pinStarter 11 // пин на реле стартера, реле включается от +5 V
05
#define tPump 4000 // насос - 4 секунды
06
#define tStarter 6000 // стартер - 6 секунд
07
boolean power=0;
08
boolean startStop=0;
09
boolean work=0;
10
//==================================================================================
11
void
setup
()
12
{
13
pinMode(pinStartStop,INPUT);
// входной пин
14
digitalWrite(pinStartStop,HIGH);
// подтяжка пина резистором 20 kOm к +5 V
15
pinMode(pinZagh,OUTPUT);
// выходной пин
16
digitalWrite(pinZagh,0);
// зажигание выкл.
17
pinMode(pinStarter,OUTPUT);
// выходной пин
18
digitalWrite(pinStarter,0);
// стартер выкл.
19
}
20
//==================================================================================
21
void
loop
()
22
{
23
if
(!analogRead(pinStartStop) startStop=!startStop;
24
25
if
(startStop&&!work)
// если нажата кнопка и мотор не работает - ЗАПУСК
26
{
27
digitalWrite(pinZagh,1);
28
delay(tPump);
29
digitalWrite(pinStarter,1);
30
delay(tStarter);
31
digitalWrite(pinStarter,0);
32
work=1;
33
}
34
35
if
(startStop&&work)
// если нажата кнопка и мотор работает - СТОП
36
{
37
digitalWrite(pinZagh,0);
38
work=0;
39
}
40
41
delay(500);
42
}
43
//==================================================================================
строка 7 - лишняя :)
вместо кнопки на пин можно подать сигнал с приёмника охрсигнализации, НО - полярность сигнала нужна отрицательная, длительность импкльса > 500 mS ( или уменьшить задержку в строке 41, или строку 41 вообще убрать ), амплитуда < 5 V.
дайте параметры сигнала с приёмника охрсигнализации при нажатии на брелке кнопки допканала - я переделаю программу....
:( в строке 23 забыл поставить закрывающую скобку
SU-27-16
Спасибо за пример) Но все же хотелось бы понять сам код на моем примере, и что я делаю не так, потому как суть не именно в устройстве а в программировании подобных схем, я почти достиг цели, всё срабатывает как мне нужно, но только при повторном нажатии на кнопку устройство не отключается а просто заново начинает цыкл, вот тут я и не нашел решения. Вот пример кода:
01
const
int
control = 2;
//переключатель "предохранитель"
02
const
int
on = 3;
//кнопка запуска
03
const
int
engine = 4;
//выход на "зажигание"
04
const
int
starter = 5;
//выход на "запуск стартера"
05
int
flag = 0;
//переменная состояния кнопки запуска
06
07
void
setup
()
08
{
09
pinMode(control, INPUT);
//обьявляем вход для пин2
10
pinMode(on, INPUT);
//обьявляем вход для пин3
11
pinMode(engine, OUTPUT);
//обьявляем выход для пин4
12
pinMode(starter, OUTPUT);
//обьявляем выход для пин5
13
}
14
15
void
loop
()
16
{
17
if
(digitalRead(control)==LOW)
//Если на пин2 НИЗКИЙ уровень, выполняем программу:
18
{
19
if
(digitalRead(on)==LOW&&flag==0)
//При первом нажатии на кнопку запуска выполняем программу:
20
{
21
digitalWrite(engine, HIGH);
//Подаем высокий уровень на пин4 (включаем зажигание)
22
delay(4000);
//Ждем 4 секунды
23
digitalWrite(starter, HIGH);
//Подаем высокий уровень на пин5 (запускаем двигатель)
24
delay(6000);
//Ждем 6 секунд
25
digitalWrite(starter, LOW);
//Подаем низкий уровень на пин5 (включаем зажигание)
26
flag=1;
//Запоминаем состояние кнопки запуска
27
}
28
if
(digitalRead(on)==LOW&&flag==1)
//При следующем нажатии на кнопку запуска:
29
{
30
digitalWrite(engine, LOW);
//Подаем низкий уровень на пин4 (выключаем зажигание)
31
flag=0;
//Запоминаем состояние кнопки запуска
32
}
33
}
34
}
Что именно я делаю не так?
вместо кнопки на пин можно подать сигнал с приёмника охрсигнализации, НО - полярность сигнала нужна отрицательная, длительность импкльса > 500 mS ( или уменьшить задержку в строке 41, или строку 41 вообще убрать ), амплитуда < 5 V.
дайте параметры сигнала с приёмника охрсигнализации при нажатии на брелке кнопки допканала - я переделаю программу....
всё намного проще, при нажатии на кнопку доп канала, сам контролеер сигнализации просто замыкает один из своих контактов на землю, к которому я и собраюсь подключить так называемую "кнопку запуска" (пин3)
1...4 - #define - так принято
5 - хватит byte
как подключены переключатель и кнопка ? если на пин и на землю, то надо пины 2 и 3 подтянуть к питанию - в строке 9А digitalWrite(control, HIGH); , аналогично в строке 10А
Пины 2 и 3 подтянуты к +5В через 10КОм
зачем внешние ? для этого придуманы внутренние :)
смотрите как сделать чтобы стартер не перетруживался
01
const
int
control = 2;
//переключатель "предохранитель"
02
const
int
on = 3;
//кнопка запуска
03
const
int
engine = 4;
//выход на "зажигание"
04
const
int
starter = 5;
//выход на "запуск стартера"
05
#define zarjad 6
06
int
flag = 0;
//переменная состояния кнопки запуска
07
08
void
setup
()
09
{
10
Serial
.begin(9600);
11
pinMode(control, INPUT);
//обьявляем вход для пин2
12
digitalWrite(control,HIGH);
13
pinMode(on, INPUT);
//обьявляем вход для пин3
14
digitalWrite(on,HIGH);
15
16
pinMode(zarjad, INPUT);
//обьявляем вход для пин6
17
digitalWrite(zarjad,HIGH);
18
19
pinMode(engine, OUTPUT);
//обьявляем выход для пин4
20
digitalWrite(engine,HIGH);
21
pinMode(starter, OUTPUT);
//обьявляем выход для пин5
22
digitalWrite(starter,HIGH);
23
}
24
25
void
loop
()
26
{
27
if
(digitalRead(control)==LOW)
//Если на пин2 НИЗКИЙ уровень, выполняем программу:
28
{
29
if
(digitalRead(on)==LOW&&flag==0)
//При первом нажатии на кнопку запуска выполняем программу:
30
{
31
digitalWrite(engine, LOW);
//Подаем высокий уровень на пин4 (включаем зажигание)
32
delay(4000);
//Ждем 4 секунды
33
digitalWrite(starter, LOW);
//Подаем высокий уровень на пин5 (запускаем двигатель)
34
// delay(6000); //Ждем 6 секунд
35
unsigned
long
T=millis();
36
while
(digitalRead(zarjad)==HIGH)
37
{
38
if
((millis()-T)>6000)
break
;
//ждем пока не потухнет лампа генератора, но не более 6 секунд
39
}
40
digitalWrite(starter, HIGH);
//Подаем низкий уровень на пин5 (включаем зажигание)
41
flag=1;
//Запоминаем состояние кнопки запуска
42
}
43
if
((digitalRead(on)==LOW)&&(flag==1))
//При следующем нажатии на кнопку запуска:
44
{
45
digitalWrite(engine, HIGH);
//Подаем низкий уровень на пин4 (выключаем зажигание)
46
flag=0;
//Запоминаем состояние кнопки запуска
47
}
48
}
49
delay(500);
50
}
ниже - почему не работало
прога правильная, вас мучал эффект "дребезг контактов" :(
это устранено задержкой в строке 49
но правильнее :
- по железному - параллельно кнопке кондёр 0,01.....0,47 мкФ ( опытным путём )
- по программному - читайте http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
Спасибо за совет по "штатным" подтяжкам!!! не знал этого, теперь буду знать)
Да, действительно, добавил задержку и всё заработало как нужно)) спасибо тебе добрый человек!!!
реле будут срабатывать если включены зажигание и стартер ! а что они подключают ?
схема подключения из #29 - с минимальными затратами при подключении