#1 2020-02-04 03:56:22

Alex.I
Участник
Зарегистрирован: 2019-11-29
Сообщений: 8

Nano (v3) + SD + DS1307. Проблема з кроном

Всім вітання. Одразу до проблеми. Є ось такий код:

#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
#include <string.h>
#include <TimeLib.h>
#include <WeeklyAlarm.h>
#include <SD.h>

#define DS1307_I2C_ADDRESS 0x68
#define SD_ChipSelectPin 10

RTC_DS1307 RTC;
char FileName[] = "00000000.DAT";
char FolderName[] = "logs/archived/";
char file[50];
char folder[50];
char location[1];
WeeklyAlarm weeklyAlarm;
Alarm alarm1;


void setup(){
  RTC.begin();
     if (! RTC.isrunning()) {
     Serial.println(F("RTC is NOT running!"));
      return;
      }
  Serial.begin(9600);
  RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
  setTime(8, 26, 0, 3, 2, 2020);

    initial();
    getFileName();
    moveFiles();
    weeklyAlarm.prettyPrintTime(now(), Serial);
    alarm1.setCallback(callbackPlain);
    alarm1.set(AlarmType::ALL_DAYS, ON, 8, 28);
    weeklyAlarm.add(alarm1);
    alarm1.printTo(Serial);
    delay(2000);
}
void loop() {
  weeklyAlarm.handler();
  weeklyAlarm.prettyPrintTime(now(), Serial);
  delay(5000);
}

void initial (){
  File myFile;
  if(!SD.begin(SD_ChipSelectPin))
{
  Serial.println(F("Memory FAIL"));
  return;
}
  else{   
    Serial.println(F("Memory OK"));   
  }
  delay(200);
//check directories
if (!SD.exists("logs/")) {
    SD.mkdir("logs/");
  }
  if (!SD.exists("logs/archived/")) {
    SD.mkdir("logs/archived/");
  }
  if (!SD.exists("logs/start")) {
    myFile = SD.open("logs/start", FILE_WRITE);
    myFile.close();
  }
  Serial.println(F("Dirs and files OK"));
  }  
void getFileName(){
    DateTime now = RTC.now();
    FileName[0] = (now.year()/1000)%10 + '0'; //To get 1st digit from year()
    FileName[1] = (now.year()/100)%10 + '0'; //To get 2nd digit from year()
    FileName[2] = (now.year()/10)%10 + '0'; //To get 3rd digit from year()
    FileName[3] = now.year()%10 + '0'; //To get 4th digit from year()
    FileName[4] = now.month()/10 + '0'; //To get 1st digit from month()
    FileName[5] = now.month()%10 + '0'; //To get 2nd digit from month()
    FileName[6] = now.day()/10 + '0'; //To get 1st digit from day()
    FileName[7] = now.day()%10 + '0'; //To get 2nd digit from day()
    //Serial.println(filename);
}
void moveFiles(){
    File myFile;
    File myFileIn;
    File myFileOut;
    strcpy(file,FileName);
    strcpy(folder,FolderName);
    strcat(location, folder);
    strcat(location, file);
    myFileIn = SD.open("logs/start", FILE_READ);
    Serial.println(myFile.size());
        if(myFileIn.size() > 2048){
            Serial.println(F("File will be archived!!"));
            myFileOut = SD.open(location, FILE_WRITE);
              while (myFileIn.available()) {
                myFileOut.write(myFileIn.read());
              }
        myFileIn.close();
        myFileOut.close();
        Serial.println(F("File archived!!"));
        SD.remove("logs/start");
        myFileIn = SD.open("logs/start", FILE_WRITE);
        myFileIn.close();
        }
        else if(myFileIn.size() < 2048){
              Serial.println(F("Log files OK"));
              }
        }

void callbackPlain() {
      DateTime now = RTC.now();
    FileName[0] = (now.year()/1000)%10 + '0';
    FileName[1] = (now.year()/100)%10 + '0';
    FileName[2] = (now.year()/10)%10 + '0';
    FileName[3] = now.year()%10 + '0';
    FileName[4] = now.month()/10 + '0';
    FileName[5] = now.month()%10 + '0';
    FileName[6] = now.day()/10 + '0';
    FileName[7] = now.day()%10 + '0';
    File myFile;
    File myFileIn;
    File myFileOut;
    strcpy(file,FileName);
    strcpy(folder,FolderName);
    strcat(location, folder);
    strcat(location, file);
    myFileIn = SD.open("logs/start", FILE_READ);
    Serial.println(myFile.size());
        if(myFileIn.size() > 2048){
            Serial.println(F("File will be archived!!"));
            myFileOut = SD.open(location, FILE_WRITE);
              while (myFileIn.available()) {
                myFileOut.write(myFileIn.read());
              }
        myFileIn.close();
        myFileOut.close();
        Serial.println(F("File archived!!"));
        SD.remove("logs/start");
        myFileIn = SD.open("logs/start", FILE_WRITE);
        myFileIn.close();
        }
        else if(myFileIn.size() < 2048){
              Serial.println(F("Log files OK"));
              }
}

Це мій експеримент роботи "по крону". Суть проблеми
- при старті перевіряється чи наявні папки та файли, якщо ні - то вони створюються + якщо файл перевищує заданий розмір, то він копіюється до іншої папки...

...
    initial();
    getFileName();
    moveFiles();
...

перевіряв з різними розмірами файлів - працює, sd робоча.
Але, якщо я код перевірки та копіювання файлу "кидаю у крон", то система намертво підвисає, коли доходить до моменту виконная і це видно по монітору порта - результуючий напис не виводиться, а от якщо лишити просто вивід напису

Serial.println(F("Log files OK"));

чи подібне - то все проходить. Чи хтось зтикався з подібним? Пробував використовувати різни ліби - результат однаковий. Грішу на ОЗУ, т.я. після компіляції лишається, приблизно 670б

#2 2020-02-04 08:39:15

vvr
Участник
Зарегистрирован: 2015-04-12
Сообщений: 649

Re: Nano (v3) + SD + DS1307. Проблема з кроном

мне кажется вряд ли кто такие проверки вообще делает.
вам путь в доскональное ковыряние библиотек и разбор их функций....

#3 2020-02-04 09:01:32

Watchdog
Гость

Re: Nano (v3) + SD + DS1307. Проблема з кроном

Ну не тянет Нано такие ресурсоёмкие операции, а ОС Ардуино не имеет никаких проверок и защит от переполнения памяти. Расчитывать нужно почти каждый байт! smile

#4 2020-02-04 09:17:52

Alex.I
Участник
Зарегистрирован: 2019-11-29
Сообщений: 8

Re: Nano (v3) + SD + DS1307. Проблема з кроном

OK. Спробую на 2560, можливо запрацює

#5 2020-02-20 11:51:02

YK
Гость

Re: Nano (v3) + SD + DS1307. Проблема з кроном

А что за платформаю.
Скорее всего Ваш Alarm создает новый процессорный таск таймер или ISR
Самое простое уйти от этого контекста и выполнять все в Loop
Например в контексте крона взведите флаг а в loop выполните
Ну если надо дождаться выпролнения можно либо критическую секцию либо другой флаг  smile

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела