Ви не увійшли.
Причина оказалась в самой библиотеке <DS1307RTC.h>.
Когда всё подключил через библиотеку <iarduino_RTC.h> проблем уже не было.
В таком случае я бы начал с проверки качества соединений (особенно если все собрано на макетке) и питания. По описанным симптомам глючат не модули, а виснет ардуина.
Какая нагрузка?
Нагрузка на какую мосфет переключается?
Проблема точно не в нём. Он пока отключен и в скетче закоментирован.
А вообще он переключает с заряда акума на тєн, когда солненчные панели зарядили акум.
Какая нагрузка?
Добрый вечер всем!
Использую ардуино для записи данных с датчика тока и датчика напряжения. Так же мосфет для переключения нагрузки. Пока всё моделировал, ардуина работала норм. Как только поставил на ежедневную работу, то начались проблемы. Не могу понять в чём. Уже всё перепробовал. И подключал 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);
}
}
}
*/