#define SPEAKER 7 // Определяем выход сигнала на пищалку
#define redPin 9 // ШИМ выход на красный светодиод
#define greenPin 10 // ШИМ выход на зеленый
#define bluePin 6 // ШИМ выход на синий
// Частоты нот для мелодии ("ПОДМОСКОВНЫЕ ВЕЧЕРА")
#define Lya_little 220
#define Do 262
#define Mi 330
#define Re 294
#define Si_little 247
#define Sol 392
#define Fa 349
#define Fa_diez 370
#define Sol_diez 415
#define Si 494
#define Lya 440
// Массив нот для мелодии. Для удобства представления разбиваем на такты в столбик.
// Всего нот 38 (от 0 до 37). С 18 до 37 должен быть повтор.
int frequency_note[] = {
Lya_little, Do, Mi, Do, //1 первый такт, little - слева от первой октавы. 0,1,2,3
Re, Do, Si_little, //2 4,5,6
Mi, Re, //3 7,8
Lya_little, //4 9
Do, Mi, Sol, Sol, //5 10,11,12,13
Lya, Sol, Fa, //6 14,15,16
Mi, //7 17
Fa_diez, Sol_diez, //8 с 18 ноты начинается припев. 18,19
Si, Lya, Mi, //9
Mi, Do, Lya_little, //10
Mi, Re, Fa, //11
Fa, Sol, Fa, //12
Mi, Re, Do, //13
Mi, Re, //14
Lya_little //15 последний такт
};
int takt_Melody = 1500; // Длительность такта в мс при спокойной игре (можно менять!). Это число принимается за целое.
// Массив длительностей звучания нот для мелодии 1 в мс
int times_Melody[] = {
takt_Melody / 4, takt_Melody / 4, takt_Melody / 4, takt_Melody / 4, //1 первый такт
takt_Melody / 2, takt_Melody / 4, takt_Melody / 4, //2
takt_Melody / 2, takt_Melody / 2, //3
takt_Melody, //4
takt_Melody / 4, takt_Melody / 4, takt_Melody / 4, takt_Melody / 4, //5
takt_Melody / 2, takt_Melody / 4, takt_Melody / 4, //6
takt_Melody, //7
takt_Melody / 2, takt_Melody / 2, //8
takt_Melody / 4, takt_Melody / 4, takt_Melody, //9 !! Увеличенная длительность
0, takt_Melody / 4, takt_Melody / 4, //10 !! Нулевая длительность, чтобы не было разрыва между нотами
takt_Melody / 4, takt_Melody / 4, takt_Melody, //11 !! Увеличенная длительность
0, takt_Melody / 4, takt_Melody / 4, //12 !! Нулевая длительность
takt_Melody / 2, takt_Melody / 4, takt_Melody / 4, //13
takt_Melody / 2, takt_Melody / 2, //14
takt_Melody //15 последний такт
};
void setup() {
pinMode(redPin, OUTPUT); // Определяем, как выход
pinMode(greenPin, OUTPUT); // Определяем, как выход
pinMode(bluePin, OUTPUT); // Определяем, как выход
}
void loop() {
Podmoskovnye_Vechera();
}
void Podmoskovnye_Vechera() {
static uint32_t timer = 0;
static byte i = 0; // счётчик нот в массиве frequency_note[]
static byte counter = 0; // счётчик нот в припеве
switch (i) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
tone(SPEAKER, frequency_note[i], times_Melody[i]); // Звучит i-тая нота
if (millis() - timer >= times_Melody[i]) {
timer = millis();
i++;
RGB(times_Melody[i]);
}
break;
case 18:
tone(SPEAKER, frequency_note[i], times_Melody[i]);
if (millis() - timer >= times_Melody[i]) {
timer = millis();
i++;
counter++; // В припеве 20 нот (с 18 по 37). Инкремент счётчика нот в припеве
RGB(times_Melody[i]);
}
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
tone(SPEAKER, frequency_note[i], times_Melody[i]);
if (millis() - timer >= times_Melody[i]) {
timer = millis();
i++;
counter++;
RGB(times_Melody[i]);
}
break;
case 37:
tone(SPEAKER, frequency_note[i], times_Melody[i]);
timer = millis();
i++;
counter++;
RGB(times_Melody[i]);
break;
case 38:
if (millis() - timer >= 2 * takt_Melody) { // Пауза
timer = millis();
i = (counter >= 40) ? 0 : 18; // Повтор с 18 до 37 ноты (припев) или с 0 ноты
if (counter >= 40) counter = 0; // Чтобы counter не увеличивался постоянно
}
break;
}
}
void RGB(int frequency_note) { // Функция интенсивности свечения каждого цвета RGB
int redIntensity;
int greenIntensity;
int blueIntensity;
frequency_note = map(frequency_note, 220, 494, 0, 767);
// Определяем, в какую из 3-х зон попадает сигнал frequency_note из мах. 767 вариантов цвета.
if (frequency_note <= 255) // зона 1
{
redIntensity = 255 - frequency_note; // красный меняется из включенного на выключенный
greenIntensity = frequency_note; // зеленый меняется из выключенного на включенный
blueIntensity = 0; // голубой всегда выключен
} else if (frequency_note <= 511) // зона 2
{
redIntensity = 0; // красный всегда выключен
greenIntensity = 255 - (frequency_note - 256); // зеленый от включенного к выключенному
blueIntensity = (frequency_note - 256); // голубой от выключенного к включенному
} else if (frequency_note >= 512) // зона 3
{
redIntensity = (frequency_note - 512); // красный выкл. к вкл.
greenIntensity = 0; // зеленый всегда выкл.
blueIntensity = 255 - (frequency_note - 512); // голубой от вкл. к выкл.
}
redIntensity = map(redIntensity, 0, 767, 0, 255); // Приводим интенсивность свечения в соответствие с ШИМ управлением (0...255)
greenIntensity = map(greenIntensity, 0, 767, 0, 255);
blueIntensity = map(blueIntensity, 0, 767, 0, 255);
analogWrite(redPin, redIntensity); // Зажигаем светодиод с нужным ШИМ-сигналом, который пропорционален аналоговому сигналу
analogWrite(greenPin, greenIntensity);
analogWrite(bluePin, blueIntensity);
}