Sari la conținut
ELFORUM - Forumul electronistilor

Turture 20 Leduri cu 5 pini


deejay2k1

Postări Recomandate

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 de deejay2k1
Link spre comentariu
  • 10 luni mai târziu...

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 1
Error compiling for board Arduino Nano.

"

Editat de Florian Ciobanu
Link spre comentariu

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

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 possible
led_0 -|>- : 2 3
led_1 -<|- : 2 3
led_2 -|>- : 2 4
led_3 -<|- : 2 4
led_4 -|>- : 2 5
led_5 -<|- : 2 5
led_6 -|>- : 2 6
led_7 -<|- : 2 6
led_8 -|>- : 3 4
led_9 -<|- : 3 4
led_10 -|>- : 3 5
led_11 -<|- : 3 5
led_12 -|>- : 3 6
led_13 -<|- : 3 6
led_14 -|>- : 4 5
led_15 -<|- : 4 5
led_16 -|>- : 4 6
led_17 -<|- : 4 6
led_18 -|>- : 5 6
led_19 -<|- : 5 6

Link spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări