Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Arduino: теория и практика

Войти
Регистрация
Восстановить пароль
 
Alex Csharp
0 / 0 / 0
Регистрация: 30.04.2017
Сообщений: 12
#1

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

09.08.2017, 00:09. Просмотров 138. Ответов 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):

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

Бегущая строка - PHP
Как с помощью php реализовать бегущую строку. Главное, чтобы текст строки был записан в отдельный файл, чтобы потом из админки его...

Бегущая строка - C#
Здравствуйте Покажите пожалуйста пример кода как написать бегущую строку. Примерчик можете показать с помощью банера или просто...

Бегущая строка - Pascal ABC
Ввести бегущую строку: &quot;Физфак-лучший факультет университета&quot;. Заранее спасибо!

Бегущая строка - Pascal ABC
Разработать программу вывода на экран текстовой информации в виде &quot;бегущей строки&quot; (слева направо).

Бегущая строка - HTML, CSS
Можно ли сделать Бегущую строку в СSS, если да то как?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Valery__
232 / 222 / 43
Регистрация: 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__
232 / 222 / 43
Регистрация: 19.03.2012
Сообщений: 369
10.08.2017, 13:28 #4
Если Вам надо выводить строку вновь созданную, то флешь память не нужна. В подпрограмме работайте с этой строкой.
C++ (Qt)
1
2
void scrollMessage(unsigned char * messageString){
...}
0
avporsk
50 / 29 / 8
Регистрация: 03.11.2016
Сообщений: 127
11.08.2017, 06:54 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Поскольку 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2017, 03:40
Привет! Вот еще темы с ответами:

Бегущая строка - JavaScript
как сделать бегущую строку на JS чтоб работала как тег marquee?

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

Бегущая строка - Java
Нужна написать яваскрипт бегущей строки с права налево в строке состояния браузера ( которая есть только в IE ) Вот код часов с датой и...

Бегущая строка - C#
Здравствуйте Помогите пожалуйста, мне нужен пример чтоб осмыслить как делать бегущую строку, типа баннер готовый или такой вариант, как...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
12.08.2017, 03:40
Ответ Создать тему
Опции темы

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