Hallo Valen, erstmal vielen Dank an dich für deine Bemühung Ordnung in mein Programm(wenn man es so nennen will) zu bringen.
Ich werd mich jetzt ransetzen und versuchen deine Erklärungen zu übernehmen.
Druckbare Version
Hallo Valen, erstmal vielen Dank an dich für deine Bemühung Ordnung in mein Programm(wenn man es so nennen will) zu bringen.
Ich werd mich jetzt ransetzen und versuchen deine Erklärungen zu übernehmen.
Bodo hat mir in einem PB geantwortet, aber ich möchte das gerner in dieses Thema weiter Diskusieren. Zo können mehrere mitlesen, und vielleicht auch davon lernen.
Seine letzte bearbeite code (Asteriks entfernt)
Hilfe frage:Code://Kran der Calypso ansteuern
//1 Stepper und 1 DC Motor
#include <Stepper.h>
#include "TimerOne.h"
#define LED 7 //WarnLED Kran in Bewegung
#define S1 4 //Starttaster von RC-Fernbedienung
#define S2 6 //Endschalter Kran in Ruheposition
int valueRC = digitalRead(S1); //Signal von RC-Fernbedienung OK
int KranOK = digitalRead(S2); //Signal vom Endschalter Kran Ruhepostion OK
int Kranstart = digitalRead((S1)&&(S2)); //Kran fertig zum Start
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(100000); // 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); // Signal Kran starten von RC-Fernbedienung
digitalWrite(S1,HIGH);
pinMode(S2,INPUT_PULLUP); // Schalter Kran in Ruheposition
digitalWrite(S2,HIGH);
pinMode(RELAISAUF,OUTPUT);
pinMode(RELAISAB,OUTPUT);
myStepper1.setSpeed(400);
valueRC = digitalRead(S1);
KranOK = digitalRead(S2);
Kranstart = digitalRead((S1,HIGH)&&(S2,HIGH))==HIGH; //Kran fertig zum Start
if(Kranstart==HIGH)
digitalWrite(Kranstart,HIGH);
else(Kranstart,LOW);
digitalWrite(Kranstart,LOW);
//digitalWrite(Kranstart)= (S1,HIGH)&&(S2,HIGH)==HIGH;
}
void callback(){
{
// Die LED blinkt unabhängig vom Programmcode in loop()
digitalWrite(LED, digitalRead(LED) ^ 1); // EXOR invertiert
}
}
void loop(){
valueRC = digitalRead(S1); //Signal von RC-Fernbedienung OK
KranOK = digitalRead(S2); //Signal vom Endschalter Kran Ruhepostion OK
Kranstart = digitalRead(Kranstart); //Kran fertig zum Start
Serial.begin(9600);
Serial.print("Channell 1:");
Serial.println (valueRC);
Serial.print ("Channell 2:");
Serial.println(KranOK);
Serial.print ("Channell 3:");
Serial.println(Kranstart);
delay(500);
if (digitalRead(Kranstart)==HIGH){
digitalWrite(RELAISAUF,HIGH);
delay(2600);
digitalWrite (RELAISAUF, LOW);
delay(2000);
myStepper1.step(-3600); //Kran ausdrehen (Winkel einstellen)
delay(2000); //Warten
digitalWrite (RELAISAB, HIGH);
delay(13000); //Seil ab für 13 sec
digitalWrite (RELAISAB, LOW);
delay(20000);
digitalWrite (RELAISAUF, HIGH);
delay(13000);
digitalWrite (RELAISAUF, LOW);
delay(2000);
myStepper1.step(3600); //Kran eindrehen
delay(3000);
digitalWrite (RELAISAB, HIGH);
delay(2600);
digitalWrite (RELAISAB, LOW);
delay(5000);
}
else {
digitalWrite(RELAISAUF,HIGH);
delay(2600);
digitalWrite(RELAISAUF,LOW);
delay(2000);
myStepper1.step(S2==HIGH);
delay(2000);
}
{
while(Kranstart==HIGH);
}
}
Zitat:
Ich habe aber folgendes Problem:
Der Schalter S1 soll ein Schaltkontakt von der RC-Fernbedienung sein.
Der Schalter S2 ist der Endlageschalter am Kran.
Kranstart soll High sein wenn S1 und S2 High sind.
Ich komme hier nicht weiter!!!!
Der Kran fährt los ohne die Schalter zu beachten! Was mache ich falsch?
Beide Schalter wechseln aber den Zustand wenn der Kran losfährt!
S1 kommt nur kurz von der RC-Fernbedienung zu Start.
S2 wird Low wenn der Kran sich vom Endschalter wegbewegt.
Wie kann ich das Lösen?
Wie kann ich die ganzen Delays vermeiden? Wie funktioniert das mit den Interrupts?
Bodo, bitte sag mal, was meinst du mit Kranstart? Ist das ein Speicherplatz das ein Zustand andeuten soll. Oder ist das ein Nummer das ein Schalter-pin für ein bestimmter Signal andeuten soll? Weil du das auf beiden Arten verwendest:
zbs Zeile 44 und 45:
Wenn Kranstart die Integer Wert 1 hat ist es gleich an HIGH, und deshalb wird digitalWrite dann die D1 Pin((Serial TX) HIGH machen. Dass wurde doch nicht deine Bedeutung sein!?!Code:if(Kranstart==HIGH) /* Kranstart als Zustand Variabele */
digitalWrite(Kranstart,HIGH); //Kranstart als Pin-nummer ....
Etwas höher in dein Programm:
"Kran fertig zum Start" ... Das sollte also den Anfangszustand bedeuten, oder?Code:#define S1 4 //Starttaster von RC-Fernbedienung
#define S2 6 //Endschalter Kran in Ruheposition
...
int Kranstart = digitalRead((S1)&&(S2)); //Kran fertig zum Start
Theoretisch sollte hier nur ein Anfangswert gegeben werden als initialisierung von den Speicherplatzt. Und nicht schon ein Pin-Messung gemacht werden. Das sollte am frühsten in setup() passieren, nach das einstellen der PinModus. (Eingang/Eingang mit Pull-up/Ausgang)
(S1 && S2) wird als (4 && 6) ausgewertet beim Kompilieren. Weil && ein Boolean/Boolesch Und-Operator ist meint dass (TRUE UND TRUE), was naturlich TRUE ist. Und das wird für digitalRead als ein Integer Wert 1 ausgewertet, und so wird wieder die Ausgangszustand von den Serial TX Pin eingelesen (Pin Nummer 1).
In setup():
In meine Beitrag von gestern habe ich schon erklärt (hoffe ich, jedenfalls) das (S1,HIGH)&&(S2,HIGH) nicht stimmen kann mit deine Bedeutung. (Wenn ich das richtig verstehe) Das hat das gleiche Effekt als das Code Schnipsel hier oben.Code:Kranstart = digitalRead((S1,HIGH)&&(S2,HIGH))==HIGH; //Kran fertig zum Start
Dann wird das: Kranstart= ( digitalRead(1)==HIGH );
Als Logik-Formel stimmt das, Kranstart wird hier TRUE wenn digitalRead ein HIGH eingelesen hat. Aber für dein Boot Projekt ist das wieder Unsinn weil 1 das Falscher Pin Nummer ist. Genauer wurde:
Code:Kranstart = (digitalRead(S1)==HIGH) && (digitalRead(S2)==HIGH); //Kran fertig zum Start, wenn S1 HIGH ist UND S2 HIGH ist.
Am ende von setup():
Am Anfang von loop():Zitat:
if(Kranstart==HIGH) //Ist Kranstart ein Zustand?
digitalWrite(Kranstart,HIGH); // , ... oder Pin-nummer?
else (Kranstart,LOW); // else LOW; ... else 0; ... ??????
// Außerdem, achte auf das Punkt-Komma... hier kommt den else Befehl zu ende. Was hiernach kommt gehört nicht zu dem if-then-else!
digitalWrite(Kranstart,LOW); // Eben wenn die Zeile hier oben als "else Kranstart=LOW" gemeint ist, wieso danach noch die Pin LOW setzen?
Nicht fertig, ... Kranstart = Pin-zustand von Serial RX oder TX Pin (Gewählt durch S2 Pin-zustand)Code:KranOK = digitalRead(S2); //Signal vom Endschalter Kran Ruhepostion OK
Kranstart = digitalRead(Kranstart); //Kran fertig zum Start
Am ende von loop():
Wieder ein Endloss-schleife, wenn Kranstart gleich 1 ist, kommt das Programm niemals weiter als den Punkt-Komma. (Ausserhalb den callback function, Flickern soll der LED schon weiter machen) Wieso die While-schleife hier eigentlich? Was hat das für Effekt in deiner Meinung?Code:{
while(Kranstart==HIGH);
}
- - - Aktualisiert - - -
Oh ja, nicht ganz Falsch, sondern die digitalWrites sind unnötig:
in setup()
Die richtige Kommentar wurde sein: Pin S1 als Eingang mit internen Pull-up einstellen; zu RCFernbedienung 'Kran starten'.Code:pinMode(S1,INPUT_PULLUP); // Signal Kran starten von RC-Fernbedienung
Wieso Pin S1 als Ausgang auf HIGH setzen? Es ist gerade noch als Eingang eingestellt. Den Pull-up macht das schon HIGH.Code:digitalWrite(S1,HIGH);
Genau so wie oben bei S1: "Den Kran" oder "Den Schalter" ist nicht in Ruhe position. Sondern: diese Pin (zu dem Ruhe Position Schalter) ist eingestellt als Eingang (mit Pull-up)Code:pinMode(S2,INPUT_PULLUP); // Schalter Kran in Ruheposition
Genau so wie oben bei S1.Code:digitalWrite(S2,HIGH);
Darf ich annehmen du verstehst was die Funktion einer Pull-up Widerstand ist? Es macht die Pin zustand HIGH eben wenn es nicht zu einer zustand gezwungen wird durch Spannungen von angeschlossen Leitungen.
Hallo Valen, danke für deine Erläuterungen. Ich weiß und hab es auch geschrieben gehabt das ich keine Erfahrung mit dem programmieren hab. Das kranprojekt läuft nun mal und ich bin auf Hilfe angewiesen.
Ich werde mich nochmal ransetzen und rumprobieren. Deine Erläuterungen helfen mir auf jeden Fall sehr. Du kannst das sehr gut erklären und ich denke ich habe auch verstanden was du geschrieben hast. Sorry für die PN. Du hast recht es wollen ja alle etwas lernen oder mitdiskutieren. Ich setze den überarbeiteten Code dann wieder rein. S1 soll der schaltimpuls von der Fernsteuerung sein. Ist also nicht die gesamte Zeit an. S2 ist ein Schalter der anzeigt das der Kran in anfangsstellung steht, also bereit ist zum starten. Auch S2 geht aus wenn der Kran sich von der grundstellung wegbewegt. Kranstart soll das Signal für den Arduino sein das der Kran sein Programm abspielen soll. Ich muss also S1 und S2 Zwischenspeichern bis zum Ende des Programmes. Die while Schleife habe ich reingemacht damit der Kran das Programm nur einmal durchläuft. Der Kran soll nach Ende des Programmablaufes warten bis zum nächsten Signal zum starten. Wenn S 2 nicht high oder true ist dann soll der Kran zu dieser Position hinfahren. Nur S1 und S2 high oder true zusammen ergeben kranstart true. Die pullup Funktion an den Tastern S1 und S2 hab ich reingemacht damit ich jetzt beim probieren nicht mit widerstanden arbeiten muss.
Danke Bodo
Hallo Zusammen, Hallo Valen. Ich hab mich jetzt nochmal hingesetzt und versucht deine Erklärungen zu befolgen. Hier der Code:
Ich habe für mich serial Monitor mit reingeschrieben um zu sehen was meine Taster machen.Code:
//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 = digitalRead((S1)&&(S2)); //Kran fertig zum Start
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
}
digitalWrite(S1,HIGH); // Taster von RC-Fernbedienung
digitalWrite(S2,HIGH); // Taster Kran in Ruheposition
pinMode(RELAISAUF,OUTPUT); // Relais für Seil AUF
pinMode(RELAISAB,OUTPUT); // Relais für Seil AB
myStepper1.setSpeed(400); // Steppermotor Kran drehen
}
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.begin(9600);
Serial.print("Channell 1:");
Serial.println (digitalRead(S1));
Serial.print ("Channell 2:");
Serial.println(digitalRead(S2));
Serial.print ("Channell 3:");
Serial.println(digitalRead(Kranstart));
delay(50);
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 ((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(100); // 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((S2)==HIGH &&(S1)==LOW);{
while((S1)==HIGH); } // Warten bis zum neuen Programmstart
}
}
Jetzt funktioniert Kranstart ( wenn S1 und S2 sind HIGH), leider funktioniert das Warten auf den nächsten Programmstart nur wenn S1 und S2 High sind.
Es wechseln ja beide S1 und S2 in low wenn der Kran sich bewegt. S1 geht weg weil das Signal von der Ferbsteuerung nur zum Starten benötigt wird. S 2 wechselt in Low wenn der Kran sich dreht und kommt am ende des Programmes wieder wenn der Kran in Ruheposition gefahren ist.
wenn jetzt S2 high ist und S1 low fährt der Kran immer weiter zum Taster S2. wenn dann Taster S1 high gesetzt wird läuft Programm normal weiter.
Wo liegt der Fehler? Ich komme nicht drauf.
Danke Bodo
Sorry, aber ich seh nur Sterne!?
Die gesehenen Sterne kommen daher da ich die Leertaste benutze.
Bitte Recherchiere wie du das mit den Leertaste und * lösen kann. Weil das nicht normal ist. Ein Leertaste soll kein * anzeigen. Und es sehr ärgerlich wird wenn wir das jedes mal umsetzen müssen.
Das ist vielleicht eine Einstellung im Editor. Leerzeichen durch Tab ersetzen oder so was
Erstmal etwas wichtiges was noch nicht erklärt ist:
Welcher Zustand hat das Fernbedienung S1 signal wenn den Kran nicht ausgehen soll? Ist es im rühe(nicht starten) HIGH oder LOW? Mit Pull-ups wird das HIGH, aber was macht der Fernbedienung?
Von S2 Schalter-signal hast du schon in das Privat Bericht angegeben das es LOW wird/ist wenn es nicht mehr gegen die Endschalter steht.
Hier unter habe ich dein Programm aufgeteilt in Stückchen, und unterbrochen auf Stellen wo du etwas falsch macht oder wo ein Problem entsteht.:
Nein, S1 und S2 sind gerade als Pin-nummer definiert, aber die Pins sind noch nicht als Eingang eingestellt in setup(). Deshalb können wir nicht darauf verlassen das digitalRead die Schaltern richtig ausliest. Deshalb annehmen das die Kran nicht fertig ist. Es geht nur darum ein Fail-Safe anfangswert zu geben:Code://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 = digitalRead((S1)&&(S2)); //Kran fertig zum Start
Code:boolean Kranstart = false; //Kran Zustand-variabele
Wieder nein! S1 und S2 bezeichnen die Pins wo den Ruheposition-Schalter und Fernbedienung angeschlossen sind. Da kommen Signalen rein! Deshalb ist es sinnlos die als Ausgang zu benutzen. Diese 2 digitalWrite Befehlen sollen ausgetauscht werden durch pinMode Befehlen die S1 und S2 als Eingängen machen:Code:
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
}
// digitalWrite(S1,HIGH); // Taster von RC-Fernbedienung
// digitalWrite(S2,HIGH); // Taster Kran in Ruheposition
Code:pinMode(S1,INPUT_PULLUP); // RC-Fernbedienung Eingang mit Pull-up
pinMode(S2,INPUT_PULLUP); // Taster Eingang mit Pull-up, Kran in Ruheposition
Serial.begin gehört in den setup() Funktion. Nur wenn ein Programm die Serielle Port an/ausschalten möchtest, oder auf eine andere Baudtakt umstellen möchtest, sollte das irgendwo in ein weitere Funktion oder in den loop() Funktion vor kommen. Ein mal das Befehl ausführen soll hier reichen.Code:
pinMode(RELAISAUF,OUTPUT); // Relais für Seil AUF
pinMode(RELAISAB,OUTPUT); // Relais für Seil AB
myStepper1.setSpeed(400); // Steppermotor Kran drehen
}
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.begin(9600);
Kranstart ist kein Pin-nummer! Kann deshalb nicht an digitalRead gegeben werden als Parameter. Sonnst:Code:Serial.print("Channell 1:");
Serial.println (digitalRead(S1));
Serial.print ("Channell 2:");
Serial.println(digitalRead(S2));
Serial.print ("Channell 3:");
// Serial.println(digitalRead(Kranstart));
Code:Serial.println(Kranstart);
Was bedeutet ((S2)==LOW)? S2 ist als Pin-nummer Bezeichnung gemeint, und ist nur das Nummer 6. Das kann theoretisch nicht mit ein LOW Eingang-zustand verglichen werden. Dafür brauchen wir digitalRead(S2). Weil S2 und LOW im Gehirn von Arduino als ein Nummer geschrieben sind kann das Trotzdem kompiliert werden. Ist aber Kwatsch: "6==0".Code:
delay(50);
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 ((S2)==LOW);{ // Kran nicht fertig zum Start
Und else an-sich kann kein Bedingung haben. Für weitere Bedingungen sollte man mit ein neues if danach anfangen. ((S2)==LOW); wird nur als ein Vergleich-befehl ausgeführt, aber das Resultat wird ignoriert. Und den Punkt-Komma beendet den ese-Zweig. Das {} Code block danach steht also isoliert davon.
Besser:
Code:else if (digitalRead(S2)==LOW) { // Kran nicht im Ruheposition -> zurück drehen
Wieder Kwatsch! digitalRead braucht ein Pin Nummer als Parameter, du gibt ihn aber ein Logik-test wovon das Resultat entweder 1 oder 0 ist. Was versuchst du hier zu machen? S2 einlesen, oder HIGH machen?Code:
digitalWrite(RELAISAUF,HIGH); // Seil auf Start
delay(2600);
digitalWrite(RELAISAUF,LOW); // Seil auf Stop
delay(1000);
myStepper1.step(100); // 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);
Ich sehe kein digitalReads. Du vergleichst (6 gleich 1) und (4 gleich 0). Kwatsch-Logik, es ist nicht von den Elektronische Umwelt abhängig! Dazu, die Punkt-Komma ohne ein Befehl da vorne sagt das nichts gemacht werden soll. Die Code zwischen den {} danach ist deshalb wieder davon unabhängig.Code:// if((S2)==HIGH &&(S1)==LOW);{
Code:if(digitalRead(S2)==HIGH && digitalRead(S1)==LOW) {
Gehen wir mal davon aus das du das if-Befehl als Bedingung für das eintreten von den while-loop möchtest, und den Punkt-Komma am ende von das if-Befehl dort nicht steht. Dann stimmt das hier nicht. Die bedingung zur eintreten der while-schleife ist das S1 LOW sein soll. Aber den Bedingung in den while-schleife zu bleiben ist das S1 HIGH sein soll. Ist es nicht, deshalb endet den while-schleife gleich den erste mal. Warten tut es denn nicht.Code:while((S1)==HIGH); } // Warten bis zum neuen Programmstart
}
}
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.