Цитата:
Сообщение от Fedun
можно скеч посмотреть?
|
Легко
Код:
int ledPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop()
{
int i,count;
count=random(10,60);
for (i=0;i<count;i++) {
digitalWrite(ledPin, HIGH); // set the LED on
delay(random(60));
digitalWrite(ledPin, LOW); // set the LED off
delay(random(200));
}
delay(random(800,2000));
}
В "допиленном" собственно только алгоритм работы и временные фазы из данного скетча.
Там все через millis() сделано. Ниже на двух отдельных сварных управляемых кнопками.
В варианте с бригадой нужно немного переработать обработку нажатия на кнопки. Сделать через переменные не получилось (особо сильно и не старался), обрабатывал в цикле конкретные пины и на "бригаду" заполнял несколько объектов.
Код:
#include <Bounce2.h>
int buttonPins[]={10,12};
int ledPins[]={2,3};
const int welders=sizeof(ledPins)/sizeof(int);
Bounce welderBouncer[welders];
typedef struct {
int Cycle;
unsigned long Delay;
boolean State;
boolean Status;
} wData;
wData wd[welders];
unsigned long Time;
void setup() {
Time = millis();
for(int i=0;i<welders;i++){
pinMode(buttonPins[i], INPUT);
welderBouncer[i] = Bounce();
welderBouncer[i].attach(buttonPins[i]);
welderBouncer[i].interval(5);
pinMode(ledPins[i], OUTPUT);
wd[i].Cycle=random(10,60);
wd[i].Delay=Time+random(60);
wd[i].State=1;
wd[i].Status=0;
}
}
void loop() {
Time=millis();
for(int i=0;i<welders;i++){
if(welderBouncer[i].update()){
if(welderBouncer[i].read()==LOW){
wd[i].Status=!wd[i].Status;
}
if(wd[i].Status){
wd[i].Cycle=random(10,60);
wd[i].Delay=Time+random(60);
wd[i].State=1;
}
else {
digitalWrite(ledPins[i], LOW);
}
}
if(wd[i].Status){
if(wd[i].Cycle>0){
if(wd[i].Delay<Time){
wd[i].State=!wd[i].State;
digitalWrite(ledPins[i], wd[i].State);
if(wd[i].State){
wd[i].Delay=Time+random(60);
}
else {
wd[i].Delay=Time+random(200);
wd[i].Cycle--;
}
}
}
else if(wd[i].Delay<Time){
if(wd[i].State){
wd[i].Cycle=random(10,60);
wd[i].Delay=Time+random(60);
}
else {
wd[i].Delay=Time+random(800,2000);
wd[i].State=1;
}
}
}
}
}