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);
}
@GarryMoveOut, 👍2
Обсуждение0
- Nextion Display не получает обновленных данных
- Создание файла на SD-карте
- SD-карта не инициализируется
- Печать содержимого файла SD - карты на ЖК-дисплее
- Возникла проблема с переобъявлением символа другого типа
- Записать массив на SD
- Использование Arduino wireless SD Shield для сохранения данных на SD-карту и отправки на ПК по беспроводной сети
- Файл не найден на SD-карте
Пожалуйста, дайте точную спецификацию используемых вами щитов. Возможно, есть какие-то скрытые подсказки., @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