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.:
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
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:
boolean Kranstart = false; //Kran Zustand-variabele
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
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:
pinMode(S1,INPUT_PULLUP); // RC-Fernbedienung Eingang mit Pull-up
pinMode(S2,INPUT_PULLUP); // Taster Eingang mit Pull-up, Kran in Ruheposition
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);
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:
Serial.print("Channell 1:");
Serial.println (digitalRead(S1));
Serial.print ("Channell 2:");
Serial.println(digitalRead(S2));
Serial.print ("Channell 3:");
// Serial.println(digitalRead(Kranstart));
Kranstart ist kein Pin-nummer! Kann deshalb nicht an digitalRead gegeben werden als Parameter. Sonnst:
Code:
Serial.println(Kranstart);
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
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".
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
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);
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:
// if((S2)==HIGH &&(S1)==LOW);{
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(digitalRead(S2)==HIGH && digitalRead(S1)==LOW) {
Code:
while((S1)==HIGH); } // Warten bis zum neuen Programmstart
}
}
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.
Lesezeichen