Fehler im Sketch? aber wo?

Guten Tag,
ich sitze gerade an einem Sketch, der einen Schrittmotor immer um einen Schritt bewegen soll. Während der Stillstandphase soll ein Relais schalten und eine LED anschalten (LED nur zur Pribe für mein eigentliches Projekt). Allerdings schaltet das Relais am Anfang nur einmal, die LED bleibt an. Der Schrittmotor macht wie gewollt seine Schritte.
Mit einem anderen Sketch funktioniert das Relais, die Verkabelung ist also korrekt. Es muss ein Fehler in meinem Code vorliegen. Vielleicht kann mir jemand sagen, wo der Fehler liegt. Ich finde ihn bis jetzt nicht.

Danke
Gruß

int DIR=4;
int PUL=5;
int ENA=6;
int Schritte;
float w;
int relais=8;
int SchrittmotorStatus;
int KontrollLED=10;


void setup(){
Serial.begin(9600);

pinMode(DIR,OUTPUT); //Direction
pinMode(PUL,OUTPUT); //Puls
pinMode(ENA,OUTPUT); //Enable
pinMode(relais,OUTPUT);
pinMode(KontrollLED,OUTPUT); // Leuchtet während des gesamten Messvorganges

digitalWrite(ENA,LOW);


}


void Schrittmotor (){
digitalWrite(PUL,HIGH);
delay(500);
digitalWrite(PUL,LOW);
delay(500);
}


void Relais(){
  SchrittmotorStatus = digitalRead(PUL);
  if (SchrittmotorStatus == LOW)
    digitalWrite(relais, HIGH);
  else
    digitalWrite(relais, LOW);
}

void KontrollLampe(){
  if(Schritte<201){
    digitalWrite(KontrollLED,HIGH);
  }
  else{
    digitalWrite(KontrollLED,LOW);
  }
}
void loop()
{


digitalWrite(DIR,LOW); //Drehung im Uhrzeigersinn

for(Schritte= 1, w=1.8; Schritte <201; Schritte++, w+=1.8) //Schleife: 200Schritte/360° Drehung
{
KontrollLampe ();
Schrittmotor();
Relais();

Serial.print("Schritt: ");
Serial.print(Schritte);
Serial.print(" Winkel: ");
Serial.print(w);
Serial.println("°");


}
}

Ich habe versucht Funktionen einzubauen, um den loop Teil aufzuräumen, ich vermute den Fehler irgendwo in diesem Zusammenhang

Du rufst die Funktion nur in der Schleife auf, die sicherstellt, dass Schritte immer zwischen 1 und 201 liegt. Damit ist die Bedingung immer wahr und die Lampe brennt.

Das kommt immer nach Schrittmotor sodass PUL immer LOW ist. Das einmalige Relaisklackern wird wohl von der Initialisierung herkommen (einmal von LOW auf HIGH für das Relais).

Wie kann ich das beheben ?

Kann ich Dir nicht sicher sagen, weil ich noch nicht verstanden habe wann das Relais an- und wieder abgeschaltet werden soll. Anders formuliert: Ich sehe den Zusammenhang zwischen dem PUL-Signal (das vermutlich den Schrittmotor einen Tick weitertreibt) und dem Relais nicht.

Nach jedem Schritt ein HIGH/LOW-Zyklus? Dann brauchst Du die Abfrage m.E. gar nicht. Der Schrittmotor hat gerade seinen Schritt gemacht, danach kommt das Relais.

"Anderer Code" ist gut...
Da wird wohl das Relais während der Schrittmotoransteuerung "mitgeschalten".

Durch das delay() in der Schrittmotorfunktion kommst Du nie in den Zustand:

  else
    digitalWrite(relais, LOW);
}

Du bist - während der Schrittmotorfunktion - für eine Sekunde komplett blind.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.