Звук перестает воспроизводиться после подключения 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;
  }
}

Кто-нибудь может мне помочь?

, 👍0


2 ответа


Лучший ответ:

0

TMRpcm и одна из других ваших библиотек могут использовать один и тот же таймер в Uno, что приведет к поломке одной из них. Либо приобретите Arduino Mega, которая может запускать TMRpcm на TIMER3,4 или 5, либо используйте библиотеки, не требующие таймера.

,

Каким образом библиотека Wire использует таймер?, @Majenko

@Majenko, вероятно, для синхронизации импульсов SCK., @Coder_fox

Я не могу найти никаких ссылок на то, для чего он используется и используется ли вообще, но кажется, что использование TWBR ломает многие вещи, связанные с первым таймером., @Coder_fox

Можете ли вы привести какие-либо доказательства этого? Это новое для меня - и периферийное устройство TWI не имеет ничего общего с периферийными устройствами таймера - генератор скорости передачи является внутренним для TWI и использует системные часы в качестве источника., @Majenko

@SoumendraDey, объясните, пожалуйста, как этот ответ помог, потому что он не должен, @Juraj


2

Проблема в том,

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