светодиодная матрица на MAX7219 базе Max72xxPanel создаем бегущую строку с помощью переменных.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 17/10/2016 - 06:14
здарово народ! как то раз нужно было быстро сделать бегущую строкку на светодиодеой матрице MAX7219 на руском языке и с возможностью отображения заначения разных переменых. перерыл вес инет не чего подобного не нашел, если что и было то все какоето карявое. единственый нормально работающий код для отображения русского шрифта я нашел на этом форуме. http://arduino.ru/forum/programmirovanie/led-matritsa-max7219-maxmatrixlib базы можно скачать там же. я немного над ним поработал и все что мне было нужно получилось и решил викинуть сюда, может каму пригодится.
#include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> int pinCS = 10; // DIN 11, CLK 13 int numberOfHorizontalDisplays = 1;//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО int numberOfVerticalDisplays = 4;//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4 Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); String tape = ""; int wait = 10; // время в миллисекундах int spacer = 2; // Промежуток между символами (кол-во точек) int width = 5 + spacer; // Ширина шрифта 5 пикселей /* Перекодировать русские шрифты из UTF-8 в Windows-1251 */ String utf8rus(String source) { int i,k; String target; unsigned char n; char m[2] = { '0', '\0' }; k = source.length(); i = 0; while (i < k) { n = source[i]; i++; if (n >= 0xC0) { switch (n) { case 0xD0: { n = source[i]; i++; if (n == 0x81) { n = 0xA8; break; } if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n <= 0x8F) n = n + 0x6F; break; } } } m[0] = n; target = target + String(m); } return target; } String Serial_Read() { unsigned char c; // переменная для чтения сериал порта String Serial_string = ""; // Формируемая из символов строка while (Serial.available() > 0) { // Если в сериал порту есть символы c = Serial.read(); // Читаем символ //Serial.print(c,HEX); Serial.print(" "); Serial.print(c); if (c == '\n') { // Если это конец строки return Serial_string; // Возвращаем строку } //* ВНЕКОТОРЫХ КОМИЛЯТОРАХ АРДУИНО ЭТОТ КОД НУЖЕН, НАПРИМЕР В 1.0.3 СДВИГАТЬ СИМВОЛ НУЖНО, А В 1.6.7 УЖЕ НЕТ. if (c == 0xB8) c = c - 0x01; // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ if (c >= 0xBF && c <= 0xFF) c = c - 0x01; Serial_string = Serial_string + String(char(c)); //Добавить символ в строку } return Serial_string; } //*ПЕРЕМЕНЫЕ //********************************** int stroka = 0;//переменая строки String peremenay1 = "20 "; String peremenay2 = "75 "; String peremenay3 = "24 "; String peremenay4 = "переменая4"; //********************************** void setup() { Serial.begin(9600); matrix.setIntensity(1); // Используйте значение между 0 и 15 для яркости matrix.setRotation(matrix.getRotation()+3); //развернуть строку 1 - 90, 2 - 180, 3 - 270 } void loop() { // сдесь в зависимости от перменых на матрицу выводится нужная строка if (stroka == 0) { tape = utf8rus(" первая сторка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%"); } if (stroka == 1) { tape = utf8rus("вторая строка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%"); } if (stroka == 2) { tape = utf8rus("третья строка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%"); } if (stroka== 3) { tape = utf8rus("четвертая строка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%"); } if (stroka == 4) { tape = utf8rus("пятая строка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%"); } stroka += 1; if (stroka == 5) { stroka = 0; } if (Serial.available()){ tape=Serial_Read(); } for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ ) { matrix.fillScreen(LOW); int letter = i / width; // номер символа выводимого на матрицу int x = (matrix.width() - 1) - i % width; int y = (matrix.height() - 8) / 2; // отцентрировать текст по вертикали while ( x + width - spacer >= 0 && letter >= 0 ) { if ( letter < tape.length() ) { matrix.drawChar(x, y, tape[letter], HIGH, LOW,1); } letter--; x -= width; } matrix.write(); // Отправить картинку для отображения delay(wait); } }
Вот спомощю этого кода вывел даные с DHT-11 на светодиодную матрицу.
правда в строке
сначала должна быть переменая String и наче выдает ошибку
возможно каким то образом надо преобразовывать переменые float в String, кроме этого косяка все остальное норм, работает. библиотеку скачал сдесь http://iarduino.ru/file/225.html
вот видео.
https://www.youtube.com/watch?v=ioPhjgSu68E
вот видео
https://youtu.be/xwNt9NwN_Io
сейчес жду индикатор на TM1637 и свето диоды. на основе этого железа хочу собрать большой 4-разрядный 7-сегментный индикатор и тогда проект будет готов.
здорово!!! подпишусь на темку, тоже получил матрицы, буду делать в подарок часы.
ранее брал отдельные индикаторы без регистров, плату под них разводил, травил, больно много мороки....
тут прислали, за вечер подключил, русифицировал, ваще красота...
Спасибо!!!
Ура мне пришел мой индикатор TM1637. наконец то я смог закончить свой проект часов.
большой 4 разрядный 7сегментный индикатор я собрал на 130 светодиодах, вот так
с плато TM1637 я снял маленький индикатор и на его место припаял ножки, свой индикатор подсоединил по этой схеме.
все железо к ардуино подсоединил вот так.
блок питания взял от TP-LINK 9 вольт 800 микроампер.
вот код
также в ардуино осталась свободная память. которую я решил использовать. и добавил в код возможность отображать знаменательные дни. такие как. С новым годом, с нем рожденья и т.п. Но код пока сырой и надним еще надо поработать. Также в коде полный хаус, если у кого есть желание приведите его в божеский вид.
вот видео
https://www.youtube.com/watch?v=J-s8X1iwKOs
[quote=shapkin]
Спасибо за отличную схемку. Собрал , добавил 2 DS18B20 к Dht11 - вывел один датчик на улицу, другой на балкон. Допилил скетч, заметил что можно выводить еще строки с текстом. Добавил случайную переменную и 5 строк - получился отличный новогодний подарок жене.
https://yadi.sk/i/QJp0i6Qa35nR74 видео
класно получилось, вот если бы ты использовал 8 матриц, а не 4 веще была бы красота.
Полностью согласен. Вот только надо было сразу заказать несколько матриц.... а сейчас заказы идут долго. Еще хочу сделать часы с бегущей строкой - понравились https://www.youtube.com/watch?v=bRN6QQCCVqA . как сделать такую анимацию???
помогите где я тут накосипорил.мне надо датчик тепловой подключить простой и чтоб по русски писать можно было.Что надо поменять?
Взять скетч из второго поста, там все правильно... и по русски писать можно ))))
Привет всем.Помогите ни с одного а с двух датчиков вывести на олед дисплей.Я вообще ни могу понять.Пробовал расположение текста поменять тоже не допру.
Привет всем.Помогите ни с одного а с двух датчиков вывести на олед дисплей.Я вообще ни могу понять.Пробовал расположение текста поменять тоже не допру.
прога Flprog https://www.youtube.com/watch?v=JP3kE_Z2wLY
я щас смотрю видео и в программе не могу найти олед дисплей.Привет
https://youtu.be/i9SfKAzAR8w
может у меня версия старая?
есть какое нибудь обновление программы?
Щас подключил два датчика в ком порте с двух показывает температуру.На дисплее тоже все разделил все норм но две температуры с одного датчика показывает.
Текст сделал по русски все норм но как второе значение заставить читать со второго датчика ни как.
Всем привет !! Подскажите пытаюсь освоить матрицу на max7219 4 модуля в ряд , через arduino mega 2560 . Подключил все по даташиту на mega и max7219
50 ( miso) -> Din
51 (mosi) -> CLK
53 (SS) -> CS
данное подключение работает с библиотекой Ledcontrol.h всякие спецэффекты работают но перевернуто , а с библиотеками Adafruit_GFX.h и max72xxPanel.h все застывает и ничего не происходит , вот вариант кода ( брал с данной ветки) :
Народ подскажите, какой то сдвиг букв, печтаю А выводит Б и так далее, где капать?
Народ подскажите, какой то сдвиг букв, печтаю А выводит Б и так далее, где капать?
Код взят от сюда в месте с библиотеками, но у все все норм, находил вопрос такой же в сети, но ответа небыло, видимо еденичный случай
Код взят от сюда в месте с библиотеками, но у все все норм, находил вопрос такой же в сети, но ответа небыло, видимо еденичный случай
Ну да потерялась строка в файле знакогенератора ,вот и сдвиг образовался. Вместо того что бы ковыряться в коде, вы ищите ошибку здесь.
Я тут прошу помочь. А не что мне делать. Кто может сталкивался. Начинаются палки. Если такие знатоки, помогли бы, чем язвить.
Вот зачем мне копаться в чужом коде, портить глаза. Тем более тот код я не считаю "шедевром" , и опыта я в этом точно не получу, только настроение упадет.
Народ подскажите, какой то сдвиг букв, печтаю А выводит Б и так далее, где капать?
См. пост 15 темы: http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...
Нет там в 15 посте ничего что нужно мне.
Код взят от сюда в месте с библиотеками, но у все все норм, находил вопрос такой же в сети, но ответа небыло, видимо еденичный случай
Ну, если "от сюда", то конечно. Вы предлагаете всем угадывать от какого такого "сюда" Вы что-то там взяли и перерывать все "сюда" в надежде наткнуться на золотую жилу? Задаёте вопрос - давайте код.
Но ответ (судя по хрустальному шару) скорее всего такой. Автор нумерует буквы с нуля ("а" - нулевая, "б" - первая"), а Вы с единицы ... ну, или что-то в этом роде.
int
numberOfHorizontalDisplays = 1;
//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО
008
int
numberOfVerticalDisplays = 4;
//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4
Подскажите а сколько вообще можно сразу подключить этих матриц по горизонтали и вертикали комплекты по 4шт. спасибо
Классно получилось. Уважаемый Ardo23 Ты можешь скинуть мне скетч-очень надо- я не программист и поэтому ничего не понимаю в написании кода. Но провода соединить могу. Я накупил этого железа хочу сделать такие часы. В принципе я уже залил скетч представленный выше но хотелось бы чтобы всё работало чётко. Год был 4-ёх значный часы в формате 1:07 а не 1:7 . И что в этом коде классно что там есть знаменательные дни. Под себя можно даты и записи сделать. Заранее благодарю. А датчик давления BMP280 реально в этот код вписать?
Я тоже не программист ... есть такая програмка Flprog , а вот ссылка на форум с блоком для МАХ7219 http://flprog.ru/forum/18-1769-1 . Теперь можно выводить на панель показания любых датчиков и русский текст , и много других символов .
maxbarich DIN -51
CLK-52
CS-53
Подскажите как настроить время и дату той строкой в коде неполучаетса. Спасибо
вот видео
https://youtu.be/xwNt9NwN_Io
сейчес жду индикатор на TM1637 и свето диоды. на основе этого железа хочу собрать большой 4-разрядный 7-сегментный индикатор и тогда проект будет готов.
[/quote]
Не понял, чего вы хотите, но если про незначащие нули, то:
часы 1307 убегают хорошо . За год на 90 минут прибавили .
https://youtu.be/y-dzk8t0cWA
https://youtu.be/XazS43FvGIo моя строчка с датчиками , год спустя.
У меня вопрос по коду что выше немогу настроить дату и время в коде указано что дата и время можно настроить RTC.adjust(DateTime(__DATE__, __TIME__)); но у меня ничего неполучаетса.
Ну так раскомментируйте эту строку и получится - скомпилируйте и залейте скетч. Время на часах выставится по компьютерному времени.
Только потом снова закомментимруйте и перезалейте скетч. Иначе после каждой перезагрузки, время будет устанавливаться одно и то же.
Так я сделал раскоментировал залил но нечего не настраиваетса.
А чего именно Вы ждёте?
У меня вопрос по коду что выше немогу настроить дату и время в коде указано что дата и время можно настроить RTC.adjust(DateTime(__DATE__, __TIME__)); но у меня ничего неполучаетса.
Вы моего вопроса не поняли. Чего Вы ждёте от этой строки? Что она посмотрит на часы и установит Вам правильную время и дату или что она за пивом сбегает? Что делает по-Вашему эта строка?
Согласно кода строка для настройки дати и времени но она етого не делает и я спрашиваю как настроить дату и время.
Боюсь, что Вы не понимаете смысла этой строки. Какую именно дату и время она по Вашему устанавливает? И откуда она, по-Вашему, эту дату и время берёт?
Так обясните пожалуйста если несложно.
Я Вас спрашивая. Вы говорите она не работает. Я и спрашиваю, чего на не делает? Время не устанавливает? А какое время она должна по-Вашему установить - текущее в момент включения питания или время, в которое Вы просыпаетесь на работу. Что она должна делать и не делает?
Если Вы не знаете, что она должна делать, то как Вы заключили, что она этого не делает?
Когда я заливаю скетч которий должен отображать дату время температуру и влажность но дата изначально стоит 2000 01 01 и время 0 00 так вот время и дата должни отображатса текущие тоесть настольние часи но етого непроисходить. Так понятно или нет.
Вытащите эту строку наружу из if-а, внутри которого она сейчас стоит. И проделайте описанные операции: раскомментировать, залить скетч, закомментировать обратно, залить скетч.
Тогда эта строка не то, что Вам надо.
Эта строка содержит время и дату компиляции программы. Вот всё. на что Вы можете расчитывать.