====== Умный котик Nyan: Инструкция по сборке, примеры использования и документация ======
Соберите умного котика [[amp>product/nyan?utm_source=proj&utm_campaign=nyan&utm_medium=wiki|Nyan]], который
станет забавным и полезным предметом на рабочем столе, помощником в тайм-менеджменте или интернет-нотификатором. Набор поможет быстро и весело начать путь в мир хобби-электроники.
{{ :projects:nyan:nyan.2.jpg?nolink |}}
Nyan Cat поставляется в разборном виде. Следуйте нашей инструкции, и вы получите готовое к работе устройство!
===== Видеообзоры =====
{{youtube>EvcMxbcYLwU?large}}
{{youtube>SNt7QL49Om4?large}}
===== Что в коробке =====
{{ :projects:nyan:nyan.3.jpg?nolink |}}
- 1× [[amp>product/iskra-neo?utm_source=proj&utm_campaign=nyan&utm_medium=wiki | Iskra Neo]]
- 1× [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=nyan&utm_medium=wiki | Troyka Slot Shield]]
- 1× [[amp>product/troyka-5mm-led-module?utm_source=proj&utm_campaign=nyan&utm_medium=wiki | Светодиоды 5 мм (Troyka-модуль)]] (красный, жёлтый, зелёный и синий)
- 1× [[amp>product/troyka-button?utm_source=proj&utm_campaign=nyan&utm_medium=wiki | Тактовая кнопка (Troyka-модуль)]]
- 1× [[amp>product/troyka-buzzer?utm_source=proj&utm_campaign=nyan&utm_medium=wiki|Пьезопищалка (Troyka-модуль)]]
- 1× [[amp>product/usb-cable-micro?utm_source=proj&utm_campaign=nyan&utm_medium=wiki | Кабель USB (A — Micro USB)]]
- 3× [[amp>product/nylon-screw-m3x8?utm_source=proj&utm_campaign=nyan&utm_medium=wiki|Винт М3 (4 шт.)]]
- 1× [[amp>product/structor-slot-box?utm_source=proj&utm_campaign=nyan&utm_medium=wiki|Набор деталей Slot Box (#Структор)]]
Всё необходимое для сборки вместе с корпусом из #Структора мы собрали в [[amp>product/nyan?utm_source=proj&utm_campaign=nyan&utm_medium=wiki|готовый набор Nyan]].
===== Сборка корпуса =====
- Вкрутите четыре винта М3 в плашку #струткора, как показано на рисунке.{{ :projects:nyan:nyan-instructions.1.css.png?nolink&600 |}}
- Переверните плашку корпуса и установите плату Iskra Neo на болты M3.{{ :projects:nyan:nyan-instructions.2.png?nolink |}}
- Закрепите боковые стенки #струткора к общему корпусу.{{ :projects:nyan:nyan-instructions.3.png?nolink |}}
- Соберите из плашек готовый готовый корпус.{{ :projects:nyan:nyan-instructions.4.png?nolink&600 |}}
- Вставьте модули в Slot Shied:
- Светодиоды в ячейки B, C, E и F;
- Зуммер в ячейку A;
- Кнопку в ячейку D.{{ :projects:nyan:nyan-instructions.5.png?nolink |}}{{ :projects:nyan:nyan-instructions.6.png?nolink&600 |}}
- Закрепите модули винтами М3.{{ :projects:nyan:nyan-instructions.7.png?nolink&600 |}}
- Соберите голову Nyan Cat.{{ :projects:nyan:nyan-instructions.8.png?nolink |}}
- Закрепите голову котика на корпусе.{{ :projects:nyan:nyan-instructions.9.png?nolink |}}
- Nyan Cat собран, теперь можно переходить к [[#программная_настройка|программной настройке]].
===== Программная настройка =====
- Подключите плату Iskra Neo к компьютеру по USB. Для коммуникации используйте [[amp>product/usb-cable-micro?utm_source=proj&utm_campaign=nyan&utm_medium=wiki|кабель USB (A — Micro USB)]].
- Скачайте и установите [[articles:arduino-ide-install|Arduino IDE]].
===== Примеры работы =====
Рассмотрим несколько примеров по работе с Nyan Cat.
Для старта [[#сборка_корпуса|соберите корпус]] и [[#программная_настройка|выполните программную настройку]].
**Обрати внимание**
Для успешной загрузке скетчей понадобиться драйвер CH340. Прочитайте наши статьи по установке драйвера [[articles:driver-ch340|для Windows]] или [[projects:installing-the-ch340-on-linux|для Linux]]
==== Нян Код ====
Для начала предлагаем демонстрационный код, который заставит котика по клике на кнопку, мигать светодиодами и пищать мелодию.
// Ноты
#define REST 0
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
// Пины подключенных модулей
#define LED_R_PIN 10
#define LED_G_PIN 9
#define LED_B_PIN 4
#define LED_Y_PIN 6
#define BUZZER_PIN 7
#define BUTTON_PIN 8
// Массив с нотами мелодии
int melody[] = {
NOTE_DS5, NOTE_E5, NOTE_FS5, REST, NOTE_B5, NOTE_E5, NOTE_DS5,
NOTE_E5, NOTE_FS5, NOTE_B5, NOTE_DS6, NOTE_E6, NOTE_DS6, NOTE_AS5,
NOTE_B5, REST, NOTE_FS5, REST, NOTE_DS5, NOTE_E5, NOTE_FS5,
REST, NOTE_B5, NOTE_CS6, NOTE_AS5, NOTE_B5, NOTE_CS6, NOTE_E6,
NOTE_DS6, NOTE_E6, NOTE_CS6, NOTE_FS4, NOTE_GS4, NOTE_D4, NOTE_DS4,
NOTE_FS2, NOTE_CS4, NOTE_D4, NOTE_CS4, NOTE_B3, NOTE_B3, NOTE_CS4,
NOTE_D4, NOTE_D4, NOTE_CS4, NOTE_B3, NOTE_CS4, NOTE_DS4, NOTE_FS4,
NOTE_GS4, NOTE_DS4, NOTE_FS4, NOTE_CS4, NOTE_DS4, NOTE_B3, NOTE_CS4,
NOTE_B3, NOTE_DS4, NOTE_FS4, NOTE_GS4, NOTE_DS4, NOTE_FS4, NOTE_CS4,
NOTE_DS4, NOTE_B3, NOTE_D4, NOTE_DS4, NOTE_D4, NOTE_CS4, NOTE_B3,
NOTE_CS4, NOTE_D4, NOTE_B3, NOTE_CS4, NOTE_DS4, NOTE_FS4, NOTE_CS4,
NOTE_D4, NOTE_CS4, NOTE_B3, NOTE_CS4, NOTE_B3, NOTE_CS4, NOTE_FS4,
NOTE_GS4, NOTE_D4, NOTE_DS4, NOTE_FS2, NOTE_CS4, NOTE_D4, NOTE_CS4,
NOTE_B3, NOTE_B3, NOTE_CS4, NOTE_D4, NOTE_D4, NOTE_CS4, NOTE_B3,
NOTE_CS4, NOTE_DS4, NOTE_FS4, NOTE_GS4, NOTE_DS4, NOTE_FS4, NOTE_CS4,
NOTE_DS4, NOTE_B3, NOTE_CS4, NOTE_B3, NOTE_DS4, NOTE_FS4, NOTE_GS4,
NOTE_DS4, NOTE_FS4, NOTE_CS4, NOTE_DS4, NOTE_B3, NOTE_D4, NOTE_DS4,
NOTE_D4, NOTE_CS4, NOTE_B3, NOTE_CS4, NOTE_D4, NOTE_B3, NOTE_CS4,
NOTE_DS4, NOTE_FS4, NOTE_CS4, NOTE_D4, NOTE_CS4, NOTE_B3, NOTE_CS4,
NOTE_B3, NOTE_B3, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_FS3,
NOTE_GS3, NOTE_B3, NOTE_CS4, NOTE_DS4, NOTE_B3, NOTE_E4, NOTE_DS4,
NOTE_E4, NOTE_FS4, NOTE_B3, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3,
NOTE_FS3, NOTE_E4, NOTE_DS4, NOTE_CS4, NOTE_B3, NOTE_E3, NOTE_DS3,
NOTE_E3, NOTE_FS3, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_FS3,
NOTE_GS3, NOTE_B3, NOTE_B3, NOTE_CS4, NOTE_DS4, NOTE_B3, NOTE_FS3,
NOTE_GS3, NOTE_FS3, NOTE_B3, NOTE_B3, NOTE_AS3, NOTE_B3, NOTE_FS3,
NOTE_GS3, NOTE_B3, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_FS4, NOTE_B3,
NOTE_AS3, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_FS3, NOTE_GS3,
NOTE_B3, NOTE_CS4, NOTE_DS4, NOTE_B3, NOTE_E4, NOTE_DS4, NOTE_E4,
NOTE_FS4, NOTE_B3, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_FS3,
NOTE_E4, NOTE_DS4, NOTE_CS4, NOTE_B3, NOTE_E3, NOTE_DS3, NOTE_E3,
NOTE_FS3, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_FS3, NOTE_GS3,
NOTE_B3, NOTE_B3, NOTE_CS4, NOTE_DS4, NOTE_B3, NOTE_FS3, NOTE_GS3,
NOTE_FS3, NOTE_B3, NOTE_B3, NOTE_AS3, NOTE_B3, NOTE_FS3, NOTE_GS3,
NOTE_B3, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_FS4, NOTE_B3, NOTE_CS4,
NOTE_FS4, NOTE_GS4, NOTE_D4, NOTE_DS4, NOTE_FS2, NOTE_CS4, NOTE_D4,
NOTE_CS4, NOTE_B3, NOTE_B3, NOTE_CS4, NOTE_D4, NOTE_D4, NOTE_CS4,
NOTE_B3, NOTE_CS4, NOTE_DS4, NOTE_FS4, NOTE_GS4, NOTE_DS4, NOTE_FS4,
NOTE_CS4, NOTE_DS4, NOTE_B3, NOTE_CS4, NOTE_B3, NOTE_DS4, NOTE_FS4,
NOTE_GS4, NOTE_DS4, NOTE_FS4, NOTE_CS4, NOTE_DS4, NOTE_B3, NOTE_D4,
NOTE_DS4, NOTE_D4, NOTE_CS4, NOTE_B3, NOTE_CS4, NOTE_D4, NOTE_B3,
NOTE_CS4, NOTE_DS4, NOTE_FS4, NOTE_CS4, NOTE_D4, NOTE_CS4, NOTE_B3,
NOTE_CS4, NOTE_B3, NOTE_CS4, NOTE_FS4, NOTE_GS4, NOTE_D4, NOTE_DS4,
NOTE_FS2, NOTE_CS4, NOTE_D4, NOTE_CS4, NOTE_B3, NOTE_B3, NOTE_CS4,
NOTE_D4, NOTE_D4, NOTE_CS4, NOTE_B3, NOTE_CS4, NOTE_DS4, NOTE_FS4,
NOTE_GS4, NOTE_DS4, NOTE_FS4, NOTE_CS4, NOTE_DS4, NOTE_B3, NOTE_CS4,
NOTE_B3, NOTE_DS4, NOTE_FS4, NOTE_GS4, NOTE_DS4, NOTE_FS4, NOTE_CS4,
NOTE_DS4, NOTE_B3, NOTE_D4, NOTE_DS4, NOTE_D4, NOTE_CS4, NOTE_B3,
NOTE_CS4, NOTE_D4, NOTE_B3, NOTE_CS4, NOTE_DS4, NOTE_FS4, NOTE_CS4,
NOTE_D4, NOTE_CS4, NOTE_B3, NOTE_CS4, NOTE_B3, NOTE_B3, NOTE_B3,
NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_CS4,
NOTE_DS4, NOTE_B3, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_FS4, NOTE_B3,
NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_FS3, NOTE_E4, NOTE_DS4,
NOTE_CS4, NOTE_B3, NOTE_E3, NOTE_DS3, NOTE_E3, NOTE_FS3, NOTE_B3,
NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_B3,
NOTE_CS4, NOTE_DS4, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_FS3, NOTE_B3,
NOTE_B3, NOTE_AS3, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_E4,
NOTE_DS4, NOTE_E4, NOTE_FS4, NOTE_B3, NOTE_AS3, NOTE_B3, NOTE_FS3,
NOTE_GS3, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_CS4, NOTE_DS4,
NOTE_B3, NOTE_E4, NOTE_DS4, NOTE_E4, NOTE_FS4, NOTE_B3, NOTE_B3,
NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_FS3, NOTE_E4, NOTE_DS4, NOTE_CS4,
NOTE_B3, NOTE_E3, NOTE_DS3, NOTE_E3, NOTE_FS3, NOTE_B3, NOTE_FS3,
NOTE_GS3, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_B3, NOTE_CS4,
NOTE_DS4, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_FS3, NOTE_B3, NOTE_B3,
NOTE_AS3, NOTE_B3, NOTE_FS3, NOTE_GS3, NOTE_B3, NOTE_E4, NOTE_DS4,
NOTE_E4, NOTE_FS4, NOTE_B3, NOTE_CS4,
};
// Массив длительности нот в мелодии:
// 4 = четвертная нота, 8 = восьмая нота, и так далее...
int noteDurations[] = {
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 8, 8, 16, 16, 16, 16, 16,
16, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 16, 16, 16,
16, 16, 16, 16, 8, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 8, 8, 8, 8,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 8, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 8,
8, 8, 8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 8, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 16, 8, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 8,
8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 8, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 16, 8, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 8, 8, 8,
16, 16, 16, 16, 16, 16, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 16, 16, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 16, 16, 16, 16, 16, 16, 16, 16, 8, 8, 8, 8, 8, 16, 16, 16, 16, 16,
16, 8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 16, 16, 16,
16, 16, 16, 16, 8, 8, 8, 8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16,
16, 16, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 16,
8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16,
16, 16, 16, 8, 8, 8, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 16, 8, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16,
16, 8, 8,
};
void setup() {
// Пины со светодиодами в режим выхода
pinMode(LED_R_PIN, OUTPUT);
pinMode(LED_Y_PIN, OUTPUT);
pinMode(LED_G_PIN, OUTPUT);
pinMode(LED_B_PIN, OUTPUT);
}
void loop() {
// Если была нажата кнопка, запускаем мелодию
if (checkClick())
startMelody();
// Гасим светодиоды
digitalWrite(LED_R_PIN, LOW);
digitalWrite(LED_G_PIN, LOW);
digitalWrite(LED_Y_PIN, LOW);
digitalWrite(LED_B_PIN, LOW);
}
void startMelody() {
// Вычисляем количество нот
int noteCount = sizeof(melody) / sizeof(int);
// Переменная для хранения состояния светодиодов
bool toggleLeds = true;
// Играем мелодию
for (int thisNote = 0; thisNote < noteCount; thisNote++) {
// Если была нажата клавиша - останавливаем мелодию
if (checkClick())
return;
// Каждую новую ноту меняем состояние светодиодов
digitalWrite(LED_R_PIN, toggleLeds);
digitalWrite(LED_Y_PIN, toggleLeds);
digitalWrite(LED_G_PIN, !toggleLeds);
digitalWrite(LED_B_PIN, !toggleLeds);
toggleLeds = !toggleLeds;
// Останавливаем воспроизведение предыдущей ноты
noTone(BUZZER_PIN);
// Вычислим длительность ноты. Разделим секунду на длительность ноты из массива
// Четвертная нота = 1000 / 4, восьмая нота 1000 / 8
// Скорость можно увеличить, увеличив числитель. Больше подошло 1200
int noteDuration = 1200 / noteDurations[thisNote];
// Можно увеличить высоту мелодии, умножая ноты на 2, 4, 8
int octaveMul = 2;
// Воспроизведём ноту
tone(BUZZER_PIN, octaveMul * melody[thisNote], noteDuration);
// Чтобы отделить ноты друг от друга, добавим небольшую паузу между ними
// 30% от длины ноты звучат неплохо
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
}
}
// Функция для проверки клика кнопки
bool checkClick() {
// Переменная для хранения предыдущего состояния кнопки
static bool buttonWasUp = true;
bool result = false;
// Читаем текущее состояние кнопки
bool buttonIsUp = digitalRead(BUTTON_PIN);
// Если кнопка была не нажата, а теперь нажата
// значит был клик
if (buttonWasUp && !buttonIsUp) {
delay(50);
result = true;
}
buttonWasUp = buttonIsUp;
return result;
}
==== Таймер «Помидор» ====
[[https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BC%D0%B8%D0%B4%D0%BE%D1%80_(%D0%BC%D0%B5%D1%82%D0%BE%D0%B4)|Помидорная техника]] используется для повышения продуктивности работы. Вы просто ставите себе таймер на 25 минут и не отвлекаетесь. А ещё с её помощью можно приготовить яичницу.
// Пины подключенных модулей
constexpr uint8_t LED_R_PIN = 10;
constexpr uint8_t LED_G_PIN = 9;
constexpr uint8_t LED_B_PIN = 4;
constexpr uint8_t LED_Y_PIN = 6;
constexpr uint8_t BUZZER_PIN = 7;
constexpr uint8_t BUTTON_PIN = 8;
// Время таймера в минутах
constexpr uint8_t POMODORO_TIME = 25;
// Количество светодиодов
constexpr uint8_t LED_COUNT = 4;
// Массив пинов со светодиодами
int leds[] = { LED_R_PIN, LED_G_PIN, LED_Y_PIN, LED_B_PIN };
// Переменная для хранения времени таймера в миллисекундах
unsigned long pomodoroTimeInMillis;
// Переменная для хранения времени переключения светодиодов
unsigned long ledSwitchTime;
// Переменная для хранения времени начала работы таймера
unsigned long lastTime = 0;
// Состояние таймера — выключен
bool pomodoroState = false;
void setup() {
// Рассчитаем время таймера в миллисекундах
pomodoroTimeInMillis = POMODORO_TIME * 60000;
// Рассчитаем время переключения светодиодов
ledSwitchTime = pomodoroTimeInMillis / LED_COUNT;
// Переключим пины светодиодов в состояние выхода
for (int i = 0; i < LED_COUNT; ++i) {
pinMode(leds[i], OUTPUT);
}
}
void loop() {
// Если был клик кнопки
if (checkClick()) {
// Запомним текущее время
lastTime = millis();
// Переключим состояние таймера вкл/выкл
pomodoroState = !pomodoroState;
// Выключим все светодиоды
for (int i = 0; i < LED_COUNT; ++i) {
digitalWrite(leds[i], LOW);
}
}
// Если таймер включён
if (pomodoroState) {
// Рассчитаем прошедшее время
unsigned long elapsedTime = millis() - lastTime;
// Если прошедшее время меньше времени срабатывания таймера
if (elapsedTime < pomodoroTimeInMillis) {
// Рассчитаем, какой из светодиодов должен гореть
unsigned long currentLed = elapsedTime / ledSwitchTime;
// И зажжём этот светодиод
digitalWrite(leds[currentLed], HIGH);
// Если прошедшее время таймера больше времени срабатывания — звеним
} else {
finish();
}
}
}
// Функция для проверки клика кнопки
bool checkClick() {
// Переменная для хранения предыдущего состояния кнопки
static bool buttonWasUp = true;
bool result = false;
// Читаем текущее состояние кнопки
bool buttonIsUp = digitalRead(BUTTON_PIN);
// Если кнопка была не нажата, а теперь нажата
// значит был клик
if (buttonWasUp && !buttonIsUp) {
delay(100);
result = true;
}
buttonWasUp = buttonIsUp;
return result;
}
void finish() {
// Переменная для хранения переключателя светодиодов
bool toggle = true;
// Попиликаем 10 раз
for (int i = 0; i < 10; i++) {
tone(BUZZER_PIN, 500 + toggle * 500);
// Почерёдно моргаем парами светодиодов
for (int i = 0; i < LED_COUNT; ++i) {
digitalWrite(leds[i], toggle);
toggle = !toggle;
}
toggle = !toggle;
delay(100);
}
// Отключаем звук
noTone(BUZZER_PIN);
// Выключаем таймер
pomodoroState = false;
}
===== Что дальше? =====
Nyan Cat — это только начало пути в мир Arduino. Если вы хотите расширить возможность котика, обратите внимания на следующие проекты:
* [[slot-box:meteo|Метеостанция]]
* [[slot-box:co-alarm|Детектор дыма]]
* [[slot-box:timer|Кухонный таймер]]
* [[slot-box:light-show|Светомузыка]]
* [[slot-box:simon-says|Игра «Саймон говорит»]]
Выберите свой новый проект на [[slot-box:start|Arduino и Slot Shield]]. Скучно не будет!
===== Ресурсы =====
* [[amp>product/nyan?utm_source=proj&utm_campaign=nyan&utm_medium=wiki|Nyan Cat]] в магазине.
* [[slot-box:start|Расширенные возможности Nyan Cat]]