Forum: PC-Programmierung Array, wie? und wie verändern?


von Tobias N. (silberkristall)


Lesenswert?

Hi leute,

ich brauche für ein projekt mal eure Hilfe.

Also es geht um ws2811/ws2812 LEDs. es hängen 250 Stück hintereinander.

Ich dachte somit an ein Array z.b. namens LED

Wie muss ich dieses Array nun bauen?

Also ich dachte mir das so, LED[1] beinhaltet die werte R,G,B also 
müsste das Array ja aussehen LED[1] = ( 255,255,255 )

Wie erstelle ich so ein Array? wie komme ich an die Werte usw usw?

Dann möchte ich einzelne Werte ändern können also beim Initialisieren 
sollen alle LEDs aus sein, somit muss das array LED 1 - 150 jeweils die 
werte 0,0,0 haben.

Wie komme ich jetzt an die einzelnen LED Werte? und wie kann ich einen 
Wert im Array verändern ohne die anderen zu berühen? Also z.b. nur LED 
117 auf 255,255,255 setzen?

Dann würde ich das ganze noch gerne per "Random" füllen lassen können, 
also wirkürlich werden werte gesetzt.

Kann mir da jemand weiter helfen?

Danke euch schonmal.

: Verschoben durch Moderator
von Bitflüsterer (Gast)


Lesenswert?

Du könntest eine geeignete Programmiersprache lernen und Dein Vorhaben 
mit deren Mitteln realisieren.

von Coder (Gast)


Lesenswert?

1
typedef struct
2
{
3
    uint8_t R;
4
    uint8_t G;
5
    uint8_t B;
6
} RGB_t;
7
8
9
#define LED_CNT   250U
10
11
typedef struct
12
{
13
    RGB_t LED_Data[LED_CNT];
14
} RGB_Data_t;

Mit der Idee mal spielen...

von Tobias N. (silberkristall)


Lesenswert?

ich hatte da mal so angefangen, nur bin ich noch nicht soweit das ich 
weiss ob das so klappt oder nicht.

Hier mal der Code:

ws2811.h
1
#define WSDDR DDRA
2
#define WSPORT PORTA
3
#define WSPIN PA1
4
#define ledanzahl 100 // 1 - 1024
5
6
void ws2811_reset(void);
7
void ws2811_init(void);
8
void wswrite_zero(void);
9
void wswrite_one(void);
10
void ws2811_rgbsetall(int r, int g, int b);
11
12
void ws2811_rgbsetone(int led, int r, int g, int b);
13
void ws2811_send(void);
14
15
// erstelle ledarray
16
17
int leds[ledanzahl][3];


ws2811.c
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include "ws2811.h"
4
5
void ws2811_reset(void)
6
{
7
  WSPORT &= ~(1<<WSPIN);
8
  _delay_us(55);
9
}
10
11
void wswrite_zero(void)
12
{
13
  // 500ns +- 150ns high
14
  WSPORT |= (1<<WSPIN); // 125ns
15
  WSPORT |= (1<<WSPIN); // 125ns
16
  // 2000ns +- 150ns low
17
  WSPORT &= ~(1<<WSPIN); // 125ns
18
  WSPORT &= ~(1<<WSPIN); // 125ns
19
  WSPORT &= ~(1<<WSPIN); // 125ns
20
  WSPORT &= ~(1<<WSPIN); // 125ns
21
  WSPORT &= ~(1<<WSPIN); // 125ns
22
  WSPORT &= ~(1<<WSPIN); // 125ns
23
  WSPORT &= ~(1<<WSPIN); // 125ns
24
  WSPORT &= ~(1<<WSPIN); // 125ns
25
  WSPORT &= ~(1<<WSPIN); // 125ns
26
  WSPORT &= ~(1<<WSPIN); // 125ns
27
  WSPORT &= ~(1<<WSPIN); // 125ns
28
  WSPORT &= ~(1<<WSPIN); // 125ns
29
  WSPORT &= ~(1<<WSPIN); // 125ns
30
  WSPORT &= ~(1<<WSPIN); // 125ns
31
  WSPORT &= ~(1<<WSPIN); // 125ns
32
  WSPORT &= ~(1<<WSPIN); // 125ns
33
}
34
35
void wswrite_one(void)
36
{
37
  // 1200ns +- 150ns high
38
  WSPORT |= (1<<WSPIN); // 125ns
39
  WSPORT |= (1<<WSPIN); // 125ns
40
  WSPORT |= (1<<WSPIN); // 125ns
41
  WSPORT |= (1<<WSPIN); // 125ns
42
  WSPORT |= (1<<WSPIN); // 125ns
43
  WSPORT |= (1<<WSPIN); // 125ns
44
  WSPORT |= (1<<WSPIN); // 125ns
45
  WSPORT |= (1<<WSPIN); // 125ns
46
  WSPORT |= (1<<WSPIN); // 125ns
47
  WSPORT |= (1<<WSPIN); // 125ns
48
  // 1300ns +- 150ns low
49
  WSPORT &= ~(1<<WSPIN); // 125ns
50
  WSPORT &= ~(1<<WSPIN); // 125ns
51
  WSPORT &= ~(1<<WSPIN); // 125ns
52
  WSPORT &= ~(1<<WSPIN); // 125ns
53
  WSPORT &= ~(1<<WSPIN); // 125ns
54
  WSPORT &= ~(1<<WSPIN); // 125ns
55
  WSPORT &= ~(1<<WSPIN); // 125ns
56
  WSPORT &= ~(1<<WSPIN); // 125ns
57
  WSPORT &= ~(1<<WSPIN); // 125ns
58
  WSPORT &= ~(1<<WSPIN); // 125ns
59
}
60
61
void ws2811_rgbsetall(int r, int g, int b) // ws2811_rgbsetall(0,0,0) = alle aus
62
{
63
  for(int i=0;i<ledanzahl;i++)
64
   {
65
     leds[i][0] = r;
66
   leds[i][1] = g;
67
   leds[i][2] = b;
68
   }
69
}
70
71
void ws2811_rgbsetone(int led, int r, int g, int b)
72
{
73
  leds[led][0] = r;
74
  leds[led][1] = g;
75
  leds[led][2] = b;
76
}
77
78
void ws2811_send(void)
79
{
80
  for (int ws11=0; ws11<ledanzahl; ws11++)
81
    {
82
      
83
      // Rot
84
    if (leds[ws11][0] & 1<<1) { wswrite_one(); } else { wswrite_zero(); }
85
    if (leds[ws11][0] & 1<<2) { wswrite_one(); } else { wswrite_zero(); }
86
    if (leds[ws11][0] & 1<<3) { wswrite_one(); } else { wswrite_zero(); }
87
    if (leds[ws11][0] & 1<<4) { wswrite_one(); } else { wswrite_zero(); }
88
    if (leds[ws11][0] & 1<<5) { wswrite_one(); } else { wswrite_zero(); }
89
    if (leds[ws11][0] & 1<<6) { wswrite_one(); } else { wswrite_zero(); }
90
    if (leds[ws11][0] & 1<<7) { wswrite_one(); } else { wswrite_zero(); }
91
    if (leds[ws11][0] & 1<<8) { wswrite_one(); } else { wswrite_zero(); }
92
    
93
    // Grün
94
    if (leds[ws11][1] & 1<<1) { wswrite_one(); } else { wswrite_zero(); }
95
    if (leds[ws11][1] & 1<<2) { wswrite_one(); } else { wswrite_zero(); }
96
    if (leds[ws11][1] & 1<<3) { wswrite_one(); } else { wswrite_zero(); }
97
    if (leds[ws11][1] & 1<<4) { wswrite_one(); } else { wswrite_zero(); }
98
    if (leds[ws11][1] & 1<<5) { wswrite_one(); } else { wswrite_zero(); }
99
    if (leds[ws11][1] & 1<<6) { wswrite_one(); } else { wswrite_zero(); }
100
    if (leds[ws11][1] & 1<<7) { wswrite_one(); } else { wswrite_zero(); }
101
    if (leds[ws11][1] & 1<<8) { wswrite_one(); } else { wswrite_zero(); }
102
    
103
    // Blau
104
    if (leds[ws11][2] & 1<<1) { wswrite_one(); } else { wswrite_zero(); }
105
    if (leds[ws11][2] & 1<<2) { wswrite_one(); } else { wswrite_zero(); }
106
    if (leds[ws11][2] & 1<<3) { wswrite_one(); } else { wswrite_zero(); }
107
    if (leds[ws11][2] & 1<<4) { wswrite_one(); } else { wswrite_zero(); }
108
    if (leds[ws11][2] & 1<<5) { wswrite_one(); } else { wswrite_zero(); }
109
    if (leds[ws11][2] & 1<<6) { wswrite_one(); } else { wswrite_zero(); }
110
    if (leds[ws11][2] & 1<<7) { wswrite_one(); } else { wswrite_zero(); }
111
    if (leds[ws11][2] & 1<<8) { wswrite_one(); } else { wswrite_zero(); }
112
    }
113
}
114
115
void ws2811_init(void)
116
{
117
  // Port als Ausgang setzen
118
  WSDDR |= (1<<WSPIN);
119
  // Reset
120
  ws2811_reset();
121
  // alle leds aus
122
  ws2811_rgbsetall(0,0,0);
123
  // senden
124
  ws2811_send();
125
}

von Lutz H. (luhe)


Lesenswert?

Es sind drei unterschiedliche Probleme.

1. Wie werden die Werte im Rechner abgespeichert.
2. Wie werden die Werte berechnet.
3. Wie werden die berechneten Werte ausgegeben.

1. Man kann mehrdimensionale Arrays mutzen,ich würde
vorschlagen drei Eindimensionale Arrays zu Nutzen,
z.B.:
int Rot[256];
int Grün[256];
int Gelb[256};

Setzen:

Rot[117]=1;
Grün[117]=1;
Gelb[117}=1;

Zufallszahlen werden mit der RND , Random oder ähnlichen berechnet.

Die zufällige Folge wäre dann:

For (int i=0;i<256;i++){

Rnd;      // hier einem Zufallswert zwischen 0 und 1 berechnen undin Rnd 
abspeichen

(if Rnd>0.5) Rot[i]=1;
(if Rnd<=0.5) Rot[i]=0;
Rnd
(if Rnd>0.5) Grün[i]=1;
(if Rnd<=0.5) Grün[i]=0;
Rnd
(if Rnd>0.5) Gelb[i]=1;
(if Rnd<=0.5) Gelb[i]=0;

ws2811_rgbsetone(i, Rot[i], Grün[i], Gelb[i])
}


Die Ausgabe je nach Prozessor.
void ws2811_rgbsetone(int led, int r, int g, int b);
void ws2811_send(void);

: Bearbeitet durch User
von Tobias N. (silberkristall)


Lesenswert?

ok,

und die helligkeit würde mich noch interessieren, also wenn ich nur z.b. 
0,0,0 - 255,0,0 ändere dann wird Rot von 0 - 255 heller, aber wenn ich 
farben "mische" und da die werte immer nur -1 oder +1 änder dann ändert 
sich nicht die helligkeit sondern auch die farbe weil andere werte.

zum einsatz kommt ein atmega128 mit 16Mhz Quarz

: Bearbeitet durch User
von icke (Gast)


Lesenswert?

Schau dir mal den HSV-Farbraum an.
Der setzt sich - im gegensatz zu RGB - aus der Farbe (H = Hue), der 
Sättigung (S = Saturation) und Dunkelheit (V= Value) zusammen.

H wird im allgemeinen als Grad in Farbenkreis angegeben.
0 ist zum Beispiel Rot.
Wenn du jetzt den V-Wert veränderst, wird die Helligkeit vom Rot 
geändert

von Fuzzi59 (Gast)


Lesenswert?

Du könntest auch ein sogenanntes jagged Array benutzen. Das ist ein 
Array in dem du Arrays des gleichen Typs(String, Int32, Double, usw.) 
speichern kannst. Ich würde dann drei Arrays, für je eine Farbe, in 
einem Jagged-Array speichern:
1
            int[][] RGB = new int[3][];
2
            RGB[0][0] = 0;//Wert aus Array (0) an der Stelle 0
3
            RGB[1][0] = 0;//Wert aus Array (1) an der Stelle 0
4
            RGB[2][0] = 0;//Wert aus Array (2) an der Stelle 0
Hier noch ein Link zum besseren Verständnis: 
http://msdn.microsoft.com/de-de/library/2s05feca.aspx

von Max H. (hartl192)


Lesenswert?

Oder man könnte auch ein Array auf 24bit Variablen machen und in jeder 
Variable alle 3 RGB-Werte speichern.
1
LED[5]=(red_8bit<<16)|(green_8bit<<8)|(blue_8bit);

von Coder (Gast)


Lesenswert?

Native 24-Bit Variable auf einem AVR ist wohl optimistisch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.