pobleem met DS1307, tijd soms kwijt na spannings uitval

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 91
Geregistreerd: 16 Jul 2015, 21:02

pobleem met DS1307, tijd soms kwijt na spannings uitval

Berichtdoor wim2584 » 25 Jun 2024, 21:49

Hallo, wie kan mij helpen?

ik heb deze code gemaakt voor de regeling van een aquarium, werkt goed, alleen is de ds1307 zijn tijd soms kwijt na spannings uitval?

ligt dit aan een fout in mijn gebrekkig geprogrammeerde code?

of aan een slecte ds1307 module (aliexpress), een nieuwe batterij verhelpt probleem niet


Code: Alles selecteren
/* een code voor een aquarium, lampen aan heater control, pomp aan uit , voer automaat start, en stroom meting .
tijden kunnen ingevoerd worden aan het einde van de setup.
temperatuur gemeten met dallas temperatue one wire, /


#include <TimeLib.h>
#include <TimeAlarms.h>
#include <Wire.h>
#include <DS1307RTC.h>          // real time clock
#include <DallasTemperature.h>  // temperatuur sensor
#include <OneWire.h>            // temperatuur sensor

#include <EmonLib.h>  // meten stroom in AC
EnergyMonitor emon1;  // meten stroom AC

#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

float T;
const int ledlicht = 2;
const int tllicht = 3;
const int pomp = 4;
const int voer = 5;
const int voerspanning = 9;
const int heater = 7;
const int fan = 6;
const int winter_zomer = 10;
const int enable_wijzig = 11;
const int wintertijd = 12;
float power;

unsigned long Timer = 0;


int d;   // (day
int mi;  // (month
int y;   // (year
int h;   // (hour
int m;   // (minute
int s;   // second
int h1;  // aangepaste hour  winter zomer


#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);  // set the LCD address to 0x27 for a 16 chars and 2 line display


void setup(void) {

  pinMode(winter_zomer, INPUT_PULLUP);
  pinMode(enable_wijzig, INPUT_PULLUP);
  pinMode(wintertijd, OUTPUT);
  pinMode(fan, OUTPUT);
  pinMode(voer, OUTPUT);
  pinMode(heater, OUTPUT);
  pinMode(pomp, OUTPUT);
  pinMode(tllicht, OUTPUT);
  pinMode(ledlicht, OUTPUT);
  pinMode(voerspanning, OUTPUT);


  Serial.begin(9600);


  emon1.current(0, 5.17);  // Current: input pin, calibration.


  // get and set the time from the RTC

  setSyncProvider(RTC.get);
  if (timeStatus() != timeSet)
    Serial.println("Unable to sync with the RTC");
  else
    Serial.println("RTC has set the system time");

  // set RTC 1307 voor zomer of wintertijd

  mi = (minute());
  s = (second());
  m = (month());
  d = (day());
  y = (year());


  if ((digitalRead(winter_zomer) == LOW) && (digitalRead(enable_wijzig) == LOW)) {
    h1 = (hour() - 1);
    digitalWrite(12, HIGH);  // set wintertijd flag
  } else if ((digitalRead(winter_zomer) == HIGH) && (digitalRead(enable_wijzig) == LOW)) {
    h1 = (hour() + 1);
    digitalWrite(12, LOW);  // set zomertijd Flag
  } else {
    h1 = hour();
  }


  setTime(h1, mi, s, d, m, y);  // format is:  uur,minuten,seconden,dag,maand,jaar
  RTC.set(now());



  delay(100);




  lcd.init();  // initialize the lcd
  lcd.backlight();

  sensors.begin();

  lcd.setCursor(0, 0);
  lcd.print(F("Aquarium v5.0 "));
  lcd.setCursor(0, 1);
  lcd.print(F("Lenny+wim okt23"));

  delay(2000);

  lcd.init();
  lcd.setCursor(0, 0);
  lcd.print(day(), DEC);
  lcd.print("/");
  lcd.print(month(), DEC);
  lcd.print("/");
  lcd.print(year(), DEC);
  lcd.print(" ");
  lcd.setCursor(11, 0);
  if (hour() < 10) {
    lcd.print(" ");
    lcd.print(hour());
  } else {
    lcd.print(hour());
  }
  lcd.print((":"));
  if (minute() < 10) {
    lcd.print("0");
    lcd.print(minute(), DEC);
  } else {
    lcd.print(minute(), DEC);
  }


  delay(3000);

  lcd.init();

  // setting voer, TL aan/Uit , LED aan/uit , Pomp Aan/uit
  //denk eraan dat de libary Timealarms genoeg alarm inputs heeft ! standaard 6, staat nu op 24)

  Alarm.alarmRepeat(7,0,0, ledlichton);
  Alarm.alarmRepeat(7,15,0, tllichton);

  Alarm.alarmRepeat(8,0,0, pompoff);
  Alarm.alarmRepeat(8,05,0, voeron);
  Alarm.alarmRepeat(8,05,5, voeroff);
  Alarm.alarmRepeat(8,30,0, pompon);

  Alarm.alarmRepeat(10,0,0, pompoff);
  Alarm.alarmRepeat(10,05,0, voeron);
  Alarm.alarmRepeat(10,05,5, voeroff);
  Alarm.alarmRepeat(10,30,0, pompon);

  Alarm.alarmRepeat(12,0,0, pompoff);
  Alarm.alarmRepeat(12,05,0, voeron);
  Alarm.alarmRepeat(12,05,5, voeroff);
  Alarm.alarmRepeat(12,30,0, pompon);

  Alarm.alarmRepeat(20,00,0, tllichtoff);
  Alarm.alarmRepeat(20,15,0, ledlichtoff);
 
 


  // TL licht aan voor de eerste opstart (zonder time alarm)

  if ((hour() >= 8) && (hour() <= 19)) {
    digitalWrite(tllicht, HIGH);
  } else {
    digitalWrite(tllicht, LOW);
  }

  // alle outputs defineren

  digitalWrite(pomp, HIGH);
  digitalWrite(ledlicht, LOW);
  digitalWrite(voer, LOW);
  digitalWrite(heater, LOW);
  digitalWrite(fan, LOW);
  digitalWrite(voerspanning, LOW);


  delay(100);
}

void loop(void) {

  sensors.requestTemperatures();  // Send the command to get temperatures
  T = sensors.getTempCByIndex(0);

  if ((digitalRead(winter_zomer) == LOW)) {
    digitalWrite(12, HIGH);  // set wintertijd flag
  }
  if ((digitalRead(winter_zomer) == HIGH)) {
    digitalWrite(12, LOW);  // set zomertijd Flag
  }

  lcd.setCursor(0, 0);
  if (hour() < 10) {
    lcd.print(" ");
    lcd.print(hour());
  } else {
    lcd.print(hour());
  }
  lcd.print((":"));
  if (minute() < 10) {
    lcd.print("0");
  }
  {
    lcd.print(minute(), DEC);
  }


  double Irms = emon1.calcIrms(1480);  // Calculate Irms only
  power = (Irms * 230);
  Serial.println(power);  // Apparent power
  if (power < 100) {
    lcd.setCursor(12, 1);
    lcd.print(" ");
    lcd.setCursor(13, 1);
  } else {
    lcd.setCursor(12, 1);
  }
  if (power < 5) { lcd.print(" 0"); }
  else {

   lcd.print(power, 0);}


  lcd.setCursor(15, 1);
  lcd.print("W");

  lcd.setCursor(14, 0);
  lcd.print((char)223);
  lcd.setCursor(15, 0);
  lcd.print("C");
  lcd.setCursor(10, 0);
  lcd.print(T, 1);

  // setpoints winter

  if ((digitalRead(12) == HIGH) && (T < 22.3)) {

    digitalWrite(heater, HIGH);
  }
  if ((digitalRead(12) == HIGH) && (T > 22.7)) {

    digitalWrite(heater, LOW);
  }

  // setpoints zomer

  if ((digitalRead(12) == LOW) && (T < 21.3)) {

    digitalWrite(heater, HIGH);
  }
  if ((digitalRead(12) == LOW) && (T > 21.7)) {

    digitalWrite(heater, LOW);
  }


  if (T > 26) {
    digitalWrite(fan, HIGH);
  }
  if (T < 25) {
    digitalWrite(fan, LOW);
  }

  lcd.setCursor(0, 1);
  if (digitalRead(ledlicht) == HIGH) {
    lcd.print("1");
  } else lcd.print("0");
  lcd.setCursor(1, 1);
  if (digitalRead(tllicht) == HIGH) {
    lcd.print("1");
  } else lcd.print("0");
  lcd.setCursor(2, 1);
  if (digitalRead(heater) == HIGH) {
    lcd.print("1");
  } else lcd.print("0");
  lcd.setCursor(3, 1);
  if (digitalRead(pomp) == HIGH) {
    lcd.print("1");
  } else lcd.print("0");
  lcd.setCursor(4, 1);
  if (digitalRead(fan) == HIGH) {
    lcd.print("1");
    lcd.setCursor(5, 1);
  } else lcd.print("0");
  if (digitalRead(voerspanning) == HIGH) {
    lcd.print("1");
  } else lcd.print("0");
  lcd.setCursor(6, 1);
  if (digitalRead(voer) == HIGH) {
    lcd.print("1");
  } else lcd.print("0");

  lcd.setCursor(8, 1);
  if (digitalRead(12) == HIGH) {
    lcd.print("W");
  }
  if (digitalRead(12) == LOW) {
    lcd.print("Z");
  }
  Alarm.delay(1000);
}

// functions to be called when an alarm triggers

void voeron() {
  digitalWrite(voer, HIGH);
  lcd.setCursor(6, 1);
  lcd.print("1");
}
void voeroff() {
  // write here the task to perform every time
  digitalWrite(voer, LOW);
  lcd.setCursor(6, 1);
  lcd.print("0");
}

void pompon() {
  // write here the task to perform every time
  digitalWrite(pomp, HIGH);
  digitalWrite(voerspanning, LOW);
}

void pompoff() {
  // write here the task to perform every time
  digitalWrite(pomp, LOW);
  digitalWrite(voerspanning, HIGH);
}
void ledlichton() {
  // write here the task to perform every time
  digitalWrite(ledlicht, HIGH);
}
void ledlichtoff() {
  // write here the task to perform every time
  digitalWrite(ledlicht, LOW);
}
void tllichton() {
  // write here the task to perform every time
  digitalWrite(tllicht, HIGH);
}
void tllichtoff() {
  // write here the task to perform every time
  digitalWrite(tllicht, LOW);
}

Advertisement

Berichten: 4085
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: pobleem met DS1307, tijd soms kwijt na spannings uitval

Berichtdoor shooter » 27 Jun 2024, 13:08

ik zou even de rtcset uit het programma halen en kijken wat er dan bij een reset gebeurt want de klok alleen maar setten als dat nodig is door bijvoorbeeld op een knop te drukken.
paul deelen
shooter@home.nl

Berichten: 91
Geregistreerd: 16 Jul 2015, 21:02

Re: pobleem met DS1307, tijd soms kwijt na spannings uitval

Berichtdoor wim2584 » 27 Jun 2024, 22:28

bedankt voor reactie shooter!,

tja het idee was omde tijd gemakkelijk een uur vooruit of achteruit te kunnen zetten als tijdens de opstart een knopje wordt ingedrukt ((digitalRead(enable_wijzig) == LOW)) , dit werkt tijdens testen ook prima, mar je het misschien een ount, als knopje niet wordt ingedruk, set hij de ongewijzigde tijd opnieuw....

een en ander samen met mijn kleinzoon (14) gemaakt, ik zal de de code eens wijzigen zonder deze optie, eens zien wat hij dan doet.

ivm vakantie en het feit dat aquarium niet bij mij staat, zal het niet gelijk getest worden.

heb je een verklaring waarom het wel werkt tijdens testen , maat niet in de praktijk?

Berichten: 4085
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: pobleem met DS1307, tijd soms kwijt na spannings uitval

Berichtdoor shooter » 28 Jun 2024, 10:05

nee heb geen idee, maar pull up is wel gevoelig voor storingen want de weerstand is erg hoog, beter is het om het met 10 k weerstanden op te lossen en zet er een serial print opdracht vlak na de set opdracht dan heb je info over de waarden die je set.
paul deelen
shooter@home.nl

Berichten: 89
Geregistreerd: 02 Nov 2022, 13:03

Re: pobleem met DS1307, tijd soms kwijt na spannings uitval

Berichtdoor ThHe » 07 Jul 2024, 09:52

Hoe kom je er achter dat de tijd wegvalt?

Berichten: 91
Geregistreerd: 16 Jul 2015, 21:02

Re: pobleem met DS1307, tijd soms kwijt na spannings uitval

Berichtdoor wim2584 » 09 Jul 2024, 22:24

hoe je er achter komt dat tijd niet klopt? na een spannings uitval geeft display foute tijd en werken de tijden van licht en voer niet goed meer.

kan hersteld worden door ds1307 opnieuw tijd te zetten en dan de aquariumcode opnieuw laden, werkt dan weer prima,

Berichten: 4085
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: pobleem met DS1307, tijd soms kwijt na spannings uitval

Berichtdoor shooter » 12 Jul 2024, 18:58

maak een serial print als je de klok set en de tijd erbij want een knop is misschien wel de storing
paul deelen
shooter@home.nl

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten