бинарный массив управляет светодиодами

andreyblinkov
Offline
Зарегистрирован: 18.10.2014

Здравствуйте, подскажите пожалуйста на примере, если возможно.

Как с помощью бинарного массива управлять светодиодами, чтобы они зажигались, если в массиве присутствует 1 и гасли при 0. Например первая строка 0001. Вторая 0010. И так далее.

                      

 

faraddin
Offline
Зарегистрирован: 11.08.2013
andreyblinkov
Offline
Зарегистрирован: 18.10.2014

Спасибо, большое. Это возможно то что мне нужно.

std
Offline
Зарегистрирован: 05.01.2012

С корефаном как-то делали надпись на бампер машины, может пригодится. Схема простая, на выходах куски светодиодной ленты через транзисторы, на D2 просто светодиод который подтверждал принятие команды (управление по ИК). Вся идея заключается в одном большом массиве в который вбиты все программы, и двух переменных задающих начальную и конечную границу (кусок массива, который надо повторять).

#include <IRremote.h>
#include <avr\wdt.h>

// data
const boolean a1c1[188]={0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,0,1,1,0,0,0};
const boolean a1c2[188]={0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,1,1,0,0};
const boolean a1c3[188]={0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0};
const boolean a1c4[188]={0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1};
const boolean a1c5[188]={0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,1};
const boolean a1c6[188]={0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0};
const boolean a1c7[188]={0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,0,0};
const boolean a1c8[188]={0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,1,0,1,1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,0};
const boolean a1c9[188]={0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,1,1,1,1,0,0,0,0,1,1};

// IR control
const unsigned long KEY1         = 0x926DE01F;
const unsigned long KEY2         = 0x926D827D;
const unsigned long KEY3         = 0x926D926D;
const unsigned long KEY4         = 0x926D02FD;
const unsigned long KEY5         = 0x926DAA55;
const unsigned long KEY6         = 0x926DB24D;
const unsigned long KEY7         = 0x926D12ED;
const unsigned long KEY8         = 0x926D42BD;
const unsigned long KEY9         = 0x926D8A75;

const unsigned long KEY0         = 0x926D4AB5;
const unsigned long KEY10        = 0x926D32CD;

const unsigned long KEYSPEEDUP   = 0x926D0AF5;
const unsigned long KEYSPEEDDOWN = 0x926DA857;

// global variables
int dir,                         // scroll direction
    i_step,                      // counters
    max_step,                    // current array area
    min_step,
    s_step;                      // speed

unsigned long last_ir;           // cycle restriction timestamps
unsigned long last_step;
IRrecv irrecv(1);                // CIR code receiver
decode_results results;
boolean cmf;                     // mode change flag

void setup(){              // initialization
 wdt_enable(WDTO_4S);      // watchdog timer
 pinMode(5, OUTPUT);       // letters
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(10, OUTPUT);
 pinMode(11, OUTPUT);
 pinMode(12, OUTPUT);
 pinMode(13, OUTPUT);
 pinMode(2,OUTPUT);        // IR approve
 dir=0;                    // 0 - right, 1 - left
 last_ir=millis();
 last_step=millis();
 i_step=0;
 min_step=0;
 max_step=12;
 s_step=150; //int(200/2.5);
 irrecv.enableIRIn();
 cmf=false;
}                          // init routine ends

void process_ir(){
  cmf=false;
  switch (results.value){
   case KEY1:            // select mode
     i_step=0;
     min_step=0;
     max_step=12;
     dir=0;
     s_step=150;
     cmf=true;
   break;
   case KEY2:
     i_step=0;
     min_step=0;
     max_step=12;
     dir=1;
     s_step=150;
     cmf=true;
   break;
   case KEY3:
     i_step=12;
     min_step=12;
     max_step=31;
     dir=0;
     s_step=100;
     cmf=true;
   break;
   case KEY4:
     i_step=12;
     min_step=12;
     max_step=31;
     dir=1;
     s_step=100;
     cmf=true;
   break;
   case KEY5:
     i_step=32;
     min_step=32;
     max_step=47;
     dir=0;
     s_step=150;
     cmf=true;
   break;
   case KEY6:
     i_step=48;
     min_step=48;
     max_step=155;
     dir=0;
     s_step=50;
     cmf=true;
   break;
   case KEY7:
     i_step=154;
     min_step=154;
     max_step=155;
     dir=0;
     s_step=50;
     cmf=true;
   break;
   case KEY8:
     i_step=155;
     min_step=155;
     max_step=182;
     dir=0;
     s_step=100;
     cmf=true;
   break;
   case KEY9:
     i_step=183;
     min_step=183;
     max_step=187;
     dir=0;
     s_step=100;
     cmf=true;
   break;
   case KEY0:
     i_step=0;
     dir=0;
     min_step=0;
     max_step=0;
     s_step=1000;
     cmf=true;
   break;
   case KEY10:
     i_step=21;
     dir=0;
     min_step=21;
     max_step=21;
     s_step=1000;
     cmf=true;
   break;
   case KEYSPEEDUP:      // speed control
     if(min_step!=141 && s_step>50) s_step-=50;
     cmf=true;
   break;
   case KEYSPEEDDOWN:
     if(min_step!=141 && s_step<400) s_step+=50;
     cmf=true;
   break;
  }
  if(cmf){
    digitalWrite(2,HIGH); // indicate IR command
    delay(50);
    digitalWrite(2,LOW);
  }
}

void loop() {              // duty cycle
 wdt_reset();

  if(irrecv.decode(&results)){                   // check whether there is CIR data
   if(millis() - last_ir>250) process_ir();      // restrict receiver time and process data
   last_ir=millis();                             // update timer
   irrecv.resume();                              // IR proceed
  }

   digitalWrite(5, a1c1[i_step]);                // output
   digitalWrite(6, a1c2[i_step]);
   digitalWrite(7, a1c3[i_step]);
   digitalWrite(8, a1c4[i_step]);
   digitalWrite(13,a1c5[i_step]);
   digitalWrite(12,a1c6[i_step]);
   digitalWrite(11,a1c7[i_step]);
   digitalWrite(10,a1c8[i_step]);
   digitalWrite(9, a1c9[i_step]);

  if(millis()-last_step>s_step){                 // array pointer movement
   if(dir==0){
    i_step++;
    if(i_step>max_step) i_step=min_step;
   }else{
    i_step--;
    if(i_step<min_step) i_step=max_step;
   }
   last_step=millis();        // update timer
  }
}                          // duty cycle ends

 

andreyblinkov
Offline
Зарегистрирован: 18.10.2014

Я изучил пример который Вы мне показали и пришел к выводу, что это может оказаться очень неудобным из-за того что портов в ардуино мега очень много. Если бы порт был один, тогда можно было записывать действительно так:



PORTD = B10101000

PORTD = B10101001

PORTD = B10101111

и так далее...

Но портов очень много и они перемешаны с входами или выходами ардуино. Каким то образом нужно создать начальное условие или переменную для всех 54 выводов, чтобы они были единым последовательным массивом 0000000000010000000001000000000000000000001...

andreyblinkov
Offline
Зарегистрирован: 18.10.2014

Спасибо, обязательно проанализирую Ваш код.

faraddin
Offline
Зарегистрирован: 11.08.2013

andreyblinkov пишет:

Я изучил пример который Вы мне показали и пришел к выводу, что это может оказаться очень неудобным из-за того что портов в ардуино мега очень много. Если бы порт был один, тогда можно было записывать действительно так:



PORTD = B10101000

PORTD = B10101001

PORTD = B10101111

и так далее...

Но портов очень много и они перемешаны с входами или выходами ардуино. Каким то образом нужно создать начальное условие или переменную для всех 54 выводов, чтобы они были единым последовательным массивом 0000000000010000000001000000000000000000001...

 

Сдвиговый регистр и булева аогебра Вам в помощь.

andreyblinkov
Offline
Зарегистрирован: 18.10.2014

Спасибо всем. Тему можно закрыть.