Помогите с кодом

blink977
Offline
Зарегистрирован: 20.01.2012

что то не могу въехать (

для начала, вместо реле хочу подключить светодиоды, вот только не могу понять: кнопка старта подключить на 2 ногу, но замыкать на + или массу?? и еще: как светодиоды подключить, вернее какие резисторы нужны что бы не спалить выходы контроллера?

blink977
Offline
Зарегистрирован: 20.01.2012

как только дотрагиваюсь до 2 ноги, светодиод подключенный к 5,6,7 ногам начинает беспорядочно мигать ((

в чем дело??

whoim
Offline
Зарегистрирован: 03.11.2011

 прочитайте эту же тему выше, там все расписано..

whoim
Offline
Зарегистрирован: 03.11.2011

step962 пишет:

blink977 пишет:

а как лучще кнопку ставить, на массу или +?

Правильно - помнить, как подключена кнопка, и правильно интерпретировать уровень на пине, к которому она подключена.

Еще правильно - вместе с каждой кнопкой устанавливать подтягивающий резистор. В случае кнопки замыкаемой на массу, можно использовать внутренние подтягивающие резисторы мк (pinMode(But1pin,INPUT); digitalWrite(But1pin,HIGH);), но иметь при этом LOW при замыкании кнопки. Не мешает, но требуется ПОМНИТЬ. При альтернативном подключении кнопки (замыкание на +) резистор следует ставить физически. При этом уровень для замкнутой кнопки - HIGH.

Выбирайте, что нравится

blink977
Offline
Зарегистрирован: 20.01.2012

я установил резистор 10ком вместе с кнопкой, замыкается на массу, но не могу добится закономерности в работе. то светодиод постоянно горит, то не горит совсем, единственное что я уловил это отключение стартера через 8 секунд. короче говоря программа не совсем пашет(((

whoim
Offline
Зарегистрирован: 03.11.2011

 я установил резистор 10ком вместе с кнопкой, замыкается на массу

Еще правильно - вместе с каждой кнопкой устанавливать подтягивающий резистор. В случае кнопки замыкаемой на массу, можно использовать внутренние подтягивающие резисторы мк (pinMode(But1pin,INPUT); digitalWrite(But1pin,HIGH);), но иметь при этом LOW при замыкании кнопки.

blink977
Offline
Зарегистрирован: 20.01.2012

что то в самой программе тоже не то (( кто нибудь может залить и проверить??

whoim
Offline
Зарегистрирован: 03.11.2011

 blink977, если программа не компилится - то компилятор выдает осмысленную ошибку, почему так происходит. 

blink977
Offline
Зарегистрирован: 20.01.2012

не програма компилится без ошибок. я все симитировал, и сигнал с генератора и все реле но никакого результата (

работает включение ACC и Ignition при удержании кнопки на секунду и две соответственно.

А при простом нажатии все три реле включаются вместе, и вырубаются через 8 секунд

 

whoim
Offline
Зарегистрирован: 03.11.2011

 Приведите ваш код

Mastino
Offline
Зарегистрирован: 03.12.2011

что то ты не так подключил, я проверял программу на led`ах все работало нормально

blink977
Offline
Зарегистрирован: 20.01.2012

я тоже led-ы подключал, но ничего. (( А что там подключать, включил через 220ом резисторы светодиоды на выходы 5, 6, 7 вместо реле, кнопку замыкаю на массу через 10ком резистор и ниче, они все вместе загораются и потом гаснут. (( работает удерживание кнопки на секунду, включается ACC, а если подольше подержать то Ignition.

Mastino
Offline
Зарегистрирован: 03.12.2011

нужно подключить две кнопки на 2 и 3 таким образом:

blink977
Offline
Зарегистрирован: 20.01.2012

а зачем 2 кнопки? на 3-ю ногу я подавал +5 вольт, имитируя горящую лампу генератора, но все равно не то было ((

Mastino
Offline
Зарегистрирован: 03.12.2011

генератор надо эмитировать с помощью кнопки.

blink977
Offline
Зарегистрирован: 20.01.2012

попробую

blink977
Offline
Зарегистрирован: 20.01.2012

whoim пишет:

 Опробовал сегодня простую консрукцию для проверки кнопки, чтобы срабатывала по отпусканию. Работает)

if(digitalRead(btnPin) == LOW) {
   while(digitalRead(btnPin) == LOW)
      delay(1);
/тут код
}

 

можно поставить комменты, или разьяснить?

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

или как то по другому это реализовать? Просто я решил написать все сначала и по своему, а то рытся в чужой проге - легче выучить язык и самому написать!

whoim
Offline
Зарегистрирован: 03.11.2011

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

 

До всех секций

#define btnPin 10 //компилятор заменит все встретившиеся ему btnPin на текст 10. Это НЕ переменная, это для удобства - вы не запоминаете цифры и при смене пина если что поменяете его только здесь.

в секции setup

pinMode(btnPin, INPUT); //переключение пина btnPin в режим ввода (чтобы читать из него)
digitalWrite(btnPin, HIGH); //устанавливаем высокое на пине, тем самым включая внутренний подтягивающий резистор. Никакие другие резисторы на выводе и кнопке не нужны, но кнопка замыкается на минус (GND)

в секции loop (тело программы)

if(digitalRead(btnPin) == LOW) { //если на пине LOW (по умолчанию HIGH но мы нажали кнопку и замкнули вывод на минус), ТО
while(digitalRead(btnPin) == LOW) пока держится LOW
delay(1); //ничего особо не делаем - задержка. Но это подвесит контроллер пока не отпустим кнопку, имейте ввиду

//Так как после цикла while у нас нет фигурных скобок - исполняется только один оператор delay. Все, что будет после него, исполнится один раз в рамках условия if когда "отпустит" while

//тут код, который выполнится посте отпускания кнопки
}

Mastino
Offline
Зарегистрирован: 03.12.2011

вот пройди уроков http://www.ladyada.net/learn/arduino/lesson1.html

blink977
Offline
Зарегистрирован: 20.01.2012
 
 #define btnPin 2
 #define acc 5
 #define ignition 6
 #define start 7
 #define ewsPin 3
 #define gensigPin 4
 
 
 int ewsState = 0;
 int gensigState = 0;
 
 void setup() {
    pinMode(acc, OUTPUT);
    pinMode(ignition, OUTPUT);
    pinMode(start, OUTPUT);
    pinMode(btnPin, INPUT); 
    digitalWrite(ewsPin, HIGH);
    digitalWrite(btnPin, HIGH); 
 
 void loop() {
   
    
   
     if(digitalRead(btnPin) == LOW) {
	   while(digitalRead(btnPin) == LOW) 
	   delay(50); 
           digitalWrite(acc, LOW);
           digitalWrite(ignition, HIGH);
           delay(500);
           digitalWrite(start, HIGH);
           
           
	}
         if(digitalRead(btnPin) == LOW) {
	   while(digitalRead(btnPin) == LOW) 
	   delay(50); 
           digitalWrite(acc, LOW);
           digitalWrite(ignition, LOW);
           digitalWrite(start, LOW);
 }
        ewsState = digitalRead(ewsPin);
    if(ewsState == LOW) {
    digitalWrite(acc, HIGH);
    }
    else{
    digitalWrite(acc, LOW);
    }
    
     }
 }
  
вот что я пока сегодня наработал, почему то нечетко работает кнопка, включается сразу, а вот для выключения надо нажать несклько раз, подскажите что там не то?
 
 
 
whoim
Offline
Зарегистрирован: 03.11.2011

 не очень понял суть кода. Зачем два одинаковых блока по проверке btnPin?

Последний блок будет выполяться с такой скоростью, что хер вы угадаете, когда кнопку надо бросить чтобы acc потух

whoim
Offline
Зарегистрирован: 03.11.2011

 И что за открывающася скобка после  

delay(500);
30
           digitalWrite(start, HIGH);{

 

blink977
Offline
Зарегистрирован: 20.01.2012

whoim пишет:

 И что за открывающася скобка после  

delay(500);
30
           digitalWrite(start, HIGH);{

 

 у меня там стоял цикл  do....while, потом я его убрал и эта скобка осталась

blink977
Offline
Зарегистрирован: 20.01.2012

один блок только включает светодиод, потом так и остается включеным никак не отрубишь, а мне надо было что бы при первом нажатии включалось а при последующем выключалось, впринципе я этого добился но не четко работает ((

Mastino
Offline
Зарегистрирован: 03.12.2011

учится тебе лень вот и выходит так.. говорил же пройди все 5 уроков http://www.ladyada.net/learn/arduino/lesson1.html

blink977
Offline
Зарегистрирован: 20.01.2012

Mastino пишет:

учится тебе лень вот и выходит так.. говорил же пройди все 5 уроков http://www.ladyada.net/learn/arduino/lesson1.html

там нету ничего из того что мне надо ((

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

Mastino
Offline
Зарегистрирован: 03.12.2011

В тех пяти уроках есть ВСЕ, что тебе нужно.. а если лень то надо было покупать не arduino, a готовое решение - Start Engine button kit..

blink977
Offline
Зарегистрирован: 20.01.2012

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

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Готового решения по твоей проблеме тоже нет))) 

step962
Offline
Зарегистрирован: 23.05.2011

 Вам все же следует определиться. Или 

Цитата:

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

или

Цитата:

может в будущем мне захочется как то поменять программу управления. нет, готовое решение не для меня )))

Или готовое решение, или все же учить основы.

Еще вариант - заказывать доработку программы специалисту. Но это решение, видимо, тоже не для вас...

Diemon
Offline
Зарегистрирован: 18.11.2011

 blink977, прочитав последние сообщения темы я так понимаю, что у вас нечетко обрабатывается сигнал с кнопки? Если да, то взгляните в сторону использования прерывания: arduino.ru/Reference/AttachInterrupt. Это именно то,что вам нужно

whoim
Offline
Зарегистрирован: 03.11.2011

 Diemon, зачем? Не проще ли правильно написать программу? С этим прерыванием у него еще больше вопросов возникнет, его лучше оставить на будущее для внешних сигналов

whoim
Offline
Зарегистрирован: 03.11.2011

 blink977, кнопка у вас одна - значит и обработка должна быть также одна. То есть проверка на нажатие - одна! А уже в ней меняйте переменные типа boolean в зависимости от условий.

Например, если A and B то A = !A, B=!B. Если A и B==false то B=!B. То есть оперируйте переменными, а впоследствии вставьте блок обработки оных в рамках того же условия по проверке кнопки.

blink977
Offline
Зарегистрирован: 20.01.2012

привожу один из блоков моей программы, нажатие кнопки и включение ignition и start.

проблема в следующем: после включения ignition у меня пауза в 1000мск, затем включается start и должен остатся включенным пока не 3-я нога не разомкнется с массой, тоесть после размыкания 3-й ноги с массой, start должен отключится, что и не происходит, он все равно остается включенным. что не так? сигнал с генератора коротит 3-ю ногу на массу, так что я подключаю провод безо всяких резисторов.

#define btn 2   
#define ignition 6
#define start 7
#define gensigPin 3

int val;         
int val2;            
int buttonState;       
int genState;

int lightMode = 0;       

void setup() {
  pinMode(gensigPin, INPUT);
  pinMode(start, OUTPUT);
  pinMode(btn, INPUT);  
  pinMode(ignition, OUTPUT);
  buttonState = digitalRead(btn);  
  digitalWrite(gensigPin, HIGH);
}


void gen() {
          genState = digitalRead(gensigPin);
          if(genState == HIGH) {
          digitalWrite(start, LOW);
          }
          if(genState == LOW){
          digitalWrite(start, HIGH);
          }
}



void loop(){
  
  val = digitalRead(btn);   
  delay(1);             
  val2 = digitalRead(btn);    
  if (val == val2) {        
    if (val != buttonState) {        
      if (val == LOW) {                
        if (lightMode == 0) {        
          lightMode = 1;           
          {             
          digitalWrite(ignition, HIGH);
          delay(1000);
          gen();
          }
          } 
        else {
          lightMode = 0;               
          digitalWrite(ignition, LOW);
          
        }
      }
    }
    buttonState = val;  
    
    
}

}

         

  

 

step962
Offline
Зарегистрирован: 23.05.2011

blink977 пишет:

 сигнал с генератора коротит 3-ю ногу на массу, так что я подключаю провод безо всяких резисторов.

Вот это поясните пожалуйста  - получается, что на этом выводе у вас всегда LOW?

blink977
Offline
Зарегистрирован: 20.01.2012

не всегда, только в начале. на 3-ей ноге будет LOW пока не погаснет лампа зарядки, как только она погаснет start сразу же должен отрубится. вот этого то он не делает ((

blink977
Offline
Зарегистрирован: 20.01.2012

кто нибудь?

Mastino
Offline
Зарегистрирован: 03.12.2011

blink977 пишет:

кто нибудь?

это потому что у тебя неправильно подключен сигнал генератора, да и сам код фигня..
начинай с этого : http://www.ladyada.net/learn/arduino/starterpack.html
пройдя все уроки поймешь как правильно подключить и код нормальный написать

blink977
Offline
Зарегистрирован: 20.01.2012

итак, условия изменились. буду делать по заводскому:

1. вставил ключ в замок - включается ACC

2. нажимаем кнопку старт - включается только зажигание, двигатель не заводится

3. удерживаем педаль тормоза, нажимаем кнопку старт - включается зажигание и двигатель заводится

для этой цели я немного переделал код Mastino, надо его еще до ума довести.

        const int starbutton = 2;   
	const int gensigPin = 3;   
	const int ACCPin = 5;
        const int acc_check = 4;
	const int ignitionPin = 6;
	const int starterPin = 7;
	const int lockLed = 8;
	const int accLed = 9;
	const int ignitionLed = 10;
        const int brakePin = 11;

	long time = 0;
	long oldtime = 0;
	int buttonState = 0;
	int engineState = 0;
	int programState = 0;
	int acctime = 0;
	int brakeState = 0;
        int accState = 0;

	void setup() {
          pinMode(acc_check, INPUT);
          pinMode(brakePin, INPUT);
	  pinMode(gensigPin, INPUT);
	  pinMode(starbutton, INPUT);
	  pinMode(ACCPin, OUTPUT);
	  pinMode(ignitionPin, OUTPUT);
	  pinMode(starterPin, OUTPUT);
	  pinMode(lockLed, OUTPUT);
	  pinMode(accLed, OUTPUT);
	  pinMode(ignitionLed, OUTPUT);
	}
	 
	 
	void loop() {
        accState = digitalRead(acc_check);
        if(accState == HIGH){
        alloff();
        }
        else{
        acc();
        }
	if(programState == 0) {
	alloff();
	if((millis() - acctime) > 20000) {
	digitalWrite(lockLed, LOW);
	}
	digitalWrite(ignitionLed, LOW);
	digitalWrite(accLed, LOW);
	}
	 
	if(programState == 1) {
	motoron();
	digitalWrite(ignitionLed, HIGH);
	digitalWrite(accLed, LOW);
	digitalWrite(lockLed, LOW);
	}
	 
	if(programState == 2) {
	acc();
	digitalWrite(ignitionLed, LOW);
	digitalWrite(accLed, HIGH);
	digitalWrite(lockLed, LOW);
	}
	 
	if(programState == 3) {
	ignition();
	digitalWrite(ignitionLed, HIGH);
	digitalWrite(accLed, LOW);
	digitalWrite(lockLed, LOW);
	}
	engineState = digitalRead(gensigPin);
	buttonState = digitalRead(starbutton);
	if (buttonState == HIGH) {
	 time++;
	 delay(1);
	}
	if (buttonState == LOW) {
	pinguintime();
	}
	}
	 
	void pinguintime()
	{
	  if (programState == 1 || programState == 2 || programState == 3) {
	  if(time >= 5) {
	  acctime = millis();
	  digitalWrite(lockLed, HIGH);
	  programState = 0;
	  time = 0;
	}
	}
	  if (programState == 0) {
	  if(time >= 5 && time <= 400) {
	  oldtime = millis();
	  programState = 1;
	  time = 0;
	}
	}
	}
	 
	 
	void motoron()
	{
        brakeState = digitalRead(brakePin);
	digitalWrite(ignitionPin, HIGH);
	if((engineState == HIGH)&& (brakeState == HIGH)) {
	digitalWrite(starterPin, HIGH);
	if((millis() - oldtime) > 8000) {
	programState = 0;
	}
	}
	else
	{
	digitalWrite(starterPin, LOW);
	}
	  
	   
	   
	}
        
	   
	void acc()
	{
	digitalWrite(ACCPin, HIGH);
	digitalWrite(ignitionPin, LOW);
	digitalWrite(starterPin, LOW);
	}
	void ignition()
	{
	digitalWrite(ACCPin, HIGH);
	digitalWrite(ignitionPin, HIGH);
	digitalWrite(starterPin, LOW);
	}
	void alloff()
	{
	digitalWrite(ACCPin, LOW);
	digitalWrite(ignitionPin, LOW);
	digitalWrite(starterPin, LOW);
	}


 вопрос вот в чем: имитацию сигнала с генератора и педали тормоза я делаю с помощью кнопок в ключенных таким образом:

когда я буду ставить все это добро на машину, каким образом подключить допустим сигнал с генератора на ардуину?

blink977
Offline
Зарегистрирован: 20.01.2012

еще одно: нужна пауза в 1000мск между digitalWrite(ignition, HIGH) и digitalWrite(starter, HIGH) в процедуре motoron()

не могу понять куда вставить delay(1000); ?

Mastino
Offline
Зарегистрирован: 03.12.2011

blink977 пишет:

когда я буду ставить все это добро на машину, каким образом подключить допустим сигнал с генератора на ардуину?

делай через 12V реле, реле работает с "задержкой" - тебе именно это и нужно.

Mastino
Offline
Зарегистрирован: 03.12.2011

blink977 пишет:

еще одно: нужна пауза в 1000мск между digitalWrite(ignition, HIGH) и digitalWrite(starter, HIGH) в процедуре motoron()

не могу понять куда вставить delay(1000); ?

millis вставляй, delay блокирует весь код

blink977
Offline
Зарегистрирован: 20.01.2012

я так и думал что через реле, только вот все это громоздкое получается! я уже не знаю куда мне от этих проводов и кнопок дется ))

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

спасибо

Mastino
Offline
Зарегистрирован: 03.12.2011

blink977 пишет:

я так и думал что через реле, только вот все это громоздкое получается! я уже не знаю куда мне от этих проводов и кнопок дется ))

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

спасибо

реле есть разного размера.. 

дистанционный запуск я тоже делал на свой гольф..:) все работало хорошо, только датчик нейтральной скорости не как не мог придумать куда и как поставить...

blink977
Offline
Зарегистрирован: 20.01.2012

с нейтралкой я не буду парится, тем более что у меня механика, там просто некуда этот дачик ставить. если не будет поднят ручник, удаленный запуск не сработает и все!

blink977
Offline
Зарегистрирован: 20.01.2012

еще один ламерский вопрос, получится ли так:

допустим закончил я эту программу, жаль мне потом ардуину в машине оставлять! короче, снять с платы атмегу, засунуть в програматор, вычитать из атмеги бинарник с прошивкой, собрать плату на такой же атмеге, залить туда прошивку вычитанную из ардуины, и получить готовый девайс с реле, оптронами и так далее. получится?

Mastino
Offline
Зарегистрирован: 03.12.2011

если осилишь то можно..

blink977
Offline
Зарегистрирован: 20.01.2012

подскажите, как все таки millis() использовать?

Mastino
Offline
Зарегистрирован: 03.12.2011
blink977
Offline
Зарегистрирован: 20.01.2012

это я уже смотрел, но не разобрался как использовать в моем случае ((