Я попытался создать случайную картину замирания на нескольких светодиодах, и это привело к мерцанию, потому что он не может распознать, какие светодиоды уже используются.
Я нахожусь в процессе создания простой лампы, которая показывает некоторый светшаблоны с использованием 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. Как я могу убедиться, что они не «принимают» одинаковые привели к выходу.Кроме того, кажется, что некоторые светодиоды «выбрасываются».Как я могу убедиться, что они остаются активными.