Вывод массива на OLED-дисплей 0.96,128х64 на SSD1306
- Войдите на сайт для отправки комментариев
Ср, 03/10/2018 - 22:30
Здравствуйте.
Вопрос в следующем,делаю декодер азбуки Морзе на ардуино.Нашел похожую программу в интернете,с помощью нее длинные и короткие посылки из радиоэфира преобразуются в буквы но в 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; // Сбрасываем флаги и переменные относящиеся к принятому символу, так как мы его уже вывели } // }
Посмотреть в библиотеке iarduino_OLED_txt как работает функция вывода из 46 строки вашего скетча.