добавить паузу в цикле без delay

typoy
Offline
Зарегистрирован: 31.05.2018
const int ledPin_1 = 3;     //номер пина
unsigned long next_time_1;  // время включения
long timeout_1 = 1000;      // половина периода
long led_state_1 = 1;       // начальное состояние - 1 включен


void setup() {
  pinMode(ledPin_1, OUTPUT);
 digitalWrite(ledPin_1, led_state_1); // гасим led 1
  next_time_1 = millis() + timeout_1; // вычисляем время следующего переключения

}

void loop() {
  long now_time = millis(); // текущее время millis функция таймера
  if ( now_time >= next_time_1 ) {       // если текущее время превысило намеченное время, то
    next_time_1 = now_time + timeout_1;  // вычисляем время следующего переключения.
    led_state_1 = !led_state_1;          // меняем состояние на противоположное
    digitalWrite(ledPin_1, led_state_1); // зажигаем или гасим светодиод
  }


}

// как мне добавить паузу, светодиод горит 1 сек, 10сек, не горит. Помогите пожаоуйста 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вопрос о том как добавить паузу упирается в то, для чего её добавлять. От этого зависит как это делать.

Поэтому объясните пожалуйста:

1) чем Вас не устраивает delay?

2) что должно делаться во время паузы, ради чего она "безделэйная"?

Кстати, при таком коде, как у Вас, будут проблема с переполнением значения millis

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
unsigned long mill;
//----------------------
const int led1Pin = /*номер пина*/13;     //
bool led = 1;       // начальное состояние - 1 включен
const bool LedON = LOW; /*уровень вкл светодиода*/
const unsigned long timeON = 100; // время включения 1 сек
const unsigned long timeOFF = 1000; // время выключения 10 сек
unsigned long past;
void led1init() {/*поместить в setup()*/
  pinMode(led1Pin, OUTPUT);
  past = millis();
  digitalWrite(led1Pin, led = !LedON);
}
void led1run() {/*поместить в loop()*/
  if ( led == !LedON && mill - past >= timeON ) {
    past = mill;
    digitalWrite(led1Pin, led = LedON);
  }
  if ( led == LedON  && mill - past >= timeOFF ) {
    past = mill;
    digitalWrite(led1Pin, led = !LedON);
  }
}
//-----main()----------------------------------------
void setup() {
  led1init();
}
void loop() {
  mill = millis();
  led1run();
}
/*Скетч использует 1004 байт (3%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 19 байт (0%) динамической памяти, оставляя 2029 байт для локальных переменных. Максимум: 2048 байт.
*/

 

typoy
Offline
Зарегистрирован: 31.05.2018

мне надо, что бы  параллельно, другие Пины работали, без Delay

led 1 горит 1сек, -пауза 5сек.

2) что должно делаться во время паузы, ради чего она "безделэйная"? ничего не должно делаться просто off

снова горит 1 сек. между горением, пауза  5 сек , как еще объяснить я не знаю.

одну 1 секунду горит, 5 секунд не горит без   delay

typoy
Offline
Зарегистрирован: 31.05.2018

без delay,   чтобы другие пины работали асинхронно 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
unsigned long mill;
//----------------------
class Cl_Led {
  protected:
    int pin ;
    bool led;
    const bool LedON = LOW; /*уровень вкл светодиода*/
    unsigned long timeON = 100; // время включения 1 сек
    unsigned long timeOFF = 1000; // время выключения 10 сек
    unsigned long past;
  public:
    Cl_Led(int p, unsigned long t1, unsigned long t2): pin(p), timeON(t1), timeOFF(t2) {}
    void init() {/*поместить в setup()*/
      pinMode(pin, OUTPUT);
      past = millis();
      digitalWrite(pin, led = !LedON);
    }
    void run() {/*поместить в loop()*/
      if ( led == !LedON && mill - past >= timeON ) {
        past = mill;
        digitalWrite(pin, led = LedON);
      }
      if ( led == LedON  && mill - past >= timeOFF ) {
        past = mill;
        digitalWrite(pin, led = !LedON);
      }
    }
};
//----------------------------------------------
Cl_Led led1(/*пин*/2,/*время вкл*/500,/*время выкл*/500);
Cl_Led led2(/*пин*/3,/*время вкл*/800,/*время выкл*/100);
Cl_Led led3(/*пин*/13,/*время вкл*/400,/*время выкл*/700);
//-----main()----------------------------------------
void setup() {
  led1.init();
  led2.init();
  led3.init();
}
void loop() {
  mill = millis();
  led1.run();
  led2.run();
  led3.run();
}
/*Скетч использует 1278 байт (4%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 61 байт (2%) динамической памяти, оставляя 1987 байт для локальных переменных. Максимум: 2048 байт.
*/

 

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

typoy пишет:

одну 1 секунду горит, 5 секунд не горит без   delay

у вас выше в скетче уже есть "пауза без делей" на 1 секунду.Так добавьте ниже точно такую же на 5 секунд и все...

Как еще обьяснить - я не знаю. Писать код за вас мне лень.

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

ник какбэ намекает.....

vvadim
Offline
Зарегистрирован: 23.05.2012
1 сек горит, 5 не горит

#define Led_Pin 13

void flashing(int time_on, int time_off )
{
  static bool state = 0;
  static unsigned long time = 0;
  if ((millis() - time)  > (state ? time_on : time_off))
  {
  state = !state;
  digitalWrite(Led_Pin, state);
  time = millis();
  }
}

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

void loop()
{
  flashing(1000, 5000);
}

 

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

Элементарнейшая задача для моих таймеров. Светлодиот 1 секунду горит, 10 - не горит.  И весь loop() свободен... 

#include "TTimerList.h"
#include "TLed.h"

extern TTimerList TimerList;

const uint32_t OFF_INTERVAL = 10000;
const uint32_t ON_INTERVAL = 1000;

TLed OutLed(13);

THandle hBlinkTimer;

void tmrBlink(void) {

	enDeviceState state = OutLed.getState();

	TimerList.NewInterval(hBlinkTimer, state == enDeviceState::On ? OFF_INTERVAL : ON_INTERVAL);

	OutLed.Toggle();
}

void setup() {

	OutLed.On();

	hBlinkTimer = TimerList.Add(ON_INTERVAL, tmrBlink);

}

void loop()
{


}

 

 

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

Занимает, правда, 3884 байта флэш и 360 АЗУ.  :)