Witam! Mam problem z RTC DS1307. Wszystko chodzi okej, ale nagle bez żadnej przyczyny potrafi się zresetować. Jest on nowy. Potrafi chodzić dobrze przez tydzień i nagle reset i cały program leży bo nie ma odpowiedniego czasu.
#include <LiquidCrystal.h>
#include <EEPROM.h>
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
LiquidCrystal lcd(2, 3, 4 ,5 ,6 ,7);
unsigned long start=60000;
float h, hw, hz;
int res=0;
int dni;
int m; //miesiąc dany
int et; //test EEPROM
int ed; //komórka zapisu w EEPROM
float tyg_1, tyg_2, tyg_3, tyg_4, tyg_5, r; //tygodnie, tygodnie razem
int sm; //stary mieśiąc
float dp; // bez użyteczny float
void setup() {
pinMode(8,INPUT_PULLUP);
pinMode(9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
while (!Serial) ; // wait for serial
delay(200);
Serial.println("DS1307RTC Read Test");
Serial.println("-------------------");
}
void loop() {
tmElements_t tm;
if (RTC.read(tm))
{
m=tm.Month;
dni=tm.Day;
}
ed=0;
if(millis()>=start)
{
start=start+60000;
h= h+0.017;
lcd.clear();
lcd.print(h);
}
if(digitalRead(9)==LOW)
{
delay(20);
if(digitalRead(9)==LOW)
{
delay(300);
tyg_1=0.00;
tyg_2=0.00;
tyg_3=0.00;
tyg_4=0.00;
tyg_5=0.00;
ed=2;
for(int i=1; i<=7; i++)
{
tyg_1=tyg_1+EEPROM.get(ed,dp);
ed=ed+4;
}
ed=30;
for(int i=1; i<=7; i++)
{
tyg_2=tyg_2+EEPROM.get(ed,dp);
ed=ed+4;
}
ed=58;
for(int i=1; i<=7; i++)
{
tyg_3=tyg_3+EEPROM.get(ed,dp);
ed=ed+4;
}
ed=86;
for(int i=1; i<=7; i++)
{
tyg_4=tyg_4+EEPROM.get(ed,dp);
ed=ed+4;
}
switch(sm)
{
case 28:
{
break;
}
case 29:
{
ed=114;
EEPROM.get(ed,tyg_5);
break;
}
case 30:
{
ed=114;
for(int i=1; i<=2; i++)
{
tyg_5=tyg_5+EEPROM.get(ed,dp);
ed=ed+4;
}
break;
}
case 31:
{
ed=114;
for(int i=1; i<=3; i++)
{
tyg_5=tyg_5+EEPROM.get(ed,dp);
ed=ed+4;
}
break;
}
}
r=tyg_1+tyg_2+tyg_3+tyg_4+tyg_5;
lcd.clear();
lcd.print("W tym mies grano:");
lcd.setCursor(0,1);
lcd.print(r);
while(digitalRead(9)== HIGH) delay(20);
delay(300);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("W 1 tyg grano:");
lcd.setCursor(0,1);
lcd.print(tyg_1);
while(digitalRead(9)== HIGH) delay(20);
delay(300);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("W 2 tyg grano:");
lcd.setCursor(0,1);
lcd.print(tyg_2);
while(digitalRead(9)== HIGH) delay(20);
delay(300);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("W 3 tyg grano:");
lcd.setCursor(0,1);
lcd.print(tyg_3);
while(digitalRead(9)== HIGH) delay(20);
delay(300);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("W 4 tyg grano:");
lcd.setCursor(0,1);
lcd.print(tyg_4);
while(digitalRead(9)== HIGH) delay(20);
delay(300);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("W 5 tyg grano:");
lcd.setCursor(0,1);
lcd.print(tyg_5);
while(digitalRead(9)== HIGH) delay(20);
delay(300);
lcd.clear();
}
}
if(digitalRead(10)==LOW)
{
delay(20);
if(digitalRead(10)==LOW)
{
lcd.clear();
lcd.print("Zresetowac?:");
lcd.setCursor(0,1);
lcd.print("<- Nie | Tak ->");
delay(300);
while(digitalRead(10)==HIGH)
{
delay(20);
if(digitalRead(8)==LOW)
{
delay(20);
if(digitalRead(8)==LOW)
{
lcd.clear();
for(int i=2; i<=125; i++)
{
EEPROM.put(i,0.00);
}
lcd.setCursor(0,0);
lcd.print("Zresetowano!");
delay(1500);
lcd.clear();
break;
}
}
}
delay(300);
lcd.clear();
start=millis()+60000;
h=0;
}
}
if(digitalRead(8)==LOW)
{
delay(20);
if(digitalRead(8)==LOW)
{
for(;;)
{
EEPROM.get(0,et);
if(et==m)
{
lcd.clear();
ed=0;
ed=4*dni-2;
Serial.println(dni);
Serial.println(m);
Serial.println(ed);
EEPROM.get(ed,hw);
hz=hw+h;
EEPROM.put(ed,hz);
lcd.clear();
start=millis()+60000;
h=0.00;
lcd.print("zapisano");
delay(1000);
lcd.clear();
break; //po udanym zapisie
}
else //nowy miesiąc
{
lcd.clear();
lcd.print("Niezgodnosc mies.");
delay(1000);
lcd.clear();
lcd.print("Tworze nowy mies.");
EEPROM.get(0, sm);
EEPROM.put(0,m);
sm = dniwm(sm);
tyg_1=0.00;
tyg_2=0.00;
tyg_3=0.00;
tyg_4=0.00;
tyg_5=0.00;
ed=2;
for(int i=1; i<=7; i++)
{
tyg_1=tyg_1+EEPROM.get(ed,dp);
ed=ed+4;
}
ed=30;
for(int i=1; i<=7; i++)
{
tyg_2=tyg_2+EEPROM.get(ed,dp);
ed=ed+4;
}
ed=58;
for(int i=1; i<=7; i++)
{
tyg_3=tyg_3+EEPROM.get(ed,dp);
ed=ed+4;
}
ed=86;
for(int i=1; i<=7; i++)
{
tyg_4=tyg_4+EEPROM.get(ed,dp);
ed=ed+4;
}
switch(sm)
{
case 28:
{
break;
}
case 29:
{
ed=114;
EEPROM.get(ed,tyg_5);
break;
}
case 30:
{
ed=114;
for(int i=1; i<=2; i++)
{
tyg_5=tyg_5+EEPROM.get(ed,dp);
ed=ed+4;
}
break;
}
case 31:
{
ed=114;
for(int i=1; i<=3; i++)
{
tyg_5=tyg_5+EEPROM.get(ed,dp);
ed=ed+4;
}
break;
}
}
r=tyg_1+tyg_2+tyg_3+tyg_4+tyg_5;
lcd.clear();
lcd.print("W tym mies grano:");
lcd.setCursor(0,1);
lcd.print(r);
while(digitalRead(9)== HIGH) delay(20);
delay(300);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("W 1 tyg grano:");
lcd.setCursor(0,1);
lcd.print(tyg_1);
while(digitalRead(9)== HIGH) delay(20);
delay(300);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("W 2 tyg grano:");
lcd.setCursor(0,1);
lcd.print(tyg_2);
while(digitalRead(9)== HIGH) delay(20);
delay(300);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("W 3 tyg grano:");
lcd.setCursor(0,1);
lcd.print(tyg_3);
while(digitalRead(9)== HIGH) delay(20);
delay(300);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("W 4 tyg grano:");
lcd.setCursor(0,1);
lcd.print(tyg_4);
while(digitalRead(9)== HIGH) delay(20);
delay(300);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("W 5 tyg grano:");
lcd.setCursor(0,1);
lcd.print(tyg_5);
while(digitalRead(9)== HIGH) delay(20);
delay(300);
}
}
}
}
}
int dniwm(int mi)
{
tmElements_t tm;
int d, y;//dni w miesiącu, rok
switch(mi)
{
case 1:
{
//Styczeń
d = 31;
break;
}
case 2:
{
//luty
y=tmYearToCalendar(tm.Year);
if((y%4==0 && y%100!=0) || y%400==0)
d=29;
else
d=28;
break;
}
case 3:
{
//Marzec
d = 31;
break;
}
case 4:
{
//Kwiecień
d = 30;
break;
}
case 5:
{
//Maj
d = 31;
break;
}
case 6:
{
//Czerwiec
d = 30;
break;
}
case 7:
{
//Lipec
d = 31;
break;
}
case 8:
{
//Sierpień
d = 31;
break;
}
case 9:
{
//Wrzesień
d = 31;
break;
}
case 10:
{
//Październik
d = 31;
break;
}
case 11:
{
//Listopad
d = 30;
break;
}
case 12:
{
//Grudzień
d = 31;
break;
}
}
return d;
}
Wiem wiem jest w tym kodzie kilka rzeczy nie potrzebnych, ale on jest jeszcze nie skończony. Jednak działa poprawnie oprócz tego resetowania.