Игра на развитии памяти "Simon" теперь реализована на Arduino с помощью Trema Set Shield и новых Trema-модулей кнопок со светодиодами.
Правила игры:
Вы должны повторить последовательность цветов, нажимая кнопки в той же последовательности, в которой загорались светодиоды. На 1 уровне зажжется на пол секунды один из трех светодиодов кнопки. После того как он потухнет, нужно нажать кнопку с соответствующим светодиодом. На 2 уровне, зажжется тот же светодиод, а потом еще один из трех, нужно нажать кнопку с соответствующим первым светодиодом, а потом кнопу с други загоревшимся светодиодом. На уровне три последовательно зажгутся три светодиода и т. д. Если вы нажмёте не на ту кнопку, ошибетесь в последовательности, то на 1 секунду зажгутся все светодиоды и игра начнется с 1 уровня.
Нам понадобится:
- Arduino Uno х 1шт.
- Trema Set Shield х 1шт.
- Trema OLED-дисплей 128x64 х 1шт.
- Trema-модуль кнопка со светодиодом, синяя х 1шт.
- Trema-модуль кнопка со светодиодом, красная х 1шт.
- Trema-модуль кнопка со светодиодом, зеленая х 1шт.
Для реализации проекта нам необходимо установить следующие библиотеки:
- iarduino_OLED - графическая библиотека для работы с Trema OLED дисплеями.
О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE.
Схема подключения:
Перед подключением модулей, закрепите винтами нейлоновые стойки в отверстиях секций 3 и 4 Trema Set Shield.- Установите Trema Set Shield на Arduino Uno.
- Устанавливаем Trema-модуль синюю кнопку со светодиодом в 1 посадочную площадку.

- Установите Trema OLED-дисплей 128x64 в 3 посадочную площадку, в верхнюю I2C колодку.

- Устанавливаем Trema-модуль красную кнопку со светодиодом в 4 посадочную площадку.

- Устанавливаем Trema-модуль зеленую кнопку со светодиодом в 5 посадочную площадку.

- Полученный результат представлен на рисунке ниже.

Код программы:
#include <iarduino_OLED.h> // Подключаем библиотеку iarduino_OLED.
iarduino_OLED myOLED(0x3C); // Объявляем объект myOLED, указывая адрес дисплея на шине I2C: 0x3C.
extern uint8_t MediumFont[]; // Подключаем шрифт MediumFont.
//
const uint8_t pinLed[3] = {1,A2, 5}; // Создаем массив констант с № входов к которым подключены светодиоды.
const uint8_t pinKey[3] = {A0,2,A3}; // Создаем массив констант с № входов к которым подключены кнопки.
//
uint8_t task[99]; // Создаем массив заданий (последовательность цветов).
uint8_t level = 0; // Создаем переменную для хранения № текущего уровня.
uint8_t numKey = 0; // Создаем переменную для хранения № нажатой клавиши.
uint8_t sumKey = 0; // Создаем переменную для подсчета количества нажатий клавиш.
bool start = 1; // Создаем флаг старта.
//
void setup() //
{ //
for(int i=0; i<3; i++) // В цикле конфигурируем выводы и включаем светодиоды.
{ //
pinMode(pinLed[i],OUTPUT); // Переводим выводы pinLed в режим выхода.
digitalWrite(pinLed[i],LOW); // Выключаем светодиоды.
pinMode(pinKey[i],INPUT); // Переводим выводы pinKey в режим выхода.
randomSeed(analogRead(A1)); // Назначаем случайное число со входа A0, для генератора random().
} //
myOLED.begin(); // Инициируем работу с дисплеем.
myOLED.setFont(MediumFont); // Указываем шрифт который требуется использовать для вывода цифр и текста.
} //
void loop() //
{ //
numKey = 3; // Присваиваем переменой № нажатой клавиши число 3.
for(int i=0; i<3; i++) // В цикле фиксируем нажатие одной из трех клавиш.
{ //
if(digitalRead(pinKey[i])) // Если нажата клавиша.
{ //
numKey = i; sumKey++; // Сохраняем номер нажатой клавиши, увеличиваем количество нажатий клавиши.
} //
} //
if(numKey<3) // Если номер нажатой клавиши меньше 3.
{ //
digitalWrite(pinLed[numKey],1); // Включаем светодиод нажатой клавиши.
while(digitalRead(pinKey[numKey])){delay(50);} // Ждем пока не отпустят кнопку.
digitalWrite(pinLed[numKey],0); // Выключаем светодиод нажатой клавиши.
if(task[sumKey-1] != numKey){level = 0; start = 1;} // Если ошибка, то переходим на 0 уровень.
if(!start && sumKey>level){level++; start = 1;} // Если нет ошибок, то увеличиваем уровень.
} //
myOLED.print(level, OLED_C, OLED_C); // Выводим уровень на экран.
if(start) // Если начат новый уровень.
{ //
start = sumKey = 0; // Запрещаем начинать новый уровень и обнуляем переменную подсчета количества нажатий клавиш.
task[level] = random(0,3); // Придумываем последний цвет от 0 до 2.
if(level == 0) // Если начат нулевой уровень.
{ //
for(int i=0; i<3; i++){digitalWrite(pinLed[i],1);} // Включаем все светодиоды.
delay(1000); // Задержка 1 с.
for(int i=0; i<3; i++){digitalWrite(pinLed[i],0);} // Выключаем все светодиоды.
} //
delay(500); // Задержка 500 мс.
for(int i=0; i<=level; i++) // В цикле выводим всю последовательность цветов.
{ //
delay(500); digitalWrite(pinLed[task[i]],1); // Включаем очередной светодиод.
delay(500); digitalWrite(pinLed[task[i]],0); // Выключаем очередной светодиод.
} //
} //
} //
Алгоритм работы:
В начале скетча (до кода setup) выполняются следующие действия:
- Подключаем графическую библиотеку iarduino_OLED для работы с Trema OLED дисплеем.
- Объявляем объект myOLED указывая адрес дисплея на шине I2C, он должен совпадать с адресом установленным переключателем на обратной стороне платы OLED дисплея.
- Подключаем шрифты предустановленные в библиотеке myOLED.
- Объявляем пины для работы с Trema-модуль синей кнопкой со светодиодом, Trema-модуль красной кнопкой со светодиодом и Trema-модуль зеленой кнопкой со светодиодом, а так же пины для работы со светодиодами кнопок.
- Объявляем массив и переменные задействованные в скетче.
В коде setup выполняются следующие действия:
- Переводим все выводы pinKey в режим входа для кнопок, а все выводы pinLed в режим выхода для светодиодов кнопок.
- Гасим все светодиоды.
- Назначаем случайное число со входа A0, для генератора random().
- Инициируем OLED дисплей и указываем шрифт для работы.
В коде loop выполняются следующие действия:
- Присваиваем переменой № нажатой клавиши число 3.
- В цикле фиксируем нажатие одной из трех клавиш. Если нажата клавиша, то сохраняем номер нажатой клавиши, увеличиваем количество нажатий клавиши.
- Если номер нажатой клавиши меньше 3. Включаем светодиод нажатой клавиши. Ждем пока не отпустят кнопку. Выключаем светодиод нажатой клавиши.
- Если ошибка, то переходим на 0 уровень.
- Если нет ошибок, то увеличиваем уровень.
- Выводим уровень на экран.
- Если начат новый уровень.
- Придумываем последний цвет от 0 до 2.
- Если начат нулевой уровень. Включаем все светодиоды. Ждем одну секунду. Выключаем все светодиоды.
- В цикле выводим всю последовательность цветов, включаем и выключая очередной светодиод.

Обсуждение