#1 2022-06-08 20:43:17

XoXol2
Учасник
Зареєстрований: 2022-06-08
Повідомлень: 3

Проблемы с датчиком времени и SD картой

Добрый вечер всем!
Использую ардуино для записи данных с датчика тока и датчика напряжения. Так же мосфет для переключения нагрузки. Пока всё моделировал, ардуина работала норм. Как только поставил на ежедневную работу, то начались проблемы. Не могу понять в чём. Уже всё перепробовал. И подключал SD карту и Модуль часов к отдельному источнику, и напрямую к ардуине. Но проблема не уходит. Возможно в коде что-то не так. Проблема в том что иногда СД карта отказывается записывать файлы, а модуль времени показывает полную охинею. Ну и иногда монитор просто зависает и нечего не печатает.
Возможно причина в том что динамическая память забита на 59%? Или проблема в соединениях? Или может сильно много всего нацеплял на ардуину?


/*
  //----------------------------------------------------------------------
  // пин подключения контакта OUT
  #define PIN_OUT A1
  // подключение библиотеки
  #include <TroykaCurrent.h>
  // создание объекта
  ACS712 dataI(PIN_OUT);
  //----------------------------------------------------------------------
*/
//подключение часов
#include <TimeLib.h>
#include <Wire.h>
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t
//----------------------------------------------------------------------
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <SD.h>
//----------------------------------------------------------------------
// масивы даты и время
char stime[8];
char stime1[6];
char sdate[10];
char sdate1[8];
tmElements_t tm;
//----------------------------------------------------------------------
File myFile;
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display

//byte Program = 0;

int mVperAmp = 100;
int RawValue = 0;
int ACSoffset = 2500;
double Voltage = 0;


int analogInput = A0;
float vout = 0.0;
float vin = 0.0;
float R1 = 30000.0;
float R2 = 7500.0;
int value = 0;
float I = 0.00;
float IAM = 0.00;
float Wat = 0.00;





void setup() {
  Serial.begin(9600);
  while (!Serial);
  Serial.print(F("Initializing SD card..."));
  if (!SD.begin(4)) {
    Serial.println(F("initialization failed!"));
    while (1);
    }
  Serial.println(F("initialization done."));



  //----------------------------------------------------------------------
  // инициализация мосфета.
  pinMode(A2, OUTPUT);
  //----------------------------------------------------------------------
  pinMode(analogInput, INPUT);
  pinMode(2, INPUT_PULLUP);
}

void loop() {
  lcd.init();
  lcd.backlight();

  //----------------------------------------------------------------------
  //часы
  if (RTC.read(tm)) {

    Serial.print(F("Датчик времени работает "));

  } else {
    if (RTC.chipPresent()) {

      Serial.println(F("The DS1307 is stopped.  Please run the SetTime"));
      Serial.println();

    } else {

      Serial.println(F("DS1307 read error!  Please check the circuitry."));
      Serial.println();

    }
  }

  lcd.setCursor(0, 0);
  lcd.print(gettimeHM());
  lcd.print(" ");
  Serial.print(F("Time: "));
  Serial.print(gettimeHM());
  Serial.print(F(", Date (D/M/Y) = "));
  lcd.print(getdateDMY());
  Serial.println(getdateDMY());


  /*
    I = dataI.readCurrentDC() + 0.05;
    if (I<0) {
      I=0.00;
    }
  */
  lcd.setCursor(0, 1);
  lcd.print(F("V=")); lcd.print(VoltDC()); lcd.print(F("B|I=")); lcd.print(AmpsDC ()); lcd.print(F("A"));
  //----------------------------------------------------------------------

  /*  String filename1 = getdateDMYfile() + ".txt";
      Serial.print (F("rnИмя файла ---"));
      char filename[filename1.length() + 1];
      filename1.toCharArray(filename, sizeof(filename));
  */
  
  Serial.print (F("Имя файла - "));
  Serial.println (GetFileName (getdateDMYfile()));

/*
  String Warmeter1 = gettimeHMS() + "_" + String (VoltDC()) + "_" + String (AmpsDC());
  char Warmeter [Warmeter1.length() + 1];
  Warmeter1.toCharArray(Warmeter, sizeof(Warmeter));
  Serial.print (F("Массив -Ват метр- "));
  Serial.println (Warmeter);
*/  Serial.print (F("Функция -Ват метр- "));
  Serial.println (GetValueDC(gettimeHMS(),VoltDC(),AmpsDC()));


  myFile = SD.open(GetFileName (getdateDMYfile()), FILE_WRITE);

  if (myFile) {
    Serial.print(F("rnCreate log file... rn"));
    myFile.print(F("rn"));
    myFile.print(GetValueDC(gettimeHMS(),VoltDC(),AmpsDC()));
    myFile.close ();
    Serial.println(F("done create."));
  } else {
    Serial.println(F("error create."));
  }



  if (IAM < AmpsDC ()) {
    IAM = AmpsDC ();
  }

  //Wat = AmpsDC () * VoltDC();



  //Включение мосфета
  //Mosfet();
  //----------------------------------------------------------------------


  // Смена дисплеев по нажатию кнопки
  /*  if (!digitalRead(2)) {

        Program += 1;
        delay (1000);

    }
  */
   
 delay (1000);
}


String gettimeHMS()
{

  sprintf(stime, "%02d:%02d:%02d", tm.Hour, tm.Minute, tm.Second);
  return String(stime);

}

String gettimeHM()
{

  sprintf(stime1, "%02d:%02d", tm.Hour, tm.Minute);
  return String(stime1);
}

String getdateDMY()
{
  sprintf(sdate, "%02d/%02d/%04d", tm.Day, tm.Month, tmYearToCalendar(tm.Year));
  return String(sdate);
}

String getdateDMYfile()
{
  sprintf(sdate1, "%02d%02d%04d", tm.Day, tm.Month, tmYearToCalendar(tm.Year));
  return String(sdate1);
}

String GetFileName (String name)
{
  String filename1 = name + ".txt";
  char filename[filename1.length() + 1];
  filename1.toCharArray(filename, sizeof(filename));
  return String (filename);
}

  String GetValueDC (String TimeHMS, float VDC, float IDC)
  {
  String WarmeterString = TimeHMS + "_" + String (VDC) + "_" + String (IDC);
  char WarmeterDC [WarmeterString.length() + 1];
  WarmeterString.toCharArray(WarmeterDC, sizeof(WarmeterDC));
  return String (WarmeterDC);
  }

float VoltDC()
{
  // read the value at analog input
  value = analogRead(analogInput);
  vout = (value * 5.0) / 1024.0;
  vin = (vout / (R2 / (R1 + R2)));
  return vin;
}

float AmpsDC ()
{
  RawValue = analogRead (A1);
  Voltage = (RawValue / 1024.0) * 5000;
  I = ((Voltage - ACSoffset) / mVperAmp);
  if (I < 0) {
    I = 0;
  }
  return I;
}

/*
//Переключение Мосфета
void Mosfet() {
  if (vin >= 14.35)
  { {
      digitalWrite(A2, HIGH);
    }
  }
  if (vin < 12.45)
  { {
      digitalWrite(A2, LOW);
    }
  }
}
*/

Остання редакція XoXol2 (2022-06-08 20:51:56)

Неактивний

#2 2022-06-08 21:00:55

г0сть
Гість

Re: Проблемы с датчиком времени и SD картой

Какая нагрузка?

#3 2022-06-08 21:08:43

XoXol2
Учасник
Зареєстрований: 2022-06-08
Повідомлень: 3

Re: Проблемы с датчиком времени и SD картой

г0сть пише:

Какая нагрузка?

Нагрузка на какую мосфет переключается?

Проблема точно не в нём. Он пока отключен и в скетче закоментирован.
А вообще он переключает с заряда акума на тєн, когда солненчные панели зарядили акум.

Неактивний

#4 2022-06-08 21:35:15

г0сть
Гість

Re: Проблемы с датчиком времени и SD картой

В таком случае я бы начал с проверки качества соединений (особенно если все собрано на макетке) и питания. По описанным симптомам глючат не модули, а виснет ардуина.

#5 2022-06-26 18:06:26

XoXol2
Учасник
Зареєстрований: 2022-06-08
Повідомлень: 3

Re: Проблемы с датчиком времени и SD картой

Причина оказалась в самой библиотеке <DS1307RTC.h>.
Когда всё подключил через библиотеку <iarduino_RTC.h> проблем уже не было.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму