Да потому что я не знаю как по другому воздействовать на светодиод. У меня получается зажечь его по таймеру или погасить но как ему указать сколько раз это повторить не понимаю.
Заведите переменную-счетчик. После окончания каждой вспышки светодиода увеличивайте значение этого счетчика. Если счетчик дотикал до нужного значения - переставайте теребить светодиод.
Megakoteyka, у человека другая проблема. Несколько светодиодов нужно гасить и зажигать асинхронно. Прочитайте ветку сначала, включая примеры кода.
С точки зрения дилетанта.. Флаги, счетчик Код (Text): #define RED_PIN 6 #define PIN_BTN_START 5 #define LED_SLEEP 0 #define LED_READY 1 #define LED_ON 2 #define LED_OFF 3 #define LED_DELAY 4 // пауза перед работой после старта unsigned long next_red = 200; // длительность свечения unsigned long ligth_time_red = 500; // количество сколько раз мигнуть byte Pulse_red = 2; // будет регулироваться от 1 до 5 byte red_i = 1; // счетчик //интервал между миганием unsigned long pulseIntervalRed = 100; // задержка между импульсами boolean prevBtnState = false; byte redLedState = LED_SLEEP; unsigned long redLedTimer = 0; void setup() { pinMode(RED_PIN, OUTPUT); digitalWrite(RED_PIN, LOW); pinMode(PIN_BTN_START, INPUT); } void loop(){ boolean btnState = digitalRead(PIN_BTN_START); if(btnState && !prevBtnState && redLedState == LED_SLEEP){ redLedState = LED_DELAY; redLedTimer = millis(); } if(redLedState == LED_DELAY && millis() - redLedTimer > next_red){ redLedState = LED_READY; } if(redLedState == LED_READY ){ digitalWrite(RED_PIN, HIGH); redLedState = LED_ON; redLedTimer = millis(); } if(redLedState == LED_ON && millis() - redLedTimer > ligth_time_red){ digitalWrite(RED_PIN, LOW); redLedState = LED_OFF; redLedTimer = millis(); } if(redLedState == LED_OFF && millis() - redLedTimer > pulseIntervalRed){ red_i++; if(red_i > Pulse_red){ redLedState = LED_SLEEP; red_i = 1; }else{ redLedState = LED_READY; } } prevBtnState = btnState; }
Читал. В самом начале шла речь о том, что их нужно не только асинхронно теребить, но и для каждого светодиода должно быть задано количество вспышек, после которого все должно закончиться. Если я все правильно понял.
Да, я тоже так понял. Предложил в цикле вычислять флаги включения светодиодов как функции времени и по ним уже теребить светодиоды.
в продолжение моргаем асинхронно 3 светодиодами Код (Text): #define RED_PIN 6 #define GREEN_PIN 7 #define BLUE_PIN 8 #define PIN_BTN_START 5 enum { LED_SLEEP, LED_READY, LED_ON, LED_OFF, LED_DELAY}; struct MyLed { // пауза перед работой после старта unsigned long next; // длительность свечения unsigned long ligth_time; // количество сколько раз мигнуть byte Pulse; // будет регулироваться от 1 до 5 byte i; //счетчик //интервал между миганием unsigned long pulseInterval; // задержка между импульсами byte state; //состояние светодиода unsigned long timer; //таймер byte pin; //пин светодиода }; MyLed redLed, greenLed, blueLed; boolean prevBtnState = false; void setup(){ redLed.next = 200; redLed.ligth_time = 500; redLed.Pulse = 5; redLed.i = 1; redLed.pulseInterval = 100; redLed.state = LED_SLEEP; redLed.timer = 0; redLed.pin = RED_PIN; greenLed.next = 2000; greenLed.ligth_time = 500; greenLed.Pulse = 10; greenLed.i = 1; greenLed.pulseInterval = 700; greenLed.state = LED_SLEEP; greenLed.timer = 0; greenLed.pin = GREEN_PIN; blueLed.next = 3000; blueLed.ligth_time = 100; blueLed.Pulse = 5; blueLed.i = 1; blueLed.pulseInterval = 1000; blueLed.state = LED_SLEEP; blueLed.timer = 0; blueLed.pin = BLUE_PIN; pinMode(RED_PIN, OUTPUT); digitalWrite(RED_PIN, LOW); pinMode(GREEN_PIN, OUTPUT); digitalWrite(GREEN_PIN, LOW); pinMode(BLUE_PIN, OUTPUT); digitalWrite(BLUE_PIN, LOW); pinMode(PIN_BTN_START, INPUT); } void LedLed(struct MyLed &someLed){ if(someLed.state == LED_DELAY && millis() - someLed.timer > someLed.next){ someLed.state = LED_READY; } if(someLed.state == LED_READY ){ digitalWrite(someLed.pin, HIGH); someLed.state = LED_ON; someLed.timer = millis(); } if(someLed.state == LED_ON && millis() - someLed.timer > someLed.ligth_time){ digitalWrite(someLed.pin, LOW); someLed.state = LED_OFF; someLed.timer = millis(); } if(someLed.state == LED_OFF && millis() - someLed.timer > someLed.pulseInterval){ someLed.i++; if(someLed.i > someLed.Pulse){ someLed.state = LED_SLEEP; someLed.i = 1; } else{ someLed.state = LED_READY; } } } void loop(){ boolean btnState = digitalRead(PIN_BTN_START); if(btnState && !prevBtnState && redLed.state == LED_SLEEP){ redLed.state = LED_DELAY; redLed.timer = millis(); } if(greenLed.state == LED_SLEEP){ greenLed.state = LED_DELAY; greenLed.timer = millis(); } if(blueLed.state == LED_SLEEP){ blueLed.state = LED_DELAY; blueLed.timer = millis(); } LedLed(redLed); LedLed(greenLed); LedLed(blueLed); prevBtnState = btnState; }
тут пара ошибок, может поэтому у ТС не заводилось... Код (Text): void loop() { long int time = millis() - time_start; bool led_on = false; for (int i = 0; i < pulse_count; i++) { if ((time>=(DELAY_FIRST_PULSE + DELAY_NEXT_PULSE*i + PULSE_LENGTH*i)) && (time<(DELAY_FIRST_PULSE + DELAY_NEXT_PULSE*i + PULSE_LENGTH*(i+1)))) { led_on = true; break; } } digitalWrite(PIN_LED, led_on); } как-то так надо