Банально: термометр + часы.. Но есть нюансы..

PVL
Offline
Зарегистрирован: 28.05.2017

Приветствую всякого сюда заглянувшего!

Действительно, решил сделать банальную вещь (первую в этом роде) - термометр + часы + давление +д.влажности + д.освещенности на Arduino Nano v3 + готовые LED matrix (4*8*8) RED. Вроде всё просто, но.. "мы не ищем лёгких путей!".. У меня 5 планок (сами матрицы - LD-1088AS). Захотелось сделать на них 2 экрана: 2 строки (32*16) и 3 строки (32*24). И самое интересное - чтобы информация на них дублировалась. Бегущая строка тут не нужна, только цифры (по-крайней мере пока). Такая была идея.. Когда стал пробовать - столкнулся с тем, что матрицы что попало выводят - развёрнуты! Помучился - бегущая строка получилась.. но это не то что нужно было.. Пришлось мучиться дальше - всё-таки удалось сделать экран на две строки высотой. Удалось это сделать только с помощью библиотеки Max72xxPanel. Но у неё скудный функционал - не хватает возможности подключить другой шрифт, т.к. стандартный при 2-ом размере получается слишком широкий, мало цифр влезет на экран. Пилить стандартный - а другие проекты??? Использовать массивы символов - опять же не хватает или мозгов или функционала.. drawChar - только стандартные выводит, остаётся только по пиксельно - как-то грамоздко, но можно.. Вот и решил обратиться за помощью, может кто посоветует нормальное решение.. Пробовал другие библиотеки (Parola, LedControl), но либо зависает (ничего не выводит), либо экран не собирается нужным образом, либо мозгов не хватает.. казалось, всё просто.. только шрифт свой подпихнуть.. а вышло вон как..

yucan
Offline
Зарегистрирован: 20.04.2015

На Радиокоте видел подобный проект

PVL
Offline
Зарегистрирован: 28.05.2017

yucan пишет:

На Радиокоте видел подобный проект

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

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

PVL пишет:

Действительно, решил сделать банальную вещь (первую в этом роде) - термометр + часы + давление +д.влажности + д.освещенности на Arduino Nano v3 + готовые LED matrix (4*8*8) RED. Вроде всё просто, но.. "мы не ищем лёгких путей!".. У меня 5 планок (сами матрицы - LD-1088AS).

Не понял, что значит 5 планок? На рисунках их там больше

PVL
Offline
Зарегистрирован: 28.05.2017

ulis пишет:

PVL пишет:

Действительно, решил сделать банальную вещь (первую в этом роде) - термометр + часы + давление +д.влажности + д.освещенности на Arduino Nano v3 + готовые LED matrix (4*8*8) RED. Вроде всё просто, но.. "мы не ищем лёгких путей!".. У меня 5 планок (сами матрицы - LD-1088AS).

Не понял, что значит 5 планок? На рисунках их там больше

Вы путаете понятия "планки" и "модуль".. В планке по 4 модуля 8*8.. Сборка заводская, и они получаются перевернуты.. Самопальные сборки можно собрать правильно..

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

PVL пишет:

Вы путаете понятия "планки" и "модуль".. В планке по 4 модуля 8*8.. Сборка заводская, и они получаются перевернуты.. Самопальные сборки можно собрать правильно..

Теперь понял ... а библиотеку LedControl пробовали? Имхо для вывода удобнее использовать массив байтов, тогда можно придумать любой шрифт ... дайте ссылку на такую планку

PVL
Offline
Зарегистрирован: 28.05.2017

ulis пишет:

PVL пишет:

Вы путаете понятия "планки" и "модуль".. В планке по 4 модуля 8*8.. Сборка заводская, и они получаются перевернуты.. Самопальные сборки можно собрать правильно..

Теперь понял ... а библиотеку LedControl пробовали? Имхо для вывода удобнее использовать массив байтов, тогда можно придумать любой шрифт ... дайте ссылку на такую планку

Вот здесь интересная статья про них : http://zlitos.com/publ/ehlektronika/arduino_i_t_p/arduino_i_svetodiodnye_matricy_8kh8_max7219/12-1-0-35

Я брал https://ru.aliexpress.com/item/Free-Shipping-MAX7219-Dot-Matrix-Module-For-Arduino-Microcontroller-4-In-One-Display-with-5P-Line/32683042114.html?spm=2114.13010608.0.0.vsvmuJ&aff_platform=link-c-tool&cpt=1496512537672&sk=uR7uBY3Rz&aff_trace_key=234c3bddbc634763bd8ed78fbc98b18f-1496512537672-08074-uR7uBY3Rz

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Ну так и в чем дело? У этих планок тот же интерфейс, что и у отдельных модулей. Используй библиотеку LedControl. Шрифты и знаки можно делать какие угодно, двигать куда угодно. Единственное ограничение - 8 модулей, но его, по-видимому, можно обойти, используя разные выводы ардуины

PVL
Offline
Зарегистрирован: 28.05.2017

Ну и как там создать экран, а не строку?

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

PVL пишет:

Ну и как там создать экран, а не строку?

Вы установили библиотеку? Там есть примеры, посмотрите. Заполнение всей, допустим планки из 4-х модулей - это будет цикл вывода заранее созданного массива символов в нужную позицию

PVL
Offline
Зарегистрирован: 28.05.2017

PVL пишет:

Ну и как там создать экран (высотой 2 строки), а не строку?

 But the maximum default of 8 MAX72XX wil also work.
 */
LedControl lc=LedControl(12,11,10,8);

Последовательное подключение до 8 устройств. Про количество строк - нигде. Других настроек не увидел..

Вот здесь человек добился нужного эффекта! https://www.drive2.ru/b/456796504879792647/

borzov
borzov аватар
Offline
Зарегистрирован: 17.10.2016

в библилтеке PAROLA есть готовый пример метеостанции.

как менять шрифт я делал видео

пример шрифта английские и русские.(я не художник)

поэтому редактируйте под себя.

02.06.2017 в библиотеку PAROLA был добавлен этот шрифт.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

PVL пишет:

PVL пишет:

Ну и как там создать экран (высотой 2 строки), а не строку?

 But the maximum default of 8 MAX72XX wil also work.
 */
LedControl lc=LedControl(12,11,10,8);

Последовательное подключение до 8 устройств. Про количество строк - нигде. Других настроек не увидел..

Вот здесь человек добился нужного эффекта! https://www.drive2.ru/b/456796504879792647/

Первая планка будет первой строкой (верхней), вторая планка - второй строкой. Первая планка соответственно будет иметь адресацию модулей от 0 до 3-х, вторая от 4 до 7-ми.

Теперь, допустим, вам нужно вывести вертикальную черту высотой в две планки, в позицию 3, считая от начала строки. Соответственно выводите 0хff в 3-ю позицию 0-го модуля и 0xff в 3-ю позицию 4-го модуля. Для вывода в библиотеке есть функция myLed.setColumn(НомерИндикатора, НомерКолонкиВПределахИндикатора,Байт);

Вот и все. Единственное, что нужно будет создать - это массив ваших символов и продумать, как его выводить соответсвенно в первую и вторую строки

PVL
Offline
Зарегистрирован: 28.05.2017

Я обдумывал уже такой вариант, на крайний случай.. он более трудоемкий, и, по сути, это подгонка строк под столбцы.. Т.е. для экрана в 3 строки, это нужно три массива символов.

Следующий вариант более удобный! Я пробовал раньше его, но видел только "чёрный экран". Но этот вариант, вдруг, запустился! Чему я очень рад!

borzov пишет:

в библилтеке PAROLA есть готовый пример метеостанции.

как менять шрифт я делал видео

пример шрифта английские и русские.(я не художник)

поэтому редактируйте под себя.

02.06.2017 в библиотеку PAROLA был добавлен этот шрифт.

Только остается вопрос про экран в 3 строки.. Взлетит???

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

PVL пишет:

Я обдумывал уже такой вариант, на крайний случай.. он более трудоемкий, и, по сути, это подгонка строк под столбцы.. Т.е. для экрана в 3 строки, это нужно три массива символов.

Только остается вопрос про экран в 3 строки.. Взлетит???

То, что более трудоемкий - это да, зато гибкий ...  Для двух строк достаточно одного массива, можно принять, что нечетные элементы - это первая планка, четные - вторая. 3 строки с библиотекой LedControl?

PVL
Offline
Зарегистрирован: 28.05.2017

ulis пишет:

PVL пишет:

Я обдумывал уже такой вариант, на крайний случай.. он более трудоемкий, и, по сути, это подгонка строк под столбцы.. Т.е. для экрана в 3 строки, это нужно три массива символов.

Только остается вопрос про экран в 3 строки.. Взлетит???

То, что более трудоемкий - это да, зато гибкий ...  Для двух строк достаточно одного массива, можно принять, что нечетные элементы - это первая планка, четные - вторая. 3 строки с библиотекой LedControl?

Буду пробовать оба варианта, выберу .. тот что взлетит .. на 3 строки. Ведь мне нужно будет использовать одновременно на разные экраны разные шрифты..

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

PVL пишет:

Буду пробовать оба варианта, выберу .. тот что взлетит .. на 3 строки. Ведь мне нужно будет использовать одновременно на разные экраны разные шрифты..

Удачи

borzov
borzov аватар
Offline
Зарегистрирован: 17.10.2016

набросал на скорую руку. Весь алфавит не делал -только две цыфры.

вот скетч

Старт библтотек MD.PAROLA  более одной высоты проходит ооочень плохо.

если напишете в другой библиотеке, будет лучше.

MD.PAROLA меня замучила стартом. А так хороша примерами и возможностями.

 

PVL
Offline
Зарегистрирован: 28.05.2017

borzov пишет:

набросал на скорую руку. Весь алфавит не делал -только две цыфры.

вот скетч

Старт библтотек MD.PAROLA  более одной высоты проходит ооочень плохо.

если напишете в другой библиотеке, будет лучше.

MD.PAROLA меня замучила стартом. А так хороша примерами и возможностями.

Спасибо! Неожиданно.. я как раз думал как 3-этажные буквы выводить!

По поводу старта.. Действительно проблема какая-то.. Загрузил (кстати, пример из библиотеки, часы с 2-шрифтом)- работает, отключил USB, включил - не работает, тёмный экран.. Загружаю Ваш "обезжиренный" кусок:

#include <EEPROM.h> // подключаем библиотеку EEPROM 
#include <MD_Parola.h>  //библиотека 2 высоты
#include <MD_MAX72xx.h> //
#include <SPI.h>
//#include "RUS70.h"///подключаем кирилицу// широкий кратный2.//большие и маленькие русские!!!!!!!1
#define MAX_ZONES 2  //2 высоты
#define ZONE_SIZE 4 ///количество девайсов в ряду
#define  MAX_DEVICES (MAX_ZONES * ZONE_SIZE)
#define ZONE_UPPER  1
#define ZONE_LOWER  0
#define  CLK_PIN   13  //выходы зашищаем резисторами по 100  ом
#define DATA_PIN  11  //выходы зашищаем резисторами по 100  ом
#define CS_PIN    10  //выходы зашищаем резисторами по 100  ом
MD_Parola P = MD_Parola(CS_PIN, MAX_DEVICES);
//#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) ///пересчитываем 

uint8_t tormaz=0,nazad=0,s=0,y=0,pravo=0,eeprom=0,flag_tel=0,text_old=3, //флаги //
        levo=0,avariik=0,ctop=0,opros=0,textN =3,len=25; ////флаги //

char *msg_avto[] = /// буквы "Ё" нет!
 {/////////сервисные фразы. не трогаем их//////////////////хотя... :)
  "POEHALI", //0// фраза -можно поставить на старт
  "SPASIBO",  //1//
  "\x015\x016\x020\x020\x020\x020\x020\x015\x016", //2// 2 знака "/!  /! /// для табло 16х80//выбираем под свое 
//"\x015\x016\x020\x015\x016"                      //2// 2 знака "/!  /! /// для табло 16х64- без пробелов  
  "\x015\x016", //3/// знак /! /////
  "\x019\x020\x01a\x020\x01b\x020\x01c",//4//CТОП//ЖИРНЫМ ШРИФТОМ//для табло 16х80//выбираем под свое табло 
//"\x019\x01a\x01b\x01c",               //4//CТОП//ЖИРНЫМ ШРИФТОМ//  - это пробел.можно убрать для 16х64 
  ">>> >> >",             //5//>>>  //поворот вправо
  "< << <<<",             //6// <<<  ///поворот влево
  "< НАЗАД >"};           //7// назад//для 16х64 стрелки можно убрать
  
 char efkt[] =  /// эфекты из библиотеки////WIPE,  WIPE_CURSOR,  OPENING, OPENING_CURSOR, ....
{  PA_PRINT,       //0// появдяется в центре
   PA_NO_EFFECT,    //1// 
   PA_SCROLL_LEFT,  //2// бежит налево
   PA_SCROLL_RIGHT, //3// бежит направо
   PA_CLOSING       //4// шторки
} ;


void setup() {
  // put your setup code here, to run once:
/// блок старта (инициализации). самый ПРОБЛЕМАТИЧНЫЙ участок.!!!!!!!!!!!
 delay(1001);
 // P.begin();
 // P.displayText("Hello", PA_CENTER, 30, 100, PA_PRINT, PA_NO_EFFECT);
 
  P.begin(MAX_ZONES); // инициализация 2 зоны
  P.setZone(ZONE_LOWER, 0, ZONE_SIZE - 1);
//  P.setFont(ZONE_LOWER, BigFontLower);
  P.setZone(ZONE_UPPER, ZONE_SIZE, MAX_DEVICES-1);
//  P.setFont(ZONE_UPPER, BigFontUpper);
// P.setCharSpacing(P.getCharSpacing()*2);//двойной высоты->двойной интервал//для кирилицы не ставивим, там уже2
//  //---------------подключаем входы от машины --------------------------------------------
//      digitalWrite(trm,HIGH);  // тормоз// 
//      digitalWrite(nzd,HIGH);  // назад // ВКЛ ВНУТРЕНИЕ РЕЗИСТОРЫ НА +5в
//      digitalWrite(prv,HIGH);  // поворот право
//      digitalWrite(lev,HIGH);  // поворот лево///*/
//digitalWrite(trm,LOW); digitalWrite(nzd,LOW); digitalWrite(prv,LOW);digitalWrite(lev,LOW); //зто для режима тест,имитируем нули
 Serial.begin(9600);
 Serial.println("161");
}

void loop() {
  // put your main code here, to run repeatedly:
int  s=0;
int y=1;
int textN=0;
 P.displayAnimate(); P.setInvert(LOW);
  //if (P.getZoneStatus(ZONE_LOWER) && P.getZoneStatus(ZONE_UPPER))
     //{ 
      P.displayZoneText(ZONE_LOWER, msg_avto[textN], PA_CENTER,P.getSpeed(), 0, efkt[s], efkt[y]);
     //}
       P.displayZoneText(ZONE_UPPER, msg_avto[textN], PA_CENTER,P.getSpeed(), 0, efkt[s], efkt[y]);
       P.synchZoneStart(); text_old=textN;
    // } 
}

А затем пример - и всё опять работает, но до перезагрузки..

И ещё один вопрос в догонку: реально сделать дублирующиеся экраны разных размеров с одной Arduin-ой?

С библиотекой LedControl можно, два объекта создаются.. А с Porol-ой зонами управлять?

borzov
borzov аватар
Offline
Зарегистрирован: 17.10.2016

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

ответ один -это ваш БП виноват!

А он не виноват.Косяк в библиотеке. У меня ума не хватит найти проблему.

Я приспособился так.

1.питание ардуино через VIN

2.прописываю в сетуп паразитную функфию delay(1000);

3 меняю время в delay пока не запустится.

4.добовляю или убираю строку Serial.begin(57600);

так и мучаюсь.

форум тут

 

PVL
Offline
Зарегистрирован: 28.05.2017

Странно, но ваш трёхстрочный пример кода работает и после перезагрузки! Здорово! Спасибо!

А есть идеи как два экрана сделать? На другие выводы Arduinы или просто две суперзоны сделать?

PVL
Offline
Зарегистрирован: 28.05.2017

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

void loop(void)
{ 
  static uint32_t lastTime = 0; // millis() memory
  static bool flasher = false;  // seconds passing flasher  
  
  P.setIntensity(1) ; //яркость//
  P.displayAnimate();
//  if (P.getZoneStatus(ZONE_LOWER) && P.getZoneStatus(ZONE_MIDDL) && P.getZoneStatus(ZONE_UPPER))
   //if ( P.displayAnimate()){
    // Adjust the time string if we have to. It will be adjusted
    // every second at least for the flashing colon separator.
    if (millis() - lastTime >= 1000)
    {
      lastTime = millis();
      getTime(szTimeL, flasher);
      //createHString(szTimeH, szTimeL);
      
      P.displayZoneText(ZONE_LOWER, szTimeL, PA_LEFT, 75, 0, PA_PRINT, PA_PRINT);
      P.displayZoneText(ZONE_MIDDL, szTimeL, PA_LEFT, 75, 0, PA_PRINT, PA_PRINT);
      P.displayZoneText(ZONE_UPPER, szTimeL, PA_LEFT, 75, 0, PA_PRINT, PA_PRINT);

      flasher = !flasher;
      P.displayReset();
      
      P.synchZoneStart();
      
//   { P.displayZoneText(ZONE_LOWER, msg[cycle], PA_LEFT, 75, 0, PA_PRINT, PA_PRINT);
//     P.displayZoneText(ZONE_MIDDL, msg[cycle], PA_LEFT, 75, 0, PA_PRINT, PA_PRINT);
//     P.displayZoneText(ZONE_UPPER, msg[cycle], PA_LEFT, 75, 0, PA_PRINT, PA_PRINT);
//    P.synchZoneStart();
//    cycle = (cycle + 1) % ARRAY_SIZE(msg);
   }
  delay(1000);
  // }
//if (cycle==5) {cycle==0;}
}

 

borzov
borzov аватар
Offline
Зарегистрирован: 17.10.2016

запуск анимации 1 вариант

if ( P.displayAnimate()){....}

запуск анимации  2 вариант

P.displayAnimate();

if (P.getZoneStatus(ZONE_LOWER) && P.getZoneStatus(ZONE_MIDDL) && P.getZoneStatus(ZONE_UPPER) {....}

displayReset();// эта строка у меня всегда вела к краху. НЕ используйте ее.

так как ниже писать нельзя.

P.displayZoneText(ZONE_LOWER, szTimeL, PA_LEFT, 75, 0, PA_PRINT, PA_PRINT);

szTimeL недопустимо тут вставлять. Здесь указатель на массив должен быть.

переменная типа char *msg

 

 

 

 

 

borzov
borzov аватар
Offline
Зарегистрирован: 17.10.2016

в Parola ecть альтернативное подключение табло ,

// SOFTWARE SPI
//MD_Parola P = MD_Parola(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

но не 2 табло. кроме того альтернатива работает ооочень медлено. это не SPI

PVL
Offline
Зарегистрирован: 28.05.2017
#define MAX_MESG  6
// Global variables
char  szTimeL[MAX_MESG];    // mm:ss\0

Это из примера библиотеки..

Закоментил (//P.displayReset();) - никаких изменений..