Merkwürdiger Fehler bei Wecker-Projekt.

Hallo Arduino-Forum,

dies ist mein erster Post, also falls ich Regeln oder Konventionen verletze, sorry :)

Ich arbeite derzeit im Rahmen eines Schulprojekts an einem Wecker. Ich benutze die folgenden Komponenten:

-Arduino Mega -Adafruit TFT Display (Dieses) -Adafruit Music Maker (Hier) -ds1307 rtc

Folgendes Problem: Auf dem Display soll - logischer Weise - unter anderem die aktuelle Uhrzeit angezeigt werden. Das klappt auch soweit alles hervorragend, nur nach ungefähr 5-10 Minuten funktioniert es ohne ersichtlichen Grund nicht mehr.

Genauer heißt das, dass die Sekunden stehen bleiben oder übereinander geschrieben werden und beim nächsten Erreichen einer neuen Minute, fällt auch diese Anzeige aus. Wenn ich dann anfange auf meine Bereiche zu drücken, fehlt bei jedem neuen Bildschirm immer mehr Text, sodass nach einigem hin und her drücken nur noch die blanken Schaltflächen zu sehen sind.

Ich habe bereits versucht Regelmäßigkeiten festzustellen, aber zumindest die Sekunden-Anzahl hat scheinbar keine Bedeutung. Weiter unten findet ihr die relevanten Zeilen des Codes, das ist alles, was zur Laufzeit in dem Moment ausgeführt werden sollte, weil ich sonst nicht mit dem Teil interagiert hab. Ich hab es nur angesehen. Und es passiert jedes Mal, nicht nur manchmal. Nach einem Reset ist dann alles wieder gut, für 10 Minuten.

Wenn weitere Informationen notwendig sind, werde ich mich bemühen diese bereitzustellen,

Grüße

xkap50x

void loop()
{
        unsigned long currentMillis = millis();

        if (currentMillis - previousMillis > 1000) {
                Serial.println(currentMillis);
                previousMillis = currentMillis;
                if (timeSinceTouch >= STANDBY_TIME) {
                        digitalWrite(LITE_PIN, LOW);
                } else {
                        timeSinceTouch++;
                }
        }



        if (doretime) {
                retime(false);
        }

        TSPoint p = ts.getPoint();
        pinMode(XM, OUTPUT);
        pinMode(YP, OUTPUT);
        checkTouch(p.x, p.y, p.z);
}


void retime(bool instaretime) {
        DateTime nowtime = rtc.now();
        if (t_s == nowtime.second()) {
                return;
        }

        bool mc = instaretime;
        bool hc = instaretime;
        bool sc = instaretime;
        bool dac = instaretime;

        if (t_da != nowtime.day()) {
                dac = true;
        }

        if (t_m != nowtime.minute()) {
                mc = true;
        }
        if (t_h != nowtime.hour()) {
                hc = true;
        }
        if (twoDigit(t_s).substring(0, 1) != twoDigit(nowtime.second()).substring(0, 1)) {
                sc = true;
        }

        t_s = nowtime.second();
        t_m = nowtime.minute();
        t_h = nowtime.hour();

        t_da = nowtime.day();
        t_mo = nowtime.month();
        t_ye = nowtime.year();

        dow = nowtime.dayOfTheWeek();

        if (sc) {
                prnt(twoDigit(t_s), 370, 150, 8, 255, 80, 120, 0, 0, 0, true);
        } else {
                prnt(twoDigit(t_s).substring(1, 2), 418, 150, 8, 255, 80, 120, 0, 0, 0, true);
        }
        if (mc) {
                prnt(twoDigit(t_m), 210, 115, 13, 255, 80, 120, 0, 0, 0, true);
        }
        if (hc) {
                prnt(twoDigit(t_h), 30, 115, 13, 255, 80, 120, 0, 0, 0, true);
        }
        if (dac) {
                prnt(twoDigit(t_da) + "." + twoDigit(t_mo), 13, tft.height() - 70, 7, 0, 0, 0, 255, 233, 0, true);
                tft.setTextSize(4);
                int x1, x2, y1, y2;
                tft.getTextBounds(long_dotw[nowtime.dayOfTheWeek()].c_str(), 0, 0, &x1, &y1, &x2, &y2);
                prnt(long_dotw[nowtime.dayOfTheWeek()], 240 - (x2 / 2), 15, 4, 10, 10, 255, 0, 0, 0, true);
        }
        prnt(":", 152, 105, 16, 10, 10, 255, 0, 0, 0, false);

        if (mc) {
                if (DateTime(t_ye, t_mo, t_da, t_h, t_m, 0).unixtime() == nextAlarm.unixtime()) {
                        Serial.print("Alarmzeit erreicht!"); //Alarm
                        scr_alert();
                }
        }
}

|500x375 |500x375

Bitte den gesamten, lauffähigen Sketch bei dem der Fehler auftritt mit Link zu den benutzten Bibliotheken.

Grüße Uwe

Weiter unten findet ihr die relevanten Zeilen des Codes

Schön, wenn du irrelevantes weglässt. Sollte aber soviel übrig bleiben, dass es kompiliert und den Fehler noch zeigt. Den MusicMaker weglassen wäre eine gute Idee, wenn der Fehler dann immer noch auftritt. Wenn du denkst, dass die Funktion checkTouch nicht relevant ist, lass sie weg. usw.

michael_x: Sollte aber soviel übrig bleiben, dass es kompiliert und den Fehler noch zeigt.

Es gibt ja wie gesagt keine Fehler beim Kompilieren, sondern erst nach vielen Minuten Laufzeit.

uwefed: Bitte den gesamten, lauffähigen Sketch bei dem der Fehler auftritt mit Link zu den benutzten Bibliotheken.

Danke für eure Hilfe, ich hab den Fehler nach einigen Stunden jetzt gefunden. Ein Befehl der Adafruit GFX Library (tft.gettextbounds) benötigt jedes Mal ein wenig RAM und da dieser Befehl sehr oft ausgeführt wird, verbraucht das Programm entsprechend schnell den gesamten verfügbaren RAM. Eine Lösung habe ich nicht, allerdings habe ich dafür einen neuen Thread eröffnet, wenn ihr also Ideen habt, wie ich das Problem lösen kann, würde ich mich freuen, wenn ich vorbeischaut :)

Hier der Link zum Thread