Как избавиться от проклятого delay
- Войдите на сайт для отправки комментариев
Ср, 23/08/2017 - 16:53
Помогите избавиться в скетче от delay
/* Запуск двигателя автомобиля от кнопки "Start-Stop"*/
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); // выключаем стартер
// delay(50); // задержка на включение ACC
digitalWrite(9,HIGH); // включить ACC
}
}
//----------------------------------------------------------------------------1------------------------------------------
//------------------------------------------------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------------------------------------------------------------------------
Просто не используй его и все. :-)
Ты гений,имел ввиду заменить на миллис,подскажи если знаешь
Если никто не сподобится, то завтра. Седня лень. И вотка степлица.
Вы внимательно изучите этот скетч.
/**/ unsigned long mill;//переменная millis() //---------Cl_Led------------------------------------------------- // класс светодиод class Cl_Led { const byte pin; const bool inv; unsigned long time, past; bool statBlink = 0; bool led; public: /*конструктор Cl_Led описание создать объект ввод _pin: нога _inv: инверсия выхода вывод нет */ Cl_Led(byte _pin, bool _inv) : pin(_pin), inv(_inv) {} /*функция setup описание иницилизация ввод нет вывод нет */ void setup() { pinMode(pin, OUTPUT); OFF(); } /*функция loop описание для нормальной работы вставить в тело loop() ввод нет вывод нет */ void loop() { if (statBlink && mill - past > time) { past = mill; digitalWrite(pin, led = !led); } } /*функция ON описание включить светодиод ввод нет вывод нет */ void ON() { digitalWrite(pin, led = !inv); statBlink = 0; } /*функция OFF описание выключить светодиод ввод нет вывод нет */ void OFF() { digitalWrite(pin, led = inv); statBlink = 0; } /*функция blink описание мигать светодиодом ввод _time; время полупериода мигания вывод нет */ void blink(unsigned long _time = 200) { time = _time; statBlink = 1; digitalWrite(pin, led = !led); } }; //---------Cl_Btn------------------------------------------------- // класс светодиод class Cl_Btn { const byte pin; void (*Do)(); bool btn, oldBtn = 1; bool bounce = 0; unsigned long past; public: /*конструктор Cl_Btn описание создать объект ввод _pin: нога _inv: инверсия выхода вывод нет */ Cl_Btn(byte _pin, void (_Do)()): pin(_pin), Do(_Do) {} /*функция setup описание иницилизация ввод нет вывод нет */ void setup() { pinMode(pin, INPUT); btn = digitalRead(pin); } /*функция loop описание для нормальной работы вставить в тело loop() ввод нет вывод нет */ void loop() { bool newBtn = digitalRead(pin); if (bounce && newBtn != btn) { bounce = 1; } if (!bounce && mill - past >= 10) { past = mill; bounce = 0; oldBtn = btn; btn = newBtn; if (!btn && oldBtn) (*Do)(); } } }; //-----Компоновка----------------------------------------------------- Cl_Led Led(/*пин*/13,/*инверсия*/0); void Do_Btn1() { Led.ON(); } Cl_Btn Btn1(/*пин*/2,/*обработчик*/Do_Btn1); void Do_Btn2() { Led.OFF(); } Cl_Btn Btn2(/*пин*/3,/*обработчик*/Do_Btn2); void Do_Btn3() { Led.blink(300); } Cl_Btn Btn3(/*пин*/4,/*обработчик*/Do_Btn3); //----main()----------------------------------------------------- void setup() { Led.setup(); Btn1.setup(); Btn2.setup(); Btn3.setup(); } void loop() { mill = millis(); Led.loop(); Btn1.loop(); Btn2.loop(); Btn3.loop(); } /*Скетч использует 1532 байт (4%) памяти устройства. Всего доступно 32256 байт. Глобальные переменные используют 55 байт (2%) динамической памяти, оставляя 1993 байт для локальных переменных. Максимум: 2048 байт. */А потом составьте ТЗ на программу. Ковырятся в коде, который непонятно что делает нет желания.
я использую таймера вместо delay, в этом случае программа не зависает и выполняется дальше, актульано еще ?
весь код приводит не буду, только в объеме необходимом для тебя .
// для таймера unsigned long currentTime; unsigned long loopTime; int loop_flag; case 3: { // ОТКРЫВАЕМ ШЛАГБАУМ currentTime = millis(); // считываем текущее время для таймера if (loop_flag==0){ loopTime = currentTime; loop_flag =1; FLAG_SCHLAGBAUM_OPENED = 1; digitalWrite(PIN_OPEN_TOR, LOW); } if(currentTime >= (loopTime + 1000)){ digitalWrite(PIN_OPEN_TOR, HIGH); loop_flag =0; automat_state = 4; } break;не разбереешься - пиши.
Ну мой вариант такой #140