Помогите с кнопкой

mixailovsky
Offline
Зарегистрирован: 23.08.2017

Прошу помощи с кнопкой запуска для авто,при нажатии получается какая-то ерунда со светодиодами,загораются как хотят.Запуск в одно нажатие вообще не происходит

вот скетч

/* Запуск двигателя автомобиля от кнопки "Start-Stop"*/
 
 
 
int ledzel=2; // светодиод зеленый (ACC)
int ledzol=3; // светодиод желтый (зажигание)
int ledred=4; // светодиод красный двс заведен 
int regim=1; // переменная для выбора нескольких режимов, типа что то выбора меню
int flag=0; // переменная состояния нажатия или отжатия кнопки
 
//-------------- для выполнения какого либо действия по истечению заданого времени после нажатия кнопки ---------------
//int valBut=0; // задаем переменную для счетчика
//long previousMillis=0; // зададим начальное значение счетчика millis
//long TimePush=200; // время нажатия на кнопку 500= 8секунд
//---------------------------------------------------------------------------------------------------------------------
 
//---------------мигание светодиода красного--------------------------------
int previousMillis1=0;
int interval1=40;
//--------------------------------------------------------------------------
 
//--------------- задержка для включеня стартера и ACC ---------------------
int previousMillis2=0;
int interval2=50;
//--------------------------------------------------------------------------
 
 
void setup()
{
pinMode(2, OUTPUT); // Светодиод статуса зеленый
pinMode(3, OUTPUT); // Светодиод статуса желтый
pinMode(4, OUTPUT); // Светодиод статуса красный
pinMode(6, INPUT); // Вход button (кнопка start-stop)(-)
pinMode(7, INPUT); // Вход педаль тормоза (+12V)
pinMode(8, INPUT); // Вход сигнал генератора (+)
pinMode(9, OUTPUT); // Выход ACC (Акссесуары)(+)
pinMode(10, OUTPUT); // Выход ING 1 (зажигание)(+)
pinMode(11, OUTPUT); // Выход ING 2 (зажигание)(+)
pinMode(12, OUTPUT); // Выход STARTER (стартер)(+)
}
 
//=============================== Начало основного кода программы ================================================== ===============
 
void loop()
{
 
/***** Сам код программы Авто и Ручного пуска ДВС *****/ 
 
if(digitalRead(6)==HIGH&&flag==0) // если кнопка нажата и переменная flag равна 0, то ....
{
if(digitalRead(7)==LOW) // "ТОРМОЗ" НЕ НАЖАТ
{
regim++; // это нужно для того что бы с каждым нажатием кнопки
flag=1; // происходило только одно действие
// плюс защита от дребезга 100%
 
if(regim>3) // ограничим количество режимов 
{
regim=1; // так как мы используем только одну кнопку,
// то переключать режимы будем циклично
}
}
}
//================================ Режим Автопуска ДВС ================================================== =
if(digitalRead(7)==HIGH&&digitalRead(3)==LOW) // если тормоз нажат и светодиод желтый не горит, то ...
{
statusredmig(); // мигание светодиода во время прокрутки стартера
start(); // включаем автопуск
regim=0; // обнуляем все режимы(отключаем ручной запуск)
//================================================== ================================================== ====
 
if(digitalRead(6)==LOW&&flag==1) // проверяем нажата ли кнопка если да, то ... см.ниже
{
flag=0; // обнуляем переменную "кнопка" 
 
if(regim==1) // первый режим
{
digitalWrite(9,LOW); // выключаем ACC
digitalWrite(10,LOW); // выключаем ING 1
digitalWrite(11,LOW); // выключаем ING 2
digitalWrite(12,LOW); // выключаем STARTER
digitalWrite(3,LOW); // выключить светодиод желтый
digitalWrite(4,LOW); // выключить светодиод красный
// ВСЕ ВЫКЛЮЧАЕМ
}
 
 
if(regim==2) // второй режим
{
digitalWrite(9,HIGH); // включаем ACC
}
if(regim==3) // третий режим
{
digitalWrite(10,HIGH); // включаем ING 1
digitalWrite(11,HIGH); // включаем ING 2
digitalWrite(3,HIGH); // включаем желтый светодиод
if(digitalRead(6)==HIGH&&digitalRead(3)==HIGH&&digitalRead(7)==HIGH&digitalRead(8)==LOW&flag==0) // если нажата кнопка, нажат "ТОРМОЗ",
{
digitalWrite(12,HIGH); // включаем стартер
digitalWrite(9,LOW); // выключаем ACC
}
 
if(digitalRead(6)==LOW) // проверяем отпушенна ли кнопка 
{
digitalWrite(12,LOW); // выключаем STARTER
digitalWrite(9,HIGH); // включаем ACC
}
 
}
/***** Конец кода программы Авто и Ручного пуска ДВС *****/
 
//====================================== Конец основного кода программы ================================================== ======
 
 
 
// ----------------------- Подпрограмма Автопуска ДВС, в одно касание кнопки -1----------------------------------------------
 
void start() // Подпрограмма запуска ДВС
{
 
if(digitalRead(6)==HIGH) // если кнопка нажата, то ....
{
digitalWrite(9,LOW); // выключаем acc
digitalWrite(10,HIGH); // включаем ing 1
digitalWrite(11,HIGH); // включаем ing 2
delay(50); // задержка перед пуском стартера
digitalWrite(12,HIGH); // включаем STARTER
}
 
if(digitalRead(8)==HIGH||digitalRead(7)==LOW) // если есть сигнал с генератор(+12V) или отпущенн тормоз
 
digitalWrite(12,LOW); // выключаем стартер
digitalWrite(ledred, HIGH); // включаем красный светодиод
// delay(50); // задержка на включение ACC
digitalWrite(9,HIGH); // включить ACC
 
}
//----------------------------------------------------------------------------1------------------------------------------
 
//------------------------------------------------2----------------------------------------------------------------------- 
/***** Подпрограмма для сработки кнопки или от чего нибудь,через заданное время *****/
 
/** void pushtime() 
{
if(digitalRead(7)==HIGH) // если педаль или кнопка или что то нажато-включенно, то 
{
if(millis()-previousMillis>=1)//&&digitalRead(6)==HIGH) // начинаем считать время нажатия
{
previousMillis=millis();
valBut++; // с каждой милисекундой увеличиваем значение valBut
}
else // если кнопку отпустили, то valBut становится равным 0
{ // это необходимо для защиты от срабатывания при частых
// и многократных нажатиях
valBut=0;
if(valBut>=TimePush) // как только значение valLed становиться равным TimtPush
{
regim=0;
// upr(); // запускаем третий режим, т.е. включаем зажигание
valBut=0; // устанавливаем valBut=0
}
} **/
//------------------------------------------------2------------------------------------------------------------------------
 
//-------------------------------Подпрограмма мигания красного светодиода в автопуске ----3--------------------------------
void statusredmig()
{
unsigned long currentMillis=millis();
if(currentMillis-previousMillis1>interval1&&digitalRead(7)==HIGH)
{
// сохраняем время последнго переключения
previousMillis1=currentMillis;
// если светодиод не горит, то зажигаем и наоборот
if(digitalRead(4)==LOW)
digitalWrite(4,HIGH); // включаем светодиод
else
digitalWrite(4,LOW); // выключаем светодиод
}
//---------------------------------------------------------------------------------------3---------------------------------
mixailovsky
Offline
Зарегистрирован: 23.08.2017

прошу помощи

b707
Offline
Зарегистрирован: 26.05.2017

код программы вставьте, как положено на форуме

mixailovsky
Offline
Зарегистрирован: 23.08.2017

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

mixailovsky
Offline
Зарегистрирован: 23.08.2017
/* Запуск двигателя автомобиля от кнопки "Start-Stop"*/
 
 
 
int ledzel=2; // светодиод зеленый (ACC)
int ledzol=3; // светодиод желтый (зажигание)
int ledred=4; // светодиод красный двс заведен 
int regim=1; // переменная для выбора нескольких режимов, типа что то выбора меню
int flag=0; // переменная состояния нажатия или отжатия кнопки
 
//-------------- для выполнения какого либо действия по истечению заданого времени после нажатия кнопки ---------------
//int valBut=0; // задаем переменную для счетчика
//long previousMillis=0; // зададим начальное значение счетчика millis
//long TimePush=200; // время нажатия на кнопку 500= 8секунд
//---------------------------------------------------------------------------------------------------------------------
 
//---------------мигание светодиода красного--------------------------------
int previousMillis1=0;
int interval1=40;
//--------------------------------------------------------------------------
 
//--------------- задержка для включеня стартера и ACC ---------------------
int previousMillis2=0;
int interval2=50;
//--------------------------------------------------------------------------
 
 
void setup()
{
pinMode(2, OUTPUT); // Светодиод статуса зеленый
pinMode(3, OUTPUT); // Светодиод статуса желтый
pinMode(4, OUTPUT); // Светодиод статуса красный
pinMode(6, INPUT); // Вход button (кнопка start-stop)(-)
pinMode(7, INPUT); // Вход педаль тормоза (+12V)
pinMode(8, INPUT); // Вход сигнал генератора (+)
pinMode(9, OUTPUT); // Выход ACC (Акссесуары)(+)
pinMode(10, OUTPUT); // Выход ING 1 (зажигание)(+)
pinMode(11, OUTPUT); // Выход ING 2 (зажигание)(+)
pinMode(12, OUTPUT); // Выход STARTER (стартер)(+)
}
 
//=============================== Начало основного кода программы ================================================== ===============
 
void loop()
{
 
/***** Сам код программы Авто и Ручного пуска ДВС *****/ 
 
if(digitalRead(6)==HIGH&&flag==0) // если кнопка нажата и переменная flag равна 0, то ....
{
if(digitalRead(7)==LOW) // "ТОРМОЗ" НЕ НАЖАТ
{
regim++; // это нужно для того что бы с каждым нажатием кнопки
flag=1; // происходило только одно действие
// плюс защита от дребезга 100%
 
if(regim>3) // ограничим количество режимов 
{
regim=1; // так как мы используем только одну кнопку,
// то переключать режимы будем циклично
}
}
}
//================================ Режим Автопуска ДВС ================================================== =
if(digitalRead(7)==HIGH&&digitalRead(3)==LOW) // если тормоз нажат и светодиод желтый не горит, то ...
{
statusredmig(); // мигание светодиода во время прокрутки стартера
start(); // включаем автопуск
regim=0; // обнуляем все режимы(отключаем ручной запуск)
} 
//================================================== ================================================== ====
 
if(digitalRead(6)==LOW&&flag==1) // проверяем нажата ли кнопка если да, то ... см.ниже
{
flag=0; // обнуляем переменную "кнопка" 
} 
 
if(regim==1) // первый режим
{
digitalWrite(9,LOW); // выключаем ACC
digitalWrite(10,LOW); // выключаем ING 1
digitalWrite(11,LOW); // выключаем ING 2
digitalWrite(12,LOW); // выключаем STARTER
digitalWrite(3,LOW); // выключить светодиод желтый
digitalWrite(4,LOW); // выключить светодиод красный
// ВСЕ ВЫКЛЮЧАЕМ
}
 
 
if(regim==2) // второй режим
{
digitalWrite(9,HIGH); // включаем ACC
}
if(regim==3) // третий режим
{
digitalWrite(10,HIGH); // включаем ING 1
digitalWrite(11,HIGH); // включаем ING 2
digitalWrite(3,HIGH); // включаем желтый светодиод
if(digitalRead(6)==HIGH&&digitalRead(3)==HIGH&&digitalRead(7)==HIGH&digitalRead(8)==LOW&flag==0) // если нажата кнопка, нажат "ТОРМОЗ",
{
digitalWrite(12,HIGH); // включаем стартер
digitalWrite(9,LOW); // выключаем ACC
}
 
if(digitalRead(6)==LOW) // проверяем отпушенна ли кнопка 
{
digitalWrite(12,LOW); // выключаем STARTER
digitalWrite(9,HIGH); // включаем ACC
}
 
}
/***** Конец кода программы Авто и Ручного пуска ДВС *****/
 
//====================================== Конец основного кода программы ================================================== ======
 
} 
 
 
// ----------------------- Подпрограмма Автопуска ДВС, в одно касание кнопки -1----------------------------------------------
 
void start() // Подпрограмма запуска ДВС
{
 
if(digitalRead(6)==HIGH) // если кнопка нажата, то ....
{
digitalWrite(9,LOW); // выключаем acc
digitalWrite(10,HIGH); // включаем ing 1
digitalWrite(11,HIGH); // включаем ing 2
delay(50); // задержка перед пуском стартера
digitalWrite(12,HIGH); // включаем STARTER
}
 
if(digitalRead(8)==HIGH||digitalRead(7)==LOW) // если есть сигнал с генератор(+12V) или отпущенн тормоз
 
{ 
digitalWrite(12,LOW); // выключаем стартер
digitalWrite(ledred, HIGH); // включаем красный светодиод
// delay(50); // задержка на включение ACC
digitalWrite(9,HIGH); // включить ACC
 
} 
}
//----------------------------------------------------------------------------1------------------------------------------
 
//------------------------------------------------2----------------------------------------------------------------------- 
/***** Подпрограмма для сработки кнопки или от чего нибудь,через заданное время *****/
 
/** void pushtime() 
{
if(digitalRead(7)==HIGH) // если педаль или кнопка или что то нажато-включенно, то 
{
if(millis()-previousMillis>=1)//&&digitalRead(6)==HIGH) // начинаем считать время нажатия
{
previousMillis=millis();
valBut++; // с каждой милисекундой увеличиваем значение valBut
} 
}
else // если кнопку отпустили, то valBut становится равным 0
{ // это необходимо для защиты от срабатывания при частых
// и многократных нажатиях
valBut=0;
} 
if(valBut>=TimePush) // как только значение valLed становиться равным TimtPush
{
regim=0;
// upr(); // запускаем третий режим, т.е. включаем зажигание
valBut=0; // устанавливаем valBut=0
}
} **/
//------------------------------------------------2------------------------------------------------------------------------
 
//-------------------------------Подпрограмма мигания красного светодиода в автопуске ----3--------------------------------
void statusredmig()
{
unsigned long currentMillis=millis();
if(currentMillis-previousMillis1>interval1&&digitalRead(7)==HIGH)
{
// сохраняем время последнго переключения
previousMillis1=currentMillis;
// если светодиод не горит, то зажигаем и наоборот
if(digitalRead(4)==LOW)
digitalWrite(4,HIGH); // включаем светодиод
else
digitalWrite(4,LOW); // выключаем светодиод
} 
}
//---------------------------------------------------------------------------------------3---------------------------------
Верх

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

И почему мне кажется, что я не первый раз вижу этот код на форуме? ;)

Где скомуниздил код, туда и стоит обратится, нет? Ну или внятно пиши, что и как у тебя не работает.

mixailovsky
Offline
Зарегистрирован: 23.08.2017
const int STARTERPin = 12;
 
int STARTERState = LOW; // состояние светодиода: ВКЛ/ВЫКЛ
long previousMillis = 0; // время, когда состояние светодиода обновлялось
 
long interval = 3000; // половина периода мигания (в миллисекундах)
 


int regim=1; // переменная для выбора нескольких режимов, типа что то выбора меню
int flag=0; // переменная состояния нажатия или отжатия кнопки

//-------------- для выполнения какого либо действия по истечению заданого времени после нажатия кнопки ---------------
int val=0; // задаем переменную для счетчика
//long previousMillis=0; // зададим начальное значение счетчика millis
long TimePush=200; // время нажатия на кнопку 500= 8секунд
//---------------------------------------------------------------------------------------------------------------------


//--------------------------------------------------------------------------

//--------------- задержка для включеня стартера и ACC ---------------------
int previousMillis2=0;
int interval2=50;
//--------------------------------------------------------------------------


void setup()
{
pinMode(6, INPUT); // Вход button (кнопка start-stop)(-)
pinMode(7, INPUT); // Вход педаль тормоза (+12V)
pinMode(8, INPUT); // Вход сигнал генератора (+)
pinMode(9, OUTPUT); // Выход ACC (Акссесуары)(+)
pinMode(10, OUTPUT); // Выход ING 1 (зажигание)(+)
pinMode(11, OUTPUT); // Выход ING 2 (зажигание)(+)
pinMode(12, OUTPUT); // Выход STARTER (стартер)(+)
}

//=============================== Начало основного кода программы ================================================== ===============

void loop()
{

/***** Сам код программы Авто и Ручного пуска ДВС *****/ 

if(digitalRead(6)==HIGH&&flag==0) // если кнопка нажата и переменная flag равна 0, то ....
{
if(digitalRead(7)==LOW) // "ТОРМОЗ" НЕ НАЖАТ
{
regim++; // это нужно для того что бы с каждым нажатием кнопки
flag=1; // происходило только одно действие
// плюс защита от дребезга 100%

if(regim>3) // ограничим количество режимов 
{
regim=1; // так как мы используем только одну кнопку,
// то переключать режимы будем циклично
}
}
}
//================================ Режим Автопуска ДВС ================================================== =
if(digitalRead(7)==HIGH) // если тормоз нажат и светодиод желтый не горит, то ...
{
start(); // включаем автопуск
regim=0; // обнуляем все режимы(отключаем ручной запуск)
} 
//================================================== ================================================== ====

if(digitalRead(6)==LOW&&flag==1) // проверяем нажата ли кнопка если да, то ... см.ниже
{
flag=0; // обнуляем переменную "кнопка" 
} 

if(regim==1) // первый режим
{
digitalWrite(9,LOW); // выключаем ACC
digitalWrite(10,LOW); // выключаем ING 1
digitalWrite(11,LOW); // выключаем ING 2
digitalWrite(12,LOW); // выключаем STARTER
digitalWrite(3,LOW); // выключить светодиод желтый
digitalWrite(4,LOW); // выключить светодиод красный
// ВСЕ ВЫКЛЮЧАЕМ
}


if(regim==2) // второй режим
{
digitalWrite(9,HIGH); // включаем ACC
}
if(regim==3) // третий режим
{
digitalWrite(10,HIGH); // включаем ING 1
digitalWrite(11,HIGH); // включаем ING 2
if(digitalRead(6)==HIGH&&digitalRead(7)==HIGH&flag==0) // если нажата кнопка, нажат "ТОРМОЗ",
{
digitalWrite(12,HIGH); // включаем стартер
digitalWrite(9,LOW); // выключаем ACC
}

if(digitalRead(6)==LOW) // проверяем отпушенна ли кнопка 
{
digitalWrite(12,LOW); // выключаем STARTER
digitalWrite(9,HIGH); // включаем ACC
}

}
/***** Конец кода программы Авто и Ручного пуска ДВС *****/

//====================================== Конец основного кода программы ================================================== ======

} 


// ----------------------- Подпрограмма Автопуска ДВС, в одно касание кнопки -1----------------------------------------------

void start() // Подпрограмма запуска ДВС
{
if(digitalRead(6)==HIGH) // если кнопка нажата, то ....
{    
digitalWrite(9,LOW); // выключаем acc
digitalWrite(10,HIGH); // включаем ing 1
digitalWrite(11,HIGH); // включаем ing 2
delay(2000);                                            // КАК В ЭТОМ МЕСТЕ ЗАМЕНИТЬ DELAY на Millis
digitalWrite(12,HIGH);//  включаем стартер
delay(2000);                                                     // КАК В ЭТОМ МЕСТЕ ЗАМЕНИТЬ DELAY на Millis
if(digitalRead(7)==LOW) // если есть сигнал с генератор(+12V) или отпущенн тормоз
{ 
  digitalWrite(12,LOW); // выключаем стартер
  digitalWrite(9,HIGH); // включаем acc
}
}
}
//------------------------------------------------2----------------------------------------------------------------------- 
/***** Подпрограмма для сработки кнопки или от чего нибудь,через заданное время *****/

 void pushtime() 
{
if(digitalRead(7)==HIGH) // если педаль или кнопка или что то нажато-включенно, то 
{
if(millis()-previousMillis>=1)//&&digitalRead(6)==HIGH) // начинаем считать время нажатия
{
previousMillis=millis();
val++; // с каждой милисекундой увеличиваем значение valBut
} 
}
else // если кнопку отпустили, то valBut становится равным 0
{ // это необходимо для защиты от срабатывания при частых
// и многократных нажатиях
val=0;
} 
if(val>=TimePush) // как только значение valLed становиться равным TimtPush
{
regim=0;
// upr(); // запускаем третий режим, т.е. включаем зажигание
val=0; // устанавливаем valBut=0
}
}
//------------------------------------------------2------------------------------------------------------------------------

Код действительно изначально не мой,проблема в том что во-первых не могу избавиться от делай,вернее заменить делай на миллис,во-вторых проблема с третим режимом,если по-условию тормоз не нажат,одно нажатие включился АСС,второе нажатие включилось ING1 ING2,то по условию если нажата педаль тормоза и нажать кнопку третий раз и не отпускать то должен работать стартер пока не будет отпущена кнопка,именно этого и не происходит а получается что сразу перескакивает в режим автопуска,то есть если я нажимаю кнопку в третий раз,нажимаю педаль тормоза,держу кнопку секунд 6 то при отпускании либо кнопки либо педали тормоза ничего не происходит и стартер продолжает работать еще пару секунд,я так понимаю что это видимо delay мне мешает,заранее благодарен 

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

По поводу Автостарта попробуйте так

void start() // Подпрограмма запуска ДВС
{
  if (digitalRead(6) == HIGH) // если кнопка нажата, то ....
  {
    digitalWrite(9, LOW); // выключаем acc
    digitalWrite(10, HIGH); // включаем ing 1
    digitalWrite(11, HIGH); // включаем ing 2
    delay(2000);  // В ЭТОМ МЕСТЕ я думаю - можно оставить
    digitalWrite(12, HIGH); //  включаем стартер
//Меняем
    uint32_t timeTemp = millis();
    while (millis() - timeTemp < 2000) {
      if (digitalRead(7) == LOW) // если есть сигнал с генератор(+12V) или отпущенн тормоз
      {
        digitalWrite(12, LOW); // выключаем стартер
        digitalWrite(9, HIGH); // включаем acc
        break;
      }
    }
  }
}

 

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

Хотя не понятно вот здесь

 if (digitalRead(7) == HIGH) // если тормоз нажат и светодиод желтый не горит, то ...
  {
    start(); // включаем автопуск
    regim = 0; // обнуляем все режимы(отключаем ручной запуск)
  }
нажав на тормоз Вы запускаете "автостарт"
 
А как по мне то должно быть
if (digitalRead(7) == HIGH && digitalRead(6) == HIGH) // если тормоз нажат и кнопка СТАРТ
    regim = 0; // обнуляем все режимы(отключаем ручной запуск)
    start(); // включаем автопуск
  }

 

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

Что означает строчка 94

 if (digitalRead(6) == HIGH && digitalRead(7) == HIGH & flag == 0) // если нажата кнопка, нажат "ТОРМОЗ",

Может надо

 if (digitalRead(6) == HIGH && digitalRead(7) == HIGH && flag == 0) // если нажата кнопка, нажат "ТОРМОЗ",

Но мне кажется что можно и так

 if (digitalRead(6) == HIGH && digitalRead(7) == HIGH) // если нажата кнопка, нажат "ТОРМОЗ",