Вывод минут и секунд на LED матрицу
- Войдите на сайт для отправки комментариев
Чт, 10/04/2014 - 10:42
Есть матрица 40х8 на 5 микросхемах MAX7219. Необходимо выводить на нее минуты:секунды:тысячные доли.
Для начала решил вывести только минту и секнды, и столкнулся с проблемой. Такое ощущение что программа тормозит. На матрицу время выводится, но только каждые 11 секунд, т.е. сначала отображается 0:00, затем 0:11, затем 0:22 и т.д. Никак не могу понять, почему такая задержка происходит. Вот скетч, может кто подскажет, что я сделал не так?
#include <LedControl.h> const int numDevices = 5; // количество микросхем MAX7219 LedControl svetofor1=LedControl(12,11,10,numDevices); byte n9[5]={ B01100000,B10010010,B10010010,B10010100,B01111000}; //Цифра 9 byte n8[5]={ B01101100,B10010010,B10010010,B10010010,B01101100}; //Цифра 8 byte n7[5]={ B11000000,B10000000,B10001110,B10010000,B11100000}; //Цифра 7 byte n6[5]={ B00111100,B01010010,B10010010,B10010010,B00001100}; //Цифра 6 byte n5[5]={ B11100100,B10100010,B10100010,B10100010,B10011100}; //Цифра 5 byte n4[5]={ B00011000,B00101000,B01001000,B11111110,B00001000}; //Цифра 4 byte n3[5]={ B10000100,B10000010,B10100010,B11010010,B10001100}; //Цифра 3 byte n2[5]={ B01000010,B10000110,B10001010,B10010010,B01100010}; //Цифра 2 byte n1[5]={ B00000000,B00000000,B01000010,B11111110,B00000010}; //Цифра 1 byte n0[5]={ B01111100,B10001010,B10010010,B10100010,B01111100}; //Цифра 0 byte dv[3]={ B00000000,B01101100,B00000000}; //Символ : byte times[17];//40 Сюда записываем итоговое время void setup(){ Serial.begin(9600); for (int x=0; x<numDevices; x++){ svetofor1.shutdown(x,false); //Включаем микросхемы svetofor1.setIntensity(x,13); // Устанавливаем яркость svetofor1.clearDisplay(x); // Очищаем матрицу } } void loop(){ milistosec(); } void milistosec(){ //num=0; long tm=millis(); int minut = tm/60000;//Вычисляем минуты char stringminut[2]; itoa(minut,stringminut,10);//Преобразуем число в строку int lenminut = strlen(stringminut);//Определяем сколько символов в минутах //Вычисляем секунды int secund = (tm %60000)/1000; char stringsecund[2]; itoa(secund,stringsecund,10);//Преобразуем число в строку int lensecund = strlen(stringsecund);//Определяем сколько символов в секундах //Вычисляем тысячные доли секунды int tyssec = (tm %60000)%1000; char stringtyssec[3]; itoa(tyssec,stringtyssec,10);//Преобразуем число в строку int lentyssec = strlen(stringtyssec);//Оопределяем сколько символов в сотых секундах*/ int s7=minut;//Первая цифра - минуты int s5=secund/10;//Вторая цифра секунды int s4=secund%10;//Третья цифра секунды int s2=tyssec/100;//Четвертая цифра десятые доли int s1=(tyssec%100)/10;//Пятая цифра сотые доли int s0=((tyssec%100)%10)%10;//Шестая цифра тысячные доли casenumber(s7,0); //Записываем минуты times[5]=dv[0];times[6]=dv[1];times[7]=dv[2]; //Записываем двоеточие casenumber(s5,8); //Записываем первое число секунд times[13]=B00000000;//Вставляем пробел между числами casenumber(s5,14);//Записываем второе число секунд //times[19]=dv[0]; //times[20]=dv[1]; //times[21]=dv[2]; //casenumber(s5,22); //times[27]=B00000000; //casenumber(s5,28); //times[33]=B00000000; //casenumber(s5,34); //times[39]=B00000000; //times[40]=B00000000; /*-------------------------------------------------*/ int column=0; for (int j=0;j<8;j++){// Выводим минуты и секунды на матрицу svetofor1.setColumn(4,j,times[column]); svetofor1.setColumn(3,j,times[column+8]); svetofor1.setColumn(2,j,times[column+16]); //svetofor1.setColumn(1,j,times[column+24]); //svetofor1.setColumn(0,j,times[column+32]); column++; } } void casenumber(int n,int tcol){//Определяем поступившую цифру, и заносим ее бинарное значение в массив //int tcol=ttcol; switch(n){ case 0: for (int col=0;col<5;col++){ times[tcol] = n0[col]; tcol++; } break; case 1: for (int col=0;col<5;col++){ times[tcol] = n1[col]; tcol++; } break; case 2: for (int col=0;col<5;col++){ times[tcol] = n2[col]; tcol++; } break; case 3: for (int col=0;col<5;col++){ times[tcol] = n3[col]; tcol++; } break; case 4: for (int col=0;col<5;col++){ times[tcol] = n4[col]; tcol++; } break; case 5: for (int col=0;col<5;col++){ times[tcol] = n5[col]; tcol++; } break; case 6: for (int col=0;col<5;col++){ times[tcol] = n6[col]; tcol++; } break; case 7: for (int col=0;col<5;col++){ times[tcol] = n7[col]; tcol++; } break; case 8: for (int col=0;col<5;col++){ times[tcol] = n8[col]; tcol++; } break; case 9: for (int col=0;col<5;col++){ times[tcol] = n9[col]; tcol++; } break; } }
Програмный SPI - тормозная штука, ножно аппаратный использовать и программу максимально оптимизировать - может тогда и тысячные будет видно. Хотя мне кажется дальше сотых не получится...
Аппаратный SPI это, как я понимаю, выход ICSP на Leonardo ?
Никак не понимаю как напрямую с микросхемой работать. Т.е. как зажечь скажем 3-ю строку на всех 5 матрицах я понял, а вот как допустим зажечь ту же 3-ю строку только на 2 матрице, никак не пойму. В интернете вычитал по параметр No-op, но как его правильно применять сам не могу допенькать, и простых примеров не нахожу.
Решил проблему использованием другой библиотеки, нарытой на просторах интернета. Она работает шустро и о тормозах никаких намеков.
Вот тут описание и файлы для скачивания:
https://www.pjrc.com/teensy/td_libs_Matrix.html