LED-матрица + MAX7219 + MaxMatrix.lib

DenKis
Offline
Зарегистрирован: 20.05.2015
sensVal = constrain(sensVal, 10, 150);
// ограничиваем значения sensVal диапазоном от 10 до 150

 

DenKis
Offline
Зарегистрирован: 20.05.2015

Совсем правильно был бы буфер [n х 8, 8], который выводится с заданным fps. При этом я бы выводил его постоянно - мало ли, пробежит помеха или будет плохой контакт с матрицей. Но нужно ли это обсуждать в данной теме?

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

Ладно пойдем другим путем , мулти плексор это переключатель  8 входов которые перелючаються в сзависимости от поступившевого адреса , а выход один ,  так как работает механизм  пришедших даных с выхода мультиплексора , тоесть первая нога мултиплексора сотвествует первому столбику , вторая второму , и тд, и в зависимости напряжения на ноге изменяеться высота столбика , так вот мне непонятно в коде как это проиходит  , а точнее я получил данные с мултика , потом что мне сделать толь массив какой то толь сразу выкидивать , как это в коде выглядит ? мне проще разобрать чтоб понять механизм 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

Я не утверждаю что мой код правильный и реализация тоже , может я в корне не правельно думаю ,  может решения такой задачи есть еще и  проще , я буду только призннателен если  поможете разобраться

 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

DenKis пишет:

sensVal = constrain(sensVal, 10, 150);
// ограничиваем значения sensVal диапазоном от 10 до 150

 

ах да, это я попутал - да оно именно так делает

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

Jenek_Anapa пишет:

Ладно пойдем другим путем , мулти плексор это переключатель  8 входов которые перелючаються в сзависимости от поступившевого адреса , а выход один ,  так как работает механизм  пришедших даных с выхода мультиплексора , тоесть первая нога мултиплексора сотвествует первому столбику , вторая второму , и тд, и в зависимости напряжения на ноге изменяеться высота столбика , так вот мне непонятно в коде как это проиходит  , а точнее я получил данные с мултика , потом что мне сделать толь массив какой то толь сразу выкидивать , как это в коде выглядит ? мне проще разобрать чтоб понять механизм 

опишите подробнее что вы хотите увидеть на матрице и какие данные у вас есть на входе 

DenKis
Offline
Зарегистрирован: 20.05.2015
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(" | ");
    }
}

 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

http://g01.a.alicdn.com/kf/HTB1xuAFQVXXXXX1XXXXq6xXFXXXP/Diy-%D0%9A%D0%B...

Смысл вот такой , каждому столбику свой пин мултиплексора , и при изменении напряжения на пине растет уровень , 0 пину , 0й столбик , первому , превый столбик итд

 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

попробуйте иным путем пойти

задайте массив - 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]]

 

 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

ELITE пишет:

попробуйте иным путем пойти

задайте массив - 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]]

 

 

 

а можно  попрасить в коде а то у меня уже голова перевешивает туловище )

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

итак вы берете стандартную библимотеку #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 колонок но они у вас в числовом десятичном виде - вам же надо перевести их в заданную последовательность байтов

для этого вы задаете массив сопоставления - тоесть переменную типа массив с нужными вам байтами (задаете его перед ЛУПОМ! он глобальный)

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 заданные вам набор бит (байт) нужных вам данных

 

 

 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

#define ANALOG_PIN A0
#define OUT_A 2
#define OUT_B 3
#define OUT_C 4
#include "LedControl.h"
LedControl LC = LedControl(12, 11, 10, 4); 
 int val;
 
void setup() { 


   LC.shutdown(0, false); //Активируем 0ю матрицу
   LC.setIntensity(0, 8);
   LC.clearDisplay(0);
      
  pinMode(OUT_A, OUTPUT);
  pinMode(OUT_B, OUTPUT);
  pinMode(OUT_C, OUTPUT);
  Serial.begin(9600);
}

   const byte dataarr[8]   = {
      0,1,2,3,4,5,6,7}  ;
      
   const byte ByteTable[10]   = {
      B00000000,B00000001,B00000011,B00000111,B00001111,B00011111,B00111111,B01111111,B11111111}  ;    

      

     
      
void loop() { 

    


      
   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,7);
     val = constrain(val,0,7);
     
     Serial.print(val);
     Serial.print(" | ");

    for(int col=0;col<8;col++) {
      
    LC.setColumn(0,col,ByteTable[dataarr[col]]);
}  
    
    
  
   Serial.println();
   delay(1000);
   }
}

[/code]

Получился треугольник 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

Воот а как занести данные с датчика  в массив , у меня  этот вопрос то изначально стоял я  это понять не могу

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

[quote=ELITE]

итак вы берете стандартную библимотеку #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 колонок но они у вас в числовом десятичном виде - вам же надо перевести их в заданную последовательность байтов

для этого вы задаете массив сопоставления - тоесть переменную типа массив с нужными вам байтами (задаете его перед ЛУПОМ! он глобальный)

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 заданные вам набор бит (байт) нужных вам данны

 

 

Спасибо дружище , все получилось , я все с трудом понял но разберусь , Правда искрени человеческое спасибо , Скажи пожалуйста а могу ли я у тебя консльтироваться еще по мимо форума?

 

vk007
Offline
Зарегистрирован: 16.06.2015

Зачем использовать массив для формирования столбца? Простое и красивое решение - побитовый сдвиг.

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.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

vk007 пишет:

Зачем использовать массив для формирования столбца? Простое и красивое решение - побитовый сдвиг.

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.

  

интересное решение сейчас попробую )

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

vk007 красивое и правильное решение предложил

ну и если по "простенькому" то 

22    const byte dataarr[8]   = {
23       0,1,2,3,4,5,6,7}  ;

вы задали его уже как треугольник)

значит вывод на матрицу работает как надо :)

дальше - сразу измените на 

 int val[8]; //массив для данных

И соответственно нам уже не надо dataarr

и вы не верно сделали - вывод на экран уже в своем цикле - не надо его в чужой запихивать ) 

итого выйдет

   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[i] = analogRead(ANALOG_PIN);
     val[i] = map(val,0,700,0,7);
     val[i] = constrain(val,0,7);
     
     Serial.print(val[i]);
     Serial.print(" | ");

   Serial.println();
   delay(1000);
   }
    for(int col=0;col<8;col++) {
    LC.setColumn(0,col,ByteTable[val[col]]);
    }  

если у вас в Serial.print(val); выводит всё верно - то и код после правок должен заработать верно

 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
[code]
#define ANALOG_PIN A0
#define OUT_A 2
#define OUT_B 3
#define OUT_C 4
#include "LedControl.h"
LedControl LC = LedControl(12, 11, 10, 4); 
 int val;
 
void setup() { 


   LC.shutdown(0, false); //Активируем 0ю матрицу
   LC.setIntensity(0, 8);
   LC.clearDisplay(0);
      
  pinMode(OUT_A, OUTPUT);
  pinMode(OUT_B, OUTPUT);
  pinMode(OUT_C, OUTPUT);
  Serial.begin(9600);
}
 int dataarr[8];
 int pos = 0;
      
   const byte ByteTable[10]   = {
      B00000000,B00000001,B00000011,B00000111,B00001111,B00011111,B00111111,B01111111,B11111111}  ;    
void loop() {
      
   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,7);
     val = constrain(val,0,7);
    
      dataarr[pos++] = val;
    
      if(pos == 8) pos = 0; 

 
     Serial.print(val);
     Serial.print(" | ");

    for(int col=0;col<8;col++) {
      
    LC.setColumn(0,col,ByteTable[dataarr[col]]);
  }  
 }
}

[/code]

как то так 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

тогда уж

void loop() {
      
   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,7);
     val = constrain(val,0,7);

     Serial.print(val);
     Serial.print(" | ");
   
    LC.setColumn(0,i,(255 >> (8 - val)));
 }
}

и  const byte ByteTable[10] вам уже не нужен вообще

 
vk007
Offline
Зарегистрирован: 16.06.2015

Во-первых, в 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.

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

ну 0-7 можно предположить логично, что если уровень = 0 - то горит 1 нижний диод (как это классически в большинстве эквалайзеров сделано)

да и цикл на 8 шагов удобнее , чем на 9

vk007
Offline
Зарегистрирован: 16.06.2015

Ну тогда уж пишите

LC.setColumn(0, i, (255 >> (7 - val)));

vk007
Offline
Зарегистрирован: 16.06.2015

Вообще-то, я почитал, с чего все началось, Jenek_Anapa писал "помогите каждый пин отабразить по 5 светодиодов , чтобы один вольт соответствовал одному светодиоду на матрице". Если он так хотел, то тогда вообще нужно приводить к 0-5, а при отсутствии сигнала, т.е при 0, ничего не должно гореть.

Jenek_Anapa, как вам все-таки нужно?

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

Ребята не растраивайтесь , у меня целая куча еще вопросов , сейчас  второй варин пробую ) пока только моргающий столбик получился ) аааааааааааааа  пототооооооооооооооом будем к каждому солбику  цифру выводить )  так что  5 светодиодов это так сказать меньшее из бед ))))))  но в долгу не останусь , знайте что анапа ваша , организум все что пожелаете ))))

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
[code]
#define ANALOG_PIN A0
#define OUT_A 2
#define OUT_B 3
#define OUT_C 4
#include "LedControl.h"
LedControl LC = LedControl(12, 11, 10, 4); 
 int val;
 int col;
void setup() { 


   LC.shutdown(0, false); //Активируем 0ю матрицу
   LC.setIntensity(0, 8);
   LC.clearDisplay(0);
      
  pinMode(OUT_A, OUTPUT);
  pinMode(OUT_B, OUTPUT);
  pinMode(OUT_C, OUTPUT);
  Serial.begin(9600);
}
  
void loop() {
      
   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,8);
     val = constrain(val,0,8);



      byte bar = 255 >> (8 - val);  // сдвигать вправо или влево, в зависимости от ориентации матрицы
      LC.setColumn(0, col, bar);
    
    

   
 }
}

[/code]

 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

 LC.setColumn(0, col, bar);

у вас нету col у вас цикл по i

замените на  LC.setColumn(0, i, bar);

и да, byte bar = 255 >> (8 - val); тут излишня, можно сразу

LC.setColumn(0, i, (255 >> (8 - val)) );

 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

Все огонь!!!!! )))))  а вот если мне рашириться на 16 пинов надо ? тоесть на две матрици 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
[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;
}

тут что благоразумней использовать )  с тем расчетом что модуль четырех матричный 
и на вторые два будут выводиться цифры активных пинов 

 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

Jenek_Anapa пишет:

Все огонь!!!!! )))))  а вот если мне рашириться на 16 пинов надо ? тоесть на две матрици 

да хоть до 64 :) 

собираете матрица последовательно (d_out первой в D-in следующей)

и всё очно также циклом шлете данные в них

просто цикл увеличить на число матриц ну и не забывать указывать к кайо обращение идет

// не забывайте все матрицы инициализировать....

  lc.shutdown(0, false);   lc.setIntensity(0,11);  lc.clearDisplay(0);
  lc.shutdown(1, false);   lc.setIntensity(1,11);  lc.clearDisplay(1);
и тд... 

 

vk007
Offline
Зарегистрирован: 16.06.2015

Jenek_Anapa пишет:

а вот если мне рашириться на 16 пинов надо ? тоесть на две матрици 

for(byte i = 0; i < 16; i ++)
{
  //.......
  LC.setColumn(i / 8, i % 8, 255 >> (8 - val));
}

 

vk007
Offline
Зарегистрирован: 16.06.2015

constrain() и map() местами поменять не хотите, как я в сообщении #120 писал? И что за массив в строках 50-67? Зачем он там?

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
[code]
#define EN 3
#define S0 4
#define S1 5
#define S2 6
#define S3 7 
#define SIG A0
#include "LedControl.h"
LedControl LC = LedControl(12, 11, 10, 4); 
int val;

void setup(){
  Serial.begin(9600);
  
  LC.shutdown(0, false); //Активируем 0ю матрицу
  LC.shutdown(1, false); //Активируем 1ю матрицу
  LC.shutdown(2, false); //Активируем 2ю матрицу
  LC.shutdown(3, false); //Активируем 3ю матрицу
    
   LC.setIntensity(0, 8);
   LC.clearDisplay(0);
   
  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);

  
}
 int dataarr[16]; // указываем размер массива в который будет слкадываться  значение с датчика 
 int pos = 0;    // массив обнуляеться 

 const byte ByteTable[10]   = {
    B00000000,B00000001,B00000011,B00000111,B00001111,B00011111,B00111111,B01111111,B11111111}  ; 
    
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);

      dataarr[pos++] = val;
    
      if(pos == 8) pos = 0; 

 
      LC.setColumn(i / 8, i % 8, 255 >> (8 - val));

  

       
  //return the value
  return val;
}

[/code]

переменная i не компилиться можнт другой заменит буквой ?

DenKis
Offline
Зарегистрирован: 20.05.2015

vk007 пишет:

constrain() и map() местами поменять не хотите, как я в сообщении #120 писал? И что за массив в строках 50-67? Зачем он там?

Насколько я помню, map сам обрезает данные вне диапазона. поэтому constrain вообще не нужен.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

DenKis пишет:

vk007 пишет:

constrain() и map() местами поменять не хотите, как я в сообщении #120 писал? И что за массив в строках 50-67? Зачем он там?

Насколько я помню, map сам обрезает данные вне диапазона. поэтому constrain вообще не нужен.

 

вообще удалить ?

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

DenKis пишет:

vk007 пишет:

constrain() и map() местами поменять не хотите, как я в сообщении #120 писал? И что за массив в строках 50-67? Зачем он там?

Насколько я помню, map сам обрезает данные вне диапазона. поэтому constrain вообще не нужен.

Неправильно помните, читайте: map

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
DenKis
Offline
Зарегистрирован: 20.05.2015

Да, извиняюсь, ввёл в заблуждение.

void setup()
{
  Serial.begin(115200);
}

void loop()
{
  int tmp;
  for (int x = 0; x < 100; x+=10) {
    tmp = map(x, 20,80,2,8);
 	Serial.print(x);   
    Serial.print(" ");
    Serial.println(tmp);
  }
}

выдало в симуляторе 

0 0

10 1

20 2

30 3

40 4

50 5

60 6

70 7

80 8

90 9

Хотя на каком-то проекте или языке программирования данные за пределами диапазона обрезало.

vk007
Offline
Зарегистрирован: 16.06.2015

Я не о том, какую функцию от там выполняет, а почему это делается через массив? Тем более так, как он объявлен - это 128 байт оперативки, извините, в жопу. Неужели так сложно без массива представить число в двоичном виде?

Там, конечно, по хорошему, напрашивается прямой вывод в порт, но это еще, видимо, не для вашего уровня. Попробуйте через биты, что-ли. Или через остатки от последовательного деления на 2.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

vk007 пишет:

Я не о том, какую функцию от там выполняет, а почему это делается через массив? Тем более так, как он объявлен - это 128 байт оперативки, извините, в жопу. Неужели так сложно без массива представить число в двоичном виде?

Там, конечно, по хорошему, напрашивается прямой вывод в порт, но это еще, видимо, не для вашего уровня. Попробуйте через биты, что-ли.

там долеко не до моего уровня только учусь всему  этому  , я так понял что массив служит для адресации мультиплексора , чтобы переключать входа , но суть не в этом кострукция как бы исполняет свою функцию , мне  сейчас важно разобраться с выводм на матрицу , сечас у меня компилятор ругаеться на то что не обявлена переменная i вот в  этом выражении  LC.setColumn(i / 8, i % 8, 255 >> (8 - val)); я ее обьявил int i ; компилятор не ругаеться но и не работет код , на матрице моргает столбик один п родаче сигнала на любой из пинов 

vk007
Offline
Зарегистрирован: 16.06.2015

Так вы посмотрите, куда вы впихнули LC.setColumn и где он должен быть.

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
[code]
#define EN 3
#define S0 4
#define S1 5
#define S2 6
#define S3 7 
#define SIG A0
#include "LedControl.h"
LedControl LC = LedControl(12, 11, 10, 4); 
int val;
int i;
void setup(){
  Serial.begin(9600);
  
  LC.shutdown(0, false); //Активируем 0ю матрицу
  LC.shutdown(1, false); //Активируем 1ю матрицу
  LC.shutdown(2, false); //Активируем 2ю матрицу
  LC.shutdown(3, false); //Активируем 3ю матрицу
    
   LC.setIntensity(0, 8);
   LC.clearDisplay(0);
   
  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);

  
}
 int dataarr[16]; // указываем размер массива в который будет слкадываться  значение с датчика 
 int pos = 0;    // массив обнуляеться 

 const byte ByteTable[10]   = {
    B00000000,B00000001,B00000011,B00000111,B00001111,B00011111,B00111111,B01111111,B11111111}  ; 
    
void loop(){

  for(int i = 0; i < 16; i ++){

  
    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]);
  }

  int val = analogRead(SIG);
      val = map(val,0,700,0,8);
      val = constrain(val,0,8);

      dataarr[pos++] = val;
    
      if(pos == 8) pos = 0; 

 
      LC.setColumn(i / 8, i % 8, 255 >> (8 - val));

  //return the value
  return val;
}

[/code]

что тут не так , то что я не досмотрел ?

 

vk007
Offline
Зарегистрирован: 16.06.2015

Я в сообщении #130 привел пример

for(byte i = 0; i < 16; i ++)
{
  //.......
  LC.setColumn(i / 8, i % 8, 255 >> (8 - val));
}

В этом примере LC.setColumn стоит в цикле, в котором перебираются адреса от 0 до 15 (у вас это строки 46-52), а вы его почему-то вписали в функцию readMux().

ven-til
Offline
Зарегистрирован: 13.02.2018

Кому интересно  вот здесь можно посоставлять символы для матрицы 8x8 и получить готовые массивы:

https://xantorohara.github.io/led-matrix-editor/

 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

я перенес но теперь все пропало , даже мигаещего столбика нет уже 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

да человек похоже читает через 1 пост

я ему это уже писал, и про лишнюю теперь уже переменную сопоставления 41-42 строки - которую давно пора удалить

 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

Jenek_Anapa пишет:

я перенес но теперь все пропало , даже мигаещего столбика нет уже 

всегда прикладывайте КОД

и да - сворачивайте его под споллер!

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018

я убрал но ситуация не поменялас ,  я почемуто считал что массив столбиков , он разве не участвует при выводе?

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
[code]
#define EN 3
#define S0 4
#define S1 5
#define S2 6
#define S3 7 
#define SIG A0
#include "LedControl.h"
LedControl LC = LedControl(12, 11, 10, 4); 
int val;
int i;
void setup(){
  Serial.begin(9600);
  
  LC.shutdown(0, false); //Активируем 0ю матрицу
  LC.shutdown(1, false); //Активируем 1ю матрицу
  LC.shutdown(2, false); //Активируем 2ю матрицу
  LC.shutdown(3, false); //Активируем 3ю матрицу
    
   LC.setIntensity(0, 8);
   LC.clearDisplay(0);
   
  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);

  
}
 int dataarr[16]; // указываем размер массива в который будет слкадываться  значение с датчика 
 int pos = 0;    // массив обнуляеться 

// const byte ByteTable[10]   = {
 //   B00000000,B00000001,B00000011,B00000111,B00001111,B00011111,B00111111,B01111111,B11111111}  ; 
    
void loop(){

  for(int i = 0; i < 16; i ++){
  LC.setColumn(i / 8, i % 8, 255 >> (8 - val));
  
    Serial.print(readMux(i));
    Serial.print(" | ");
    
  }
  Serial.println();
  delay(2000);

   
}

[/code]

 

Jenek_Anapa
Offline
Зарегистрирован: 13.02.2018
#define EN 3
#define S0 4
#define S1 5
#define S2 6
#define S3 7 
#define SIG A0
#include "LedControl.h"
LedControl LC = LedControl(12, 11, 10, 4); 
int val;
int i;
void setup(){
  Serial.begin(9600);
  
  LC.shutdown(0, false); //Активируем 0ю матрицу
  LC.shutdown(1, false); //Активируем 1ю матрицу
  LC.shutdown(2, false); //Активируем 2ю матрицу
  LC.shutdown(3, false); //Активируем 3ю матрицу
    
   LC.setIntensity(0, 8);
   LC.clearDisplay(0);
   
  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);

  
}
 int dataarr[16]; // указываем размер массива в который будет слкадываться  значение с датчика 
 int pos = 0;    // массив обнуляеться 

// const byte ByteTable[10]   = {
 //   B00000000,B00000001,B00000011,B00000111,B00001111,B00011111,B00111111,B01111111,B11111111}  ; 
    
void loop(){

  for(int i = 0; i < 16; i ++){
  LC.setColumn(i / 8, i % 8, 255 >> (8 - val));
  
    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]);
  }

  int val = analogRead(SIG);
      val = map(val,0,700,0,8);
      val = constrain(val,0,8);

      dataarr[pos++] = val;
    
      if(pos == 8) pos = 0; 

 
    

  //return the value
  return val;
}

что тут не так ?

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

строка 19-20 вы включили 1й матрицу

а кто будет 2,3 и 4ю включать?

строка 45 - 56

вы вначале вывели на матрицы данные а потом только их получаете - странный подход.... на зазеркалье похоже.... :) зовите Алису )

да и 48-49 строки вявно не из этой "оперы тут"