бинарный массив управляет светодиодами
- Войдите на сайт для отправки комментариев
Сб, 18/10/2014 - 23:05
Здравствуйте, подскажите пожалуйста на примере, если возможно.
Как с помощью бинарного массива управлять светодиодами, чтобы они зажигались, если в массиве присутствует 1 и гасли при 0. Например первая строка 0001. Вторая 0010. И так далее.
http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry
Может это поможет
Спасибо, большое. Это возможно то что мне нужно.
С корефаном как-то делали надпись на бампер машины, может пригодится. Схема простая, на выходах куски светодиодной ленты через транзисторы, на 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Я изучил пример который Вы мне показали и пришел к выводу, что это может оказаться очень неудобным из-за того что портов в ардуино мега очень много. Если бы порт был один, тогда можно было записывать действительно так:
PORTD = B10101000
PORTD = B10101001
PORTD = B10101111
и так далее...
Но портов очень много и они перемешаны с входами или выходами ардуино. Каким то образом нужно создать начальное условие или переменную для всех 54 выводов, чтобы они были единым последовательным массивом 0000000000010000000001000000000000000000001...
Спасибо, обязательно проанализирую Ваш код.
Я изучил пример который Вы мне показали и пришел к выводу, что это может оказаться очень неудобным из-за того что портов в ардуино мега очень много. Если бы порт был один, тогда можно было записывать действительно так:
PORTD = B10101000
PORTD = B10101001
PORTD = B10101111
и так далее...
Но портов очень много и они перемешаны с входами или выходами ардуино. Каким то образом нужно создать начальное условие или переменную для всех 54 выводов, чтобы они были единым последовательным массивом 0000000000010000000001000000000000000000001...
Сдвиговый регистр и булева аогебра Вам в помощь.
Спасибо всем. Тему можно закрыть.