Вывод массива на OLED-дисплей 0.96,128х64 на SSD1306

vonka155
Offline
Зарегистрирован: 02.10.2018

Здравствуйте.

Вопрос в следующем,делаю декодер азбуки Морзе на ардуино.Нашел похожую программу в интернете,с помощью нее длинные и короткие посылки из радиоэфира преобразуются в буквы но в COM порте на компьютере,а при подключении дисплея там появляются двухзначные цифры. Может на дисплей массив как-то по другому нужно выводить.

Приму любую помощь.

Спасибо

#include <iarduino_OLED_txt.h>
#include <Wire.h>                                        
iarduino_OLED_txt myOLED_1(0x3C);                            // Объявляем объект myOLED_1, указывая адрес первого дисплея на шине I2C: 0x3C.                                     
 const uint8_t   pinSensor = A3;
 const uint16_t  varVolume = 800;      //  Определяем константу с уровнем громкости сигнала      (принимаются только те сигналы, громкость которых выше указанного уровня)
const uint32_t  tmrSignal = 300;      //  Определяем константу с указанием длительности сигнала (если сигнал короче - точка, если сигнал длиннее - тире)
const uint32_t  tmrPause  = 500;      //  Определяем константу с указанием длительности паузы   (если пауза между сигналами дольше, значит начинается новое слово)
      uint32_t  tmrSeparator;         //  Объявляем переменную для определения граничного времени для сигналов и пауз
      uint8_t   varLetter;            //  Объявляем переменную для хранения принятых точек и тире одного символа (бит 0 - точка, бит 1 - тире)
      uint8_t   lenLetter;            //  Объявляем переменную для хранения количества точек и тире в принятом символе
      bool      flgSignal;            //  Объявляем флаг указывающий на то что была принята хотя бы одна точка или тире
      bool      flgLetter;            //  Объявляем флаг указывающий на то что был принят символ
      char    chrMorze[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5',  '6',  '7',  '8',  '9',  '0',  '.',  ';',  ',',  ':',  '?',  '!',  '-',  ' ', '\n', '\r'};
      uint8_t   lenMorze[] = {  2,   4,   4,   3,   1,   4,   3,   4,   2,   4,   3,   4,   2,   2,   3,   4,   4,   3,   3,   1,   3,   4,   3,   4,   4,   4,   5,   5,   5,   5,   5,    5,    5,    5,    5,    5,    6,    6,    6,    6,    6,    6,    6,    5,    5,    5};
      uint8_t   varMorze[] = {0x1, 0x8, 0xA, 0x4, 0x0, 0x2, 0x6, 0x0, 0x0, 0x7, 0x5, 0x4, 0x3, 0x2, 0x7, 0x6, 0xD, 0x2, 0x0, 0x1, 0x1, 0x1, 0x3, 0x9, 0xB, 0xC, 0xF, 0x7, 0x3, 0x1, 0x0, 0x10, 0x18, 0x1C, 0x1E, 0x1F,  0x0, 0x2A, 0x15, 0x38, 0x0C, 0x33, 0x21, 0x11, 0x15, 0x0A};                                                                       
extern uint8_t MediumFontRus[];                              // Подключаем шрифт MediumFontRus.                                    
int A;                                                                       
void setup(){
   flgLetter=varLetter=lenLetter=0; 
    Serial.begin(9600);
    Serial.println("Детектор азбуки Морзе");                                          // Выводим текст "Детектор азбуки Морзе"
    Serial.println("=====================");   
    myOLED_1.print("Детектор азбуки Морзе");                                          // Выводим текст "Детектор азбуки Морзе"  
    myOLED_1.begin ();                                                                       // Инициируем работу с LCD дисплеем                                                                 // Включаем подсветку LCD дисплея
    myOLED_1.setFont(MediumFontRus);                         // Указываем шрифт который требуется использовать для вывода цифр и текста на первом дисплее.
                                      
   pinMode(A3,INPUT);                        
}                                                                                                                                             
void loop(){
 
  if (analogRead(A3)>180)
   { flgSignal=true;                                                               // Устанавливаем флаг указывающий на наличие сигнала
        lenLetter++;                                                                  // Увеличиваем счетчик количества точек и тире в принятом символе
        tmrSeparator = millis()+tmrSignal;                                            // Определяем граничное время сигнала (если сигнал пропадёт до этого времени - значит принята точка, иначе принято тире)
        while(analogRead(pinSensor) > varVolume){delay(10);}                          // Ждём пока не пропадёт сигнал
        varLetter<<=1; varLetter|=tmrSeparator<millis(); }
        
    else{    tmrSeparator = millis()+tmrPause;                                             // Определяем граничное время паузы (если пауза пропадёт до этого времени - значит мы продолжаем принимать символ, иначе символ полностью принят)
        while(analogRead(pinSensor) < varVolume && tmrSeparator>millis()){delay(10);} // Ждём пока не исчезнет пауза, но не дольше чем время указанное в tmrSeparator
        if(tmrSeparator<millis()){flgLetter=flgSignal; flgSignal=false;}    }
        
        if(flgLetter){                                                                    // Если установлен флаг flgLetter значит символ полностью принят, его нужно сравнить и вывести
         for(uint8_t i=0; i<46; i++){                                                  // Проходим по всем 46 символам массивов
        if(varLetter==varMorze[i] && lenLetter==lenMorze[i]){                         // Если комбинация точек и тире в varLetter совпала с varMorze[i] и количество точек и тире совпало с lenMorze[i], то...
            Serial.print(chrMorze[i]); 
           myOLED_1.print(chrMorze[i],6);  // Выводим символ из chrMorze[i] в монитор последовательного порта
        }}  flgLetter=varLetter=lenLetter=0;                                          // Сбрасываем флаги и переменные относящиеся к принятому символу, так как мы его уже вывели
    }                                                                                 //
}                                              

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Посмотреть в библиотеке iarduino_OLED_txt как работает функция вывода из 46 строки вашего скетча.