ich verwende einen Nano mit einer RTC. Das ist ein fertiger Baustein von AZ Delivery.
Eigentlich ist das ganz einfach und mit den Beispielprogrammen ds1307 funktioniert der Baustein tatellos.
In meinem Projekt stoppt der Programmablauf jedoch bei dem Befehl:
void setup(){
"rtc.begin();"
}
die notwendigen Bibliotheken #include <Wire.h> #include "RTClib.h"
RTC_DS3231 rtc;
sind eingebunden.
Es gibt einfach keine Reaktion mehr. Das Programm stoppt und nichts passiert. Sobald ich die Zeile "rtc.begin();" auskommentiere, läuft mein Programm wieder.
Mein Programm nutzt alle restlichen Analogeingänge, jedoch nicht A4 und A5, die für den I2C Bus benötigt werden.
Alle Beispielprogramme laufen ohne Probleme.
Kann es sein, dass die Spannungsversorgung beim Einschalten der Analogeingänge nicht mehr für den I2C Bus reicht?
Wenn Du wirklich rtc.begin() in Anführungszeichen "..." eingepackt hast: Nimm die mal weg. Anderenfalls den kompletten Sketch bitte so wie er nicht funktioniert posten. Dazu die Schaltfläche <CODE> verwenden.
So ein Käse, es ist richtig das die ports nur so um die 15mA vertragen, aber wenn du da deutlich mehr drauf gibst, ist ein nicht funktionierendes rtc.begin() dein geringstes Problem
Also an der Spannungsversorgung liegt es nicht.
Hier der Code. Ich hoffe, ich hab das richtig gemacht? Bin neu hier.
Ich hab keine Ahnung, warum der Arduino einfach die Arbeit verweigert und auch keine wie ich den Fehler finden kann.
Bin für jeden Hinweis dankbar!
Gruß
// 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();
// für Hauptschleifen
const long schleifenintervall = 3000;
unsigned long vorherigeMillis = 0;
//für Messung
//Arrays
unsigned long previousMillis = 0;
const unsigned long interval = 1;
int i = 0;
const int readingsCount = 180;
long Spannung[readingsCount];
long 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
///////////////////////////////////////////////////
//Arbeitsvariablen
long inputSpgP1;
long inputSpgP2;
long inputSpgP3;
long inputCurP1;
long inputCurP2;
long inputCurP3;
//////////////////////////////////////////////////////////////////////////////////
long inputSpgP1c; // an Nulllinie korrigiere Variable
long inputSpgP2c;
long inputSpgP3c;
long inputCurP1c;
long inputCurP2c;
long inputCurP3c;
//////////////////////////////////////////////////////////////////////////////////
////
bool Phase1;
bool Phase2;
bool Phase3;
///////////////////////////////////////////////////
//Nulllinie
///////////////////////////////////////////////////
//long constNullliniet1; //0V bis 5V=1024, Nulllinie liegt bei 2,5V -> 512 digits
long NulllinieMittelwertU[3];
long NulllinieMittelwertI[3];
// Leistung
///////////////////////////////////////////////////
float Leistung[3];
float summe; // Arbeitsvariable in verschiedenen Funktionen genutzt
// gleitender Mittelwert
///////////////////////////////////////////////////
const int fensterGroesse = 20; // Fenstergröße für den gleitenden Mittelwert
int index = 0;
float gleitenderMittelwert;
int daten[fensterGroesse];
///////////////////////////////////////////////////
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!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
/* 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));
}
}
void loop() {
//DateTime now = rtc.now(); // Uhrzeit abrufen
unsigned long aktuelleMillis = millis(); // Millis für die LOOP-Schleife
if (aktuelleMillis - vorherigeMillis >= schleifenintervall) {
//Serial.println("Phase 1 Messung Start");
//Serial.println("i / U / I");
messen(analogSPG1, analogSTR1);
//Serial.println("Phase 1 Messung Ende");
nulllinienabgleich(1);
verschieben(1);
leistungsberechnung(1);
//Serial.println("Phase 2 Messung Start");
messen(analogSPG2, analogSTR2);
//Serial.println("Phase 2 Messung Ende");
nulllinienabgleich(2);
verschieben(2);
leistungsberechnung(2);
//Serial.println("Phase 3 Messung Start");
messen(analogSPG3, analogSTR3);
//Serial.println("Phase 3 Messung Ende");
nulllinienabgleich(3);
verschieben(3);
leistungsberechnung(3);
//Serial.println();
glmittelwert();
Serial.print(gleitenderMittelwert);
Serial.println();
// hier muss eine Regelung rein
vorherigeMillis = aktuelleMillis;
}
}
void messen(long PhaseSpg, long PhaseStrm) {
i = 0;
do {
unsigned long currentMillis = millis(); // Aktuelle Zeit abrufen
if (currentMillis - previousMillis >= interval) { // Überprüfe, ob das Zeitintervall vergangen ist
previousMillis = currentMillis; // Speichere die aktuelle Zeit für das nächste Zeitintervall
Spannung[i] = analogRead(PhaseSpg); // Analogen Eingang auslesen und in das Array Speicherung
Strom[i] = analogRead(PhaseStrm); // Analogen Eingang auslesen und in das Array Speicherung
i = i + 1;
}
} while (i < readingsCount);
void nulllinienabgleich(int Phase) {
//Mittelwerte aus Arrays berechnen
float summeSpannung = 0;
float summeStrom = 0;
for (int i = 0; i < readingsCount; i++) {
summeSpannung += Spannung[i];
summeStrom += Strom[i];
}
NulllinieMittelwertU[Phase] = summeSpannung / readingsCount;
NulllinieMittelwertI[Phase] = summeStrom / readingsCount;
}
void verschieben(int Phase) {
for (int i = 0; i < readingsCount; i++) {
Spannung[i]=Spannung[i]-NulllinieMittelwertU[Phase];
Strom[i]=Strom[i]-NulllinieMittelwertI[Phase];
}
void leistungsberechnung(int Phase) {
summe = 0;
for (int i = 0; i < readingsCount; ++i) {
summe += (Spannung[i] * Strom[i]);
}
Leistung[Phase] = summe / (float)readingsCount; // Umwandlung des Datentyps
Leistung[Phase] =Leistung[Phase] *0.1731; // umrechnung von digits zu Watt
Serial.print(Leistung[Phase]);
Serial.print(":");
}
void glmittelwert() {
float aktuellerWert = ((Leistung[1] + Leistung[2] + Leistung[3]));
Serial.print(aktuellerWert);
Serial.print(":");
daten[index] = aktuellerWert;
index = (index + 1) % fensterGroesse;
summe = 0;
for (int i = 0; i < fensterGroesse; i++) {
summe += daten[i];
}
gleitenderMittelwert = summe / fensterGroesse;
}
Wie? zeichne mall deine Schaltung. Kenne keine MCU was kann Wechselspannung messen
Warum deklarier man eine RTC3231 wenn man eine 1307 hat. Ok es wird funktionieren den die Auswertung ist gleiche. Unglücklich gekauft, dazu womöglich überteuert, solche Sachen kauft man nicht bei AZ. auch wen einer hier kommt das der Saftladen ist der Bester auf der Welt.
Ich kann über ein Analogen Port z.b. ein Motor starten. Solange der steht, passiert nix, sobald der anfährt und dabei Last (ein Objekt) ziehen muss und Kraft braucht, kann der FALLS er die 5 V vom MC-BOARD bekommt das ganze System in die Knie zwingen.
Ist ähnlich wie mit dein Auto. Wenn du den Gaspedal (mechanisch) tritts beginnt der Motor Sprit zu verbrauchen. Tritts und ihn mehr heulst du an der Tankstelle
Schein so aussehen das Du ein ACS712 nutzt, der Braucht Stabile 5V damit er was "genau" anzeigt außer dem ist empfindlich auf fremde Magnetfelder es ist ein HAL Sensor.
Dein Ernst? Wenn es nach deiner Logik geht kann ich an den Arduino Pin auch einen Toaster anschließen, oder von mir aus auch ein Atomkraftwerk. Solange alles aus ist, sagt mir mein logischer Menschenverstand schon, dass dies wohl funktionieren wird. ... es macht einfach keinen Sinn was du da schreibst...
Ja, den Code hast Du richtig eingebunden! (Das bekommen etliche nicht hin...)
Leider kompiliert er nicht, es wäre hilfreich, wenn Du in der Arduino IDE mal STRG-T drückst - dann siehst Du leichter fehlende Klammern und die Einrückungen entsprechen nicht Deinen Gedanken (was wollte ich), sondern dem Code (was ist tatsächlich).
Eine Unstimmigkeit ist mir aufgefallen. Du schreibst in Post 1:
In deinem aktuellen Code verwendest Du aber RTC_DS3231 - welche Uhr soll es denn sein?