Тест-драйв Uno Slot + Troyka OLED и демонстратор простого текстового меню

Dislaimer: я решился выпустить этот текст по двум причинам: во-первых, техническая документация, доступная на сайте Амперки, скажем так, не полна, и чтобы начать работать с модулями «из коробки» нужно изрядное время порыться в документации используемых в них комплектующих (об этом чуть ниже), что, скажем прямо, совсем не user-friendly. Во-вторых, сайт, на который Амперка отправляет в случае возникновения вопросов – это сайт для задавания вопросов, готовых ответов вы там не найдете. Когда я ничтоже сумняшеся поделился там с народом найденным мною решением, казалось бы, очевидной проблемы – как заставить работать встроенные в Troyka OLED кнопки – мне русским по белому было сказано «иди-ка ты, мальчик, отсюда». А поделиться опытом таки хотелось.
Итак, друзья. Была у меня задачка – слепить быстро демонстратор некоего портативного устройства с ЖК-дисплеем и парой кнопок. А тут как раз Амперка объявила о начале продаж Troyka OLED-модуля, который, казалось бы, идеально подходит для решения этой задачи – ну и в нагрузку к нему я докупил Uno Slot, чтобы не мучаться с шилдами для уже имеющегося у меня арсенала Arduino-плат.

Модуль Troyka OLED, установленный на плату Uno Slot

Сам по себе дисплей мне понравился. 128х64 позволяет выводить шесть (с учетом междустрочных интервалов в два пикселя) строк шрифтом 6х8, есть возможность управления яркостью и контрастом (правда, чтобы понять, как это делать, придется покопаться в перечне ключевых слов в библиотеке на Github). А в остальном – разобраться с тем, как его подключить по I2C и начать с ним работать, было несложно.

Мой демонстратор имеет три опции меню, переключение между которыми производится правой кнопкой, а выбор – с помощью левой. При этом есть виртуальный курсор – номер ряда, который подсвечивается инверсией.

Демонстратор текстового меню в работе

Однако,  разобраться с подключением к кнопкам, которые распаяны на плате, оказалось не так-то просто. Точнее, всему виной Uno Slot  — при установке модуля Troyka OLED они подключаются к аналоговым пинам A0 и A1, что автоматически исключает возможность подключения цифровых прерываний и в основном цикле придется постоянно считывать уровень напряжения на этих входах:

#define RIGHT_BUTTON A0

#define LEFT_BUTTON A1

——————————————-

void loop(){

//some code above

left_vol = analogRead(LEFT_BUTTON);

right_vol = analogRead(RIGHT_BUTTON);

//some code below

}

Полный код скетча доступен тут.

Хотя, если кому-то интересно ловить прерывание после того как отработал АЦП – то я после прочтения блога Ника Гэммона написал следующий код:

void setup(){

Serial.begin(115200);

ADCSRA = bit(ADEN);     //turn ADC on

ADCSRA != bit(ADPS0) | bit(ADPS1) | bit(ADPS2);            //Prescaler of 128

ADMUX = bit(REFS0) | (adcPin & 0x07);                 //AVcc and select input port

}

//ADC complete ISR handle for interrupt callback

ISR(ADC_vect)

{

adcReading = ADC;

adcDone = true;

}

void loop(){

//Если АЦП закончил работу, то

if (adcDone)

{

adcStarted  = false;

// делаем что-то с результатами оцифровки аналогового сигнала

}

//если АЦП ничего не делает, запускаем его работу

if (!adcStarted)

{

adcStarted = true;

//запуск конверсии по базе в 128 бит

ADCSRA != bit(ADSC) | bit(ADIE)

}

}

В моем случае, я печатал положение виртуального курсора на экране после того как АЦП закончил свою работу.

Второй большой недостаток Uno Slot – очень маленький объем флэш-памяти. Скетч, который всего-навсего демонстрирует три строки, позволяет переключаться между ними и подсвечивать их, занял у меня 2/3 доступной для глобальных переменных флэш-памяти (2 Кбайт). Поэтому следующие посты (когда они будут) я посвящу более мощным платам.

Резюме:

Troyka OLED – весьма годный ЖК-дисплей для быстрого прототипирования. Еще каких-то четыре года назад, когда мы с командой делали Pure Charger, таких удобных и доступных модулей у нас под рукой не было. За это Амперке, безусловно, спасибо. Однако, друзья, не рекомендую его использовать с маломощными платами – вам просто не хватит памяти для реализации даже мало-мальски функционального интерфейса, не говоря уже о полезных функциях. Ну и, конечно, не рекомендую использовать подключение кнопок к аналоговым вводам – используйте цифровые вводы и прерывания.

Кстати, какую платку обозреть в будущем? Открываю комментарии…