Использование struct для создания светодиодной системы с несколькими диммерами - PullRequest
0 голосов
/ 26 сентября 2019

Я попытался создать случайную картину замирания на нескольких светодиодах, и это привело к мерцанию, потому что он не может распознать, какие светодиоды уже используются.

Я нахожусь в процессе создания простой лампы, которая показывает некоторый светшаблоны с использованием 6 светодиодов и Arduino Uno.Цель состоит в том, чтобы в зависимости от некоторых входных данных и некоторого рандомизации шаблоны менялись.Например, только 2 лампы одновременно, но случайным образом исчезают вверх и вниз на всех 6 светодиодах.Или 4 источника беспорядочно затухают вверх и вниз на 6 светодиодах.

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

Я попытался добавить поле данных для занятых, как вы можете видеть, и обновить список доступных светодиодов (тот, который не занят процессом наэто) безрезультатно.

'' 'Основной код' '' '- отредактировано после комментария бартека.

#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;

Theкод запускается и частицы переходят из светодиодов в светодиодные, но иногда они сливаются в один, и это заставляет светодиод мерцать.Проблемы почти не существуют, когда активируются от 1 до 3 частиц, но становятся проблемой, начиная с 4 до 6. Как я могу убедиться, что они не «принимают» одинаковые привели к выходу.Кроме того, кажется, что некоторые светодиоды «выбрасываются».Как я могу убедиться, что они остаются активными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...