Бегущая строка на 4 мах7219
- Войдите на сайт для отправки комментариев
Пт, 16/08/2019 - 10:38
Решил потренироваться на краденых скетчах (свои утомили).
Нашёл скетч "от Павла" , слегка его редактировал.
#include <SPI.h> #include <LedControlSPI.h>//вариация библиотеки LedControl (переименована),использующая аппаратный SPI // https://github.com/jacken/LedControl_HW_SPI const int numDevices = 10; // number of MAX7219s used const long scrollDelay = 50; // adjust scrolling speed unsigned long bufferLong [14] = {0}; /////////////////////////////////////////////////////////////// LedControl lc = LedControl(10,4);// создаём объект класса для 4 индикаторов // при этом выводы 11-DIN 13-CLK 10-CS // /////////////////////////////////////////////////////////////// //LedControl lc=LedControl(12,11,10,numDevices);//инициализация матриц ///////////////////////////////////////////ТЕКСТЫ ПОЗДРАВИТЕЛЬНЫХ И РАБОЧИХ ФРАЗ///////////////////////////////////////////// //const unsigned char scrollText[]PROGMEM={" E GFDKF! "}; const unsigned char scrollTextA[]PROGMEM={" C YJDSV 2020 UJLJV! "};// С НОВЫМ 2020 ГОДОМ! const unsigned char scrollTextB[]PROGMEM={" C GHFPLYBRJV 23 ATDHFKZ! "};// С ПРАЗНИКОМ 23 ФЕВРАЛЯ! const unsigned char scrollTextC[]PROGMEM={" C VT;LEYFHJLYSV ;TYCRBV LYTV 8 VFHNF! "};// С МЕЖДУНАРОДНЫМ ЖЕНСКИМ ДНЁМ 8 МАРТА! const unsigned char scrollTextD[]PROGMEM={" GJPLHFDKZTV C LYTV GJ,TLS! "};// ПОЗДРАВЛЯЕМ С ДНЕМ ПОБЕДЫ! /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// unsigned char scrollTextPer=scrollTextC; void setup(){ for (int x=0; x<numDevices; x++){ lc.shutdown(x,false); //The MAX72XX is in power-saving mode on startup lc.setIntensity(x,0); // Set the brightness to default value lc.clearDisplay(x); // and clear the display } } void loop(){ scrollMessage(scrollTextPer); // scrollFont(); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// const unsigned char font5x7 [] PROGMEM = { //Numeric Font Matrix (Arranged as 7x font data + 1x kerning data) B00000000, //Space (Char 0x20) B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, 6, B10000000, //! B10000000, B10000000, B10000000, B10000000, B00000000, B10000000, 2, B10100000, //" B10100000, B10100000, B00000000, B00000000, B00000000, B00000000, 4, B01010000, //# B01010000, B11111000, B01010000, B11111000, B01010000, B01010000, 6, B00100000, //$ B01111000, B10100000, B01110000, B00101000, B11110000, B00100000, 6, B11000000, //% B11001000, B00010000, B00100000, B01000000, B10011000, B00011000, 6, B01100000, //& B10010000, B10100000, B01000000, B10101000, B10010000, B01101000, 6, B01110000, //'(Э) B10001000, B00000100, B00111100, B00000100, B10001000, B01110000, 7, B00100000, //( B01000000, B10000000, B10000000, B10000000, B01000000, B00100000, 4, B10000000, //) B01000000, B00100000, B00100000, B00100000, B01000000, B10000000, 4, B00000000, //* B00100000, B10101000, B01110000, B10101000, B00100000, B00000000, 6, B00000000, //+ B00100000, B00100000, B11111000, B00100000, B00100000, B00000000, 6, B00000000, //, B00000000, B00000000, B00000000, B11000000, B01000000, B10000000, 3, B00000000, //- B00000000, B00000000, B11111000, B00000000, B00000000, B00000000, 6, B00000000, //. B00000000, B00000000, B00000000, B00000000, B11000000, B11000000, 3, B00000000, /// B00001000, B00010000, B00100000, B01000000, B10000000, B00000000, 6, B01110000, //0 B10001000, B10011000, B10101000, B11001000, B10001000, B01110000, 6, B01000000, //1 B11000000, B01000000, B01000000, B01000000, B01000000, B11100000, 4, B01110000, //2 B10001000, B00001000, B00010000, B00100000, B01000000, B11111000, 6, B11111000, //3 B00010000, B00100000, B00010000, B00001000, B10001000, B01110000, 6, B00010000, //4 B00110000, B01010000, B10010000, B11111000, B00010000, B00010000, 6, B11111000, //5 B10000000, B11110000, B00001000, B00001000, B10001000, B01110000, 6, B00110000, //6 B01000000, B10000000, B11110000, B10001000, B10001000, B01110000, 6, B11111000, //7 B10001000, B00001000, B00010000, B00100000, B00100000, B00100000, 6, B01110000, //8 B10001000, B10001000, B01110000, B10001000, B10001000, B01110000, 6, B01110000, //9 B10001000, B10001000, B01111000, B00001000, B00010000, B01100000, 6, B00000000, //: B11000000, B11000000, B00000000, B11000000, B11000000, B00000000, 3, B10101000, //;(Ж) B10101000, B01110000, B00100000, B01110000, B10101000, B10101000, 6, B00010000, //< B00100000, B01000000, B10000000, B01000000, B00100000, B00010000, 5, B00000000, //= B00000000, B11111000, B00000000, B11111000, B00000000, B00000000, 6, B10000000, //> B01000000, B00100000, B00010000, B00100000, B01000000, B10000000, 5, B01110000, //? B10001000, B00001000, B00010000, B00100000, B00000000, B00100000, 6, B01110000, //@ B10001000, B00001000, B01101000, B10101000, B10101000, B01110000, 6, B00100000, //A(Ф) B01110000, B10101000, B10101000, B01110000, B00100000, B00100000, 6, B10001000, //B(И) B10001000, B10011000, B10101000, B11001000, B10001000, B10001000, 6, B01110000, //C B10001000, B10000000, B10000000, B10000000, B10001000, B01110000, 6, B11110000, //D(В) B10001000, B10001000, B11110000, B10001000, B10001000, B11110000, 6, B10001000, //E(У) B10001000, B10001000, B11111000, B00001000, B00001000, B01110000, 6, B01110000, //F(А) B10001000, B10001000, B10001000, B11111000, B10001000, B10001000, 6, B11111000, //G(П) B10001000, B10001000, B10001000, B10001000, B10001000, B10001000, 6, B11110000, //H(Р) B10001000, B10001000, B11110000, B10000000, B10000000, B10000000, 6, B10101000, //I(Ш) B10101000, B10101000, B10101000, B10101000, B10101000, B11111000, 6, B01110000, //J(О) B10001000, B10001000, B10001000, B10001000, B10001000, B01110000, 6, B00111000, //K(Л) B01001000, B01001000, B01001000, B01001000, B01001000, B10001000, 6, B00111000, //L(Д) B01001000, B01001000, B01001000, B01001000, B01001000, B11111000, 6, B10000000, //M(Ь) B10000000, B10000000, B11110000, B10001000, B10001000, B11110000, 6, B11111000, //N(Т) B00100000, B00100000, B00100000, B00100000, B00100000, B00100000, 6, B01110000, //O B10001000, B10001000, B10001000, B10001000, B10001000, B01110000, 6, B01110000, //P(З) B10001000, B00001000, B1110000, B00001000, B10001000, B01110000, 6, B01110000, //Q(Й) B10001000, B10011000, B10101000, B11001000, B10001000, B10001000, 6, B10001000, //R(К) B10010000, B10100000, B11000000, B10100000, B10010000, B10001000, 6, B10000100, //S(Ы) B10000100, B10000100, B11100100, B10010100, B10010100, B11100100, 7, B11111000, //T(Е) B10000000, B10000000, B11110000, B10000000, B10000000, B11111000, 6, B11111000, //U(Г) B10001000, B10000000, B10000000, B10000000, B10000000, B10000000, 6, B10001000, //V(М) B11011000, B10101000, B10001000, B10001000, B10001000, B10001000, 6, B10001000, //W(Ц) B10001000, B10001000, B10001000, B10001000, B10001000, B11110100, 7, B10001000, //X(Ч) B10001000, B10001000, B01111000, B00001000, B00001000, B00001000, 6, B10001000, //Y(Н) B10001000, B10001000, B11111000, B10001000, B10001000, B10001000, 6, B01111000, //Z(Я) B10001000, B10001000, B01111000, B00101000, B01001000, B10001000, 6, B00000000, //[(х) B00000000, B10001000, B01010000, B00100000, B01010000, B10001000, 6, B00000000, //(Backward Slash) B10000000, B01000000, B00100000, B00010000, B00001000, B00000000, 6, B11100000, //] B00100000, B00100000, B00100000, B00100000, B00100000, B11100000, 4, B00100000, //^ B01010000, B10001000, B00000000, B00000000, B00000000, B00000000, 6, B00000000, //_ B00000000, B00000000, B00000000, B00000000, B00000000, B11111000, 6, B10000000, //` B01000000, B00100000, B00000000, B00000000, B00000000, B00000000, 4, B00000000, //a B00000000, B01110000, B00001000, B01111000, B10001000, B01111000, 6, B00000000, //b(и) B00000000, B10001000, B10011000, B10101000, B11001000, B10001000, 6, B00000000, //c B00000000, B01110000, B10001000, B10000000, B10001000, B01110000, 6, B00001000, //d B00001000, B01101000, B10011000, B10001000, B10001000, B01111000, 6, B00000000, //e(у) B00000000, B10001000, B10001000, B11111000, B00001000, B01110000, 6, B00000000, //f(а) B00000000, B01110000, B00001000, B01111000, B10001000, B01111000, 6, B00000000, //g(п) B00000000, B11110000, B10001000, B10001000, B10001000, B10001000, 6, B10000000, //h B10000000, B10110000, B11001000, B10001000, B10001000, B10001000, 6, B01000000, //i B00000000, B11000000, B01000000, B01000000, B01000000, B11100000, 4, B00000000, //j(о) B00000000, B01110000, B10001000, B10001000, B10001000, B01110000, 6, B00000000, //k(л) B00000000, B00111000, B01001000, B01001000, B01001000, B10001000, 6, B11000000, //l B01000000, B01000000, B01000000, B01000000, B01000000, B11100000, 4, B00000000, //m B00000000, B11010000, B10101000, B10101000, B10001000, B10001000, 6, B00000000, //n(т) B00000000, B11111000, B00100000, B00100000, B00100000, B00100000, 6, B00000000, //o B00000000, B01110000, B10001000, B10001000, B10001000, B01110000, 6, B00000000, //p B00000000, B11110000, B10001000, B11110000, B10000000, B10000000, 6, B00000000, //q(й) B01110000, B10001000, B10011000, B10101000, B11001000, B10001000, 6, B00000000, //r B00000000, B10110000, B11001000, B10000000, B10000000, B10000000, 6, B00000000, //s B00000000, B01110000, B10000000, B01110000, B00001000, B11110000, 6, B01000000, //t B01000000, B11100000, B01000000, B01000000, B01001000, B00110000, 6, B00000000, //u B00000000, B10001000, B10001000, B10001000, B10011000, B01101000, 6, B00000000, //v B00000000, B10001000, B10001000, B10001000, B01010000, B00100000, 6, B00000000, //w B00000000, B10001000, B10101000, B10101000, B10101000, B01010000, 6, B00000000, //x B00000000, B10001000, B01010000, B00100000, B01010000, B10001000, 6, B00000000, //y(н) B00000000, B10001000, B10001000, B11111000, B10001000, B10001000, 6, B00000000, //z B00000000, B11111000, B00010000, B00100000, B01000000, B11111000, 6, B10001000, //{(Х) B10001000, B01010000, B00100000, B01010000, B10001000, B10001000, 6, B10000000, //| B10000000, B10000000, B10000000, B10000000, B10000000, B10000000, 2, B10000000, //} B01000000, B01000000, B00100000, B01000000, B01000000, B10000000, 4, B00000000, //~ B00000000, B00000000, B01101000, B10010000, B00000000, B00000000, 6, B01100000, // (Char 0x7F) B10010000, B10010000, B01100000, B00000000, B00000000, B00000000, 5 }; void scrollFont() { for (int counter=0x20;counter<0x80;counter++){ loadBufferLong(counter); delay(500); } } // Scroll Message void scrollMessage( unsigned char messageString) { int counter = 0; int myChar=0; do { // read back a char myChar = pgm_read_byte_near(messageString + counter); if (myChar != 0){ loadBufferLong(myChar); } counter++; } while (myChar != 0); } // Load character into scroll buffer void loadBufferLong(int ascii){ if (ascii >= 0x20 && ascii <=0xff){ for (int a=0;a<7;a++){ // Loop 7 times for a 5x7 font unsigned long c = pgm_read_byte_near(font5x7 + ((ascii - 0x20) * 8) + a); // Index into character table to get row data unsigned long x = bufferLong [a*2]; // Load current scroll buffer x = x | c; // OR the new character onto end of current bufferLong [a*2] = x; // Store in buffer } byte count = pgm_read_byte_near(font5x7 +((ascii - 0x20) * 8) + 7); // Index into character table for kerning data for (byte x=0; x<count;x++){ rotateBufferLong(); printBufferLong(); delay(scrollDelay); } } } // Rotate the buffer void rotateBufferLong(){ for (int a=0;a<7;a++){ // Loop 7 times for a 5x7 font unsigned long x = bufferLong [a*2]; // Get low buffer entry byte b = bitRead(x,31); // Copy high order bit that gets lost in rotation x = x<<1; // Rotate left one bit bufferLong [a*2] = x; // Store new low buffer x = bufferLong [a*2+1]; // Get high buffer entry x = x<<1; // Rotate left one bit bitWrite(x,0,b); // Store saved bit bufferLong [a*2+1] = x; // Store new high buffer } } // Display Buffer on LED matrix void printBufferLong(){ for (int a=0;a<7;a++){ // Loop 7 times for a 5x7 font unsigned long x = bufferLong [a*2+1]; // Get high buffer entry byte y = x; // Mask off first character lc.setRow(3,a,y); // Send row to relevent MAX7219 chip x = bufferLong [a*2]; // Get low buffer entry y = (x>>24); // Mask off second character lc.setRow(2,a,y); // Send row to relevent MAX7219 chip y = (x>>16); // Mask off third character lc.setRow(1,a,y); // Send row to relevent MAX7219 chip y = (x>>8); // Mask off forth character lc.setRow(0,a,y); // Send row to relevent MAX7219 chip } }
Не хочется использовать прогмем. Для этого надо изменить строку 0020 и ей подобные (это я могу) и исправить (по тёмности своей я догадался - 1022). Вот в ней сплошной облом. То есть манипулировать заранее запомненными фразами можно, а как оперативно вносить информацию?(это риторический вопрос, отвечать не надо).
Переделал под передачу через монитор порта фразы на русском в английской раскладке. Жуть. Не все буквы перерисованы в массиве. Надо как то дальше улучшать- сказал фразу в смартфон, а на строке текст побежал. Кодировки замучають...
такой кодъ нада под спойлер прятать
А зачем? Потому что отсутствуют шрифты для кириллицы?
Добавил две строчки, теперь что пишем в монитор по русски, то и получаем на строке. Но мне хочется так - сказал в смартфон "Закрыто на обед" и побежала надпись по строке:)
Как этот спойлер ставить? Сын вроде показывал, опять забыл.
Сделал приложение, получилось нормально. Теперь можно электронные записки писать голосом:) прямо на дверь.
Баловался с часами на бегущей строке. Передавать время со смартфона - получается только при включённом приложении :(
С помощью модуля DS3231 вроде удобно получается, но модуль явно лишний. А если пользоваться millis() и смартфоном переодически подправлять значения? Пробовал кто?
Баловался с часами на бегущей строке. Передавать время со смартфона - получается только при включённом приложении :(
С помощью модуля DS3231 вроде удобно получается, но модуль явно лишний. А если пользоваться millis() и смартфоном переодически подправлять значения? Пробовал кто?
правильно ставить модуль точного времени любой а с внешнего источника только делать синхронизацию времени. если есть отличия более чем на Х мс
тем более цена таких модулей смешные 30-50р на али
Сделал с точностью до минуты - 4 знака и двоеточие пробегают примерно за 3 сек. по 4 матрицам друг за другом. Так спокойно, секунды бесят. Смартфоном подводить, думаю в сутки раз хватит для "миллис" (как добрые механические часы из детства). Вообщем "часы-строка сообщение" получилось.
Чего бы ещё сделать по мотивам интернета на MAX7219? (термометр-барометр не хочется).
Чего бы ещё сделать по мотивам интернета на MAX7219? (термометр-барометр не хочется).
Индикатор шума в помещении (bar graph).
Если 3231 не хочется, можно 1307 + программная коррекция. Не хочется 1307 - тогда просто 32кгц кварц вместо родного.)
Если 3231 не хочется, можно 1307 + программная коррекция. Не хочется 1307 - тогда просто 32кгц кварц вместо родного.)
взять сратый будильник, приделать к нему мотор для заводки, на на циферблат постаивть датчики положения стрелок и считывать их
как известно, что механические часы очень точные, практически можно вывести до долей секунды в год! - главное создать для них неизменные окружающие условия и уровень заводки - так что ставим его под стеклянный колпак и ваккумируем, подзаводить каждый час на уровень заводки в 1 час
тогда вообще будет мега крутой аппарат )
Даже интересно стало на сколько "миллис" уйдут за 12 часов - ставлю эксперимент:)
Из модулей у меня есть ещё 1302 - ни хрена я его не смог запустить:(
Ну ушло где то секунды на три, т.е. в пределах времени пробежки по экрану данных. Как-то даже неожиданно от миллис. Получается если делать часы с точностью до минуты + подводка со смартфона, то и модули RTC не нужны.
А прерывания на миллис как то воздействуют? По идеи не должны же...
Так нет прерываний в скетче. Всё что воздействует на миллис это точность частоты 16 МГц, т.е. насколько 1 миллисекунда в программе это действительно 1 миллисекунда в реальности.
Я же вообще спросил, не о конкретном скетче. Просто интересно и думаю «в тему». Значит миллис никак не связаны с прерываниями.
Обычно наши китайские товарищи экономят на кварцах и ставят керамические резонаторы. А это на несколько порядков хуже. Вот и считайте ваши миллис. А часовые обычно точнее кварцевых.
leks а чем у Вас связь со смартфоном сделана - блютуз? - в скетче что-то нет ничего
Вы бы код приложения выложили лучше, чем ардуино :) Только не в конфу, а на какой-нить ресурс
Связь со смартфоном через модуль блютуз в обе стороны. Никак с него (НС-05) "слездь" не могу. Просто и надёжно.
Вот вариант проекта приложения в мит апп инвенторе 2.
https://yadi.sk/d/0nicernDXvwXVQ