Arduino Projekt - Fehlersuche

Hallo,
benutze für ein Projekt einen Arduino UNO, NEMA 17, RTC mit DS1302, Stepperdriver A4988 und einen Expansion Board für den Stepperdriver. Der Schrittmotor soll zu bestimmten Uhrzeiten sich drehen.
Wenn die Uhrzeiten ein paar Minuten in der Zukunft liegen, dann funktioniert alles einwandfrei, sobald die zeitgesteuerte Aktion weiter weg liegt, passiert nichts mehr.

Hier ist der Code den ich geschrieben habe, nicht elegant mit den If-Abfragen-Verschachtelungen, aber dadran liegt es nicht?

#include <DS1302.h>
DS1302 rtc(10, 9 ,8);
int stepCounter;
int steps = 1600;

void setup() {
Serial.begin(9600);
pinMode(6, OUTPUT); // Enable
pinMode(5, OUTPUT); // Step
pinMode(4, OUTPUT); // Richtung

digitalWrite(6,LOW);
}

void loop() {
  

Serial.println(rtc.getTimeStr());
Serial.println(rtc.getMonthStr());  

 
if(strcmp(rtc.getMonthStr(), "August") == 0)
        {
          if(strcmp(rtc.getTimeStr(FORMAT_SHORT), "21:45") == 0)
              {
                  digitalWrite(4,HIGH); // gegen den Uhrzeigersinn

                          for(stepCounter = 0; stepCounter < steps; stepCounter++)
                                {
                                  digitalWrite(5,LOW);
                                  delayMicroseconds(800);
                                  digitalWrite(5,HIGH);
                                  delayMicroseconds(800);
                                        }
                  delay(60000);
                  };
          if(strcmp(rtc.getTimeStr(FORMAT_SHORT), "11:10") == 0)
              {
                  digitalWrite(4,LOW); // im Uhrzeigersinn

                    for(stepCounter = 0; stepCounter < steps; stepCounter++)
                                {
                            digitalWrite(5,LOW);
                                    delayMicroseconds(800);
                              digitalWrite(5,HIGH);
                            delayMicroseconds(800);
                                  }
                  delay(60000);
                  };
          };
if(strcmp(rtc.getMonthStr(), "September") == 0)
        {
          if(strcmp(rtc.getTimeStr(FORMAT_SHORT), "21:00") == 0)
              {
                  digitalWrite(4,HIGH); // gegen den Uhrzeigersinn

                          for(stepCounter = 0; stepCounter < steps; stepCounter++)
                              {
                            digitalWrite(5,LOW);
                            delayMicroseconds(800);
                                digitalWrite(5,HIGH);
                                delayMicroseconds(800);
                                    }
                  delay(60000);
                  };
          if(strcmp(rtc.getTimeStr(FORMAT_SHORT), "06:30") == 0)
              {
                 digitalWrite(4,LOW); // im Uhrzeigersinn

                    for(stepCounter = 0; stepCounter < steps; stepCounter++)
                          {
                        digitalWrite(5,LOW);
                          delayMicroseconds(800);
                          digitalWrite(5,HIGH);
                          delayMicroseconds(800);
                                  }
                  delay(60000);
                  };
          };
if(strcmp(rtc.getMonthStr(), "October") == 0)
        {
          if(strcmp(rtc.getTimeStr(FORMAT_SHORT), "19:30") == 0)
              {
                  digitalWrite(4,HIGH); // gegen den Uhrzeigersinn

                      for(stepCounter = 0; stepCounter < steps; stepCounter++)
                            {
                                digitalWrite(5,LOW);
                                delayMicroseconds(800);
                                  digitalWrite(5,HIGH);
                                  delayMicroseconds(800);
                                          }
                  delay(60000);
                  };
          if(strcmp(rtc.getTimeStr(FORMAT_SHORT), "07:30") == 0)
              {
                  digitalWrite(4,LOW); // im Uhrzeigersinn

                    for(stepCounter = 0; stepCounter < steps; stepCounter++)
                          {
                            digitalWrite(5,LOW);
                            delayMicroseconds(800);
                              digitalWrite(5,HIGH);
                              delayMicroseconds(800);
                                    }
                  delay(60000);
                  };
          };
if(strcmp(rtc.getMonthStr(), "November") == 0)
        {
          if(strcmp(rtc.getTimeStr(FORMAT_SHORT), "18:30") == 0)
              {
                  digitalWrite(4,HIGH); // gegen den Uhrzeigersinn

                    for(stepCounter = 0; stepCounter < steps; stepCounter++)
                        {
                          digitalWrite(5,LOW);
                            delayMicroseconds(800);
                              digitalWrite(5,HIGH);
                              delayMicroseconds(800);
                                      }
                  delay(60000);
                  };
          if(strcmp(rtc.getTimeStr(FORMAT_SHORT), "08:30") == 0)
              {
                 digitalWrite(4,LOW); // im Uhrzeigersinn

                        for(stepCounter = 0; stepCounter < steps; stepCounter++)
                                {
                                digitalWrite(5,LOW);
                                  delayMicroseconds(800);
                                  digitalWrite(5,HIGH);
                                  delayMicroseconds(800);
                                      }
                  delay(60000);
                  };
          };
if(strcmp(rtc.getMonthStr(), "December") == 0)
        {
          if(strcmp(rtc.getTimeStr(FORMAT_SHORT), "18:00") == 0)
              {
                  digitalWrite(4,HIGH); // gegen den Uhrzeigersinn

                  for(stepCounter = 0; stepCounter < steps; stepCounter++)
                    {
                      digitalWrite(5,LOW);
                          delayMicroseconds(800);
                              digitalWrite(5,HIGH);
                            delayMicroseconds(800);
                                }
                  delay(60000);
                  };
          if(strcmp(rtc.getTimeStr(FORMAT_SHORT), "09:00") == 0)
              {
                  digitalWrite(4,LOW); // im Uhrzeigersinn

                      for(stepCounter = 0; stepCounter < steps; stepCounter++)
                        {
                          digitalWrite(5,LOW);
                           delayMicroseconds(800);
                              digitalWrite(5,HIGH);
                            delayMicroseconds(800);
                                    }
                  delay(60000);
                  };
          };




delay(1000);

}

Hat jemand eine Idee? :-[

Meine erste Idee ist, du solltes mal ein paar Dokumentationen in den Sketch schreiben, damit aussenstehende auch erkennen können, was da passieren soll.
Ohne die ist der Sketch schwer zu lesen.

(deleted)

Danke, ich setze mich mal damit auseinander.
Was genau passiert in meiner Variante mit den Delays?
Den 1-Minute-Delay habe ich eingebaut, damit die Schrittmotorfunktion nur einmal zu einer Uhrzeit ausgeführt wird. :confused:

(deleted)

denrat:
Danke, ich setze mich mal damit auseinander.

Und prima, dass du dich auch um die Kommentare kümmerst.

Evtl. fällt dir dann selbst dein Fehler auf.

(deleted)

denrat:
benutze für ein Projekt einen Arduino UNO, NEMA 17, RTC mit DS1302

Hier ist der Code den ich geschrieben habe, nicht elegant mit den If-Abfragen-Verschachtelungen,

          if(strcmp(rtc.getTimeStr(FORMAT_SHORT), "09:00") == 0)

{
                  digitalWrite(4,LOW); // im Uhrzeigersinn

for(stepCounter = 0; stepCounter < steps; stepCounter++)
                        {
                          digitalWrite(5,LOW);
                          delayMicroseconds(800);
                              digitalWrite(5,HIGH);
                            delayMicroseconds(800);
                                    }
                  delay(60000);
                  };
          };

Fehlersuche ist was schönes. Code, den man lesen kann auch. Letzteres ist nicht der Fall. Bitte VOR dem einstellen STRG-T drücken, damit man auch sieht, was da tatsächlich auf einer Linie läuft.

Ja, delay() ist ein Killer. In Beispielen ok - sonst nicht.
Wie gut oder schlecht die Uhr ist, kann ich nicht beurteilen.

Du solltest Deinen PINs Namen geben.
Nach x wieviel Zeilen weiss niemand mehr, ob der PIN noch stimmt, oder was der macht.

const int enable=6;
const int step=5;
const int dir=4

void setup()
{
pinMode (enable, OUTPUT);
pinMode (step, OUTPUT);
pinMode(dir, OUTPUT);
}

Ich hab mir mal am Schluss einen Codeschnipsel genommen:

    if (strcmp (rtc.getTimeStr (FORMAT_SHORT), "09:00") == 0)
    {
      digitalWrite (4, LOW); // im Uhrzeigersinn
      for (stepCounter = 0; stepCounter < steps; stepCounter++)
      {
        digitalWrite (5, LOW);
        delayMicroseconds (800);
        digitalWrite (5, HIGH);
        delayMicroseconds (800);
      }
      delay (60000);
    };

Also früh um 9 willst Du PIN 4 (DIR) EINMAL auf LOW setzen und dann steppen.
Du wartest dann aber 60 Sekunden(!!!!!!) und machst nichts.
Warum?

Du könntest prüfen, ob der PIN bereits gesetzt ist.

 if (((strcmp (rtc.getTimeStr (FORMAT_SHORT), "09:00") == 0)&& (digitalRead(enable)))
    {
      digitalWrite (enable, LOW); // im Uhrzeigersinn
      for (stepCounter = 0; stepCounter < steps; stepCounter++)
      {
        digitalWrite (step, LOW);
        delayMicroseconds (800);
        digitalWrite (step, HIGH);
        delayMicroseconds (800);
      }
    }

Um zu vermeiden, das der PIN jetzt ständig gesetzt ist, prüfst Du ggfls erneut und stellst fest, das die Uhrzeit nicht 9:00 ist und setzt den PIN mit einem else-Zweig auf HIGH.

(Code FreiHand geschrieben - dient nur zur Anregung)

Hallo ich bin's nochmal,

Danke für eure Anregungen,
habe jetzt mein Programm so umgeschrieben, dass überhaupt keine Delays benutzt werden.
Habe aber wieder genau, dasselbe Problem, teste ich mein Programm mit Zeitangaben in der If-Abfrage, die nur ein paar Minuten in der Zukunft liegen, läuft alles richtig. Liegen die Zeiten länger weg, passiert nichts.
Könnte das Problem an einem Bauteil liegen?
Der RTC läuft, so wie er soll.

Da unsere Kristallkugeln coronabedingt etwas trüb sind, wirst Du uns schon den geänderten Sketch zeigen müssen.

Gruß Tommy

(deleted)

denrat:
Danke

Na das ist doch mal Balsam.

habe jetzt mein Programm so umgeschrieben, dass überhaupt keine Delays benutzt werden.
Habe aber wieder genau, dasselbe Problem,

Dann wäre es jetzt aber nötig, den Sketch erneut zu bringen.
Auch wenn hier grad die Welt unterzugehen scheint, solange Internet geht, will ich - und sicher auch noch einige weitere - helfen. Aber da fehlt eine Ausgangslage.

zum Entwanzen des Sketches eignet sich gut ein Software Stethoskop, in der Form von Serial.println(der Wert der mich interressiert); , an den Stellen an den du ein Fehler vermutest. So kann man sich geschmeidig Schritt für Schritt der möglichen Fehlerquelle nähern.

Sollte an den Stellen wo Du den Fehler vermutes nichts rauskommen mußt Du Stellen nehmen an denen Du den Fehler nicht vermutest.
Solche Stellen könnten sein: Nach Eingaben, Nach Berechnungen, If Vergleiche.

Grüße Uwe

Mit serial.println habe ich schon gearbeitet, um Fehler auszuschließen. Werde es aber nochmal versuchen und alles durch prüfen.
Den kompletten Sketch kann ich aufgrund der Größe leider nicht reinstellen, aber im Grunde widerholt sich das ganze einfach 12mal für jeden Monat, mit jeweils anderen Uhrzeiten.
Kann es auch sein, dass der Nema 17 nicht damit klar kommt, durchgehend enabled, also Enable auf aktiv, zu sein?
Oder macht vielleicht der Treiber(A4988) für den Schrittmotor Probleme im Dauerbetrieb? Der Aufbau befindet sich draußen, bekommt also zusätzlich zur Betriebstemperatur noch die momentane Sommertemperatur ab.

(deleted)

Danke für die schnelle Antwort, was ich noch erwähnen sollte, als ich Zeiten benutzt habe, die länger in der Zukunft liegen, hat der Schrittmotor zur richtigen Zeit zwar kurz ein Geräusch gemacht, sich aber nicht gedreht, also muss vom Arduino ein Befehl gekommen sein?
Falls es zur Visualisierung hilft, das ganze soll eine automatisierte Hühnerklappe sein, am Schrittmotor hängt also noch eine Klappe, mit dem Gewicht hat der Schrittmotor, wenn die Zeit nur ein paar Minuten entfernt liegen, kein Problem. Muss der Schrittmotor mit Enable auf aktiv bleiben, um die Klappe oben zu halten bzw. kann ich das als Fehler ausschließen?
Den überarbeiteten Sketch kann ich hochladen sobald ich von der Arbeit zurück bin.

Über eure Ratschläge bin ich sehr dankbar.=)

Mein Rat: Blickwinkel ändern!

Aus Erfahrung kann ich sagen, dass die Fehlersuche das so ziemlich dööfste ist, was man tun kann.

Nachweis: (alte Faustregel)
30% der Zeit gehen fürs Besprechungen drauf
20% der Zeit gehen fürs planen drauf
20% für das programmieren.
80% für das debuggen.
Und nein, da ist kein Rechenfehler drin.
Denn debuggen wird gerne gnadenlos über- und unterschätzt.

Verschwendete Lebenszeit.

OK, debuggen kommt einem spannend vor.
Es ist anstrengend.
Und irgendwann hat man sein eigenes Programm sogar irgendwann mal verstanden(vielleicht)

Debugggen ist also genau das richtige, wenn man nicht weiß, wie man sonst seinen Tag rum bekommt.

Auch ist es aus psychologischer Sicht bedenklich, denn das debuggen beschäftigt sich zu einem großen Teil mit dem eigenen Versagen und Unwissen. Es ist das gezielte, auf die Erkenntnis hinarbeiten, wie blöd man doch da mal wieder war.


Wie holt man das Maximum aus dem Problem raus?

Verschachtelungstiefe!
Je tiefer man if() Anweisungen, oder auch Schleifen, verschachtelt, desto mehr Spaß hat man beim debuggen.
Merke: Für jedes else gibts ein Fleißsternchen.
Je mehr Bedingungen im if()/while() verknüpft sind, desto mehr Spaß.
Ab einer Verschachtelungstiefe von ca. 3 versagt der/mein(!) menschliche Geist ganz gerne.
Anfängern empfehle ich darum eine Verschachtelungstiefe von mindestens 5.

Modularisierung!
Je kleiner die Module(Funktionen/Klassen/Methoden) desto leichter lassen sie sich einzeln testen. Eine echte Spaßbremse. Ganz öde wird es mit den Modulen, wenn man sie auf Wiederverwendung trimmt. Das nimmt einem quasi alle überraschenden Seiteneffekte. Und das leider für alle Zukunft.
Die Weicheier unter den Programmierern meinen, jede Funktion/Klasse/Methode dürfte nur ein Ding erledigen.
Meine Erkenntnis:
Das Leben verarmt, ohne GottObjekte

Benennen!
Keinesfalls die Dinge beim Namen nennen!
Falsch: Frosch, Fliege
Besser: Tier1, Tier2
Noch besser ist es natürlich, die Dinge gar nicht zu benennen.
Das gilt insbesondere, für endliche Automaten.
Klar benannte Zustände, ist mit das schlimmste, was man einem Debugging Liebhaber antun kann.

Coding Style Guides!
Das ist etwas, was man generell in Frage stellen sollte, schränkt es doch das im Grundgesetz festgelegte Recht auf freie Entfaltung ein. Eins der höchsten Güter in der BRD.
Sich freiwillig einschränken?
Gruselig.

Algorithmen, Design Pattern!
Vorgefertigtes Wissen aus Büchern, die Essenz von tausenden ManJahren Erfahrung schränken die Kreativität unglaublich ein. Auch wenn die eigenen Räder etwas eckiger werden, sind es doch meine Räder. Individuell, sie sind, und damit wunderschön.

Datenblätter, Sprachstandard, usw.!
Tue es nicht!
Du nimmst dir damit die Chance, auf Monate lange "Try and Error" Sitzungen. Außerdem, sind (nahezu) alle Schriftstücke Fehler behaftet, und darum aus Prinzip unglaubwürdig.
Auch diese Dokumente stehen der freien Entfaltung des eigenen Genius diametral entgegen.

-- und so weiter --

Sag mal combie, ist es bei dir auch so warm wie hier ? :wink: :wink:

HotSystems:
Sag mal combie, ist es bei dir auch so warm wie hier ? :wink: :wink:

Kurz vor Mittag habe ich aufgegeben.....
(werde mich wohl auf Nachtsitzungen umstellen müssen)

  • Halle
  • 3 laufende (Benzin) Motoren um mich rum
  • Kein Durchzug.

38°C in 1,5 Meter Höhe

Ob das Nebenwirkungen hat?

Für Nebenwirkungen essen sie bitte die Packungsbeilage und schlagen sie ihren Apotheker.

Ich habs befürchtet.
So lange hätte ich nicht durchgehalten.