Я пытаюсь запустить две функции в стиле "Blink" одновременно.

Я нашел в другом месте код, который позволяет мне это сделать, и изменил его! Отлично.

Однако то, что я пытаюсь сделать, - это включить и выключить один светодиод каждые 1000 мс, как обычно, но чтобы другой мигал странным образом, например, включен на 3000 мс, выключен на 100 мс, включен на 100 мс, выключен на 200 мс, затем зацикливается назад.

Чтобы это произошло, я попытался добавить случайную функцию к найденному мной коду, но мне не нравится, как это выглядит. Это похоже на мигающий светодиод с помехами или что-то в этом роде, как на радиопередатчике или что-то еще. Я пытаюсь воспроизвести старую мерцающую лампочку, то есть она всегда должна быть ВКЛЮЧЕНА дольше, чем выключена. По сути, она должна быть ВКЛЮЧЕНА / ВЫСОКАЯ в течение «более длительного» периода времени, а затем прервана несколькими короткими миганиями ВКЛ. и ВЫКЛ.

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

Вот код, который я использую до сих пор:

/* Blink Multiple LEDs without Delay
*
* Turns on and off several light emitting diode(LED) connected to a digital
* pin, without using the delay() function.  This means that other code
* can run at the same time without being interrupted by the LED code.
*/
int led1 = 13;                // LED connected to digital pin 13
int led2 = 12;
int value1 = LOW;                // previous value of the LED
int value2 = HIGH;                // previous value of the LED
long time1 = millis();
long time2 = millis();

long interval1 = 1000;           // interval at which to blink (milliseconds)

void setup()
{
 Serial.begin(9600);
 randomSeed(analogRead(0));
 pinMode(led1, OUTPUT);      // sets the digital pin as output
 pinMode(led2, OUTPUT);
}

void loop()
{
 unsigned long m = millis();

 if (m - time1 > interval1){
   time1 = m;

   if (value1 == LOW)
     value1 = HIGH;
   else
     value1 = LOW;

   digitalWrite(led1, value1);
 }

long interval2 = random(100,1500);

 if (m - time2 > interval2){
   time2 = m;

   if (value2 == LOW)
     value2 = HIGH;
   else
     value2 = LOW;

   digitalWrite(led2, value2);
 }

   Serial.println(interval2);
}
0
Connor Crawford 1 Май 2016 в 02:26

2 ответа

Лучший ответ

Это всегда занимает меньше секунды, поэтому вы можете вернуться к основному циклу и убедиться, что не пропустите 1 секунду включения / выключения другого светодиода:

void flicker(){
    boolean state = false;
    int r = random(20, 175);
    for(int i = 0; i < 5; i++){
        digitalWrite(led2, state);
        state = !state;
        delay(r);
        r = random(20, 175);
    }
    digitalWrite(led2, HIGH);
}

Кстати. Я заменяю этот код переключения:

if (value2 == LOW)
  value2 = HIGH;
else
  value2 = LOW;

digitalWrite(led2, value2);

С этим:

state = !state;
digitalWrite(led2, state);

Теперь вызовите flicker() через случайные промежутки времени; возможно, каждые 15-45 секунд или как вы сочтете подходящим / реалистичным.

0
jDo 2 Май 2016 в 16:39

Попробуйте что-то вроде этого:

void setup()
{
 Serial.begin(9600);
 randomSeed(analogRead(0));
 pinMode(led1, OUTPUT);      // sets the digital pin as output
 pinMode(led2, OUTPUT);
}

long interval2 = random(100,1500);

void loop()
{
 unsigned long m = millis();

 if (m - time1 > interval1){
   time1 = m;

   if (value1 == LOW)
     value1 = HIGH;
   else
     value1 = LOW;

   digitalWrite(led1, value1);
 }

 if (m - time2 > interval2){
   time2 = m;

   if (value2 == LOW) {
     value2 = HIGH;
     interval2 = random(100, 1500);
   } else {
     value2 = LOW;
     interval2 = random(100, 200);
   }

   digitalWrite(led2, value2);
 }
0
Rasmus Friis Kjeldsen 1 Май 2016 в 18:37