Мигание диодом 4 секунды по условию

058395
Offline
Зарегистрирован: 07.06.2016

Здравствуйте!

Пытаюсь научиться использовать мигание диодов без delay().

Не приложу ума как реализовать следующее:

При изменении состояния диода 1, диод 2 должен мигать 4 секунды с частотой 3 Гц.

Заранее благодарю.

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

058395 пишет:

Не приложу ума как реализовать следующее:

Эо утверждение. Оно принято к сведению. А вопрос-то в чём?

058395
Offline
Зарегистрирован: 07.06.2016

ЕвгенийП пишет:

058395 пишет:

Не приложу ума как реализовать следующее:

Эо утверждение. Оно принято к сведению. А вопрос-то в чём?

Как при изменении состояния диода 1, а именно LOW или HIGH заставить диод 2 моргать 4 секунды с требуемой частотой (3 Гц)?

vvadim
Offline
Зарегистрирован: 23.05.2012

058395 пишет:

Здравствуйте!

Пытаюсь научиться использовать мигание диодов без delay().

Не приложу ума как реализовать следующее:

При изменении состояния диода 1, диод 2 должен мигать 4 секунды с частотой 3 Гц.

Заранее благодарю.

 

ну а что заставляет светодиод 1 менять состояние ?

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

058395 пишет:

Как при изменении состояния диода 1, а именно LOW или HIGH заставить диод 2 моргать 4 секунды с требуемой частотой (3 Гц)?

Ну, как брать и моргать.

Вы как пробовали? Свой код можете показать?

Если нет кода, то словами можете чётко по пунктам расписать последовательность действий?

Если можете, то 1) распишите и 2) запишите это в виде кода. И уж потом. если не получится, то пишите сюда.

А так - когда Вы сами ничего не делали, Вам тут вряд ли помогут. Хотите, чтобы сделали за Вас, идите в раздел "Ищу исполнителя", там заплатите и Вам сделают.

058395
Offline
Зарегистрирован: 07.06.2016

Использовал вместо таймера milis() счетчик цикла программы.

int Button = 10;
int LedG = 7; //  горит, при нажатии на кнопку
int LedO = 4; //  горит по умолчанию
int LedR = 3; //  должен мигать 4 секунды или 4 цикла
byte   I = 0; // счетчик

void setup() {
  
  pinMode(LedG, OUTPUT);  
  pinMode(LedO, OUTPUT);
  pinMode(LedR, OUTPUT);
  pinMode(Button, INPUT);
  Serial.begin(9600);  
}

void loop() {

if (digitalRead(Button) == HIGH) 
      {
      digitalWrite(LedG, HIGH);
      digitalWrite(LedO, LOW);
      }

else  {
      digitalWrite(LedO, HIGH);
      digitalWrite(LedG, LOW);
      }

  if (digitalRead(LedG) == HIGH)
        
            {
              I++;
              if        (I>0  && I<30) { digitalWrite(LedR, HIGH); } // счетчик циклов и условия мигания
              else if   (I>20  && I<60) { digitalWrite(LedR, LOW); }
              else if   (I>50  && I<80) { digitalWrite(LedR, HIGH); }
              else if   (I>70  && I<110) { digitalWrite(LedR, LOW); }
              else if   (I>100  && I<130) { digitalWrite(LedR, HIGH); }
              else if   (I>120  && I<160) { digitalWrite(LedR, LOW); }
              else { I=0; digitalWrite(LedR, LOW);} 
            }
  else I=0;      
Serial.println(I);
}

 

vvadim
Offline
Зарегистрирован: 23.05.2012

опа, вот уже и кнопка появилась)))))

058395
Offline
Зарегистрирован: 07.06.2016

Да мне понять бы смысл и логику работы, а там уже допру своими силами. Условие не важно какое будет.

Важно для меня чтобы после какого-либо действия диод перемигивал в течении 4 секунд.

vvadim
Offline
Зарегистрирован: 23.05.2012

при нажатии кнопки запускаете таймер и мигаете светиком

по истечении 4 сек тушите светик

 

058395
Offline
Зарегистрирован: 07.06.2016

Все верно, милорд, vvadim.

Но вот как программно это исполнить?

В виду того, что я отрезаю вариант с delay() мне остается принимать либо milis() для работы, либо попытаться разобраться как интервал в 4 секунды впихнуть, допустим, вот в такой код:

long previousMillis = 0;
byte I=0;

void setup()   
     {
     pinMode(4, OUTPUT);
     pinMode(10, INPUT);   
     }

void loop()
{
     if(digitalRead(10)==HIGH) // если кнопка нажималась
     {
        if (millis() - previousMillis >500)   
          {
          previousMillis = millis();    
          I++; // я не знаю как тут завязать цикл в 4 мигания, или 4 секунды 4 Гц оповещение засунуть
          }
     }

     else
        {
       I=0;
        }

     if(I>=5)
        {
          digitalWrite(4,!digitalRead(4)); // инвертируем состояние пина
          I=0;
        }

}
fogary
Offline
Зарегистрирован: 05.03.2016

Осмелюсь предложить свой вариант:

void loop() 
{
	static unsigned long previousMillis;
	static bool blinkLedR;
	static byte blinkCount;
	
	if (digitalRead(Button) == HIGH){
		digitalWrite(LedG, HIGH);
		digitalWrite(LedO, LOW);
		
		digitalWrite(LedR, HIGH);
		previousMillis = millis();
		blinkLedR = true;
		blinkCount = 0;
	} else {
		digitalWrite(LedO, HIGH);
		digitalWrite(LedG, LOW);
	}

	if (blinkLedR){
		if (millis() - previousMillis >= 333){
			previousMillis = millis();
			if (blinkCount < 12)){
				digitalWrite(LedR, !digitalRead(LedR));
				blinkCount++;
			} else {
				digitalWrite(LedR, LOW);
				blinkLedR = false;
			}
		}
	}
}

 

058395
Offline
Зарегистрирован: 07.06.2016

Гражданин fogary, ах если бы было возможно и был я Якубовичем, то воскликнул бы в тот же миг:

"И он выигрывает СсссуПпер Приз! Ааааавтомобиль!"

Все достаточно доступно и понятно на Вашем примере. Алгоритм ясен. Не додумался до этого как совместить работу со счетчиком с помощью переменной и таймер времени milis(), Превысокомногоблагодарен, fogary!

Задача решена.

Также выражаю благодарность Всем Лицам, принявшим участие в беседе!