Совсем правильно был бы буфер [n х 8, 8], который выводится с заданным fps. При этом я бы выводил его постоянно - мало ли, пробежит помеха или будет плохой контакт с матрицей. Но нужно ли это обсуждать в данной теме?
Ладно пойдем другим путем , мулти плексор это переключатель 8 входов которые перелючаються в сзависимости от поступившевого адреса , а выход один , так как работает механизм пришедших даных с выхода мультиплексора , тоесть первая нога мултиплексора сотвествует первому столбику , вторая второму , и тд, и в зависимости напряжения на ноге изменяеться высота столбика , так вот мне непонятно в коде как это проиходит , а точнее я получил данные с мултика , потом что мне сделать толь массив какой то толь сразу выкидивать , как это в коде выглядит ? мне проще разобрать чтоб понять механизм
Я не утверждаю что мой код правильный и реализация тоже , может я в корне не правельно думаю , может решения такой задачи есть еще и проще , я буду только призннателен если поможете разобраться
Ладно пойдем другим путем , мулти плексор это переключатель 8 входов которые перелючаються в сзависимости от поступившевого адреса , а выход один , так как работает механизм пришедших даных с выхода мультиплексора , тоесть первая нога мултиплексора сотвествует первому столбику , вторая второму , и тд, и в зависимости напряжения на ноге изменяеться высота столбика , так вот мне непонятно в коде как это проиходит , а точнее я получил данные с мултика , потом что мне сделать толь массив какой то толь сразу выкидивать , как это в коде выглядит ? мне проще разобрать чтоб понять механизм
опишите подробнее что вы хотите увидеть на матрице и какие данные у вас есть на входе
void loop() {
byte tmp;
// последовательно переберём ноги мультиплексора/столбики матрицы от 0 до 7
for (int i = 0b000; i <= 0b111; i++) {
digitalWrite(OUT_A, bitRead(i, 0));
digitalWrite(OUT_B, bitRead(i, 1));
digitalWrite(OUT_C, bitRead(i, 2));
val = analogRead(ANALOG_PIN);
val = map(val,0,700,0,5);
val = constrain(val,0,5);
// в этом месте у Вас val будет содержать данные напряжения для i-того входа ( i меняется от 0 до 7)
tmp = 0;
// переберём биты от 0 до 4 в столбце i
for (uint8_t row = 0; row < 5 , row++) {
if (val > row) { // зажигаем нужное количество точек. Если val = 3, будут зажжены точки 0,1,2
bitWrite(tmp, row, 1); // если val = 3, tmp = 00000111 (устанавливаем нужные биты, бит это точка на матрице)
}
}
m.setColumn(i, tmp); // выводим готовы столбец на матрицу.
Serial.print(val);
Serial.print(" | ");
}
}
Смысл вот такой , каждому столбику свой пин мултиплексора , и при изменении напряжения на пине растет уровень , 0 пину , 0й столбик , первому , превый столбик итд
итак вы берете стандартную библимотеку #include "LedControl.h"
подключаете нужные пины LedControl lc=LedControl(12,11,10,1);
задаете число экранов, будите их и очищаете
void setup() {
lc.shutdown(0,false);
lc.setIntensity(0,8);
lc.clearDisplay(0);
}
дальше ваш ЛУП
в нем вы с вашего датчика получили данные - вы их заносите в переменную (массив)
итого у вас есть например массив с данными
bute dataarr[8] = {0,5,4,1,0,5,2,1} //8 значений для 8 колонок но они у вас в числовом десятичном виде - вам же надо перевести их в заданную последовательность байтов
для этого вы задаете массив сопоставления - тоесть переменную типа массив с нужными вам байтами (задаете его перед ЛУПОМ! он глобальный)
//конструкция ByteTable[dataarr[col]] берет из массива с данными число от 0 до 7 (по циклу) и подставляет как номер ячейки для обращения к массиву сопоставления ByteTable, тем самым вы передаете setColumn в столбик от 0 до 8 заданные вам набор бит (байт) нужных вам данных
итак вы берете стандартную библимотеку #include "LedControl.h"
подключаете нужные пины LedControl lc=LedControl(12,11,10,1);
задаете число экранов, будите их и очищаете
void setup() {
lc.shutdown(0,false);
lc.setIntensity(0,8);
lc.clearDisplay(0);
}
дальше ваш ЛУП
в нем вы с вашего датчика получили данные - вы их заносите в переменную (массив)
итого у вас есть например массив с данными
bute dataarr[8] = {0,5,4,1,0,5,2,1} //8 значений для 8 колонок но они у вас в числовом десятичном виде - вам же надо перевести их в заданную последовательность байтов
для этого вы задаете массив сопоставления - тоесть переменную типа массив с нужными вам байтами (задаете его перед ЛУПОМ! он глобальный)
//конструкция ByteTable[dataarr[col]] берет из массива с данными число от 0 до 7 (по циклу) и подставляет как номер ячейки для обращения к массиву сопоставления ByteTable, тем самым вы передаете setColumn в столбик от 0 до 8 заданные вам набор бит (байт) нужных вам данны
Спасибо дружище , все получилось , я все с трудом понял но разберусь , Правда искрени человеческое спасибо , Скажи пожалуйста а могу ли я у тебя консльтироваться еще по мимо форума?
Зачем использовать массив для формирования столбца? Простое и красивое решение - побитовый сдвиг.
1) Сначала (как вы уже делаете) с помощью map приводите значение, считанное с пина, к диапазону 0-8:
val = map(val, 0, 700, 0, 8);
2) А далее формируете столбик с помощью сдвига числа 255 (B11111111 в двоичном) влево или вправо (в зависимости от ориентации матрицы) на количество битов, равное 8 - val, например:
byte bar = 255 >> (8 - val); // сдвигать вправо или влево, в зависимости от ориентации матрицы LC.setColumn(0, col, bar);
Таким образом, при значении val равном 0, на выходе получим 0, т.е. не светится ничего. При равном 1 - получим B00000001, равном 2 - B00000011, при 3 - B00000111 и т.д., при val равном 8 - сдвига не произойдет и будет гореть весь столбец B11111111.
Зачем использовать массив для формирования столбца? Простое и красивое решение - побитовый сдвиг.
1) Сначала (как вы уже делаете) с помощью map приводите значение, считанное с пина, к диапазону 0-8:
val = map(val, 0, 700, 0, 8);
2) А далее формируете столбик с помощью сдвига числа 255 (B11111111 в двоичном) влево или вправо (в зависимости от ориентации матрицы) на количество битов, равное 8 - val, например:
byte bar = 255 >> (8 - val); // сдвигать вправо или влево, в зависимости от ориентации матрицы LC.setColumn(0, col, bar);
Таким образом, при значении val равном 0, на выходе получим 0, т.е. не светится ничего. При равном 1 - получим B00000001, равном 2 - B00000011, при 3 - B00000111 и т.д., при val равном 8 - сдвига не произойдет и будет гореть весь столбец B11111111.
Во-первых, в map() делайте преобразование к диапазону 0-8, а не к 0-7.
И во-вторых, почему вы constrain() используете после map()? Не логичнее ли его использовать до?
val = analogRead(ANALOG_PIN);
val = constrain(val, 0, 700);
val = map(val, 0, 700, 0, 8);
Т.е. сначала ограничиваем принимаемое значение с входа уровнем 700 (тут не спрашиваю, почему 700, надеюсь, вы его не с потолка взяли), а уже потом приводим его к диапазону 0-8.
Вообще-то, я почитал, с чего все началось, Jenek_Anapa писал "помогите каждый пин отабразить по 5 светодиодов , чтобы один вольт соответствовал одному светодиоду на матрице". Если он так хотел, то тогда вообще нужно приводить к 0-5, а при отсутствии сигнала, т.е при 0, ничего не должно гореть.
Ребята не растраивайтесь , у меня целая куча еще вопросов , сейчас второй варин пробую ) пока только моргающий столбик получился ) аааааааааааааа пототооооооооооооооом будем к каждому солбику цифру выводить ) так что 5 светодиодов это так сказать меньшее из бед )))))) но в долгу не останусь , знайте что анапа ваша , организум все что пожелаете ))))
[code]
#define EN 3
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define SIG A0
void setup(){
Serial.begin(9600);
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
digitalWrite(S0, LOW);
digitalWrite(S1, LOW);
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
pinMode(EN, OUTPUT);
digitalWrite(EN, LOW);
}
void loop(){
//Loop through and read all 16 values
//Reports back Value at channel 6 is: 346
for(int i = 0; i < 16; i ++){
// Serial.print("Value at channel ");
// Serial.print(i);
// Serial.print(": ");
Serial.print(readMux(i));
Serial.print(" | ");
}
Serial.println();
delay(2000);
}
int readMux(int channel){
int controlPin[] = {S0, S1, S2, S3};
int muxChannel[16][4]={
{0,0,0,0}, //channel 0
{1,0,0,0}, //channel 1
{0,1,0,0}, //channel 2
{1,1,0,0}, //channel 3
{0,0,1,0}, //channel 4
{1,0,1,0}, //channel 5
{0,1,1,0}, //channel 6
{1,1,1,0}, //channel 7
{0,0,0,1}, //channel 8
{1,0,0,1}, //channel 9
{0,1,0,1}, //channel 10
{1,1,0,1}, //channel 11
{0,0,1,1}, //channel 12
{1,0,1,1}, //channel 13
{0,1,1,1}, //channel 14
{1,1,1,1} //channel 15
};
//loop through the 4 sig
for(int i = 0; i < 4; i ++){
digitalWrite(controlPin[i], muxChannel[channel][i]);
}
//read the value at the SIG pin
int val = analogRead(SIG);
val = map(val,0,700,0,8);
val = constrain(val,0,8);
//return the value
return val;
}
тут что благоразумней использовать ) с тем расчетом что модуль четырех матричный
и на вторые два будут выводиться цифры активных пинов
Я не о том, какую функцию от там выполняет, а почему это делается через массив? Тем более так, как он объявлен - это 128 байт оперативки, извините, в жопу. Неужели так сложно без массива представить число в двоичном виде?
Там, конечно, по хорошему, напрашивается прямой вывод в порт, но это еще, видимо, не для вашего уровня. Попробуйте через биты, что-ли. Или через остатки от последовательного деления на 2.
Я не о том, какую функцию от там выполняет, а почему это делается через массив? Тем более так, как он объявлен - это 128 байт оперативки, извините, в жопу. Неужели так сложно без массива представить число в двоичном виде?
Там, конечно, по хорошему, напрашивается прямой вывод в порт, но это еще, видимо, не для вашего уровня. Попробуйте через биты, что-ли.
там долеко не до моего уровня только учусь всему этому , я так понял что массив служит для адресации мультиплексора , чтобы переключать входа , но суть не в этом кострукция как бы исполняет свою функцию , мне сейчас важно разобраться с выводм на матрицу , сечас у меня компилятор ругаеться на то что не обявлена переменная i вот в этом выражении LC.setColumn(i / 8, i % 8, 255 >> (8 - val)); я ее обьявил int i ; компилятор не ругаеться но и не работет код , на матрице моргает столбик один п родаче сигнала на любой из пинов
for(byte i = 0; i < 16; i ++)
{
//.......
LC.setColumn(i / 8, i % 8, 255 >> (8 - val));
}
В этом примере LC.setColumn стоит в цикле, в котором перебираются адреса от 0 до 15 (у вас это строки 46-52), а вы его почему-то вписали в функцию readMux().
sensVal = constrain(sensVal, 10, 150);
// ограничиваем значения sensVal диапазоном от 10 до 150
Совсем правильно был бы буфер [n х 8, 8], который выводится с заданным fps. При этом я бы выводил его постоянно - мало ли, пробежит помеха или будет плохой контакт с матрицей. Но нужно ли это обсуждать в данной теме?
Ладно пойдем другим путем , мулти плексор это переключатель 8 входов которые перелючаються в сзависимости от поступившевого адреса , а выход один , так как работает механизм пришедших даных с выхода мультиплексора , тоесть первая нога мултиплексора сотвествует первому столбику , вторая второму , и тд, и в зависимости напряжения на ноге изменяеться высота столбика , так вот мне непонятно в коде как это проиходит , а точнее я получил данные с мултика , потом что мне сделать толь массив какой то толь сразу выкидивать , как это в коде выглядит ? мне проще разобрать чтоб понять механизм
Я не утверждаю что мой код правильный и реализация тоже , может я в корне не правельно думаю , может решения такой задачи есть еще и проще , я буду только призннателен если поможете разобраться
sensVal = constrain(sensVal, 10, 150);
// ограничиваем значения sensVal диапазоном от 10 до 150
ах да, это я попутал - да оно именно так делает
Ладно пойдем другим путем , мулти плексор это переключатель 8 входов которые перелючаються в сзависимости от поступившевого адреса , а выход один , так как работает механизм пришедших даных с выхода мультиплексора , тоесть первая нога мултиплексора сотвествует первому столбику , вторая второму , и тд, и в зависимости напряжения на ноге изменяеться высота столбика , так вот мне непонятно в коде как это проиходит , а точнее я получил данные с мултика , потом что мне сделать толь массив какой то толь сразу выкидивать , как это в коде выглядит ? мне проще разобрать чтоб понять механизм
опишите подробнее что вы хотите увидеть на матрице и какие данные у вас есть на входе
http://g01.a.alicdn.com/kf/HTB1xuAFQVXXXXX1XXXXq6xXFXXXP/Diy-%D0%9A%D0%B...
Смысл вот такой , каждому столбику свой пин мултиплексора , и при изменении напряжения на пине растет уровень , 0 пину , 0й столбик , первому , превый столбик итд
попробуйте иным путем пойти
задайте массив - intarr[8]
далее у вас 8 столбиков по 8 точек
значит val,0,7 надо брать (хотя 0-5 у вас будет 2 пустые строки) не сильно важно
итак - на выходе у вас есть значение от 0 до 5 (7)
задайте таблицу сравнений например
const byte ByteTable[10] = {
// 0 1 2 3 4 5 6 7 8 B00000000,B00000001,B00000011,B00000111,B00001111,B00011111,B00111111,B01111111,B11111111}
и на матрицу выводите просто сопоставление циклом
ByteTable[intarr[i]]
попробуйте иным путем пойти
задайте массив - intarr[8]
далее у вас 8 столбиков по 8 точек
значит val,0,7 надо брать (хотя 0-5 у вас будет 2 пустые строки) не сильно важно
итак - на выходе у вас есть значение от 0 до 5 (7)
задайте таблицу сравнений например
const byte ByteTable[10] = {
// 0 1 2 3 4 5 6 7 8 B00000000,B00000001,B00000011,B00000111,B00001111,B00011111,B00111111,B01111111,B11111111}
и на матрицу выводите просто сопоставление циклом
ByteTable[intarr[i]]
а можно попрасить в коде а то у меня уже голова перевешивает туловище )
итак вы берете стандартную библимотеку #include "LedControl.h"
подключаете нужные пины LedControl lc=LedControl(12,11,10,1);
задаете число экранов, будите их и очищаете
в нем вы с вашего датчика получили данные - вы их заносите в переменную (массив)
итого у вас есть например массив с данными
bute dataarr[8] = {0,5,4,1,0,5,2,1} //8 значений для 8 колонок но они у вас в числовом десятичном виде - вам же надо перевести их в заданную последовательность байтов
для этого вы задаете массив сопоставления - тоесть переменную типа массив с нужными вам байтами (задаете его перед ЛУПОМ! он глобальный)
const byte ByteTable[10] = {
// 0 1 2 3 4 5 6 7 8 B00000000,B00000001,B00000011,B00000111,B00001111,B00011111,B00111111,B01111111,B11111111}
и теперь вам надо вывести на экран результат
а тк у нас 8 столбиков - то берем цикл
for(int col=0;col<8;col++) {
lc.setColumn(0,col,ByteTable[dataarr[col]]);
}
//конструкция ByteTable[dataarr[col]] берет из массива с данными число от 0 до 7 (по циклу) и подставляет как номер ячейки для обращения к массиву сопоставления ByteTable, тем самым вы передаете setColumn в столбик от 0 до 8 заданные вам набор бит (байт) нужных вам данных
Получился треугольник
Воот а как занести данные с датчика в массив , у меня этот вопрос то изначально стоял я это понять не могу
[quote=ELITE]
итак вы берете стандартную библимотеку #include "LedControl.h"
подключаете нужные пины LedControl lc=LedControl(12,11,10,1);
задаете число экранов, будите их и очищаете
в нем вы с вашего датчика получили данные - вы их заносите в переменную (массив)
итого у вас есть например массив с данными
bute dataarr[8] = {0,5,4,1,0,5,2,1} //8 значений для 8 колонок но они у вас в числовом десятичном виде - вам же надо перевести их в заданную последовательность байтов
для этого вы задаете массив сопоставления - тоесть переменную типа массив с нужными вам байтами (задаете его перед ЛУПОМ! он глобальный)
const byte ByteTable[10] = {
// 0 1 2 3 4 5 6 7 8 B00000000,B00000001,B00000011,B00000111,B00001111,B00011111,B00111111,B01111111,B11111111}
и теперь вам надо вывести на экран результат
а тк у нас 8 столбиков - то берем цикл
for(int col=0;col<8;col++) {
lc.setColumn(0,col,ByteTable[dataarr[col]]);
}
//конструкция ByteTable[dataarr[col]] берет из массива с данными число от 0 до 7 (по циклу) и подставляет как номер ячейки для обращения к массиву сопоставления ByteTable, тем самым вы передаете setColumn в столбик от 0 до 8 заданные вам набор бит (байт) нужных вам данны
Спасибо дружище , все получилось , я все с трудом понял но разберусь , Правда искрени человеческое спасибо , Скажи пожалуйста а могу ли я у тебя консльтироваться еще по мимо форума?
Зачем использовать массив для формирования столбца? Простое и красивое решение - побитовый сдвиг.
1) Сначала (как вы уже делаете) с помощью map приводите значение, считанное с пина, к диапазону 0-8:
val = map(val, 0, 700, 0, 8);
2) А далее формируете столбик с помощью сдвига числа 255 (B11111111 в двоичном) влево или вправо (в зависимости от ориентации матрицы) на количество битов, равное 8 - val, например:
byte bar = 255 >> (8 - val); // сдвигать вправо или влево, в зависимости от ориентации матрицы
LC.setColumn(0, col, bar);
Таким образом, при значении val равном 0, на выходе получим 0, т.е. не светится ничего. При равном 1 - получим B00000001, равном 2 - B00000011, при 3 - B00000111 и т.д., при val равном 8 - сдвига не произойдет и будет гореть весь столбец B11111111.
Зачем использовать массив для формирования столбца? Простое и красивое решение - побитовый сдвиг.
1) Сначала (как вы уже делаете) с помощью map приводите значение, считанное с пина, к диапазону 0-8:
val = map(val, 0, 700, 0, 8);
2) А далее формируете столбик с помощью сдвига числа 255 (B11111111 в двоичном) влево или вправо (в зависимости от ориентации матрицы) на количество битов, равное 8 - val, например:
byte bar = 255 >> (8 - val); // сдвигать вправо или влево, в зависимости от ориентации матрицы
LC.setColumn(0, col, bar);
Таким образом, при значении val равном 0, на выходе получим 0, т.е. не светится ничего. При равном 1 - получим B00000001, равном 2 - B00000011, при 3 - B00000111 и т.д., при val равном 8 - сдвига не произойдет и будет гореть весь столбец B11111111.
интересное решение сейчас попробую )
vk007 красивое и правильное решение предложил
ну и если по "простенькому" то
22
const
byte
dataarr[8] = {
23
0,1,2,3,4,5,6,7} ;
вы задали его уже как треугольник)
значит вывод на матрицу работает как надо :)
дальше - сразу измените на
int
val[8]; //массив для данных
И соответственно нам уже не надо dataarr
и вы не верно сделали - вывод на экран уже в своем цикле - не надо его в чужой запихивать )
итого выйдет
если у вас в Serial.print(val); выводит всё верно - то и код после правок должен заработать верно
как то так
тогда уж
и
const byte ByteTable[10] вам уже не нужен вообще
Во-первых, в map() делайте преобразование к диапазону 0-8, а не к 0-7.
И во-вторых, почему вы constrain() используете после map()? Не логичнее ли его использовать до?
val = analogRead(ANALOG_PIN);
val = constrain(val, 0, 700);
val = map(val, 0, 700, 0, 8);
Т.е. сначала ограничиваем принимаемое значение с входа уровнем 700 (тут не спрашиваю, почему 700, надеюсь, вы его не с потолка взяли), а уже потом приводим его к диапазону 0-8.
ну 0-7 можно предположить логично, что если уровень = 0 - то горит 1 нижний диод (как это классически в большинстве эквалайзеров сделано)
да и цикл на 8 шагов удобнее , чем на 9
Ну тогда уж пишите
LC.setColumn(0, i, (255 >> (7 - val)));
Вообще-то, я почитал, с чего все началось, Jenek_Anapa писал "помогите каждый пин отабразить по 5 светодиодов , чтобы один вольт соответствовал одному светодиоду на матрице". Если он так хотел, то тогда вообще нужно приводить к 0-5, а при отсутствии сигнала, т.е при 0, ничего не должно гореть.
Jenek_Anapa, как вам все-таки нужно?
Ребята не растраивайтесь , у меня целая куча еще вопросов , сейчас второй варин пробую ) пока только моргающий столбик получился ) аааааааааааааа пототооооооооооооооом будем к каждому солбику цифру выводить ) так что 5 светодиодов это так сказать меньшее из бед )))))) но в долгу не останусь , знайте что анапа ваша , организум все что пожелаете ))))
LC.setColumn(0, col, bar);
у вас нету col у вас цикл по i
замените на
LC.setColumn(0, i, bar);
и да,
byte
bar = 255 >> (8 - val); тут излишня, можно сразу
LC.setColumn(0, i, (255 >> (8 - val)) );
Все огонь!!!!! ))))) а вот если мне рашириться на 16 пинов надо ? тоесть на две матрици
Все огонь!!!!! ))))) а вот если мне рашириться на 16 пинов надо ? тоесть на две матрици
да хоть до 64 :)
собираете матрица последовательно (d_out первой в D-in следующей)
и всё очно также циклом шлете данные в них
просто цикл увеличить на число матриц ну и не забывать указывать к кайо обращение идет
// не забывайте все матрицы инициализировать....
а вот если мне рашириться на 16 пинов надо ? тоесть на две матрици
constrain() и map() местами поменять не хотите, как я в сообщении #120 писал? И что за массив в строках 50-67? Зачем он там?
переменная i не компилиться можнт другой заменит буквой ?
constrain() и map() местами поменять не хотите, как я в сообщении #120 писал? И что за массив в строках 50-67? Зачем он там?
Насколько я помню, map сам обрезает данные вне диапазона. поэтому constrain вообще не нужен.
constrain() и map() местами поменять не хотите, как я в сообщении #120 писал? И что за массив в строках 50-67? Зачем он там?
Насколько я помню, map сам обрезает данные вне диапазона. поэтому constrain вообще не нужен.
вообще удалить ?
constrain() и map() местами поменять не хотите, как я в сообщении #120 писал? И что за массив в строках 50-67? Зачем он там?
Насколько я помню, map сам обрезает данные вне диапазона. поэтому constrain вообще не нужен.
Неправильно помните, читайте: map
массив для CD74HC4067 16-канальный аналоговый цифровой мультиплексор
Да, извиняюсь, ввёл в заблуждение.
выдало в симуляторе
0 0
10 1
20 2
30 3
40 4
50 5
60 6
70 7
80 8
90 9
Хотя на каком-то проекте или языке программирования данные за пределами диапазона обрезало.
массив для CD74HC4067 16-канальный аналоговый цифровой мультиплексор
Я не о том, какую функцию от там выполняет, а почему это делается через массив? Тем более так, как он объявлен - это 128 байт оперативки, извините, в жопу. Неужели так сложно без массива представить число в двоичном виде?
Там, конечно, по хорошему, напрашивается прямой вывод в порт, но это еще, видимо, не для вашего уровня. Попробуйте через биты, что-ли. Или через остатки от последовательного деления на 2.
массив для CD74HC4067 16-канальный аналоговый цифровой мультиплексор
Я не о том, какую функцию от там выполняет, а почему это делается через массив? Тем более так, как он объявлен - это 128 байт оперативки, извините, в жопу. Неужели так сложно без массива представить число в двоичном виде?
Там, конечно, по хорошему, напрашивается прямой вывод в порт, но это еще, видимо, не для вашего уровня. Попробуйте через биты, что-ли.
там долеко не до моего уровня только учусь всему этому , я так понял что массив служит для адресации мультиплексора , чтобы переключать входа , но суть не в этом кострукция как бы исполняет свою функцию , мне сейчас важно разобраться с выводм на матрицу , сечас у меня компилятор ругаеться на то что не обявлена переменная i вот в этом выражении LC.setColumn(i / 8, i % 8, 255 >> (8 - val)); я ее обьявил int i ; компилятор не ругаеться но и не работет код , на матрице моргает столбик один п родаче сигнала на любой из пинов
Так вы посмотрите, куда вы впихнули LC.setColumn и где он должен быть.
Я в сообщении #130 привел пример
В этом примере LC.setColumn стоит в цикле, в котором перебираются адреса от 0 до 15 (у вас это строки 46-52), а вы его почему-то вписали в функцию readMux().
Кому интересно вот здесь можно посоставлять символы для матрицы 8x8 и получить готовые массивы:
https://xantorohara.github.io/led-matrix-editor/
я перенес но теперь все пропало , даже мигаещего столбика нет уже
да человек похоже читает через 1 пост
я ему это уже писал, и про лишнюю теперь уже переменную сопоставления 41-42 строки - которую давно пора удалить
я перенес но теперь все пропало , даже мигаещего столбика нет уже
всегда прикладывайте КОД
и да - сворачивайте его под споллер!
я убрал но ситуация не поменялас , я почемуто считал что массив столбиков , он разве не участвует при выводе?
что тут не так ?
строка 19-20 вы включили 1й матрицу
а кто будет 2,3 и 4ю включать?
строка 45 - 56
вы вначале вывели на матрицы данные а потом только их получаете - странный подход.... на зазеркалье похоже.... :) зовите Алису )
да и 48-49 строки вявно не из этой "оперы тут"