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

Сам по себе дисплей мне понравился. 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, таких удобных и доступных модулей у нас под рукой не было. За это Амперке, безусловно, спасибо. Однако, друзья, не рекомендую его использовать с маломощными платами – вам просто не хватит памяти для реализации даже мало-мальски функционального интерфейса, не говоря уже о полезных функциях. Ну и, конечно, не рекомендую использовать подключение кнопок к аналоговым вводам – используйте цифровые вводы и прерывания.
Кстати, какую платку обозреть в будущем? Открываю комментарии…