Probleme mit der <RTClib.h>

// Bibliothen
#include <PID_v1.h>
#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {
  "Sonntag",
  "Montag",
  "Dienstag",
  "Mittwoch",
  "Donnerstag",
  "Freitag",
  "Samstag"
};

// Funktionsprototypen:
///////////////////////////////////////////////////
void messen();
void nulllinie();
void verschieben();
void leistung();
void glmittelwert();
void vorzeichen();
void uhrzeit();
void verbraucher();

// für Hauptschleifen
const long schleifenintervall = 2000;
unsigned long vorherigeMillis = 0;
unsigned long aktuelleMillis = 0;

//für Messung
//Arrays
unsigned long previousMillis = 0;  // Speichert die Zeit des letzten Durchlaufs
const unsigned long interval = 1;  // Zeitintervall zwischen den Messungen in Millisekunden
int i = 0;
const int readingsCount = 160;  //immer Vielfache von 20!! sonst haut der Mittelwert ab
int Spannung[readingsCount];    //es dürfen nur 2 Matrixen verwendet werden sonst gibts Speicherprobleme
int Strom[readingsCount];
///////////////////////////////////////////////////

///////////////////////////////////////////////////
//Zuweisung der Analogeingänge
long analogSPG1 = A7;  // der Spannungswert der Phase 1 wird über PIN A7 gelesen
long analogSPG2 = A3;  // der Spannungswert der Phase 2 wird über PIN A2 gelesen
long analogSPG3 = A6;  // der Spannungswert der Phase 3 wird über PIN A6 gelesen

long analogSTR1 = A1;  // der Stromwert der Phase 1 wird über PIN A1 gelesen
long analogSTR2 = A0;  // der Stromwert der Phase 2 wird über PIN A0 gelesen
long analogSTR3 = A2;  // der Stromwert der Phase 3 wird über PIN A2 gelesen
///////////////////////////////////////////////////



//Nulllinie
///////////////////////////////////////////////////
//

long NulllinieMittelwertU[3];
long NulllinieMittelwertI[3];

// Leistung
///////////////////////////////////////////////////

long Leistung[3];
long summe;  // Arbeitsvariable in verschiedenen Funktionen genutzt
unsigned long vorherigeMillis1 = 0;


// gleitender Mittelwert
///////////////////////////////////////////////////
const int fensterGroesse = 10;  // Fenstergröße für den gleitenden Mittelwert
int index = 0;
long gleitenderMittelwert;
long aktuellerWert;
long daten[fensterGroesse];  //ist die Variabel richtig? nicht float?
long summe1;

// Verbrauch
///////////////////////////////////////////////////
int Verbrauchsausgabe;
const int Leistungsschritt = 25;
int Testvariable1;  //wichtig nicht löschen
int digiOut;

// Uhr
///////////////////////////////////////////////////
int Minuten;
int Sekunden;


///////////////////////////////////////////////////
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);  // Setup der seriellen Verbindung

  if (!rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    while (1) delay(10);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, let's set the time!");
    Serial.println("D");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    Serial.println("E");
    // Um Datum und Uhrzeit manuell
    //einzustellen, entfernen Sie die // Zeichen
    //und geben Sie in der folgenden Zeile neue Werte ein
    //in dieser Reihenfolge: Jahr, Tag, Monat, Stunde, Minute und Sekunde.
    //rtc.adjust(DateTime(2020, 2, 24, 10, 00, 0));
  }
  rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  // digitale Ausgänge
  pinMode(5, OUTPUT);   // Setzt den Digitalpin als Outputpin
  pinMode(6, OUTPUT);   // Setzt den Digitalpin als Outputpin
  pinMode(7, OUTPUT);   // Setzt den Digitalpin als Outputpin
  pinMode(8, OUTPUT);   // Setzt den Digitalpin als Outputpin
  pinMode(9, OUTPUT);   // Setzt den Digitalpin als Outputpin
  pinMode(10, OUTPUT);  // Setzt den Digitalpin als Outputpin
}

void loop() {
  aktuelleMillis = millis();  // Millis für die LOOP-Schleife

  if (aktuelleMillis - vorherigeMillis >= schleifenintervall) {
    uhrzeit();

    messen(analogSPG1, analogSTR1);
    nulllinienabgleich(1);
    verschieben(1);
    leistungsberechnung(1);

    messen(analogSPG2, analogSTR2);
    nulllinienabgleich(2);
    verschieben(2);
    leistungsberechnung(2);

    messen(analogSPG3, analogSTR3);
    nulllinienabgleich(3);
    verschieben(3);
    leistungsberechnung(3);

    glmittelwert();

    verbraucher(gleitenderMittelwert);

    /********************************************************************************************************************************************************************************
    /* hier eine Mittelwert aller 5 Minuten ausgeben, der zu jeden vollen 5 Minuten ausgegeben wird um mit Solarmann zu synchronisieren, eventuell auch aller 2,5 min wegen der besseren Darstellung
    hier muss ein Mittelwert über 5 Minuten gebildet werden vom "aktuellen Wert" und vom "gleitenden Mittelwert" -> diesen dann hinten an die Zeile dran mit einem Wort oder Buchstaben
    */
    Serial.print(":Min2:");
    Serial.print(Minuten);
    //Serial.print(":Sec1:");
    //Serial.print(Sekunden);
    /*
    if (Minuten % 5 == 0 || Minuten == 0 || Sekunden <= (schleifenintervall / 1000)) {
      Serial.print("Out");
    }
   */

  
    vorherigeMillis = aktuelleMillis;
    Serial.println();  // der letzte Zeilenumbruch - verschieben wenn neues dazu kommt
  }
}
void uhrzeit(){
   DateTime now = rtc.now();  // Uhrzeit abrufen
//Tag der Woche
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(":");

    //Aktuelle Zeit:
    if (now.hour() < 10) {
      Serial.print("0");
      Serial.print(now.hour());
    } else {
      Serial.print(now.hour(), DEC);
    }
    Serial.print(':');
    if (now.minute() < 10) {
      Serial.print("0");
      Serial.print(now.minute());
    } else {
      Serial.print(now.minute(), DEC);
    }
    Serial.print(':');
    if (now.second() < 10) {
      Serial.print("0");
      Serial.print(now.second());
    } else {
      Serial.print(now.second(), DEC);
    }
    Serial.print(':');
    //Aktuelles Datum:
    if (now.day() < 10) {
      Serial.print("0");
      Serial.print(now.day());
    } else {
      Serial.print(now.day(), DEC);
    }
    Serial.print(':');
    if (now.month() < 10) {
      Serial.print("0");
      Serial.print(now.month());
    } else {
      Serial.print(now.month(), DEC);
    }
    Serial.print(':');
    Serial.print(now.year(), DEC);
    Serial.print(":");

    //Temperatur:
    Serial.print(rtc.getTemperature());
    Serial.print(":");
    
Minuten=now.minute(); //das geht irgendwie nicht
Sekunden=now.second();
}
    

Hallo ich habe ein komisches Verhalten mit dem RTC DS3231.
Manchmal funktioniert die Ausgabe der Minute, oft geht es nicht und er gibt totalen Blödsinn aus:

Blockzitat
Sonntag:17:48:42:03:03:2024:20.50:-259:-29:-44:-332::-330:25:-13:-325:PASSIV:000000:Min2:-44
Sonntag:17:48:44:03:03:2024:20.50:-263:-31:-45:-339::-329:25:-13:-325:PASSIV:000000:Min2:-45

Hat jemand Erfahrungen mit diesem RTC DS3231 und der Bibliothek?
Eigentlich sollten die Minuten:
17:48:42 gleich den Min2:-44 sein?
In den anderen Funktionen fasse ich die Uhr nicht an, deswegen hab ich den Code auch nicht reinkopiert. Es muss irgendeinen anderen Grund haben.
Danke für die Hinweise

Jetzt wird mit diesem Codeabschnitt:

Serial.print(":Min2:");
    Serial.print(Minuten);
der Wert eine ganz andere Variable angezeigt. Als ob der Parameter "Minute" irgendwann überschrieben wird. 
Ich denke, es hängt mit dem Datenformat von now.minute() -> uint8_t zusammen. Wie bekomme ich das in einen Integerwert transformiert?
Danke und Gruß

Der Fehler sitzt woanders oder du hast Probleme mit zuwenig RAM.
Oder du machst was anderes falsch.

:slight_smile:
Wenn du meinst, Funktionen die nichts mit dem Problem zu tun haben, weglassen zu können, finde ich das gut, aber dann schmeiss sie auch wirklich aus dem Sketch raus. Bis du einen minimalen aber kompletten Sketch hast, der das Problem (möglichst immer) zeigt.

Hallo
ich hab das Problem gelöst, indem ich die ganze Uhr-Ansteuerung in void loop() gepackt habe und nicht in void uhrzeit(). Dann ging plötzlich alles.
Gruß

Wenn ich das sehe, dann kommen mir Gedanken, das in Deinem Code evtl. irgendwo was falsch zugeordnet ist und für Verwirrung sorgt.
Auf welchem Controller wird das gespielt?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.