Зависает прием HEX с ИК пульта.
- Войдите на сайт для отправки комментариев
Пнд, 21/03/2022 - 11:19
Привет!
В программировании нулевый, была задача сделать вывод бегущей строки на адресной матрице 8х32 с нажатия кнопок на ИК пульте.
На каждую кнопку - своя надпись, которая крутится 1 раз и ждет следующей кнопки.
Код был взят с инета, и немного отредактирован на уровне моих возможностей (нулевых). Скетч работает, надписи появляются, но в определенный момент (каждый раз по разному) - в монитор начинает отправляться левый HEX код, без остановки и ардуино больше ни на что не реагирует. Так же в мониторе порта появлялись мусорные команды, которые пропали при изменении скорости порта.
Вот скетч:
#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); }irrecv.resume(); не на месте, как мне кажется.
Ну и вообще - сначала затычку вместо runText() сделайте. Начнет работать правильно - будете добавлять свои строки бегущие.
Если я ставлю irrecv.resume(); в setup то при нажатии кнопки - надпись просто сдвигается на 1 пиксель. Каждое нажатие... Что есть затычка?
Возьмите пример к библиотеке и посмотрите, где irrecv.resume(); располагать нужно.
case 0x511DBB: runText("ПОКА!!", 0, 0xFF8C00, 50); break; }Сразу после фигурной скобки.Но в таком случае, опять же - он не прокручивает строку, а смещает ее ровно на 1 пиксель. То есть функция runtext не проигрывается до конца. Может есть примеры скетча где нормально реализован хотя бы просто вывод текста на матрицу посредством кнопки с ИК пульта?
Если пульт стабильно работает без прокрутки строки, значит ошибка в функции runText().