добавить паузу в цикле без delay
- Войдите на сайт для отправки комментариев
Чт, 31/05/2018 - 16:17
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сек, не горит. Помогите пожаоуйста
Вопрос о том как добавить паузу упирается в то, для чего её добавлять. От этого зависит как это делать.
Поэтому объясните пожалуйста:
1) чем Вас не устраивает delay?
2) что должно делаться во время паузы, ради чего она "безделэйная"?
Кстати, при таком коде, как у Вас, будут проблема с переполнением значения millis
/**/ 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 байт. */мне надо, что бы параллельно, другие Пины работали, без Delay
led 1 горит 1сек, -пауза 5сек.
2) что должно делаться во время паузы, ради чего она "безделэйная"? ничего не должно делаться просто off
снова горит 1 сек. между горением, пауза 5 сек , как еще объяснить я не знаю.
одну 1 секунду горит, 5 секунд не горит без delay
без delay, чтобы другие пины работали асинхронно
/**/ 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 байт. */одну 1 секунду горит, 5 секунд не горит без delay
у вас выше в скетче уже есть "пауза без делей" на 1 секунду.Так добавьте ниже точно такую же на 5 секунд и все...
Как еще обьяснить - я не знаю. Писать код за вас мне лень.
ник какбэ намекает.....
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); }Элементарнейшая задача для моих таймеров. Светлодиот 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() { }Занимает, правда, 3884 байта флэш и 360 АЗУ. :)