Schrittmotor über RTC (DS1307) anfahren lassen

schonmal einen Schritt weiter.

Für deinen Schrittmotor würde ich erstmal wieder von vorn anfangen.

Du sagst du hast einen laufenden Sketch. Schön.

Mein Vorschlag:
Dann ändere den so, dass er nach dem Start X Schritte macht und dann nichts mehr.
Während du deinen Taster gedrückt hältst, lässt du deinen Motor zurück laufen, (jeweils nur 1 Schritt / loop Durchlauf). Wenn der Taster wieder losgelassen wurde, fährst du soweit wieder vor, wie du während des Rückwärtsfahrens gekommen bist.

Vermutlich merkst du, dass delay(1000) in solch einem Sketch nichts zu suchen hat.

Das nächste wäre dein Endschalter.

Zum Schluss kannst du den Taster ersetzen durch eine leicht modifizierte RTC-Abfrage, die dann nicht direkt eine LED schaltet, sondern einenbooleanMerker. Dessen Zustand kannst du anstelle des Tasters verwenden. Immer noch ohne delay(1000);

Viel Spass

michael_x:
Für deinen Schrittmotor würde ich erstmal wieder von vorn anfangen.

Du sagst du hast einen laufenden Sketch. Schön.

Mein Vorschlag:
Dann ändere den so, dass er nach dem Start X Schritte macht und dann nichts mehr.
Während du deinen Taster gedrückt hältst, lässt du deinen Motor zurück laufen, (jeweils nur 1 Schritt / loop Durchlauf). Wenn der Taster wieder losgelassen wurde, fährst du soweit wieder vor, wie du während des Rückwärtsfahrens gekommen bist.

Vermutlich merkst du, dass delay(1000) in solch einem Sketch nichts zu suchen hat.

Das nächste wäre dein Endschalter.

Zum Schluss kannst du den Taster ersetzen durch eine leicht modifizierte RTC-Abfrage, die dann nicht direkt eine LED schaltet, sondern einenbooleanMerker. Dessen Zustand kannst du anstelle des Tasters verwenden. Immer noch ohne delay(1000);

Viel Spass

Hey, Danke schonmal, ja mit delay werde ich im Endsketch nicht arbeiten können, das habe ich schon gemerkt, aber danke das du es mir auch nochmal verdeutlichst! Da habe ich mir schon Sachen angeguckt,mit dem Unterschied zwischen delay und millies. Wie gesagt, arbeite mich langsam rein.Danke für deine Anregungen!!!

michael_x:
Vermutlich merkst du, dass delay(1000) in solch einem Sketch nichts zu suchen hat.

Hey nochmal, macht es Sinn erstmal mit delay weiter zu probieren oder sollte ich direkt mit millies/interrupts einen Sketch ans laufen zu bekommen, weil so arbeite ich an verschiedenen Baustellen gleichzeitig und bekomm den Sketch nicht kompiliert bzw. weiß dann nicht genau wo der Fehler liegt. Danke schonmal/nochmal. MfG

Steh grad ein bisschen auf dem Schlauch und komm irgendwie nich voran.
Mit der Built-in LED habe ich es hinbekommen, dass die LED bei z.B. bei jeder Sekunde “10”, eine gewisse Zeit leuchtet(also 1 mal/Minute). Beim Schrittmotor habe ich das Problem, dass dieser bei jeder Sekunde “10” nur einen Schritt macht, könnte mir jemand verraten wie ich das ändern könnte. Bisher habe ich es bei den MototSketches immer eine gewisse Distanz definiert, das klappt allerdings in Verbindung mit der RTC leider nicht. Sorry für die doofe Frage aber sitze da jetzt schon stundenlang dran und komme irgendwie nich weiter. MfG

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;


int DirPin = 6;     // DirectionPin
int StepPin = 7;    //StepperPin



void setup(){

Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
  }

  pinMode(DirPin,OUTPUT);
  
  pinMode(StepPin,OUTPUT);

  digitalWrite(DirPin,LOW);
  
  digitalWrite(StepPin,LOW);
}

void loop(){
  

DateTime now = rtc.now();
       Serial.print(now.second(), DEC);
    Serial.println();
    delay(1000);
  
 if (now.second()== 10) 

  {

    digitalWrite(7, HIGH);

    delay(1);       //Verzögerung zwischen den Steps   

    digitalWrite(7, LOW); 

    delay(1);


 

  }
    
    
    
    
}

Edit: der letzte Post hat sich erledigt, habe es hinbekommen, dass er jetzt zu einem bestimmten Zeitpunkt eine bestimmte Anzahl an Schritten macht (z.B 100). Danke trotzdem!! Jetzt gehts wenigstens schonmal ein bisschen weiter :slight_smile:

Jetzt trotzdem die Frage:Kann ich dies so machen bzw. ist es sinnvoll es so zu machen?

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

#define DISTANCE 100

int StepCounter = 0;

int Stepping = false;

int DirPin = 6;     // DirectionPin
int StepPin = 7;    //StepperPin



void setup(){

Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
  }

  pinMode(DirPin,OUTPUT);
  
  pinMode(StepPin,OUTPUT);

  digitalWrite(DirPin,LOW);
  
  digitalWrite(StepPin,LOW);
}

void loop(){
  

DateTime now = rtc.now();
       Serial.print(now.second(), DEC);
    Serial.println();
    delay(1000);
  
 if (now.second()== 10 && Stepping == false ) 

   {

    Stepping = true;
  
  }

 if (Stepping == true)

  {

    digitalWrite(7, HIGH);

    delay(1);       //Verzögerung zwischen den Steps   

    digitalWrite(7, LOW); 

    delay(1);

    StepCounter = StepCounter + 1;


    if (StepCounter == DISTANCE)

    {

      StepCounter = 0;

      Stepping = false;

    }

  }
    
}

Kann ich dies so machen bzw. ist es sinnvoll es so zu machen?

Dein letzter Sketch macht nur 1 Schritt / Sekunde, weil in jedem loop() Durchlauf das delay(1000); drin ist.
Oder übersehe ich da was?

Dass du Serial.print nur max. 1 mal je Sekunde aufrufen solltest, ist klar.
Und per rtc.now() die Zeit öfters zu lesen, ist auch sinnlos.
Aber dafür braucht es kein delay(); sondern if (millis() - lastTime > 1000). ( oder so )

Zwei delay(1) oder so je loop Durchlauf finde ich ok.
Schneller braucht loop nicht zu sein, auch wenn es locker möglich wäre.

Das mit der Hilfsvariable Stepping könnte ein brauchbarer Ansatz sein.
Wenn du das später auf ein mal am Tag änderst, ist aber die Frage, was am ersten Tag nach Spannungswiederkehr passieren soll: Gar nichts, bis der nächste Schaltzeitpunkt (um 8:00 bzw. 21:00 ) erreicht ist?

Und dein Endschalter fehlt auch noch ...

michael_x:
Und dein Endschalter fehlt auch noch ...

Danke schonmal! Ja ich möchte es gerne Schritt für Schritt machen, um es für mich übersichtlich zu halten, das mit den Millis bereitet mir schon Kopfzerbrechen genug, versuche das jetzt erstmal hinzubekommen! MfG

ich möchte es gerne Schritt für Schritt machen

Gerne. Also: Zuerst weg mit demdelay(1000);
Der Rest kommt später.

michael_x:
Gerne. Also: Zuerst weg mit demdelay(1000);
Der Rest kommt später.

:slight_smile:

Wenn ich mich mal einmischen darf: Schreibe einen kleinen Testsketch, der einen Text alle paar Millisekunden ausgibt, natürlich ohne delay! Dann lasse eine LED mit anderer Frequenz dazu blinken. Schon hast Du das Grundgerüst, über das Du bald nicht mehr nachdenken wirst :slight_smile:

agmue:
Wenn ich mich mal einmischen darf: Schreibe einen kleinen Testsketch, der einen Text alle paar Millisekunden ausgibt, natürlich ohne delay! Dann lasse eine LED mit anderer Frequenz dazu blinken. Schon hast Du das Grundgerüst, über das Du bald nicht mehr nachdenken wirst :slight_smile:

Vielen Dank! ich denke das ist einfacher, ich merk das schon! Hab mir da schon was angeguckt und schon ein bisschen rumprobiert mit "BlinkWithoutDelay", werde das heute/morgen umsetzten! Vielen Dank für die Hilfe an Euch! Ohne Euch/dieses Forum hätte ich wahrscheinlich schon längst aufgegeben! MfG

Hier habe ich versucht, den Übergang von delay zu millis zu erklären: Anleitung: Endlicher Automat mit millis()

Den endlichen Automaten zu verstehen, hat mir sehr geholfen :slight_smile:

agmue:
Hier habe ich versucht, den Übergang von delay zu millis zu erklären: Anleitung: Endlicher Automat mit millis()

Den endlichen Automaten zu verstehen, hat mir sehr geholfen :slight_smile:

Vielen Dank ! Werde ich mir morgen mal inRuhe ansehen!

agmue:
Hier habe ich versucht, den Übergang von delay zu millis zu erklären: Anleitung: Endlicher Automat mit millis()

Den endlichen Automaten zu verstehen, hat mir sehr geholfen :slight_smile:

Hey, Super Erklärung erstmal! Das Prinzip habe ich verstanden, und auch einen kleinen Sketch geschrieben, so wie du es mir empfohlen hast, mit der blinkenden LED, welche asynchron zu der Ausgabe einer Textzeile blinkt.

const int ledPin = 3;                

int ledState = LOW;

unsigned long previousMillis = 0;

const long interval = 5000; 
 
void setup()                    
{
  pinMode(ledPin, OUTPUT); 
  Serial.begin(9600);
}
 
void loop()                    
{
 unsigned long currentMillis = millis();
  
   if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  } 

  Serial.println("LEDBlink asynchron zur Ausgabe");
}

allerdings habe ich Probleme dies nun in den "RTC-Sketch" einzubinden, da ich ja bei der RTC keinen Pin habe, welchen ich am Anfang mit

const int ledPin = 3; int ledState = LOW;

deklariere und auf "LOW" setzte. Denkfehler von mir oder habt ihr nen Tip? Ich probiere einfach mal weiter und hoffe auf ein aha-Erlebnis. Und bitte nich sauer werden, ich bin halt totaler Anfänger aber gebe mir echt Mühe das zu verstehen, auch wenn ich mich schwer tue und dies für euch wahrscheinlich total einfach ist. Danke schonmal/nochmal. MfG

Verstanden hast du es erst, wenn du es schaffst, dass die Serial-Ausgabe nur alle (z.B.) 12 Sekunden drankommt.
Also ganz unabhängig vom Blink-Zyklus.

Tip: Mit nur einer previousMillis Variablen geht es nicht.

... da ich ja bei der RTC keinen Pin habe, welchen ich am Anfang deklariere

Doch. hast du schon. Verwendest du nur nicht:

int StepPin = 7;    //StepperPin

michael_x:
Verstanden hast du es erst, wenn du es schaffst, dass die Serial-Ausgabe nur alle (z.B.) 12 Sekunden drankommt.
Also ganz unabhängig vom Blink-Zyklus.

Tip: Mit nur einer previousMillis Variablen geht es nicht.

Doch. hast du schon. Verwendest du nur nicht:

Ok, ich merk schon, doch nicht verstanden :slight_smile: ,, ich probier mal rum....

Statt Augangspin nimm eine Variable vom Typ bool.

ahhhh so in etwa?

const int ledPin = 3;                

int ledState = LOW;

unsigned long previousMillis = 0;

unsigned long previousMillis2 = 12000;


const long interval = 2000; 

const long interval2 = 12000; 
 
 
void setup()                    
{
  pinMode(ledPin, OUTPUT); 
  Serial.begin(9600);
}
 
void loop()                    
{
 unsigned long currentMillis = millis();
  
   if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  } 

   if (currentMillis - previousMillis2 >= interval2) {
    // save the last time you blinked the LED
    previousMillis2 = currentMillis;


  Serial.println("LEDBlink asynchron zur Ausgabe");
  }              
}

Ich glaube/hoffe, ich bin auf dem richtigen Weg, der Tip mit "Tip: Mit nur einer previousMillis Variablen geht es nicht." hat mir richtig weitergeholfen!!!, ich konnte das Bsp. von "agmue" auch schon nachvollziehen(du hast es ja im Prinzip genauso gemacht,natürlich viel professioneller), jedoch waren dort noch sachen wie "enum" usw. drin, welche bestimmt auch nich schwer sind, mich jedoch verwirren. Ihr werdet wahrscheinlich lachen, aber ich freu mich grad voll und danke euch vielmals! Jetzt versuchen dies in meinen RTC-Sketch zu schustern :slight_smile:

agmue:
Statt Augangspin nimm eine Variable vom Typ bool.

Ok das versuche ich mal, du meinst wegen der Frage mit dem "RTC-Pin" oder?

Philovic:
Ok das versuche ich mal, du meinst wegen der Frage mit dem "RTC-Pin" oder?

Genau. Bei Dir ist der Merker ledstate, der duch die LED sichtbar gemacht wird. Anstelle ledstate nimm rtcstate und mache den Merker true, wenn innerhalb der Zeitspanne oder false, wenn außerhalb. Du fragst die RTC nach der Zeitspanne intervall ab und speicherst das Ergebnis in rtcstate. Praktisch ist dann eine Funktion, die gleich den passenden Wert zurückgibt, also rtcstate=zeit(); beispielsweise. Bei mir hieß das dann zeitspanne = zeit();