Как избавиться от проклятого delay

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

Помогите избавиться в скетче от 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------------------------------------------------------------------------

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Просто не используй его и все. :-)

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

Ты гений,имел ввиду заменить на миллис,подскажи если знаешь

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Если никто не сподобится, то завтра. Седня лень. И вотка степлица.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вы внимательно изучите этот скетч.

/**/
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 байт.
*/

А потом составьте ТЗ на программу. Ковырятся в коде, который непонятно что делает нет желания.

Alexandsvoi
Offline
Зарегистрирован: 11.07.2017

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

 

Alexandsvoi
Offline
Зарегистрирован: 11.07.2017

весь код приводит не буду, только в объеме необходимом для тебя .

// для таймера
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;

 

Alexandsvoi
Offline
Зарегистрирован: 11.07.2017

не разбереешься - пиши.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну мой вариант такой #140