deejay2k1 Postat Decembrie 8, 2016 Partajează Postat Decembrie 8, 2016 (editat) Metoda se numeste Charlieplexing. Aceasta ofera posibilitatea multiplexarii n*(n-1) leduri, unde n = nr. de pini. Pentru 5 pini avem 20 leduri, 6 pini - 30 leduri... etc. Codul exste scalabil, daca doriti mai multi pini, adaugati in array-ul de la linia 8. Restul se descurca singur. Pentru conexiunile electrice, decomentati linia 2, iar rezultatul este afisat in consola, la pornire. 5 pins defined. Max. 20 leds possibleled_0 -|>- : 2 3led_1 -<|- : 2 3led_2 -|>- : 2 4led_3 -<|- : 2 4led_4 -|>- : 2 5led_5 -<|- : 2 5led_6 -|>- : 2 6led_7 -<|- : 2 6led_8 -|>- : 3 4led_9 -<|- : 3 4led_10 -|>- : 3 5led_11 -<|- : 3 5led_12 -|>- : 3 6led_13 -<|- : 3 6led_14 -|>- : 4 5led_15 -<|- : 4 5led_16 -|>- : 4 6led_17 -<|- : 4 6led_18 -|>- : 5 6led_19 -<|- : 5 6 //#define debug//#define help#define runInterval 30#define scanInterval runInterval >> 4#define runningPattern 0x00000fffLconst byte charliePins[] = {2, 3, 4, 5, 6};#define pinArrayLen sizeof(charliePins)/sizeof(charliePins[0])#define ledArrayLen pinArrayLen * (pinArrayLen - 1)long ledStream = 0x00;byte litLed[ledArrayLen];byte litLedIndex = 0;void moveLeds();void updateLedState();void refresh();void setup() { for (int i = 0; i < pinArrayLen; i++) { pinMode(charliePins[i], INPUT); }#if defined(debug)|defined(help) Serial.begin(115200); Serial.print(pinArrayLen); Serial.print(" pins defined. Max. "); Serial.print(ledArrayLen); Serial.print(" leds possiblen");#endif}void loop() { static long nextRun = 0; if (millis() > nextRun) { moveLeds(); updateLedState(); nextRun = millis() + runInterval; } refresh();}void moveLeds() { static int xShift = -31; ledStream = (xShift < 0) ? runningPattern >> -xShift : runningPattern << xShift; xShift++; if (xShift > 31) xShift = -31;}void updateLedState() { litLedIndex = 0; byte ledIndex = 0; static bool helped = false; for (int i = 0; i < pinArrayLen; i++) { for (int j = i + 1; j < pinArrayLen; j++) { for (int inverse = 0; inverse <= 1; inverse++) { if ((ledStream >> ledIndex) & 1) { (inverse == 0) ? litLed[litLedIndex] = (0x0f & i) << 4 | 0x0f & j : litLed[litLedIndex] = (0x0f & j) << 4 | 0x0f & i; litLedIndex++; }#if defined(help) if (!helped) { Serial.print("led_"); Serial.print(ledIndex); Serial.print("t"); (inverse == 0) ? Serial.print("-|>-") : Serial.print("-<|-"); Serial.print(" :t"); Serial.print(charliePins[i]); Serial.print("t"); Serial.println(charliePins[j]); }#endif ledIndex++; } } } helped = true;#if defined(debug) Serial.println(); Serial.print("led on count: "); Serial.println(litLedIndex); if (litLedIndex > 0) { Serial.print("led on pins matrix: {"); for (int i = 0; i < litLedIndex; i++) { if (i > 0) Serial.print(", "); Serial.print(charliePins[litLed[i] >> 4], HEX); Serial.print("-"); Serial.print(charliePins[litLed[i] & 0x0f], HEX); } Serial.println("}"); }#endif}void refresh() { static long nextScan = 0; if (millis() > nextScan) { for (byte scanIndex = 0; scanIndex < litLedIndex; scanIndex++) { byte pinH = (byte)(litLed[scanIndex] >> 4); byte pinL = (byte)(litLed[scanIndex] & 0x0f); for (byte i = 0; i < pinArrayLen; i++) { if (i != pinH & i != pinL) { pinMode(charliePins[i], INPUT); digitalWrite(charliePins[i], LOW); } } pinMode(charliePins[pinH], OUTPUT); pinMode(charliePins[pinL], OUTPUT); digitalWrite(charliePins[pinH], HIGH); digitalWrite(charliePins[pinL], LOW); } } if (litLedIndex == 0) { for (byte i = 0; i < pinArrayLen; i++) { pinMode(charliePins[i], INPUT); digitalWrite(charliePins[i], LOW); } } nextScan = millis() + scanInterval;} Distractie placuta! Editat Decembrie 8, 2016 de deejay2k1 Link spre comentariu
Vizitator keytao Postat Decembrie 11, 2016 Partajează Postat Decembrie 11, 2016 Multumesc , am sa-l probez ,imi place ideea . felicitari pentru proiect Link spre comentariu
Florian Ciobanu Postat Decembrie 11, 2016 Partajează Postat Decembrie 11, 2016 pe atmega8 merge? Link spre comentariu
deejay2k1 Postat Decembrie 12, 2016 Autor Partajează Postat Decembrie 12, 2016 Daca merge cu Arduino, da, nu vad sa fie vreo problema. Link spre comentariu
Florian Ciobanu Postat Octombrie 15, 2017 Partajează Postat Octombrie 15, 2017 (editat) ca tot vin sarbatorile am incercat sa compilez pentru Arduino nano si da eroare " C:\Users\FLORIN~1\AppData\Local\Temp\ccus9r5R.ltrans0.ltrans.o: In function `main': ccus9r5R.ltrans0.o:(.text.startup+0x86): undefined reference to `setup' ccus9r5R.ltrans0.o:(.text.startup+0x8e): undefined reference to `loop' collect2.exe: error: ld returned 1 exit status exit status 1Error compiling for board Arduino Nano. " Editat Octombrie 15, 2017 de Florian Ciobanu Link spre comentariu
deejay2k1 Postat Octombrie 15, 2017 Autor Partajează Postat Octombrie 15, 2017 S-a intamplat ceva cu formatarea codului in forum... trebuia sa arate asa: //#define debug //#define help #define runInterval 30 #define scanInterval runInterval >> 4 #define runningPattern 0x00000fffL const byte charliePins[] = {2, 3, 4, 5, 6}; #define pinArrayLen sizeof(charliePins)/sizeof(charliePins[0]) #define ledArrayLen pinArrayLen * (pinArrayLen - 1) long ledStream = 0x00; byte litLed[ledArrayLen]; byte litLedIndex = 0; void moveLeds(); void updateLedState(); void refresh(); void setup() { for (int i = 0; i < pinArrayLen; i++) { pinMode(charliePins[i], INPUT); } #if defined(debug)|defined(help) Serial.begin(115200); Serial.print(pinArrayLen); Serial.print(" pins defined. Max. "); Serial.print(ledArrayLen); Serial.print(" leds possiblen"); #endif } void loop() { static long nextRun = 0; if (millis() > nextRun) { moveLeds(); updateLedState(); nextRun = millis() + runInterval; } refresh(); } void moveLeds() { static int xShift = -31; ledStream = (xShift < 0) ? runningPattern >> -xShift : runningPattern << xShift; xShift++; if (xShift > 31) xShift = -31; } void updateLedState() { litLedIndex = 0; byte ledIndex = 0; static bool helped = false; for (int i = 0; i < pinArrayLen; i++) { for (int j = i + 1; j < pinArrayLen; j++) { for (int inverse = 0; inverse <= 1; inverse++) { if ((ledStream >> ledIndex) & 1) { (inverse == 0) ? litLed[litLedIndex] = (0x0f & i) << 4 | 0x0f & j : litLed[litLedIndex] = (0x0f & j) << 4 | 0x0f & i; litLedIndex++; } #if defined(help) if (!helped) { Serial.print("led_"); Serial.print(ledIndex); Serial.print("t"); (inverse == 0) ? Serial.print("-|>-") : Serial.print("-<|-"); Serial.print(" :t"); Serial.print(charliePins[i]); Serial.print("t"); Serial.println(charliePins[j]); } #endif ledIndex++; } } } helped = true; #if defined(debug) Serial.println(); Serial.print("led on count: "); Serial.println(litLedIndex); if (litLedIndex > 0) { Serial.print("led on pins matrix: {"); for (int i = 0; i < litLedIndex; i++) { if (i > 0) Serial.print(", "); Serial.print(charliePins[litLed[i] >> 4], HEX); Serial.print("-"); Serial.print(charliePins[litLed[i] & 0x0f], HEX); } Serial.println("}"); } #endif } void refresh() { static long nextScan = 0; if (millis() > nextScan) { for (byte scanIndex = 0; scanIndex < litLedIndex; scanIndex++) { byte pinH = (byte)(litLed[scanIndex] >> 4); byte pinL = (byte)(litLed[scanIndex] & 0x0f); for (byte i = 0; i < pinArrayLen; i++) { if (i != pinH & i != pinL) { pinMode(charliePins[i], INPUT); digitalWrite(charliePins[i], LOW); } } pinMode(charliePins[pinH], OUTPUT); pinMode(charliePins[pinL], OUTPUT); digitalWrite(charliePins[pinH], HIGH); digitalWrite(charliePins[pinL], LOW); } } if (litLedIndex == 0) { for (byte i = 0; i < pinArrayLen; i++) { pinMode(charliePins[i], INPUT); digitalWrite(charliePins[i], LOW); } } nextScan = millis() + scanInterval; } Link spre comentariu
Vizitator Postat Octombrie 15, 2017 Partajează Postat Octombrie 15, 2017 (editat) Este functional pe Nano. Multumesc de cod deejay2k1! Editat Octombrie 15, 2017 de Vizitator Link spre comentariu
Florian Ciobanu Postat Octombrie 15, 2017 Partajează Postat Octombrie 15, 2017 Multumesc pentru cod, acum functioneaza pe Nano se compileaza si pe uno, ce n-am inteles prea bine cum se conecteaza ledurile, ma poti "lumina " si pe mine? am reformatat fisierul cu conectarea ledurilor si am inteles, este bine asa? 5 pins defined. Max. 20 leds possibleled_0 -|>- : 2 3led_1 -<|- : 2 3led_2 -|>- : 2 4led_3 -<|- : 2 4led_4 -|>- : 2 5led_5 -<|- : 2 5led_6 -|>- : 2 6led_7 -<|- : 2 6led_8 -|>- : 3 4led_9 -<|- : 3 4led_10 -|>- : 3 5led_11 -<|- : 3 5led_12 -|>- : 3 6led_13 -<|- : 3 6led_14 -|>- : 4 5led_15 -<|- : 4 5led_16 -|>- : 4 6led_17 -<|- : 4 6led_18 -|>- : 5 6led_19 -<|- : 5 6 Link spre comentariu
deejay2k1 Postat Octombrie 15, 2017 Autor Partajează Postat Octombrie 15, 2017 (editat) da, este corect. pentru fiecare pereche de pini, ai 2 leduri antiparalel. Va rog montati cate o rezistenta in serie cu fiecare pin, altfel depasiti curentul maxim admis pe pini. https://imgur.com/w3p69ib Editat Octombrie 15, 2017 de deejay2k1 Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum