Помогите написать программу по алгоритму

Speedflyer
Offline
Зарегистрирован: 18.01.2015

Ждать 40 цифровых импульсов(с 50 например), затем считывать показания с аналогово входа (с А3 например) от 0,38 до 3,78 вольта и строить отношение (от 0 до 1024(напряжение аналогово) как 0 до 10 (миллисекунды)) и затем открывать выход 13 на это значение (от 0 до 10). И повторять цикл,то есть это всё в void loop.  Нужно составить эту программу (для запуска газотурбинного двигателя).

Денежных средств к сожалению на данный момент не имеется т.к. 9 класс (сами понимаете), все свободные деньги на проект уходят... Благодарю за любую помощь и поддержку. 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
// 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 );
    }
}
//==================================================================

 

vvadim
Онлайн
Зарегистрирован: 23.05.2012

Ну тебе же bwn уже написал, что нужно толково написать техзадание (а это половина успеха).

По твоим записям вряд ли помощь можно ожидать.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

добавте строку #10A - pinMode( signal , INPUT ); 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

если входной сигнал действительно от 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 );

Speedflyer
Offline
Зарегистрирован: 18.01.2015

БЛАГОДАРЮ ВАС! ВЫ НАСТОЯЩИЙ ЧЕЛОВЕК!

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

пожста; я самолёт :)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не просто человек, а человек-истребитель. SU-27-16MAN

Speedflyer
Offline
Зарегистрирован: 18.01.2015

Хорошо, самолет (:

vadim-21
Offline
Зарегистрирован: 26.12.2014

SU-27-16 помоги мне пожалуйста в этои теме 

http://arduino.ru/forum/ishchu-ispolnitelya/nuzhna-pomsh-v-napisanii-prgrammy-0 

 

Прошу прлшения что ни в своей теме но там похоже помоши нидождаться

Speedflyer
Offline
Зарегистрирован: 18.01.2015

БЛАГОДАРЮ ЗА СОДЕЙСТВИЕ) Вот что получилось на моей программе http://www.youtube.com/watch?v=aVZctLVeJV8 Завтра будет на Вашей...

Speedflyer
Offline
Зарегистрирован: 18.01.2015

Еще один вопрос: Вы случайно не две программы написали...?

Roman
Offline
Зарегистрирован: 15.02.2013

Ну ты даешь! А сжечь комнату не боялся?

Speedflyer
Offline
Зарегистрирован: 18.01.2015

SU-27-16 пишет:

// 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"?

bwn
Offline
Зарегистрирован: 25.08.2014

Speedflyer пишет:

БЛАГОДАРЮ ЗА СОДЕЙСТВИЕ) Вот что получилось на моей программе http://www.youtube.com/watch?v=aVZctLVeJV8 Завтра будет на Вашей...

Хрена себе опыты(((. Сочувствую соседям, они и не догадываются, что у них Чернобыль под боком строят.

vvadim
Онлайн
Зарегистрирован: 23.05.2012

У чела башню снесло.

Если бы у меня за стенкой такие эксперименты делали - яйца оторвал бы.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

N переменная для хранения колва фронтов импульсов пришедших на пин 2

79 = 40 имп * 2 фронта , по логарифмической линейке получилось 79 , я ей верю :)

Speedflyer
Offline
Зарегистрирован: 18.01.2015

1. В какой программе писали программу?

2. Можете ли каждый этап описать..?

Благодарю..

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Среда разработки Arduino

что значит - каждый этап ? каждую строку ? - неееееее, вам самим надо всё изучить.... на мелкие воросы - отвечу :)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А что это такое и зачем ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

это у них смотри #10 - может быть свиную тушку так хотят опалить ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

реактивный ВЫЛЫСЫПЕД !

nsystemst
Offline
Зарегистрирован: 07.02.2015

Приветствую!!! Помогите написать код! Ни в какаую не хочет думать моя голова(

Устройство будет автоматически запускать двигатель автомобиля. 

Есть 2 кнопки: первая с фиксацией (как предохранитель), а вторая непосредственно "ВКЛ/ВЫКЛ". Назовем их "КНОПКА1" и "КНОПКА2"

Есть 2 выхода, которые будут управлять зажиганием и сартером автомобиля. Назовем их "ВЫХОД_З" и "ВЫХОД_С"

В реальности выглядит так: Фиксация КНОПКА1 (она замыкает контакт на землю) обеспечивает работоспособность устройства, если контакта нет - устройство не срабатывает. Далее по однократном нажатии на КНОПКА2 (так же замыкается на землю) включается зажигание (на ВЫХОД_З подается HIGH), далее следует пауза в 4 секунды, что бы бензонасос успел закачать топливо, и запускаеться стартер ровно на 6 секунд (на ВЫХОД_С подается HIGH). Далее зажигание остается включеным (на ВЫХОД_З остается HIGH) до тех пор пока ещё раз не нажмем на КНОПКА2

Так же если в процессе работы устройства размыкается контакт на КНОПКА1 устройство сразу же выключается (или переходит в начало цикла программы)

Вот как-то так...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

для начала нарисуйте граф состояния системы ( это кружочки с кратким описанием ), потом нарисуйте стрелочками из какого в какое состояние возможен переход системы ( с указанием по какому событию ) - потом голова начнёт думать :)

 топливный насос контролируется по достижению некоторого давления в рампе - на это есть датчик

стартер включается до начала генерирования генератором тока заряда ( но не более, например 10 сек )

реально что делаете-то ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

какое авто ?

nsystemst
Offline
Зарегистрирован: 07.02.2015

SU-27-16

Устройство очень простое (без всяких вмешательств в штатные датчики и топливную систему), оно по сути эмитирует запуск двигателя с ключа (я собирал подобное устройство на 555NE, и оно прекрасно у меня работает на ВАЗ 2110 в виде запуска двигателя от доп. канала брелка сигнализации). Теперь решил собрать на микроконтроллере, и мне нужен сам код для выполнения конкретной задачи которую я описал, поскольку я новичек в процессинге, многие моменты мне не понятны. Простые программы типа основыных примеров скетчей мне даются без проблем, а вот как описать именно эту задачу опыта не хватает, хотя я уверен там 2-3 конструкций if...else будет достаточно, задача впринципе проста, но не для меня, как оказалось))) Буду признаетелен если кто-то поможет и подробно прокомментирует код. Спасибо)

P.S. Это мне наверное лучше блок схему нарисовать, что бы нагляднее было?

nsystemst
Offline
Зарегистрирован: 07.02.2015

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#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);
}
//==================================================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

R1 и R2 - внутренние резисторы МК

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

с двумя кнопками нужно два допканала на брелке.... зачем ? вот всё от одной кнопки

#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);
}
//==================================================================================

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

строка 7 - лишняя :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

вместо кнопки на пин можно подать сигнал с приёмника охрсигнализации, НО - полярность сигнала нужна отрицательная, длительность импкльса > 500 mS ( или уменьшить задержку в строке 41, или строку 41 вообще убрать ), амплитуда < 5 V.

дайте параметры сигнала с приёмника охрсигнализации при нажатии на брелке кнопки допканала - я переделаю программу....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

:( в строке 23 забыл поставить закрывающую скобку

nsystemst
Offline
Зарегистрирован: 07.02.2015

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;                           //Запоминаем состояние кнопки запуска
    }
  }  
} 

Что именно я делаю не так?

nsystemst
Offline
Зарегистрирован: 07.02.2015

SU-27-16 пишет:

вместо кнопки на пин можно подать сигнал с приёмника охрсигнализации, НО - полярность сигнала нужна отрицательная, длительность импкльса > 500 mS ( или уменьшить задержку в строке 41, или строку 41 вообще убрать ), амплитуда < 5 V.

дайте параметры сигнала с приёмника охрсигнализации при нажатии на брелке кнопки допканала - я переделаю программу....

всё намного проще, при нажатии на кнопку доп канала, сам контролеер сигнализации просто замыкает один из своих контактов на землю, к которому я и собраюсь подключить так называемую "кнопку запуска" (пин3)

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

1...4 - #define - так принято

5 - хватит byte

как подключены переключатель и кнопка ? если на пин и на землю, то надо пины 2 и 3 подтянуть к питанию - в строке 9А digitalWrite(controlHIGH); , аналогично в строке 10А

nsystemst
Offline
Зарегистрирован: 07.02.2015

Пины 2 и 3 подтянуты к +5В через 10КОм

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

зачем внешние ? для этого придуманы внутренние :)

смотрите как сделать чтобы стартер не перетруживался

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);
} 

ниже - почему не работало

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

прога правильная, вас мучал эффект "дребезг контактов" :(

это устранено задержкой в строке 49

но правильнее :

- по железному - параллельно кнопке кондёр 0,01.....0,47 мкФ ( опытным путём )

- по программному - читайте http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku

nsystemst
Offline
Зарегистрирован: 07.02.2015

Спасибо за совет по "штатным" подтяжкам!!! не знал этого, теперь буду знать) 

 

nsystemst
Offline
Зарегистрирован: 07.02.2015

Да, действительно, добавил задержку и всё заработало как нужно)) спасибо тебе добрый человек!!!

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

реле будут срабатывать если включены зажигание и стартер ! а что они подключают ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

схема подключения из #29 - с минимальными затратами при подключении

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012