Schrittmotor über RTC (DS1307) anfahren lassen

michael_x:
Wenn du ein kleines Beispiel willst, dann schmeiss doch erstmal den ganzen SD- und Temperatur-Kram raus und schreib selbst ein kleines Schrittmotor-Beispiel.

Dann schau in deiner Lieblings RTC-Library, wieviele Zeilen das reine Auslesen der Uhrzeit braucht.

Wenn du dann noch merkst, dass du nichtmal das ominöse bcdtobin bräuchtest, kannst du
#include “RTClib.h”
ersetzen durch

int getBCDHour() {

// returns hhmm BCD-coded. Readable if printed as HEX
  Wire.beginTransmission(0x68);
  Wire._I2C_WRITE((byte)0);
  Wire.endTransmission();

Wire.requestFrom(0x68, 3); // read time (3 bytes h:mm:ss)
  Wire._I2C_READ(); // sec ignore
  byte min = Wire._I2C_READ()); // min ignore
  return Wire._I2C_READ() << 8 | min;
}

bool tag;
void loop() {
  int time = getBCDHour();
  if (time >= 0x0800) tag = true;
  if (time >= 0x2100) tag = false;

// zwischen 0 und 8 Uhr wird nichts gemacht
  // zwischen 8 und 21 Uhr ist tag : Schrittmotor bei Bedarf  Richtung +
  // ab 21 Uhr : tag = false : Schrittmotor bei Bedarf Richtung -

  delay(60000L); // 1 Minute Pause

}



Zum Testen ist das natürlich Käse, weil es 13 Stunden dauert, in denen man kaum sieht was los ist.

Ausserdem: 
wofür soll das gut sein?
woher weisst du wo der Motor steht, wenn der Arduino startet?

Danke erstmal für die schnelle Antwort und das Beispiel!!ich werde mich erstmal reinfuchsen, das problem ist/war, ich brauche erstmal nen Anfang, den habe ich nun! vielen Dank!

In einem anderen Thema habe ich die RTC-Bibliothek von jurs verwendet. Die Funktion zeit() liefert true, wenn die aktuelle Zeit innerhalb der Zeitspanne liegt. Bei positiver Flanke in die eine Richtung, bei negativer in die andere. C&P ist erlaubt :slight_smile:

agmue:
In einem anderen Thema habe ich die RTC-Bibliothek von jurs verwendet. Die Funktion zeit() liefert true, wenn die aktuelle Zeit innerhalb der Zeitspanne liegt. Bei positiver Flanke in die eine Richtung, bei negativer in die andere. C&P ist erlaubt :slight_smile:

-hehe vielen Dank schonmal! mit c&p wirds nich getan sein, aber ich arbeite mich rein und hangel mich mal an dem Beispeil entlang! Vielen Dank!

Wenn du beim Hangeln stolperst, kannst du ja mal diese Version, die immerhin kompiliert, verwenden :wink:

#include <Wire.h>

int getBCDHour() {
  // returns hhmm BCD-coded. Readable if printed as HEX
  Wire.beginTransmission(0x68);
  Wire.write((byte)0);  
  Wire.endTransmission();

  Wire.requestFrom(0x68, 3); // read time (3 bytes h:mm:ss)
  Wire.read(); // sec ignore
  byte minute = Wire.read(); 
  return Wire.read() << 8 | minute;
}

michael_x:
Wenn du beim Hangeln stolperst, kannst du ja mal diese Version, die immerhin kompiliert, verwenden :wink:

#include <Wire.h>

int getBCDHour() {
  // returns hhmm BCD-coded. Readable if printed as HEX
  Wire.beginTransmission(0x68);
  Wire.write((byte)0); 
  Wire.endTransmission();

Wire.requestFrom(0x68, 3); // read time (3 bytes h:mm:ss)
  Wire.read(); // sec ignore
  byte minute = Wire.read();
  return Wire.read() << 8 | minute;
}

Besten Dank! allerdings muss ich erstmal “kleiner” Anfangen. Verstehe teilweise nur Bahnhof, aber ich denke, ich werde das/die Beispiele demnächst, wenn ich mich richtig eingearbeitet habe, bestimmt gebrauchen können! Vielen Dank schonmal!

Philovic:
mit c&p wirds nich getan sein, aber ich arbeite mich rein und hangel mich mal an dem Beispeil entlang!

So hatte ich es gemeint, erst Gehirn einschalten, dann C&P&L (Copy&Paste&Learn) :slight_smile:

Bei der Bibliothek habe ich zunächst das Beispiel zum Laufen gebracht, dann auf die für mich notwendige Funktionalität reduziert. Anschließend in den “großen” Sketch eingebaut.

Anbei mein Testsketch mit Bibliothek.

12.11.2017: Version ohne Warnungen hier im originalen Thema abgelegt.

dateTimeLibEasyDemo.ino (1.75 KB)

jursRTCtimeEasy.h (8.75 KB)

.. dann auf die für mich notwendige Funktionalität reduziert. Anschließend in den "großen" Sketch eingebaut.

Sehr richtig!
Laut deiner Beschreibung brauchst du nur Stunden ( und evtl. Minuten ) zu lesen. Die ganzen tollen Bibliotheken liefern Datum, Wochentag, Sekunden seit 1970, und allerlei anderen Pipapo. Bei einer DS1307 braucht man auch keine automatische So/Wi Umschaltung, die muss sowieso alle halbe Jahre gestellt werden.
Willst du zum Stellen der Uhr einen anderen Sketch laden? Wenn nicht, ist das nur nebenbei eine Frage der RTCLib sondern "wie teilst du dem Arduino die gewünschte neue Zeit mit?"

agmue:
So hatte ich es gemeint, erst Gehirn einschalten, dann C&P&L (Copy&Paste&Learn) :slight_smile:

Bei der Bibliothek habe ich zunächst das Beispiel zum Laufen gebracht, dann auf die für mich notwendige Funktionalität reduziert. Anschließend in den "großen" Sketch eingebaut.

Anbei mein Testsketch mit Bibliothek.

Vielen Dank, der Sketch ist deutlich übersichtlicher und da kann ich schon eher folgen :slight_smile: Ich arbeite mich langsam rein ! werde mich bei Gelegenheit sicher nochmal melden,besten dank!

michael_x:
Sehr richtig!
Laut deiner Beschreibung brauchst du nur Stunden ( und evtl. Minuten ) zu lesen. Die ganzen tollen Bibliotheken liefern Datum, Wochentag, Sekunden seit 1970, und allerlei anderen Pipapo. Bei einer DS1307 braucht man auch keine automatische So/Wi Umschaltung, die muss sowieso alle halbe Jahre gestellt werden.
Willst du zum Stellen der Uhr einen anderen Sketch laden? Wenn nicht, ist das nur nebenbei eine Frage der RTCLib sondern "wie teilst du dem Arduino die gewünschte neue Zeit mit?"

Genau, ich brauche wahrscheinlich nur Stunden. Und richtig, die Bibliotheken liefern mir Datum und Sekunden seit 1970, das habe ich schon mitbekommen,das werde ich natürlich nicht brauchen! Die SO/WI- Umstellung werde ich sicher auch nicht brauchen! Ja, ich möchte natürluc einen anderen Sketch laden, nur ich bin noch ziemlich am Anfang und habe echt wenig Basiswissen. Die Zeit gesetzt habe ich ja über rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));, wobei das Datum für meine Messwerte eventuell sinnvoll ist. Über DateTime now = rtc.now(); kann ich mir die aktuelle Zeit ja ausgeben lassen. Allerdings fragtest du ich einem vorigen post " Woher weißt du wo der Motor steht, wenn der Arduino startet". Das hatte ich erst nich berücksichtigt, und würde dies gerne über einen Schalter machen, Ich habe einen Motor mit einer gewindestange drauf, auf die Gewindestange ist eine Mutter geschraubt. Vom Prinzip her : 1. Arduino starten und den den Motor so weit drehen, dass die Mutter gegen den Schalter fährt. 2. Wenn Schalter betätigt, die Uhrzeit auslesen. 3. Je nachdem welche Uhrzeit, sollte der Motor dann X Schritte nach links oder rechts drehen (Um in die aktuelle Position zu fahren). 4. Wenn aktuelle Position erreicht, wahrscheinlich dann über die loop in ca. 10 min Schritten immer ein bisschen weiter fahren, bis Endposition (Abends ca. 21 Uhr) erreicht ist, und dann wieder in Anfangsposition fahren und morgens wieder um ca. 8 UHr das gleiche...Wie gesagt, ich bin noch am Anfang und arbeite mich langsam rein. Danke schonmal für eure/deine Tipps bzw. Fragen, welche sehr hilfsreich sind! MfG

Philovic:
Vielen Dank, der Sketch ist deutlich übersichtlicher und da kann ich schon eher folgen :slight_smile:

Wenn Du ohne Bibliothek einsteigen möchtest und Du Englisch verstehst, ist dies mein Favorit: Tutorial – Using DS1307 and DS3231 Real-time Clock Modules with Arduino

Ich habe mit diesem Text angefangen, weil es zumindest für mich leichter war, als so manche RTC-Bibliothek zu verstehen. Aber das hängt natürlich vom Vorwissen ab. Etwas bei jurs abschauen und etwas bei John Boxall sollte Dich zum Ziel führen :slight_smile:

agmue:
Wenn Du ohne Bibliothek einsteigen möchtest und Du Englisch verstehst, ist dies mein Favorit: Tutorial – Using DS1307 and DS3231 Real-time Clock Modules with Arduino

Ich habe mit diesem Text angefangen, weil es zumindest für mich leichter war, als so manche RTC-Bibliothek zu verstehen. Aber das hängt natürlich vom Vorwissen ab. Etwas bei jurs abschauen und etwas bei John Boxall sollte Dich zum Ziel führen :slight_smile:

Hehe danke mal wieder! Also mit der Uhr komme ich sowit klar. Aber werde mir den Link auch mal zu Gemühte führen :slight_smile: Ich habe mir jetzt mal nur die Stunden ausgeben lassen und Datum , Sekunden usw. weggelassen.
Somit bekomme ich gerade nur “16” ausgegeben, ihr werdet lachen aber so werde ich nicht unnötig verwirrt mit zig Zeilen Code (auch wenn er wahrscheinlich “einfach” ist)

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"


RTC_DS1307 rtc;

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!");
    // following line sets the RTC to the date & time this sketch was compiled
    // !!! auskommentiert rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    //rtc.adjust(DateTime(2016, 7, 5, 14, 26, 0));
  }
}

void loop () {
    DateTime now = rtc.now();
    
    Serial.print(now.hour(), DEC);
    Serial.println();
    delay(2000);
    
    
    

}

Jetzt bin ich dabei eine If-else Anweisung zu schreiben, mit einem Button der abfragt ob die Zeit = “16” ist, wenn ja

digitalWrite(StepPin, HIGH);

, wenn nein

digitalWrite(StepPin, LOW);

, meint ihr damit bin ich auf dem richtigen weg? Ich versuchs einfach mal, komme langsam, sehr langsam vorran aber merke dass ich immer ein bisschen weiter vorran komme.Danke schonmal. MfG

Jetzt bin ich dabei eine If-else Anweisung zu schreiben, mit einem Button der abfragt ob die Zeit = "16" ist

Ich verstehe jetzt nicht, was ein "Button" ist.

Was hältst du davon die LED_BUILTIN (üblicherweise Pin 13) leuchten zu lassen: Wenn die Stunde == 16 ist an, sonst aus.

Zum Testen würde ich erstmal natürlich lieber Sekunde statt Stunde nehmen, ist nicht so zeitraubend und erheblich spannender.

Die nächste Herausforderung wäre dann: im Bereich 8 bis 21 LED an, sonst aus.

Dann erstmal im setup deinen Schrittmotor per Endschalter auf einen gewünschte Anfangsposition fahren.

Die übernächste Herausforderung: je nach Phase (an /aus) deinen Schrittmotor langsam in die zugehörige Sollposition zu fahren und dort zu bleiben.

michael_x:
Ich verstehe jetzt nicht, was ein “Button” ist.

Was hältst du davon die LED_BUILTIN (üblicherweise Pin 13) leuchten zu lassen: Wenn die Stunde == 16 ist an, sonst aus.

Zum Testen würde ich erstmal natürlich lieber Sekunde statt Stunde nehmen, ist nicht so zeitraubend und erheblich spannender.

Die nächste Herausforderung wäre dann: im Bereich 8 bis 21 LED an, sonst aus.

Dann erstmal im setup deinen Schrittmotor per Endschalter auf einen gewünschte Anfangsposition fahren.

Die übernächste Herausforderung: je nach Phase (an /aus) deinen Schrittmotor langsam in die zugehörige Sollposition zu fahren und dort zu bleiben.

Heyho, mit Button meinte ich einen Schalter/taster, sry. Das mit der LED ist eine super Idee! xD Ja klar und dann werde ich es natürlich erstmal mit Sekunden testen! xD macht sonst wenig Sinn :slight_smile: Danke schonmal für die Anregungen! Ich werde berichten! MfG

Heyho, mit Button meinte ich einen Schalter/taster, sry

Das dachte ich mir schon, nur warum brachst du für dein großartigesifeinen Button/Schalter/taster ?

Viel Spass!

michael_x:
Das dachte ich mir schon, nur warum brachst du für dein großartigesifeinen Button/Schalter/taster ?

Viel Spass!

Ich dachte, dass es mit einer If-Else-Schleife ein einfacher weg wäre, im Prinzip zu sagen WENN der Wert 20 (Sekunde) dann HIGH ansonsten LOW, wie gesagt ich bin totaler Anfänger aber ich teste mal einfach rum, auch wenn ich bei Dir bestimmt starkes Kopfschütteln verursache :slight_smile: MfG

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

RTC_DS1307 rtc;

int GreenLedPin = 3;
int RedLedPin = 2;
int TasterPin = 13;

int MeinWert;

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(GreenLedPin,OUTPUT);
  pinMode(TasterPin,INPUT);
}

void loop(){

DateTime now = rtc.now();
    
    Serial.print(now.second(), DEC);
    Serial.println();
    delay(1000);
  
  if (now.second()==10 )
  {
  digitalWrite(GreenLedPin, HIGH);
  delay(1000);
  digitalWrite(GreenLedPin, LOW);
  }
  /*
  else if (now.second()==15 )
  {
  digitalWrite(GreenLedPin, LOW);
  }*/
}

So, das hab ich nun hinbekommen mit ner LED, und mit dem Motor wär das dann das gleiche Prinzip, also StepPin dann auf High oder Low? Danke schonmal, bin froh das ich wenigstens schonmal einen Schritt (auch wenns ein kleiner ist) weiter bin! MfG

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);


 

  }
    
    
    
    
}