Всем привет! Купил стиральную машину БЕКО, а там нет звука. Очень непривычно, решил сделать простенькую пищалку. Идея подключится питанием к экрану стиралки, а тригеры стартап-мелодии и финишной получать с соответсвующих светодиодов (лок дверцы - загорается после выбора программы стирки и ее запуска, завершение стирки/отмена) с помощью оптронов PC817. Глянье код пожалуйста, может что упустил?
#include <Arduino.h>
// Тут записаны ноты, которые мы будем использовать
#define NOTE_D5 587
#define NOTE_A5 880
#define NOTE_FS5 740
#define NOTE_E5 659
#define NOTE_G5 784
#define NOTE_C5 523
#define NOTE_G5 784
#define REST 0
// Мелодия окончания
int tempo = 85;
int finishMelody[] = {
NOTE_D5, -4, NOTE_A5, 8, NOTE_FS5, 8, NOTE_D5, 8,
NOTE_E5, -4, NOTE_FS5, 8, NOTE_G5, 4,
NOTE_FS5, -4, NOTE_E5, 8, NOTE_FS5, 4,
NOTE_D5, -2,
NOTE_D5, -4, NOTE_A5, 8, NOTE_FS5, 8, NOTE_D5, 8,
NOTE_E5, -4, NOTE_FS5, 8, NOTE_G5, 4,
NOTE_FS5, -1,
};
// Мелодия включения
int startupTempo = 85;
int startupMelody[] = {
NOTE_C5, 6, NOTE_C5, 6, NOTE_G5, 4
};
// Настраиваем пины для устройств
int buzzer = 4; // Бузер подключен сюда
const int finishTriggerPin = 12; // Финиш-сигнал
const int startupTriggerPin = 10; // Стартап-сигнал
// Флаги и таймеры для окончания стирки
bool finishTriggered = false;
bool playedFirst = false;
bool playedSecond = false;
unsigned long firstPlayTime = 0;
unsigned long finishOffTime = 0;
// Флаги и таймеры для начала стирки
bool startupTriggered = false;
unsigned long startupOffTime = 0;
// Функция для воспроизведения финиш-мелодии
void playFinishMelody() {
int wholenote = (60000 * 4) / tempo;
int divider = 0, noteDuration = 0;
int totalNotes = sizeof(finishMelody) / sizeof(finishMelody[0]) / 2;
for (int i = 0; i < totalNotes * 2; i += 2) {
divider = finishMelody[i + 1];
if (divider > 0) {
noteDuration = wholenote / divider;
} else if (divider < 0) {
noteDuration = wholenote / abs(divider) * 1.5;
}
tone(buzzer, finishMelody[i], noteDuration * 0.9);
delay(noteDuration);
noTone(buzzer);
}
}
// Функция для воспроизведения стартап-мелодии
void playStartupMelody() {
int wholenote = (60000 * 4) / startupTempo;
int divider = 0, noteDuration = 0;
int totalNotes = sizeof(startupMelody) / sizeof(startupMelody[0]) / 2;
for (int i = 0; i < totalNotes * 2; i += 2) {
divider = startupMelody[i + 1];
if (divider > 0) {
noteDuration = wholenote / divider;
} else if (divider < 0) {
noteDuration = wholenote / abs(divider) * 1.5;
}
tone(buzzer, startupMelody[i], noteDuration * 0.9);
delay(noteDuration);
noTone(buzzer);
}
}
void setup() {
pinMode(buzzer, OUTPUT);
pinMode(finishTriggerPin, INPUT_PULLUP);
pinMode(startupTriggerPin, INPUT_PULLUP);
}
void loop() {
if (!startupTriggered && digitalRead(startupTriggerPin) == LOW) {
playStartupMelody();
startupTriggered = true;
}
if (startupTriggered) {
if (digitalRead(startupTriggerPin) == HIGH) {
if (startupOffTime == 0) {
startupOffTime = millis();
} else if (millis() - startupOffTime >= 10000) {
startupTriggered = false;
startupOffTime = 0;
}
} else {
startupOffTime = 0;
}
}
if (!finishTriggered && digitalRead(finishTriggerPin) == LOW) {
playFinishMelody();
playedFirst = true;
finishTriggered = true;
firstPlayTime = millis();
}
if (finishTriggered && playedFirst && !playedSecond && (millis() - firstPlayTime >= 60000)) {
playFinishMelody();
playedSecond = true;
}
if (finishTriggered && playedFirst && playedSecond) {
if (digitalRead(finishTriggerPin) == HIGH) {
if (finishOffTime == 0) {
finishOffTime = millis();
} else if (millis() - finishOffTime >= 10000) {
finishTriggered = false;
playedFirst = false;
playedSecond = false;
finishOffTime = 0;
}
} else {
finishOffTime = 0;
}
}
}