Помогите с кодом : Как заменить delay

void longPressStart2() {

digitalWrite(MOTOR1, 0); delay(400);

digitalWrite(MOTOR2, 1); delay(5000); digitalWrite(MOTOR2, 0);

}

Реверс двигателя без концевиков стопа, параллельно выполняются другие действия. Как заменить delay.

3.2.1… картинка исчезает!
@alexshuv72 если хотите помощи, - вставьте код полностью, что бы любой мог его скомпилировать у себя. И не забудьте отформатироваться его, прежде чем выложить по правилам форума.

2 лайка

Читать про миллис. Долго читать, пока не дойдет. Иначе никак.

Форум не благотворительный кружок по бесплатному написанию кода для лентяев.

2 лайка

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

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

#define MOT1 11

#define MOT2 12

#define MOT3 10

#define ButtonPin_1 3

#define ButtonPin_2 2

#define ButtonPin_3 4

#include “OneButton.h”

OneButton button1(ButtonPin_1, true);

OneButton button2(ButtonPin_2, true);

OneButton button3(ButtonPin_3, true);

void setup() {

pinMode (MOT1, OUTPUT);

pinMode (MOT2, OUTPUT);

pinMode (MOT3, OUTPUT);

button1.attachLongPressStart(longPressStart1);

button2.attachLongPressStart(longPressStart2);

button3.attachLongPressStart(longPressStart3);

button1.setPressTicks(500);

button2.setPressTicks(50);

button3.setPressTicks(50);

button1.setClickTicks(500);

button2.setClickTicks(50);

button3.setClickTicks(50);

}

void loop() {

button1.tick();

button2.tick();

button3.tick();

}

void longPressStart1() { //вперед

digitalWrite(MOT1, 1);

}

void longPressStart2() { //назад

digitalWrite(MOT1, 0); delay(400);

digitalWrite(MOT2, 1); delay(5000); digitalWrite(MOT2, 0);

}

void longPressStart3() { //если не открылся

static int m = LOW;

m = !m;

digitalWrite(MOT3, m); digitalWrite(MOT1, 0); delay(400);

digitalWrite(MOT2, 1); delay(3000); digitalWrite(MOT2, 0);

}

Все просто я не программист решил сделать на авто открывание багажника с помощью линейного привода

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

замок хочу избавиться от delay пару дней боролся с милс но он меня пока побеждает не останавливается цикл видимо

чтото не допанимаю.

Это не главная проблема. Главная проблема в том, что Вы не умеете читать. А без этого умения … “милс всегда будет Вам побеждать!”

Вы вот это видели?

Так, какого ж …?

```
#define MOT1 11 
#define MOT2 12 
#define MOT3 10 


#define ButtonPin_1 3 
#define ButtonPin_2 2 
#define ButtonPin_3 4 


#include "OneButton.h" 
OneButton button1(ButtonPin_1, true); 
OneButton button2(ButtonPin_2, true);
OneButton button3(ButtonPin_3, true);

void setup() {

  pinMode (MOT1, OUTPUT);
  pinMode (MOT2, OUTPUT);
  pinMode (MOT3, OUTPUT); 

  button1.attachLongPressStart(longPressStart1); 
  button2.attachLongPressStart(longPressStart2);
  button3.attachLongPressStart(longPressStart3);
  
  button1.setPressTicks(500); 
  button2.setPressTicks(50);
  button3.setPressTicks(50);
  
  button1.setClickTicks(500); 
  button2.setClickTicks(50);
  button3.setClickTicks(50);

}


void loop() {
  button1.tick(); 
  button2.tick();
  button3.tick();

}



void longPressStart1() { //вперед
  digitalWrite(MOT1, 1); 
  

}
void longPressStart2() { //назад
  digitalWrite(MOT1, 0); delay(400);
  digitalWrite(MOT2, 1); delay(5000); digitalWrite(MOT2, 0);
  

}
void longPressStart3() { //если не открылся
  static int m = LOW;
  m = !m;
  digitalWrite(MOT3, m);  digitalWrite(MOT1, 0); delay(400);
  digitalWrite(MOT2, 1); delay(3000); digitalWrite(MOT2, 0);
  
}
```

Отлично. Спасибо за правильное оформление кода.
Только это не тот код.
Вы вставили код с делеями. А вам надо показать свои попытки заменить делеи на миллис

```

#define MOT2 11 // реверс
#define MOT3 12 // 
#define SENSOR A0
//#define RelayPin_1 5 // управление отрицательным "0"
//#define RelayPin_2 6 // управление отрицательным "0"
uint32_t tmr;  // переменная таймера
bool state;    // состояние таймера


#define ButtonPin_1 2 
#define ButtonPin_2 3 



#include "OneButton.h" 
OneButton button1(ButtonPin_1, true); 
OneButton button2(ButtonPin_2, true);
//OneButton button3(ButtonPin_3, true);
//unsigned long timing;

void setup() {
  Serial.begin(9600);
  //pinMode (AIN1, OUTPUT);
  pinMode (AIN2, OUTPUT);
  pinMode (AIN3, OUTPUT); 
 

  button1.attachLongPressStart(longPressStart1); 
  button2.attachLongPressStart(longPressStart2);
  //button3.attachLongPressStart(longPressStart3);
  
  button1.setPressTicks(50); 
  button2.setPressTicks(50);
  //button3.setPressTicks(100);
  
  button1.setClickTicks(50); 
  button2.setClickTicks(50);
  //button3.setClickTicks(100);
    // запустить таймер
    tmr = millis();
    state = true;



}


void loop() {
  button1.tick(); 
  button2.tick();
  //button3.tick();
    int val = analogRead(SENSOR);
  //Serial.println(val);
  if (val > 570) { 
    //digitalWrite(AIN1, 0); delay(4000); digitalWrite(AIN2, 0);
   
   }
    tmr = millis();
    state = true;

  
}





void longPressStart1() { //назад
  digitalWrite(MOT1, 1); //delay(4000);
  //digitalWrite(MOT2, 0); delay(5000); digitalWrite(MOT2, 0);
  

}
void longPressStart2() { 
  digitalWrite(MOT2, 0); 
   
      // включить светодиод
    digitalWrite(MOT, 1);



        if (state && millis() - tmr >= 3000) {
        // остановить таймер
        state = false;

        // выключить светодиод
        digitalWrite(MOT2, 0);
    }

    }
```
Это последний черновик с началом по току. Собираю на макетке с диодами.

Ваши функции longPressStart1() и longPressStart2() в коде нигде не вызываются. Каким образом вы предполагаете что-то будет работать?

внимательнее! Это коллбэки. стр 30 и 31

и объяснить человеку, как переделать коллбэки без делей будет ох как непросто… если он “не программист”. Но пробуйте! Совершенствуйте педагогический скилл! :wink:

ТС, дорогой. Колбэк переделать нельзя. МОжно вместо этого сделать так:
в колбэке ты только поднимаешь флаг. А в бесконечном цикле loop() ты проверяешь флаги и делаешь неблокирующие действия, как учат в примере “блинк без делей”.
Попробуй… если IQ трехзначный - должно получиться.
:wink: без обидок, бевакаша.

Точно. Я слепой

Прихожу в больницу говорю доктор болит голова

Доктор: как болит?

Я: сильно

Доктор: Где болит?

Я: везде

Доктор: как лечили?

Я: ни как

P.S. ЕСЛИ-БЫ Я БЫЛ ДОКТОРОМ Я В БОЛЬНИЦУ НЕ ПОШЁЛ-БЫ!!!

Поучать и ёрничать может каждый, а дать дельный совет навряд ли!!!

Я зашёл в раздел для новичков а не в Академию “королей программирования”!!!

А никто и не ерничал. Вам дали совет. Если вы его не поняли - переспросите.
Но не рассчитывайте, что кто-то напишет вам готовый код.
Тема миллис обсосана во всех учебниках и в примерах до безобразия, нужно только желание научиться.

2 лайка

я ж написал: без обид, пожалуйста!
Все точно тебе написал:

  1. в колбеках поднимаешь флаг.
  2. действие пишешь в лууп. неблокирующее.
    если непонятно - ну попроси ИИ написать пример.

вот тебе от ИИ приличный пример.
переменная flag допустим где-то поднимается… в каком-то колбеке.
У тебя, для отслеживания состояния чего-то, в данном примере светодиода, появляется еще одна переменная ledOn.
При поднятом флаге и выключенном объекте (тут можно еще одну проверку добавить) ты сбрасываешь внешний флаг, шоп потом второй раз не сработало, и поднимаешь внутренний.

НУ все ж понятно? Еще нет?

const int ledPin = 13;
bool flag = false;
bool ledOn = false;
unsigned long timer = 0;
const unsigned long delayTime = 1000; // 1 секунда

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // где-то в коде флаг может быть поднят, например в колбэке
  // flag = true;

  if (flag) {
    flag = false;          // сбросили, чтобы не повторялось
    ledOn = true;          // включаем
    digitalWrite(ledPin, HIGH);
    timer = millis();      // запоминаем момент включения
  }

  if (ledOn && millis() - timer >= delayTime) {
    digitalWrite(ledPin, LOW);
    ledOn = false;
  }
}

Код написан и представлен единственный недостаток что во время (delay) я не могу выполнить другие действия которыми хочу дополнить скетч:

ButtonPin_1 3 (-) с сигналки включается линейный привод толкает крышку багажника
ButtonPin_2 2  2команда(-) концевик который включает: стоп, пауза, реверс, отключение реверса
ButtonPin_3 4 3команда(-) доп канал с сигналки(если не сработал замок багажника и “ток превысил допустимое значение” в написании) стоп,пауза,реверс,отключение.
```
#define MOT1 11 
#define MOT2 12 
#define MOT3 10 


#define ButtonPin_1 3 
#define ButtonPin_2 2 
#define ButtonPin_3 4 


#include "OneButton.h" 
OneButton button1(ButtonPin_1, true); 
OneButton button2(ButtonPin_2, true);
OneButton button3(ButtonPin_3, true);

void setup() {

  pinMode (MOT1, OUTPUT);
  pinMode (MOT2, OUTPUT);
  pinMode (MOT3, OUTPUT); 

  button1.attachLongPressStart(longPressStart1); 
  button2.attachLongPressStart(longPressStart2);
  button3.attachLongPressStart(longPressStart3);
  
  button1.setPressTicks(500); 
  button2.setPressTicks(50);
  button3.setPressTicks(50);
  
  button1.setClickTicks(500); 
  button2.setClickTicks(50);
  button3.setClickTicks(50);

}


void loop() {
  button1.tick(); 
  button2.tick();
  button3.tick();

}



void longPressStart1() { //вперед
  digitalWrite(MOT1, 1); 
  

}
void longPressStart2() { //назад
  digitalWrite(MOT1, 0); delay(400);
  digitalWrite(MOT2, 1); delay(5000); digitalWrite(MOT2, 0);
  

}
void longPressStart3() { //если не открылся
  static int m = LOW;
  m = !m;
  digitalWrite(MOT3, m);  digitalWrite(MOT1, 0); delay(400);
  digitalWrite(MOT2, 1); delay(3000); digitalWrite(MOT2, 0);
  
}

Аминь!

1 лайк

Я предполагал что этого будет достаточно мне нужна пауза в коде.

Ну шо, православные! Спорить будем?

  1. понял ли ТС объяснения?
  2. Скажет ли “спасибо”?

Ваши ставки, господа!