RTC и SD работают отдельно, а не вместе

Я работаю над небольшим проектом. Я хочу использовать Arduino Mega 2560 v3, PIR-датчик, модуль карты micro SD, модуль RTC 1307, несколько светодиодов, кнопок и зуммер. Для включения и выключения обнаружения движения, а при обнаружении обнаружения время сохраняется на SD-карте.

Я все соединил, закодировал и начал тестировать. Во время тестов Arduino при загрузке снова и снова перезапускался. Сначала я подумал, что проблема в макетной плате и подключении. Я проверил ее несколько раз и не заметил ничего неправильного. Поэтому я снова и снова проверял код. Все еще ничего.

Итак, я начал тестировать модули. И обнаружил проблему. Когда я не использую в скетче ни RTC, ни SD-карту (физически они все еще подключены, потому что мне лень), все работает нормально. Arduino не перезагружается. Я не использовал SD-модуль для записи данных , вместо этого я использовал последовательный порт для отображения данных. Все работает отлично: я могу видеть, в какое время обнаружено движение, и Arduino выводит это на терминал.

Во втором сценарии я не использовал RTC, только модуль SD. На этот раз все снова работает отлично. На SD-карте я смог прочитать, сколько раз было обнаружено движение. Это странно, потому что когда я смешиваю все вместе, это не работает.

Вот мой код:

// **************************************************
// ВКЛЮЧАТЬ
// **********************************************
#include <Wire.h>                    
#include <SD.h>
#include <SPI.h>
#include "RTClib.h"
// **********************************************
// ОПРЕДЕЛЯТЬ
// **********************************************
#define GREENLED 39
#define BTNON 11 
#define REDLED 41
#define BTNOFF 9 
#define BUZZ 3 
#define PIR_PIN 10 
//SD (на мега)
#define SD_CLK_SD 52
#define SD_MI 50
#define SD_MO 51
#define SD_CS 4

//РТК
#define RTC_SDA 20
#define RTC_SCL 21
#define RTC_DS 2

// **********************************************
// ПЕРЕМЕННЫЕ
// **********************************************
RTC_DS1307 rtc;
File myFile;
char godz[8];
char data[5];

int btnON;
int btnOFF;
int pirD;
bool stan_alarmu;

void wlAlarmu() {
  digitalWrite(REDLED,LOW);
  digitalWrite(GREENLED, HIGH);
  stan_alarmu=true;
  gettime();
  myFile = SD.open("dane.txt", FILE_WRITE);
  if (myFile) {
    myFile.print("### Wlaczenie alarmu ### ");
    myFile.print(" ");
    myFile.print(godz);
    myFile.print(data);
    myFile.println("");
    myFile.close();
  }
}

void wylAlarmu(){
  digitalWrite(GREENLED, LOW);
  digitalWrite(REDLED,HIGH);
  stan_alarmu=false;
  gettime();
  myFile = SD.open("dane.txt", FILE_WRITE);
  if (myFile) {
    myFile.print("### Wylaczenie alarmu ### ");
    myFile.print(" ");
    myFile.print(godz);
    myFile.print(data);
    myFile.println("");
    myFile.close();
  }
}

void alarm(){
  digitalWrite(GREENLED,LOW);
  digitalWrite(REDLED,HIGH);
  digitalWrite(BUZZ,HIGH);
  delay(500);
  digitalWrite(BUZZ,LOW);

  gettime();
  myFile = SD.open("dane.txt", FILE_WRITE);
  if (myFile) {
    myFile.print("Alarm: ");
    myFile.print(" ");
    myFile.print(godz);
    myFile.print(data);
    myFile.println("");
    myFile.close();
  }
  delay(5000);
  digitalWrite(REDLED,LOW);
  digitalWrite(GREENLED,HIGH);
}

void blad() {
  while(1){
    digitalWrite(REDLED,HIGH);
    delay(500);
    digitalWrite(REDLED,LOW);
    delay(500);
  }
}

void gettime() {
  DateTime now = rtc.now();
  sprintf(godz,"%02d:%02d:%02d ",now.hour(),now.minute(),now.second());
  sprintf(data,"%d.%d",now.day(),now.month());
}

// **********************************************
// НАСТРАИВАТЬ
// **********************************************
void setup() {
  //РТК
  Wire.begin();
  // Контакты I2C на плате Shield подключаются к альтернативной шине I2C на Arduino Due
  rtc.begin();
  if (!rtc.isrunning()) {
    blad();
    // следующая строка устанавливает RTC на дату и время компиляции этого скетча
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // Эта строка устанавливает RTC с явной датой и временем, например, чтобы установить
    // 21 января 2014 года в 3 часа ночи вы позвоните:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
  pinMode(BTNON,INPUT);
  pinMode(GREENLED, OUTPUT);
  pinMode(BTNOFF,INPUT);
  pinMode(REDLED, OUTPUT);
  pinMode(PIR_PIN,INPUT);
  pinMode(BUZZ,OUTPUT);

  //тестовая последовательность
  digitalWrite(GREENLED,HIGH);
  digitalWrite(REDLED,HIGH);
  digitalWrite(BUZZ,HIGH);
  delay(100);
  digitalWrite(BUZZ,LOW);
  digitalWrite(GREENLED,LOW);
  digitalWrite(REDLED,LOW);
  delay(500);  
  pinMode(SD_CS, OUTPUT);
  if (!SD.begin(SD_CS)) {
    blad();
  }
  digitalWrite(GREENLED,HIGH);
  delay(1000);
  digitalWrite(GREENLED,LOW);
  gettime();
  Serial.begin(9600);

  myFile = SD.open("dane.txt", FILE_WRITE);
  if (myFile) {
    myFile.print("####START SYSTEMU: ");
    myFile.print(godz);
    myFile.print(data);
    myFile.print(" ####");
    myFile.println("");
    myFile.close();
  }
  wylAlarmu();
}

void loop() {  
  btnON = digitalRead(BTNON);
  btnOFF = digitalRead(BTNOFF); 
  pirD = digitalRead(PIR_PIN);

  if(btnON == HIGH) {
    wlAlarmu();
    delay(2000);
  }
  if(btnOFF == HIGH) {
    wylAlarmu();
    delay(2000);
  }

  if(pirD==HIGH && stan_alarmu==true) {
    alarm();
  }
  delay(1000);
}

, 👍2

Обсуждение

Пожалуйста, дайте точную спецификацию используемых вами щитов. Возможно, есть какие-то скрытые подсказки., @Ariser

Мой модуль RTC выглядит примерно так: http://www.arduino-projekte.de/index.php?n=45 спецификация находится внизу страницы под DS1307 Datenblatt PDF (ENG). Считыватель SD microSD производится Catalex http://catalex.taobao.com/, но я не смог найти документацию на их сайте :), @GarryMoveOut

Похоже, вы используете RTC-библиотеку от adafruit. То же самое и с библиотекой SD? Я предполагаю, что конфигурации I²C-Bus для обоих модулей конфликтуют. Скорее всего, это касается битрейта. Вам следует заглянуть внутрь обеих библиотек и проверить, какие параметры они применяют к Wire-Library., @Ariser

Я не нашел ничего в библиотеках. Я также нашел, что кто-то использует библиотеку rtc и sd, как и я, и это работает. http://www.michellechandra.com/physical-computing/activity-tracker-log-date-and-time-to-microsd-using-real-time-clock-and-arduino/, @GarryMoveOut

Я пробовал использовать 3 разные библиотеки. Все равно ничего удивительного., @GarryMoveOut

Хм, если у вас есть осциллограф, вам следует проверить стабильность всех напряжений в вашей системе. Повторные перезагрузки указывают на провалы напряжения., @Ariser

У меня нет осциллографа. Только мультиметр. Напряжение в пределах 4,86 - 4,90., @GarryMoveOut

Вы пробовали использовать аппаратный пин для SPI SS (это 53, я предположил, что вы используете Arduino Mega, глядя на директивы вашего препроцессора). Иногда происходят странные вещи, когда вы переназначаете этот пин., @Vassilis

После долгого времени я построил новую схему и новый скетч. Я использовал только rtc и sd, на этот раз все работало нормально. Сейчас проблем нет. Раньше что-то было не так., @GarryMoveOut