#1 Re: Програмування Arduino » бегущая строка с переключением ик пультом » 2017-05-31 22:46:48

qwone пише:

Основная проблема в команде scrollMessage(scrollText2);  Она как delay() . Пока она работает остальное стоит. А когда она закончится начнет работать все остальное по очереди. До следущих тормозов похожих на  delay() . Это не Ардуино виновата. Это даунский подход к программироваю на Си на этой платформе. Вижу несколько путей: есть визуал программирование на Ардуине. Хотя так кривой код, но тормозов delay() поменьше. Или же учить глубже Си->Cи++ -> ООП . Я выбрал 2 путь. Ничего по этому огрызку программы не скажу, так как это огрызок. А у меня хрустальный шар затерялся. roll

Спасибо, что пытаетесь помочь.
#include <IRremote.h>
#include <IRremoteInt.h>

#include <LedControl.h>

#include <avr/pgmspace.h>
#include <LedControl.h>
IRrecv irrecv(2);
decode_results results;

const int numDevices = 4;      // number of MAX7219s used
const long scrollDelay = 75;   // adjust scrolling speed


unsigned long bufferLong [14] = {0};


LedControl lc=LedControl(12,11,10,numDevices);


const unsigned char scrollText[] PROGMEM ={" 12345  "};
const unsigned char scrollText2[] PROGMEM ={" 0123456  "};

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,8);       // Set the brightness to default value
lc.clearDisplay(x);         // and clear the display

  Serial.begin(9600);
irrecv.enableIRIn();
}
}


void loop(){
   if ( irrecv.decode( &results )) {
    Serial.println(results.value, HEX);

  if (results.value==0xFF30CF){
scrollMessage(scrollText);results.value=0;
}

  if (results.value==0xFF18E7){
scrollMessage(scrollText2);results.value=0;
}
irrecv.resume();
}
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////


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,
B00000000,
B00000000,
B10000000,
2,
//Тут перечень букв идет//

void scrollFont() {
for (int counter=0x20;counter<0x80;counter++){
loadBufferLong(counter);
delay(500);
}
}


// Scroll Message
void scrollMessage(const 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
}
}


Код полностью не мой немного допиляный.
Так вот проблема в том что пока бежит выбранная строка, пульт не реагирует.
Как толь один круг пройден- останавливается надпись, и ждет команды.
Выбираю другую надпись пультом, тоже самое до первого повтора, строка останавливается.

Спасибо за ранее.

#3 Re: Програмування Arduino » бегущая строка с переключением ик пультом » 2017-05-31 13:40:27

qwone пише:

Если вы покупаете машинку в детских товарах, а потом норовите сесть за руль и ездить по нормальным дорогам, то всем покажет, что вы идиот. Так вот и программирование на Ардуине. Оно расчитано на детей. Для проектов посложнее надо получше разбираться в Си и программированиию

По видимому Вы такой же ребенок.

#4 Програмування Arduino » бегущая строка с переключением ик пультом » 2017-05-31 00:43:52

Svatoy_otec
відповідей: 8

Здравствуйте уважаемые. Помогите пожалуйста решить проблемку. Есть пульт, который переключаетна бегущей строке отдельные слова на LCD 8x8. При нажатиии на нужную кнопку,предложение проходит один круг и замирает в ожидании кнопки. При пробеги предложении если выбираешь другое предложение предыдущее не прерывается. Как это сделать. Только начинаю творить, помогите в этом куске скетча.

void loop(){
   if ( irrecv.decode( &results )) {
    Serial.println(results.value, HEX);

  if (results.value==0xFF30CF){
scrollMessage(scrollText);results.value=0;
}

  if (results.value==0xFF18E7){
scrollMessage(scrollText2);results.value=0;
}
irrecv.resume();
}
}
Заранее спасибо.

Підвал форуму