Зависает прием HEX с ИК пульта.

Rasberg
Offline
Зарегистрирован: 21.03.2022

Привет!
В программировании нулевый, была задача сделать вывод бегущей строки на адресной матрице 8х32 с нажатия кнопок на ИК пульте.

На каждую кнопку - своя надпись, которая крутится 1 раз и ждет следующей кнопки.

Код был взят с инета, и немного отредактирован на уровне моих возможностей (нулевых). Скетч работает, надписи появляются, но в определенный момент (каждый раз по разному) - в монитор начинает отправляться левый HEX код, без остановки и ардуино больше ни на что не реагирует. Так же в мониторе порта появлялись мусорные команды, которые пропали при изменении скорости порта.
 

Вот скетч:

 
 
 
 
 
 
 
Rasberg
Offline
Зарегистрирован: 21.03.2022
#include <FastLED.h>
#include "font.h"
#include <IRremote.h> // подключаем библиотеку для IR приемника

#define DATA_PIN 2

#define NUM_LEDS 256
#define MATRIX_WIDTH 32            
#define MATRIX_HEIGHT 8 
#define BRIGHTNESS 200

IRrecv irrecv(11); // указываем пин, к которому подключен IR приемник
decode_results results;

//константы и переменные для работы с текстом
const String fontNumStr="0123456789 !,.:;?";
const String fontLetStr="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
uint16_t curPixel;
uint8_t curX;
uint8_t curY;
unsigned long timer;
CRGB leds[NUM_LEDS];

//переменные для работы с бегущей строкой
uint16_t lineStart=0;//с какого столбца строки начинаем вопроизведение текста
uint16_t lineFin=0;//каким столбцом строки заканчиваем вопроизведение текста
uint8_t startRunLineX=MATRIX_WIDTH-1;//столбец X начала отрисовки бегущей строки


void setup() { 
    irrecv.enableIRIn();  // запускаем прием инфракрасного сигнала
    FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
    FastLED.setBrightness(BRIGHTNESS);//0-255
    
    Serial.begin (2400);
    FastLED.show();
}
void loop() { 



  if ( irrecv.decode( &results )) { // если данные пришли
    
    Serial.println(results.value, HEX);
    switch ( results.value ) {
    case 0xFFA25D:
         runText("СПАСИБО!", 0, 0x32CD32, 50);
        break;
        case 0xE318261B:
         runText("СПАСИБО!", 0, 0x32CD32, 50);
        break;
    case 0xFF629D:
         runText("ПОКА!!", 0, 0xFF8C00, 50);
        break;
         case 0x462CAD38:
         runText("ПОКА!!", 0, 0xFF8C00, 50);
        break;
         case 0x511DBB:
         runText("ПОКА!!", 0, 0xFF8C00, 50);
        break;
    }    
  
  }
}
void setPixel (byte x, byte y, uint32_t color) {
   uint16_t curLed;
   if (x%2==0){
      curLed=MATRIX_HEIGHT*x+y;
   }
   else {
      curLed=(MATRIX_HEIGHT*(x+1)-1)-y; 
   }
   
   leds[curLed]=color;
}

byte getPixel (uint8_t vertPixels, byte startY, uint32_t color) {
   byte pixel;
   for (int k = 7; k >=0; k--) {//
        pixel = ((vertPixels >> k) & 0x01);
        if (pixel==1){
            setPixel (curX, curY, color);
        }
        curY++;
    }
    curY=startY;
    curX++;
}

void runText(String text, byte startY, uint32_t color, int speedText){//вывод бегущей строки
    int i;
    byte n;
    bool isRusLetter=false;
    byte vertPixels;
    
    curY=startY;
    curX=startRunLineX;
    FastLED.clear();

    int l=0;
    for (i=0;i<text.length();i++){
        if (int(text[i])>0){
            n=fontNumStr.indexOf(text[i]);
            for (byte j=0;j<4;j++){
               vertPixels=pgm_read_byte(&(font7num[n][j]));
               if ((j==0)||(vertPixels>0)){//только первая колонка и не пустые колонки
                   if ((l>=lineStart)&&(l<=lineFin)){
                     getPixel (vertPixels, startY, color);
                   }

                   l++;
               }
               if (j==3){//в конце каждого символа добавляем пробел
                  if ((l>=lineStart)&&(l<=lineFin)){
                      curX++;
                   }
                   l++;
               }
             }
        }
        else {
            if (isRusLetter==true){
                isRusLetter=false;
                n=112+int(text[i]);
                for (byte j=0;j<7;j++){
                     vertPixels=pgm_read_byte(&(font7let[n][j]));

                     if ((j==0)||(vertPixels>0)||((n==27)&&(j<6))){//только первая колонка, не пустые колонки или буква Ы
                         if ((l>=lineStart)&&(l<=lineFin)){
                            getPixel (vertPixels, startY, color);
                         }
                         l++;
                     }
                      if (j==6){//в конце каждого символа добавляем пробел
                          if ((l>=lineStart)&&(l<=lineFin)){
                              curX++;
                           }
                           l++;
                       }
                }
            }
            else {
               isRusLetter=true;
            }
        }
    }
    lineFin++;
    if (lineFin>=MATRIX_WIDTH) {
        lineStart++;  
    }
    
    if (startRunLineX>0){//каждый кадр смещаем начало отрисовки бегущей строки на 1 пиксель влево от правого края матрицы
        startRunLineX--;
    }

    if (lineStart>l){//воспроизводим с начала
      l=0;
      lineStart=0;
      lineFin=0;
      startRunLineX=MATRIX_WIDTH-1;
      irrecv.resume(); // принимаем следующую команду
    }
    FastLED.show();
    delay(speedText);
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

irrecv.resume(); не на месте, как мне кажется.

Ну и вообще - сначала затычку вместо runText() сделайте. Начнет работать правильно - будете добавлять свои строки бегущие.

Rasberg
Offline
Зарегистрирован: 21.03.2022

Если я ставлю irrecv.resume(); в setup то при нажатии кнопки - надпись просто сдвигается на 1 пиксель. Каждое нажатие... Что есть затычка?

sadman41
Offline
Зарегистрирован: 19.10.2016

Возьмите пример к библиотеке и посмотрите, где  irrecv.resume(); располагать нужно.

Rasberg
Offline
Зарегистрирован: 21.03.2022
 
case 0x511DBB:
         runText("ПОКА!!", 0, 0xFF8C00, 50);
        break;
    } 
  

Сразу после фигурной скобки.

 Но в таком случае, опять же - он не прокручивает строку, а смещает ее ровно на 1 пиксель. То есть функция runtext не проигрывается до конца. Может есть примеры скетча где нормально реализован хотя бы просто вывод текста на матрицу посредством кнопки с ИК пульта?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Если пульт стабильно работает без прокрутки строки, значит ошибка в функции runText().