使用struct创建多调光LED系统

时间:2019-09-26 07:20:38

标签: list struct arduino

我试图在多个LED上设置随机的衰落模式,由于无法识别正在使用的LED,因此会导致闪烁。

我正在创建一个简单的灯,该灯使用6 led和arduino uno显示一些光图案。目标是根据一些输入和一些随机化,模式将改变。例如,同一时间只有2盏灯,但在所有6盏LED灯上随机上下升降。或在6个LED上随机随机出现4个灯光。

我决定创建一个结构,该结构将是一个名为粒子的浅色图案,并且该粒子具有一个名为led_position的变量,该变量显示在某个时刻它处于打开状态。粒子可以更改其位置以点亮另一个LED。

正如您所见,我尝试为忙碌添加一个数据字段,并将可用LED列表(没有忙碌进程的列表)更新为无效。

'''主代码''''-在Bartek评论后编辑。

#include "MyTypes.h"

int led0 = 3;    // the PWM pin the LED is attached to
int led1 = 5; 
int led2 = 6; 
int led3 = 9; 
int led4 = 10; 
int led5 = 11; 



//int led;
int brightness;
int fadeAmount;


// Definition of the different particles
particle_type particle[]={
  { 0,led0,0, 2,   false },  
  { 1,led1,50, 2,   false },  
  { 2,led2,100,  2,   false },  
  { 3,led3,80,  2,   false },
  { 4,led4,30,  2,   false},
  { 5,led5,70,  2,   false},
};

led_type led[]={
  { 3,false },  
  { 5,false },  
  { 6,false },  
  { 9,false },
  { 10,false },
  { 11,false },
};



//initiation of the particles

void initiate_particle(particle_type& particle_example,led_type led[]){



 //take a random led from list of led  
  int number=random(6);
  Serial.println(number);
  led[number];
  if (led[number].busy == false){ //if led non-occupied
    for (int i=0;i<6;i++){
      if (led[i].led_position==particle_example.led_position){
      led[i].busy=false;
      Serial.println("success");
      Serial.println(led[i].led_position);
      }
    }
    particle_example.led_position=led[number].led_position;
    Serial.println(particle_example.led_position);
    led[number].busy = true ;//take this led as output
    } 

  else{
//  initiate_particle( particle_example,led);
}

  particle_example.reset = false; //reset turned off 
  delay(30);

}

void update_light(particle_type& particle_example,led_type led[]){ //updating led brightness

analogWrite(particle_example.led_position, particle_example.brightness);  //updating led brightness
  if (particle_example.brightness >=  160) {
    particle_example.fadeAmount = -particle_example.fadeAmount;

  }

  if (particle_example.brightness <=  160 && particle_example.brightness >=  100 ) {
    particle_example.brightness = particle_example.brightness + 2*particle_example.fadeAmount;

  }

  if (particle_example.brightness >= 50 && particle_example.brightness <=  100){ 
      particle_example.brightness = particle_example.brightness + particle_example.fadeAmount;

  }

  if (particle_example.brightness >= 0 && particle_example.brightness <=  50){ 
      particle_example.brightness = particle_example.brightness + 0.5*particle_example.fadeAmount;

  }

  if (particle_example.brightness <= 0){
    particle_example.reset= true;
    particle_example.brightness =0;
    int number = particle_example.led_position;
    particle_example.fadeAmount = -particle_example.fadeAmount;
  }



}

void activate_particle(particle_type& particle_example,led_type led[]){ //function to keep led activated

  if (particle_example.reset==true){ //if led not initiated or has finished its dimming down
    initiate_particle(particle_example, led); //initiate it again
  ;}

  else {
   update_light(particle_example,led); //update its brightness
  }
}

void setup() { //create led outputs
  pinMode(led0, OUTPUT);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);

  Serial.begin(9600); //serial for debug

}



void loop() {

  activate_particle(particle[0],led);
  activate_particle(particle[1],led);
  activate_particle(particle[2],led);
//  activate_particle(particle[3],led);
//  activate_particle(particle[4],led);
//  activate_particle(particle[5],led);
//  

 delay(10); // 20-17-15-12-10-7-2

}

'''Mytypes.h''''

typedef struct {
    int id;
    int led_position;
    int brightness;
    int fadeAmount;
    bool reset;
} particle_type;

typedef struct {
    int led_position;
    bool busy;
} led_type;

代码运行,粒子从led转到led,但是有时它们合并为一个,这使LED闪烁。 当激活1到3个粒子时,问题几乎不存在,但从4到6开始就成为问题。 我如何确保它们不“吸收”相同的导致输出。 最重要的是,似乎有些LED被“丢弃”了。我如何确保它们保持活动状态。

0 个答案:

没有答案