Показать сообщение отдельно
Старый 12.02.2017, 16:36   #42
BNSF9399
Местный
 
Аватар для BNSF9399
 
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
0 Всего
Репутация: репутация неоспорима (2791)
По умолчанию

Цитата:
Сообщение от 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;
        }
      }
    }
  }
}
BNSF9399 вне форума  
Вверх
5 пользователя(ей) сказали cпасибо: