Форум программистов, компьютерный форум, киберфорум
Наши страницы
Arduino
Войти
Регистрация
Восстановить пароль
 
Alex Csharp
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
#1

бегущая строка - Arduino

09.08.2017, 00:09. Просмотров 836. Ответов 5
Метки нет (Все метки)

Мне тут под руку подвернулся модуль 8*8*4 на MAX7219 и я решил вывести на него показания разного рода датчиков в виде бегущей строки. Немного поискав в интернете я смог найти русифицированный скетч:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include <avr/pgmspace.h>
#include <LedControl.h>
 
const int numDevices = 4;          // number of MAX7219s used (количество соединённых матриц 8х8)
const long scrollDelay = 30;       // adjust scrolling speed (задержка сдвига текста в мс)
const unsigned char interval = 1;  // интервал между символами (в исходном варианте было только число,
                                   // на 1 превышающее ширину символа)
unsigned long bufferLong [16] = {0}; 
 
LedControl lc=LedControl(8,10,9,numDevices); // Номера выводов платы Arduino Uno, на которые поступают
                                             // сигналы DIN, CLK, CS (можно выбрать другие)
 
                                          
const unsigned char scrollText[100] PROGMEM = { 
                                     "выводящийся текст"  };                                  
unsigned char WaterDebet[] = "0"; 
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,3);       // Set the brightness to default value
        lc.clearDisplay(x);         // and clear the display
        }
}
 
void loop(){ 
    scrollMessage(scrollText);
    
//    scrollFont();                 // тестовая подпрограмма вывода всего шрифта
}
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
const unsigned char font5x7[] PROGMEM = {     // Numeric Font Matrix (Arranged as 7x font data + 1x kerning data)
    B00000000,   //Space (Char 0x20)           // Массив шрифта переделан на 8х, чтобы высота текста была 8 точек,
    B00000000,                                // вместо 7, при этом появилась возможность правильно расположить
    B00000000,                                // символы с "подстрочными" элементами (в т.ч. английские);
    B00000000,                                // также вместо 1x kerning data можно задать свой интервал.
    B00000000,
    B00000000,
    B00000000,
    B00000000,
    5 +  interval,/*огромное количество буков
и разного рода символов (что и является нашими шрифтами)*/
};
 
 void scrollFont() {
     for (int counter=0x20;counter<0xC2;counter++){
         loadBufferLong(counter);
         delay(200);
     }
 }
 
// Scroll Message
void scrollMessage(const unsigned char * messageString) {
    int counter = 0;
    int myChar = 0;
    int CharRange = 0;
    do {
        // read back a char 
        myChar =  pgm_read_byte_near(messageString + counter);
 
         if (myChar < 0x20 || myChar > 0xbf)      // байт не выводится, т.к. либо не включён в шрифт,
         {                                      
           if (myChar == 0xd0 || myChar == 0xd1){ // либо это первый байт русских символов            
            CharRange = myChar - 0xd0 + 1 ;       // запоминается признак первого байта
            }
         }
         else if (myChar > 0x7f && myChar < 0x90) //     второй байт русского символа
         {
         switch (CharRange) {
                  case 1:                         //     код 0xd081 - буква Ё в UTF-8
                     myChar = myChar - 1 ;
                     break;
                  case 2:                         //   русские буквы р - я (0xd180 - 0xd18f в UTF-8)
                     myChar = myChar + 49 ;
                     break; 
              }
              if (myChar != 0 &&  myChar < 194){loadBufferLong(myChar);
              CharRange = 0 ;                     // признак обнуляется после вывода второго байта символа
              }
         }
         else if (myChar > 0x8f && myChar < 0xc0)  
         {                                        
              switch (CharRange) {
                  case 1:                         //    русские буквы А - Я (0xd090 - 0xd0af в UTF-8)
                     myChar = myChar - 15 ;       //  и русские буквы а - п (0xd0b0 - 0xd0bf в UTF-8)
                     break;
                  case 2:                         //    код 0xd191 - буква ё в UTF-8
                     myChar = myChar + 48 ;
                     break; 
              }            
              if (myChar != 0 &&  myChar < 194){loadBufferLong(myChar);
              CharRange = 0 ;
              }
         }
         else                             //  английские буквы и прочие символы (0x20 - 0x7f в UTF-8)
         {
              if (myChar != 0){loadBufferLong(myChar);
              CharRange = 0 ;
              }
         }
         counter++;
     } 
     while (myChar != 0);
}
// Load character into scroll buffer
void loadBufferLong(int ascii){
    if (ascii >= 0x0020 && ascii <=0x00ff){
        for (int a=0;a<8;a++){                      // Loop 7 times for a 5x7 font
            // Index into character table to get row data
            unsigned long c = pgm_read_byte_near(font5x7 + ((ascii - 0x20) * 9) + a); 
            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
        }
           // Index into character table for kerning data
        byte count = pgm_read_byte_near(font5x7 +((ascii - 0x20) * 9) + 8);  
        for (byte x=0; x<count;x++){
            rotateBufferLong();
            printBufferLong();
            delay(scrollDelay);
        }
    }
 }
// Rotate the buffer
void rotateBufferLong(){
    for (int a=0;a<8;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<8;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
  }
}
Теперь к сути вопроса: как подставлять только что полученые показания с датчиков в бегущую строку?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2017, 00:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос бегущая строка (Arduino):

Бегущая строка + Электроника КР-03
Попалась рабочая пара светодиодное табло &quot;Бегущая строка&quot; (16 матриц 8х8...

Бегущая строка на MAX7219 (8*8)
Недавно смонтировал матрицу TA15-11+MAX7219 побаловаться. В аппаратной части...

Бегущая строка на 7сегментниках
Всем привет! Давно не занимался электроникой) Замутил свой второй проект...

Бегущая строка(stm32f10*+max7219+ft232rl)
Доброго всем времени суток. Решил собрать бегущую строку. Конечно, хочется что...

Бегущая строка(мой маленький велосипед)
В общем вся элементная база включает сдвиговый регистр, тини2313 и tid матрицу...

Апплет "бегущая строка", найти ошибку, строка не останавливается и бежит по второму кругу
Заранее извиняюсь если не туда написал, суть вопроса: у меня стоит задача...

5
Valery__
233 / 223 / 146
Регистрация: 19.03.2012
Сообщений: 369
09.08.2017, 10:04 #2
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
//переменные
unsigned char scrollText[100]; 
uint16_t V1 = 0;//Показание датчика 1
uint16_t V2 = 0;//Показание датчика 2
 
void loop() {
  
  //сначала считываем значения датчиков
  //потом записываем в строку
  sprintf(scrollText, "Датчик1 %4d   Датчик2 %4d\n", V1, V2);
  //выводим на дисплей
  scrollMessage(scrollText);
}
1
Alex Csharp
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
09.08.2017, 22:20  [ТС] #3
К сожалению не все так просто . на выходе получается абракадабра, т.к. тут все записывается во флешь память контролера, а вы выкинули progmem из кода. если я пытаюсь воткунть к вашему коду progmem, то компилятор ругается примерно так:
c:\program files (x86)\arduino\hardware\tools\avr\avr\include\stdio.h:671:12: note: initializing argument 1 of 'int sprintf(char*, const char*, ...)'

extern int sprintf(char *__s, const char *__fmt, ...);

^

exit status 1
variable 'scrollText' must be const in order to be put into read-only section by means of '__attribute__((progmem))'

. если бы всё было так просто я бы сюда не обратился. Ребят помогите, а то уже мозги кипят
0
Valery__
233 / 223 / 146
Регистрация: 19.03.2012
Сообщений: 369
10.08.2017, 13:28 #4
Если Вам надо выводить строку вновь созданную, то флешь память не нужна. В подпрограмме работайте с этой строкой.
C++ (Qt)
1
2
void scrollMessage(unsigned char * messageString){
...}
0
avporsk
53 / 32 / 13
Регистрация: 03.11.2016
Сообщений: 162
11.08.2017, 06:54 #5
Лучший ответ Сообщение было отмечено Alex Csharp как решение

Решение

Поскольку Alex Csharp, нужно чтоб строка выводилась из ОЗУ из переменной, а не из ранее записанной строки в ПЗУ, то очевидно необходимо внести изменения в void scrollMessage(const unsigned char * messageString)
выборку
C
1
myChar =  pgm_read_byte_near(messageString + counter);
нужно изменить на эту:

C
1
myChar =messageString[counter];
ну и заголовок void scrollMessage(unsigned char * messageString)

тогда и этот кусок кода должен заработать.
C
1
2
3
4
5
6
7
8
void loop() {
  
  //сначала считываем значения датчиков
  //потом записываем в строку
  sprintf(scrollText, "Датчик1 %4d   Датчик2 %4d\n", V1, V2);
  //выводим на дисплей
  scrollMessage(scrollText);
}
1
Alex Csharp
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
12.08.2017, 03:40  [ТС] #6
Спасибо, разобрался
0
12.08.2017, 03:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2017, 03:40
Привет! Вот еще темы с решениями:

Бегущая строка
Приветствую всех! Подкинте идею как сделать бегущую строку

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

Бегущая строка
Ребята у меня вот возник такой вопрос. У меня есть текст который вводиться в...

Бегущая строка
Как сделать, чтобы программа запрашивала бегущую строку, и выводила ее?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru