Я пытаюсь запустить две функции в стиле "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);
}
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 секунд или как вы сочтете подходящим / реалистичным.
Попробуйте что-то вроде этого:
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);
}
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.