Programm stoppt bei rtc.begin

Hallo

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?

Danke !

Willkommen im Forum!

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.

Ich beglückwünsche dich zu deiner regen Fantasie!

Nur wenn über die Ausgänge etwas eingeschaltet wird, was durch das MC-Board versorgt wird, und dann jede Menge mA's zieht wenn es eingeschaltet ist.

Ergo. Erzähle mal was da alles dran hängt und wie es versorgt wird. Dann weiß man mehr, ansonsten ist das TV-Gucken via Glaskugel. :wink:

Gruß

Pucki

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

Nicht "um die" das ist das absolute Maximum was sollte man nicht überschreiten, empfohlen wird sich da drunter halten.

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.

Falls du mich meinst.

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 :wink:

Und JA das RTC ist dann sein kleinsten Problem :wink:

Gruß

Pucki

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.

Schreib bitte kein Unsinn.

Ich mag mich nicht streiten. Aber DAS oben habe ich schon sogar ohne MC vor > 30 Jahren geschaft.

Gruß

Pucki

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

das Stimmt aber nur das.

Hier ist der Unsinn.

Wenn du meinst, aber schau einfach mal wie ein Motorsteuerungsmodul mit Drehzahlregelung funktioniert.

Und nun höre auf zu nerven und hilf den TO. Wie bereits festgestellt wurde liegt es nicht am ungefügenden mA.

Gruß

Pucki

Hast Du Dich jetzt zum Befehlshaber des Forums aufgeschwungen? Du wirst ja immer arroganter.

Gruß Tommy

Hör auf den kompletten Post kaputtmachen, wen ich keine Ahnung habe hate ich meine Fresse.

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?

Versuch mal ganz oben, das

RTC_DS3231 rtc;

durch

RTC_DS1307 rtc;

zu ersetzen.

@to

Schreib den Code mal wir folgt um und sag was passiert. Ich habe leider das Modul nicht und kann deshalb nicht selbst testen.

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

Ich empfehle dir dazu auch noch diesen Link.

Edit : Und zeig mal ein Link zu den Uhr-Bauteil. Das lösst viele Probleme, bevor sie entstehen. !!!

Gruß

Pucki

Erst mall schauen was für Lib der TO nutzt !