// 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