Помогите с кнопкой
- Войдите на сайт для отправки комментариев
Ср, 23/08/2017 - 15:44
Прошу помощи с кнопкой запуска для авто,при нажатии получается какая-то ерунда со светодиодами,загораются как хотят.Запуск в одно нажатие вообще не происходит
вот скетч
/* Запуск двигателя автомобиля от кнопки "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---------------------------------
прошу помощи
код программы вставьте, как положено на форуме
простите я новичек в этом,как следует правильно вставлять скетч?
/* Запуск двигателя автомобиля от кнопки "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--------------------------------- ВерхИ почему мне кажется, что я не первый раз вижу этот код на форуме? ;)
Где скомуниздил код, туда и стоит обратится, нет? Ну или внятно пиши, что и как у тебя не работает.
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 мне мешает,заранее благодарен
По поводу Автостарта попробуйте так
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; } } } }Хотя не понятно вот здесь
if (digitalRead(7) == HIGH && digitalRead(6) == HIGH) // если тормоз нажат и кнопка СТАРТ regim = 0; // обнуляем все режимы(отключаем ручной запуск) start(); // включаем автопуск }Что означает строчка 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) // если нажата кнопка, нажат "ТОРМОЗ",