First sketch ok? Fensteröffner- Uno, Nema17., DRV8825, Microswitches.

Hi,

bin ganz neu im Forum und blutiger Arduinoanfänger.

Mit dem einschalten/ausschalten einer Lüftungsanlage soll ein Fenster öffnen/schließen.

Mein erstes Arduinoprojekt besteht aus: Uno (clone), DRV8825, 17HS19-2004S1, 2St. Endstopschalter

Dazu habe ich einen Sketch gebastelt.
Als absoluter Anfänger suche ich Kritik/Verbesserungsvorschlägen.
lg

#include <Arduino.h>
#include "DRV8825.h"
#define MOTOR_STEPS 200
#define DIR 8
#define STEP 9
#define MODE0 10
#define MODE1 11
#define MODE2 12
DRV8825 stepper(MOTOR_STEPS, DIR, STEP, MODE0, MODE1, MODE2);
int a = 5; //lüftung.einaus LOW=ein,HIGH=aus;
int as = 0;
int b = 6; //microswitch.fenstergeschlossen LOW=fenstergeschlossen
int bs = 0;
int c = 7; //microswitch.fensteroffen LOW=fensteroffen
int cs = 0;

void setup()
{ stepper.setRPM(10);
  stepper.setMicrostep(32);
  pinMode(a, INPUT);
  pinMode(b, INPUT);
  pinMode(c, INPUT);
}
void loop()
{
  as = digitalRead(a);
  bs = digitalRead(b);
  cs = digitalRead(c);
  if ((as == LOW) && (bs == LOW) && (cs == HIGH))                //  fenster=geschlossen->lüftung=ein;
    stepper.move(200 * 32);                                                      //  stepper=öffnet.fenster
  if ((as == LOW) && (bs == HIGH) && (cs == HIGH))//100          //  lüftung=ein;stepper=öffnet.fenster
    stepper.move(200 * 32);                                                       //  ...
  if ((as == LOW) && (bs == HIGH) && (cs == LOW))//101          //  lüftung=ein;fenster=offen->
    stepper.move(0 * 32);                                                       //  stepper=0schritte
  if ((as == HIGH) && (bs == HIGH) && (cs == LOW))//001          //  lüftung=aus->stepper=schließt.fenster
    stepper.move(-200 * 32);                                                     //  ...
  if ((as == HIGH) && (bs == HIGH) && (cs == HIGH))//000         //  lüftung=aus->stepper=schließt.fenster
    stepper.move(-200 * 32);                                                     //  ...
  if ((as == HIGH) && (bs == LOW) && (cs == HIGH))//010          //  lüftung=aus;fenster=geschlossen
    stepper.move(0 * 32);
}

hast du an deinen Mikroschaltern Pulldown Widerstände? ansonsten könntest du die internen Pullup Widerstände verwenden, dann müsstest du nur deine Logik umdrehen
Deine Variablendeklaration könnte besser so aussehen:

#include "DRV8825.h"
#define MOTOR_STEPS 200
#define DIR 8
#define STEP 9
#define MODE0 10
#define MODE1 11
#define MODE2 12
DRV8825 stepper(MOTOR_STEPS, DIR, STEP, MODE0, MODE1, MODE2);
const int a = 5; //lüftung.einaus LOW=ein,HIGH=aus;
bool as = 0;
const int b = 6; //microswitch.fenstergeschlossen LOW=fenstergeschlossen
bool bs = 0;
const int c = 7; //microswitch.fensteroffen LOW=fensteroffen
bool cs = 0;

Was hab ich davon?... fragt sich der Noob.
Vielleicht kann jemand kurz erklären, was es damit auf sich hat.
Aller Anfang ist schwer! Je mehr ich lese...desto verwirrter werde ich XD

Die Schalter...mhh..tja..es sind rote XD Ich mache ein Bild!
Ist der Schalter gedrückt, dann sind 0v auf der Signalleitung

Ist das Fenster geschlossen und Schalter b gedrückt.
Oder eben offen und Schalter c gedrückt.
hmm..ein Schalter mal nicht angefahren und der Stepper läuft Stundenlang gegen das geschlossene oder offene Fenster an.

Was machen Treiber und Stepper bei "stepper.move(0 * 32)"
Der Stepper "hält fest" bei "stepper.move(0 * 32)".
Für Treiber und Stepper ok und für 24/7 geeignet??

Hinweise zu geeigneten Lösungsansätzen und was sonst noch wichtig ist, sind sehr willkommen. Ich verliere grad den Überblick..

Taugt der Sketch? Lieber anders ansetzen?

lg

Ok Pullupwiderstände sind auf der Platine.

stepper.move(0 * 32); gibt dem Stepper eine gewisse anzahl von impulsen damit dieser diese Anzahl von schritten weiterdreht. Bei 0*32 sind das 0, in Worten NULL Schritte. Der Motor hält auch ohne diesen Funktionsaufruf fest.

Ein Schrittmotor ist immer Stromdurchflossen. Bei Deiner Anwendung ist das möglich aber wenig sinnvoll.

Grüße Uwe

Moin

uwefed:
Ok Pullupwiderstände sind auf der Platine.

; gibt dem Stepper eine gewisse anzahl von impulsen damit dieser diese Anzahl von schritten weiterdreht. Bei 0*32 sind das 0, in Worten NULL Schritte. Der Motor hält auch ohne diesen Funktionsaufruf fest.

Ein Schrittmotor ist immer Stromdurchflossen. Bei Deiner Anwendung ist das möglich aber wenig sinnvoll.

Grüße Uwe

Sollte ich stepper.move(0 * 32) nehmen, um den Stepper zu "stoppen und halten" zu lassen? Oder gibt es bessere/elegantere Wege für "stoppen und halten"?

Bisher kenne ich nur
stepper.move(x * 32) mit x!=0 --> "linksdrehen" oder "rechtsdrehen"
x=0 --> "stoppen und halten"
Wie bringe ich den Stepper zu --> "stoppen und nichthalten"?

stepper.move(0*32) //Das Fenster ist "geschlossen" und wird "gehalten"
"as" ändert Status //Einschalten der Belüftungdsanlage
stepper.move((x>0)*32) //öffnet das Fenster

Könnte ich auf die Schalter verzichten? So in etwa..
Angenommen jedes x öffnet/schließt das Fenster um 1mm
"as" verändert sich// Belüftungsanlage schaltet sich ein und ändert den Status an pin5
stepper.move(5032) //öffnet das Fenster um 50mm
stepper.move(0
32 )//"stoppt" den Stepper und "hält" das Fenster offen
"as" verändert sich// Belüftungsanlage schaltet sich aus und ändert den Status an pin5
stepper.move(-5032) //öffnet das Fenster um 50mm
stepper.move(0
32 )//"stoppt" den Stepper und "hält" das Fenster geschlossen

lg

Du brauchst gar nichts zu machen damit der Motor stillsteht; einfach keine Schritte augeben.
Grüße Uwe