// подключаем библиотеку для работы SPI #include // подключаем библиотеку для работы c картой microSD #include // подключаем библиотеку для воспроизведения музыки с помощью Arduino M0 #include // даём разумное имя пинам к которым подключены светодиоды #define LED1_PIN 8 #define LED2_PIN 9 // даём разумное имя пина к которому подключен силовой ключ #define MOSFET_PIN 11 // даём разумное имя для пина к которому подключен // инфракрасный датчик препятствий (infrared sensor barriers) #define ISB_PIN 12 void setup() { // начало работы с SD-картой памяти // передаём номер пина подключенного к линии CS SD-карты while (!SD.begin(4)) { // если связи нет, ждём 1 секунду // процесс повторяется в цикле // пока не появится положительный ответ от SD-карты delay(1000); } // инициализация и настройка таймера timerInit(); // настраиваем пины светодиодов в режим выхода // PORT_PA06 8 пин Arduino M0 // PORT_PA07 9 пин Arduino M0 PORT->Group[0].OUTTGL.reg = PORT_PA06; PORT->Group[0].DIRSET.reg = PORT_PA07; // гасим светодиоды PORT->Group[0].OUTCLR.reg = PORT_PA06; PORT->Group[0].OUTCLR.reg = PORT_PA07; // настраиваем пин силового ключа в режим выхода pinMode(MOSFET_PIN, OUTPUT); // подаём низкий уровень на силовой ключ digitalWrite(MOSFET_PIN, LOW); } void loop() { // если на выходе датчика логический 0 if (!digitalRead(ISB_PIN)) { // разрешаем прерывание по таймеру TC3 NVIC_EnableIRQ(TC3_IRQn); // подаём высокий уровень на силовой ключ digitalWrite(MOSFET_PIN, HIGH); // вызываем дважды функцию воспроизведения трека playMusic(); playMusic(); // запрещаем прерывание по таймеру TC3 NVIC_DisableIRQ(TC3_IRQn); // подаём низкий уровень на силовой ключ digitalWrite(MOSFET_PIN, LOW); } } void playMusic() { // начинаем работу с библиотекой AudioZero // выставляем частоту воспроизведения AudioZero.begin(2*44100); // открываем wave-файл с карточки microSD File myFile = SD.open("scream.wav"); // если файл открывается, проигрываем его if (myFile) { AudioZero.play(myFile); } // прекращаем работу с библиотекой AudioZero AudioZero.end(); } void timerInit() { // тактирование таймера TC3 GCLK->CLKCTRL.reg = GCLK_CLKCTRL_CLKEN|GCLK_CLKCTRL_GEN_GCLK0|GCM_TCC2_TC3; // 16 битный счётчик и предделитель 64 TC3->COUNT16.CTRLA.reg |= TC_CTRLA_MODE_COUNT16|TC_CTRLA_PRESCALER_DIV64; // прерывание по переполнению TC3->COUNT16.INTENSET.reg |= TC_INTENSET_OVF; // запуск счётчика TC3->COUNT16.CTRLA.reg |= TC_CTRLA_ENABLE; // настройка прерывания на таймер 3 NVIC_DisableIRQ(TC3_IRQn); NVIC_ClearPendingIRQ(TC3_IRQn); NVIC_SetPriority(TC3_IRQn, 40); NVIC_EnableIRQ(TC3_IRQn); } // обработчик прерывания void TC3_Handler(void) { // инвертируем состояние светодиодов PORT->Group[0].OUTTGL.reg = PORT_PA06; PORT->Group[0].OUTTGL.reg = PORT_PA07; // сбрасываем флаг прерывания TC3->COUNT16.INTFLAG.reg |= TC_INTFLAG_OVF; }