Vielen Dank an Valen, ich habe jetzt die von dir beschriebenen Codestellen verbessert und siehe da der Kran läuft. Ich Stelle den fertigen Code nochmal rein. Ich habe jetzt auch die Erläuterungen von Valen verstanden und hoffe ich kann es mir merken.
//Kran der Calypso ansteuern
//1 Stepper und 1 DC Motor
#include <Stepper.h>
#include "TimerOne.h"
#define LED 7 //WarnLED Kran in Bewegung
int S1 = 4; //Starttaster von RC-Fernbedienung
int S2 = 6; //Endschalter Kran in Ruheposition
boolean Kranstart = false; //Kran Zustand- Variable
int SPMU1 = 32;
int RELAISAUF = 2; //Seil aufrollen
int RELAISAB = 3; //Seil abrollen
Stepper myStepper1(SPMU1,10,11,12,13); //Kran drehen
void setup() {
{
pinMode(LED, OUTPUT);
Timer1.initialize(200000); // initialize timer1, and set a 1/2 second period
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
Timer1.pwm(9, 512); // setup pwm on pin 9, 50% duty cycle
}
pinMode(S1,INPUT_PULLUP); // RC-Fernbedienung Eingang mit Pull-up
pinMode(S2,INPUT_PULLUP); // Taster Eingang mit Pull-up, in Ruheposition
pinMode(RELAISAUF,OUTPUT); // Relais für Seil AUF
pinMode(RELAISAB,OUTPUT); // Relais für Seil AB
myStepper1.setSpeed(400); // Steppermotor Kran drehen
Serial.begin(9600);
}
void callback(){
{
// Die LED blinkt unabhängig vom Programmcode in loop()
digitalWrite(LED, digitalRead(LED) ^ 1); // EXOR invertiert
}
}
void loop() {
Kranstart = (digitalRead(S1)==HIGH) && (digitalRead(S2)==HIGH); //Kran fertig zum Start, wenn S1 HIGH ist UND S2 HIGH ist.
Serial.print("Channell 1:");
Serial.println (digitalRead(S1));
Serial.print ("Channell 2:");
Serial.println(digitalRead(S2));
Serial.print ("Channell 3:");
Serial.println(Kranstart);
delay(500);
if (Kranstart == true){
digitalWrite(RELAISAUF,HIGH); // Seil auf Start
delay(2600);
digitalWrite (RELAISAUF, LOW); // Seil auf Stop
delay(2000);
myStepper1.step(-3600); // Kran ausdrehen (Winkel einstellen)
delay(2000);
digitalWrite (RELAISAB, HIGH); // Seil ab Start
delay(13000);
digitalWrite (RELAISAB, LOW); // Seil ab Stop
delay(20000); // Tauchtasse im Wasser (20sec)
digitalWrite (RELAISAUF, HIGH); // Seil auf Start
delay(13000);
digitalWrite (RELAISAUF, LOW); // Seil auf Stop
delay(2000);
myStepper1.step(3600); // Kran eindrehen
delay(3000);
digitalWrite (RELAISAB, HIGH); // Seil ab Start
delay(2600);
digitalWrite (RELAISAB, LOW); // Seil ab Stop
delay(5000);
}
else if (digitalRead(S2)==LOW){ // Kran nicht fertig zum Start
digitalWrite(RELAISAUF,HIGH); // Seil auf Start
delay(2600);
digitalWrite(RELAISAUF,LOW); // Seil auf Stop
delay(1000);
myStepper1.step(50); // Kran drehen bis S2 HIGH
delay(1000);
digitalWrite(RELAISAB,HIGH); // Seil ab Start
delay(2600);
digitalWrite(RELAISAB,LOW); // Seil ab Stop
delay(1000);
//digitalRead(S2==HIGH);
if(digitalRead(S2)==HIGH && digitalRead(S1)==LOW)
{
while((S1)==LOW); } // Warten bis zum neuen Programmstart
}
}
Soweit alles gut.
Wie kann ich die LED nur dann zum blinken bringen wenn der Kran sich bewegt?
Bringt es etwas die Delays mit Interrupts zu steuern? Im Moment kann ich die Zeiten sehr gut einzeln einstellen. Ich denke dem Programm ist es Wurst wo es seine Zeiten herbekommt.
Ich muss jetzt noch beobachten wie sich die Position vom Seil (Haken) verhält, nach mehreren Durchläufen. Falls sich die Position des Hakens sehr verschiebt muss ich mir da auch noch eine Abfrage der Grundstellung einfallen lassen. Vielleicht überwache ich den Haken mit einem Microschalter wenn er in oberster Position ist.
Ich habe noch die Taster von high auf low umgeschrieben und den Kran angeschlossen. Läuft!!!!!!!!!!!!!!!
Nochmals vielen Dank, besonders an Valen, für eure Hilfe.
Lesezeichen