Звук перестает воспроизводиться после подключения rtc
Я пытаюсь воспроизвести песню с помощью Arduino и в то же время отображать время с помощью платы rtc с использованием библиотеки tmrpcm. Однако, если плата rtc подключена, звук не воспроизводится.
Я понимаю, что tmrpcm может мешать работе библиотеки wire.h, но даже комментирование не решает проблему.
Я использую следующий код:
// Функции даты и времени с использованием RTC DS1307, подключенного через I2C и Wire lib
#include <RTClib.h>
#include<Wire.h>
#include <Arduino.h>
#include "SevenSegmentTM1637.h"
#include "SevenSegmentExtended.h"
#include "SevenSegmentFun.h"
#include "SD.h"
#define SD_ChipSelectPin 4
#include "TMRpcm.h"
#include "SPI.h"
TMRpcm tmrpcm;
const int ProxSensor=3;
int inputVal = 0;
#define CLK 8
#define DIO 7
// Количество времени (в миллисекундах) между тестами
#define TEST_DELAY 2000
SevenSegmentFun display(CLK, DIO);
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
void setup () {
Serial.begin(9600);
if(!SD.begin(SD_ChipSelectPin))
{
Serial.println("SD fail");
return;
}
while (!Serial); // для Леонардо/Микро/Зеро
tmrpcm.speakerPin=9;
Serial.begin(57600);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
while (1);
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
// следующая строка устанавливает RTC на дату & время составления этого скетча
rtc.adjust(DateTime(2019, 10, 19, 01,41,00));
// Эта строка устанавливает RTC с явной датой & время, например, установить
// 21 января 2014 года в 3 часа ночи вы бы позвонили:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
pinMode(ProxSensor,INPUT); //Пин 2 подключен к выходу датчика приближения
display.begin();
}
void loop(){
DateTime now = rtc.now();
display.print((now.unixtime() / 86400L )-17963);
Serial.print((now.unixtime() / 86400L )-17963);
while(digitalRead(ProxSensor)==LOW) //Проверяем вывод датчика
{
tmrpcm.setVolume(5);
tmrpcm.play("test.wav");
repeat:
if(digitalRead(ProxSensor==LOW))
goto repeat;
}
}
Кто-нибудь может мне помочь?
@Soumendra Dey, 👍0
2 ответа
Лучший ответ:
TMRpcm и одна из других ваших библиотек могут использовать один и тот же таймер в Uno, что приведет к поломке одной из них. Либо приобретите Arduino Mega, которая может запускать TMRpcm на TIMER3,4 или 5, либо используйте библиотеки, не требующие таймера.
Проблема в том,
repeat:
if(digitalRead(ProxSensor==LOW))
goto repeat;
ProxSensor==LOW
имеет значение false, поэтому 0. вы считываете вывод 0, и результат является случайным. Окружающая проводка может повлиять на это. Если digitalRead(0) равен нулю, wav сразу же начинает воспроизводиться. По крайней мере, используйте
while (digitalRead(ProxSensor) == LOW);
Я уже использую while (digitalRead(ProxSensor) == LOW) в своем коде, @Soumendra Dey
@SoumendraDey, прочитай ответ еще раз и медленно, @Juraj
- `.readFileCounts()` не работает в мини-модуле DFPlayer
- DFPlayer, воспроизведение звука при высоком значении pin
- Проблема с SD-картой Arduino RTC
- SD-карта не инициализируется
- Транзисторный усилитель для управления динамиком с использованием ШИМ Arduino
- Какие контакты можно использовать для выбора микросхемы (CS, CC) на Arduino Nano Every?
- Не удалось выделить SSD1306 при добавлении константы
- RTC и SD работают отдельно, а не вместе
Каким образом библиотека Wire использует таймер?, @Majenko
@Majenko, вероятно, для синхронизации импульсов SCK., @Coder_fox
Я не могу найти никаких ссылок на то, для чего он используется и используется ли вообще, но кажется, что использование TWBR ломает многие вещи, связанные с первым таймером., @Coder_fox
Можете ли вы привести какие-либо доказательства этого? Это новое для меня - и периферийное устройство TWI не имеет ничего общего с периферийными устройствами таймера - генератор скорости передачи является внутренним для TWI и использует системные часы в качестве источника., @Majenko
@SoumendraDey, объясните, пожалуйста, как этот ответ помог, потому что он не должен, @Juraj