I have an arduino uno r4 connected to a p6 led matrix, but I don't know how to fine tune the red, green, and blue of the rgb colors.
#define R1 D3 // Red data for upper half
#define G1 D5 // Green data for upper half
#define B1 D6 // Blue data for upper half
#define R2 D9 // Red data for lower half
#define G2 D10 // Green data for lower half
#define B2 D11 // Blue data for lower half
#define A A0 // Address line A
#define B A1 // Address line B
#define C A2 // Address line C
#define CLK 13 // Clock pin
#define LAT A3 // Latch pin
#define OE 12 // Output enable pin
#define RED 1
#define BLUE 1
#define GREEN 1
// setup() ํจ์๋ ํ๋ก๊ทธ๋จ์ด ์์๋ ๋ ํ ๋ฒ๋ง ์คํ๋๋ฉฐ, ํ์ ์ค์ ํ๊ณ ์ด๊ธฐํ ์์
์ ์ํํฉ๋๋ค.
void setup() {
pinMode(CLK, OUTPUT); // CLK ํ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ (๋ฐ์ดํฐ ์ ์ก์ฉ ํด๋ญ ์ ํธ)
pinMode(LAT, OUTPUT); // LAT ํ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ (๋์น ์ ํธ)
pinMode(OE, OUTPUT); // OE ํ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ (์ถ๋ ฅ ํ์ฑํ ์ ์ด)
pinMode(A, OUTPUT); // A ์ฃผ์ ๋ผ์ธ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ (ํ ์ ํ์ฉ)
pinMode(B, OUTPUT); // B ์ฃผ์ ๋ผ์ธ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ (ํ ์ ํ์ฉ)
pinMode(C, OUTPUT); // C ์ฃผ์ ๋ผ์ธ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ (ํ ์ ํ์ฉ)
pinMode(R1, OUTPUT); // R1 ํ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ (์๋จ ๋นจ๊ฐ์ LED ์ ์ด)
pinMode(G1, OUTPUT); // G1 ํ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ (์๋จ ๋
น์ LED ์ ์ด)
pinMode(B1, OUTPUT); // B1 ํ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ (์๋จ ํ๋์ LED ์ ์ด)
pinMode(R2, OUTPUT); // R2 ํ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ (ํ๋จ ๋นจ๊ฐ์ LED ์ ์ด)
pinMode(G2, OUTPUT); // G2 ํ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ (ํ๋จ ๋
น์ LED ์ ์ด)
pinMode(B2, OUTPUT); // B2 ํ์ ์ถ๋ ฅ ๋ชจ๋๋ก ์ค์ (ํ๋จ ํ๋์ LED ์ ์ด)
digitalWrite(OE, LOW); // OE ํ์ LOW๋ก ์ค์ ํ์ฌ ์ถ๋ ฅ ํ์ฑํ
clearMatrix(); // LED ๋งคํธ๋ฆญ์ค๋ฅผ ์ด๊ธฐํํ์ฌ ๋ชจ๋ LED๋ฅผ ๋๋๋ค.
//drawPixel(5, 5, true);
// (5, 5) ์์น์ ๋ณด๋ผ์ ํฝ์
์ ๊ทธ๋ฆฝ๋๋ค.
drawPixel(5, 5, true);
}
// loop() ํจ์๋ ๋ฐ๋ณต์ ์ผ๋ก ์คํ๋๋ฉฐ, ์ฌ๊ธฐ์๋ ํ์ํ์ง ์์ผ๋ฏ๋ก ๋น์๋ก๋๋ค.
void loop() {
// No loop actions needed; the pixel will stay on
//drawPixel(5, 5, true);
}
// clearMatrix() ํจ์๋ LED ๋งคํธ๋ฆญ์ค์ ๋ชจ๋ LED๋ฅผ ๋๋ ์ญํ ์ ํฉ๋๋ค.
void clearMatrix() {
for (int row = 0; row < 16; row++) { // ๋งคํธ๋ฆญ์ค์ ๋ชจ๋ 16๊ฐ ํ์ ๋ฐ๋ณต ์ฒ๋ฆฌํฉ๋๋ค.
selectRow(row); // ๊ฐ ํ์ ์ ํํฉ๋๋ค.
shiftOutData(0x00); // ๋ชจ๋ ์ด์ 0์ผ๋ก ์ค์ ํ์ฌ ํด๋น ํ์ ๋ชจ๋ LED๋ฅผ ๋๋๋ค.
latchData(); // ๋์น ์ ํธ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋งคํธ๋ฆญ์ค์ ์ ์ฉํฉ๋๋ค.
}
}
// drawPixel() ํจ์๋ ํน์ ์์น (x, y)์ LED๋ฅผ ์ผ๊ฑฐ๋ ๋๋ ์ญํ ์ ํฉ๋๋ค.
void drawPixel(int x, int y, bool on) {
int row = y; // y ๊ฐ์ ์ฌ์ฉํ์ฌ ์ ํํ ํ(row)์ ์ค์ ํฉ๋๋ค.
selectRow(row); // ์ฃผ์ด์ง ํ์ ์ ํํฉ๋๋ค.
// ์ด(column)์ ์ค์ ํ๊ธฐ ์ํด ๋ฃจํ๋ฅผ ์คํํฉ๋๋ค.
for (int i = 0; i < 32; i++) { // 32๊ฐ์ ์ด์ ๋ฐ๋ณต ์ฒ๋ฆฌํฉ๋๋ค.
digitalWrite(CLK, LOW); // ํด๋ญ ์ ํธ๋ฅผ LOW๋ก ์ค์ ํ์ฌ ๋ฐ์ดํฐ ์ ์ก์ ์ค๋นํฉ๋๋ค.
if (i == x) { // ํ์ฌ ์ด์ด x ์ขํ์ ์ผ์นํ๋์ง ํ์ธํฉ๋๋ค.
if (row < 8) { // ํ์ด ์๋จ ์ ๋ฐ์ ์ํ๋ ๊ฒฝ์ฐ
analogWrite(R1, RED); // ์๋จ ์ ๋ฐ์ ๋นจ๊ฐ์ LED๋ฅผ ์ ์ดํฉ๋๋ค.
analogWrite(B1, BLUE); // ์๋จ ์ ๋ฐ์ ํ๋์ LED๋ฅผ ์ ์ดํฉ๋๋ค.
analogWrite(G1, GREEN); // ์๋จ ์ ๋ฐ์ ํ๋์ LED๋ฅผ ์ ์ดํฉ๋๋ค.
} else { // ํ์ด ํ๋จ ์ ๋ฐ์ ์ํ๋ ๊ฒฝ์ฐ
analogWrite(R2, RED); // ํ๋จ ์ ๋ฐ์ ๋นจ๊ฐ์ LED๋ฅผ ์ ์ดํฉ๋๋ค.
analogWrite(B2, BLUE); // ํ๋จ ์ ๋ฐ์ ํ๋์ LED๋ฅผ ์ ์ดํฉ๋๋ค.
analogWrite(G2, GREEN); // ์๋จ ์ ๋ฐ์ ํ๋์ LED๋ฅผ ์ ์ดํฉ๋๋ค.
}
} else { // ํ์ฌ ์ด์ด x ์ขํ์ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ
analogWrite(R1, LOW); // ํด๋น ์ด์ LED๋ฅผ ๋๋๋ค.
analogWrite(B1, LOW); // ํด๋น ์ด์ LED๋ฅผ ๋๋๋ค.
analogWrite(G1, LOW); // ํด๋น ์ด์ LED๋ฅผ ๋๋๋ค.
analogWrite(G2, LOW); // ํด๋น ์ด์ LED๋ฅผ ๋๋๋ค.
analogWrite(R2, LOW); // ํด๋น ์ด์ LED๋ฅผ ๋๋๋ค.
analogWrite(B2, LOW); // ํด๋น ์ด์ LED๋ฅผ ๋๋๋ค.
}
digitalWrite(CLK, HIGH); // ํด๋ญ ์ ํธ๋ฅผ HIGH๋ก ์ค์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๋ค.
}
latchData(); // ๋์น ์ ํธ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋งคํธ๋ฆญ์ค์ ์ ์ฉํฉ๋๋ค.
}
// selectRow() ํจ์๋ ์ฃผ์ด์ง ํ(row)์ ์ ํํ๊ธฐ ์ํด A, B, C ์ฃผ์ ๋ผ์ธ์ ์ค์ ํฉ๋๋ค.
void selectRow(int row) {
digitalWrite(A, row & 1); // A ํ์ ํ์ ์ฒซ ๋ฒ์งธ ๋นํธ๋ก ์ค์ ํฉ๋๋ค.
digitalWrite(B, (row >> 1) & 1); // B ํ์ ํ์ ๋ ๋ฒ์งธ ๋นํธ๋ก ์ค์ ํฉ๋๋ค.
digitalWrite(C, (row >> 2) & 1); // C ํ์ ํ์ ์ธ ๋ฒ์งธ ๋นํธ๋ก ์ค์ ํฉ๋๋ค.
}
// shiftOutData() ํจ์๋ ์ฃผ์ด์ง ๋ฐ์ดํฐ ๋ฐ์ดํธ๋ฅผ ๋งคํธ๋ฆญ์ค์ ์ ์กํฉ๋๋ค.
void shiftOutData(byte data) {
for (int i = 0; i < 32; i++) { // 32๊ฐ์ ์ด์ ๋ฐ๋ณต ์ฒ๋ฆฌํฉ๋๋ค.
digitalWrite(CLK, LOW); // ํด๋ญ ์ ํธ๋ฅผ LOW๋ก ์ค์ ํ์ฌ ๋ฐ์ดํฐ ์ ์ก์ ์ค๋นํฉ๋๋ค.
analogWrite(R1, (data & (1 << (31 - i))) ? HIGH : LOW); // ์๋จ ์ ๋ฐ์ ๋นจ๊ฐ์ LED๋ฅผ ์ค์ ํฉ๋๋ค.
analogWrite(B1, (data & (1 << (31 - i))) ? HIGH : LOW); // ์๋จ ์ ๋ฐ์ ํ๋์ LED๋ฅผ ์ค์ ํฉ๋๋ค.
analogWrite(G1, (data & (1 << (31 - i))) ? HIGH : LOW); // ์๋จ ์ ๋ฐ์ ํ๋์ LED๋ฅผ ์ค์ ํฉ๋๋ค.
analogWrite(G2, (data & (1 << (31 - i))) ? HIGH : LOW); // ์๋จ ์ ๋ฐ์ ํ๋์ LED๋ฅผ ์ค์ ํฉ๋๋ค.
analogWrite(R2, (data & (1 << (31 - i))) ? HIGH : LOW); // ํ๋จ ์ ๋ฐ์ ๋นจ๊ฐ์ LED๋ฅผ ์ค์ ํฉ๋๋ค.
analogWrite(B2, (data & (1 << (31 - i))) ? HIGH : LOW); // ํ๋จ ์ ๋ฐ์ ํ๋์ LED๋ฅผ ์ค์ ํฉ๋๋ค.
digitalWrite(CLK, HIGH); // ํด๋ญ ์ ํธ๋ฅผ HIGH๋ก ์ค์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๋ค.
}
}
// latchData() ํจ์๋ ๋์น ์ ํธ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋งคํธ๋ฆญ์ค์ ์ ์ฉํฉ๋๋ค.
void latchData() {
digitalWrite(LAT, HIGH); // ๋์น ์ ํธ๋ฅผ HIGH๋ก ์ค์ ํฉ๋๋ค.
//delayMicroseconds(10); // ์งง์ ์๊ฐ ๋์ ๋๊ธฐํฉ๋๋ค.
digitalWrite(LAT, LOW); // ๋์น ์ ํธ๋ฅผ LOW๋ก ์ค์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
}
I'm having trouble getting this code to work. Setting the rgb red, green, and blue values doesn't change the light, it just increases the number of pixels of that color. Please help.