Forum: Mikrocontroller und Digitale Elektronik Arduino Nano Loop "hängt"


von Mario S. (mariost)


Lesenswert?

Hallo,

ich glaube ich stehe auf einem dicken Schlauch...

Kann mir Jemand sagen was an diesem Code falsch ist, dass er nicht 
funktioniert?

Wenn ich den Nano mit Strom versorge sind alle drei Relais angezogen...

Die Endschalter habe ich per Serial.print schon überprüft, diese 
funktionieren und alle anderen Eingänge sind mit einem Widerstand auf 
Masse gezogen.
1
#include <RCSwitch.h>
2
 
3
RCSwitch mySwitch = RCSwitch();
4
5
6
int K1 = 4;//Tor auf
7
int K2 = 5;//Tor zu
8
int K3 = 6;//12v
9
int S1 = 12;//Tor offen
10
int S2 = 11;//Tor geschlossen
11
int Fhem_Tor_auf = 9;
12
int Fhem_Tor_zu =10;
13
int Tor_offen_an_Fhem=7;
14
int Tor_zu_an_Fhem=8;
15
16
int value_S1=0;
17
int value_S2=0;
18
int value_Fhem_Tor_auf=0;
19
int value_Fhem_Tor_zu=0;
20
int value_Tor_offen_an_Fhem=0;
21
int value_Tor_zu_an_Fhem=0;
22
int value_FFB=0;
23
 
24
25
void setup() {
26
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2 
27
 pinMode(K1,OUTPUT);
28
 pinMode(K2,OUTPUT);
29
 pinMode(K3,OUTPUT);
30
 pinMode(S1,INPUT);
31
 pinMode(S2,INPUT);
32
 pinMode(Tor_offen_an_Fhem,OUTPUT);
33
 pinMode(Tor_zu_an_Fhem,OUTPUT);
34
 pinMode(Fhem_Tor_auf,INPUT);
35
 pinMode(Fhem_Tor_zu,INPUT);
36
 
37
 Serial.begin(9600);
38
}
39
void loop() {
40
value_S1=digitalRead(S1);
41
value_S2=digitalRead(S2);
42
value_Fhem_Tor_auf=digitalRead(Fhem_Tor_auf);
43
value_Fhem_Tor_zu=digitalRead(Fhem_Tor_zu);
44
value_FFB=mySwitch.getReceivedValue();
45
46
47
  //////////////////////////TOR AUF////////////////////////////////////////////////////////////////
48
 if ((value_Fhem_Tor_auf==1)||(value_FFB==1234567)&&(value_S2==1)) {
49
 
50
       digitalWrite(K1,LOW);  
51
       digitalWrite(K3,LOW);
52
     }
53
    else{
54
      if ((value_S1==1)&&(value_FFB==0)&&(value_Fhem_Tor_auf==1)){digitalWrite(K1,HIGH);digitalWrite(K3,HIGH);}
55
      }
56
  
57
  /////////////////////////////TOR ZU///////////////////////////////////////////////////////////////
58
59
 if ((value_Fhem_Tor_zu==1)||(value_FFB==1234567)&&(value_S1==1)) {
60
 
61
       digitalWrite(K2,LOW);  
62
       digitalWrite(K3,LOW);
63
     }
64
     else{
65
      if ((value_S2==1)&&(value_FFB==0)&&(value_Fhem_Tor_zu==1)){digitalWrite(K2,HIGH);digitalWrite(K3,HIGH);}
66
     }
67
}

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Mario S. schrieb:
> Kann mir Jemand sagen was an diesem Code falsch ist, dass er nicht
> funktioniert?

 Dass du keine definierten Zustände am Anfang hast ?
 Dass keine von deinen if-else Abfragen zutreffen muss ?

 Und wie wäre es wenn du zuerst ohne RCSwitch probierst ?
 Schalterzustände und Eingänge per Serial.print ausgeben.

: Bearbeitet durch User
von W.A. (Gast)


Lesenswert?

Mario S. schrieb:
> Kann mir Jemand sagen was an diesem Code falsch ist, dass er nicht
> funktioniert?

Vielleicht liegt es auch an der Art der Ansteuerung deiner Relais - die 
Software ist nicht immer schuld.

von PittyJ (Gast)


Lesenswert?

Vielleicht in Setup schon mal die K1..K3 auf defaults setzen?

Ansonsten ist Serial.println() dein Freund.

von Mario S. (mariost)


Lesenswert?

Marc V. schrieb:
> Dass du keine definierten Zustände am Anfang hast ?
>  Dass keine von deinen if-else Abfragen zutreffen muss ?

Ist es so richtig?
1
#include <RCSwitch.h>
2
 
3
RCSwitch mySwitch = RCSwitch();
4
5
6
int K1 = 4;//Tor auf
7
int K2 = 5;//Tor zu
8
int K3 = 6;//12v
9
int S1 = 12;//Tor offen
10
int S2 = 11;//Tor geschlossen
11
int Fhem_Tor_auf = 9;
12
int Fhem_Tor_zu =10;
13
int Tor_offen_an_Fhem=7;
14
int Tor_zu_an_Fhem=8;
15
16
int value_S1=0;
17
int value_S2=0;
18
int value_Fhem_Tor_auf=0;
19
int value_Fhem_Tor_zu=0;
20
int value_Tor_offen_an_Fhem=0;
21
int value_Tor_zu_an_Fhem=0;
22
int value_FFB=0;
23
 
24
25
void setup() {
26
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2 
27
 pinMode(K1,OUTPUT);
28
 pinMode(K2,OUTPUT);
29
 pinMode(K3,OUTPUT);
30
 pinMode(S1,INPUT);
31
 pinMode(S2,INPUT);
32
 pinMode(Tor_offen_an_Fhem,OUTPUT);
33
 pinMode(Tor_zu_an_Fhem,OUTPUT);
34
 pinMode(Fhem_Tor_auf,INPUT);
35
 pinMode(Fhem_Tor_zu,INPUT);
36
digitalWrite(K1,HIGH);
37
digitalWrite(K2,HIGH);
38
digitalWrite(K3,HIGH);
39
 Serial.begin(9600);
40
}
41
void loop() {
42
value_S1=digitalRead(S1);
43
value_S2=digitalRead(S2);
44
value_Fhem_Tor_auf=digitalRead(Fhem_Tor_auf);
45
value_Fhem_Tor_zu=digitalRead(Fhem_Tor_zu);
46
value_FFB=mySwitch.getReceivedValue();
47
48
49
  //////////////////////////TOR AUF////////////////////////////////////////////////////////////////
50
 if ((value_Fhem_Tor_auf==1)||(value_FFB==1234567)&&(value_S2==1)) {
51
 
52
       digitalWrite(K1,LOW);  
53
       digitalWrite(K3,LOW);
54
     }
55
    else{
56
      if ((value_S1==1)&&(value_FFB==0)&&(value_Fhem_Tor_auf==1)){digitalWrite(K1,HIGH);digitalWrite(K3,HIGH);}
57
      }
58
  
59
  /////////////////////////////TOR ZU///////////////////////////////////////////////////////////////
60
61
 if ((value_Fhem_Tor_zu==1)||(value_FFB==1234567)&&(value_S1==1)) {
62
 
63
       digitalWrite(K2,LOW);  
64
       digitalWrite(K3,LOW);
65
     }
66
     else{
67
      if ((value_S2==1)&&(value_FFB==0)&&(value_Fhem_Tor_zu==1)){digitalWrite(K2,HIGH);digitalWrite(K3,HIGH);}
68
     }
69
}

Was ist damit gemeint dass keine abfrage zutreffen muss?

Die Relais ist die 4 Kanal Relaiskarte für Arduino.

: Bearbeitet durch User
von Michael U. (amiga)


Lesenswert?

Hallo,

PittyJ (Gast) hat doch schon darqauf hingewiesen.
Debugge doch mit den vorhandenen Möglichkeiten.
Gib Dir die Variablenwerte aus, gib einen Hinweistext innerhalb Deiner 
Abfragen aus usw.
Dann weißt Du in 5 Minuten mit welchen Werten er in die Abfragen geht, 
ob er im IF oder ELSE-Zweig gelandet ist usw.

Sowas kann man doch in kürzester Zeit eingrenzen.
1
  //////////////////////////TOR AUF////////////////////////////////////////////////////////////////
2
 if ((value_Fhem_Tor_auf==1)||(value_FFB==1234567)&&(value_S2==1)) {
3
 
4
       Serial.println("1. IF");
5
       digitalWrite(K1,LOW);  
6
       digitalWrite(K3,LOW);
7
     }
8
    else{
9
       Serial.println("1. ELSE");
10
      if ((value_S1==1)&&(value_FFB==0)&&(value_Fhem_Tor_auf==1)){
11
        Serial.println("2. IF");
12
        {digitalWrite(K1,HIGH);digitalWrite(K3,HIGH);}
13
        }
14
      }
15
  
16
  /////////////////////////////TOR ZU///////////////////////////////////////////////////////////////

Gruß aus Berlin
Michael

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Mario S. schrieb:
> Was ist damit gemeint dass keine abfrage zutreffen muss?

 Nichts schlimmes, nur:
 Wenn S1==0 und S2==0 werden die Befehle in if..else nie ausgeführt,
 unabhängig von anderen Bedingungen.
 Falls deine Relais mit HIGH eingeschaltet werden, bleiben diese mit
 S1==0 und S2==0 für immer eingeschaltet. Sollten die Relais mit
 S1 oder S2 ausgeschaltet werden, dann probiere es mal ohne Schalter
 aber mit Delay von etwa 1s diese im Programm auf bestimmte Werte zu
 setzen.
 Also, je nachdem was du erwartest, dass dein Programm tun soll, die
 S1 und S2 auf 0 oder 1 setzen, value_Fhem_Tor_auf und value_Fhem_Tor_zu
 auf 0 oder 1 setzen, value_FFB zuerst ganz raus.
 Zwischen Zustandswechel (per Programm, alles ist abgeklemmt) einen
 Delay von 1s, damit du es auch merkst. Mit serial.print Zustände aller
 Schalter/Eingänge/Relais ausgeben.
 Dann kannst du auch sehen was dein Programm macht und warum.

: Bearbeitet durch User
von Mario S. (mariost)


Lesenswert?

Ich danke euch für die Denkanstöße :-D

Funktioniert hat es erstmal bis zu dem Moment als das Netzteil für den 
Nano den dienst verweigert hat :-(


Hat eventuell noch jemand Verbesserungsvorschläge?

1
#include <RCSwitch.h>
2
 
3
RCSwitch mySwitch = RCSwitch();
4
5
6
int K1 = 4;//Tor auf
7
int K2 = 5;//Tor zu
8
int K3 = 6;//12v
9
int S1 = 12;//Tor offen
10
int S2 = 11;//Tor geschlossen
11
int Fhem_Tor_auf = 9;
12
int Fhem_Tor_zu =10;
13
int Tor_offen_an_Fhem=7;
14
int Tor_zu_an_Fhem=8;
15
16
int value_S1=0;
17
int value_S2=0;
18
int value_Fhem_Tor_auf=0;
19
int value_Fhem_Tor_zu=0;
20
int value_Tor_offen_an_Fhem=0;
21
int value_Tor_zu_an_Fhem=0;
22
int value_FFB=0;
23
int counter_auf=0;
24
int counter_zu=0;
25
26
void setup() {
27
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin #2 
28
 pinMode(K1,OUTPUT);
29
 pinMode(K2,OUTPUT);
30
 pinMode(K3,OUTPUT);
31
 pinMode(S1,INPUT);
32
 pinMode(S2,INPUT);
33
 pinMode(Tor_offen_an_Fhem,OUTPUT);
34
 pinMode(Tor_zu_an_Fhem,OUTPUT);
35
 pinMode(Fhem_Tor_auf,INPUT);
36
 pinMode(Fhem_Tor_zu,INPUT);
37
digitalWrite(K1,HIGH);
38
digitalWrite(K2,HIGH);
39
digitalWrite(K3,HIGH);
40
 Serial.begin(9600);
41
}
42
void loop() {
43
value_S1=digitalRead(S1);
44
value_S2=digitalRead(S2);
45
value_Fhem_Tor_auf=digitalRead(Fhem_Tor_auf);
46
value_Fhem_Tor_zu=digitalRead(Fhem_Tor_zu);
47
48
 if (mySwitch.available()) 
49
  {int value=mySwitch.getReceivedValue();
50
  value_FFB=mySwitch.getReceivedValue();
51
mySwitch.resetAvailable();
52
  }
53
  
54
  //////////////////////////TOR AUF////////////////////////////////////////////////////////////////
55
 if ((value_S1==0)&&(value_Fhem_Tor_auf==1)||(value_FFB==452)&&(value_S2==1)){counter_auf=1;}
56
 if ((value_S1==1)&&(value_S2==0)) {counter_auf=0;    }
57
if (counter_auf==1) {digitalWrite(K1,LOW); digitalWrite(K3,LOW);}
58
   else{digitalWrite(K1,HIGH);    }
59
      
60
  
61
  /////////////////////////////TOR ZU///////////////////////////////////////////////////////////////
62
63
 if ((value_S2==0)&&(value_Fhem_Tor_zu==1)||( value_FFB==452)&&(value_S1==1)) {(counter_zu=1);}
64
 if ((value_S2==1)&&(value_S1==0)) {counter_zu=0; }
65
 if (counter_zu==1){digitalWrite(K2,LOW);digitalWrite(K3,LOW);}
66
     else{digitalWrite(K2,HIGH);    }
67
     
68
69
//////////////////////////////////K3//////////////////////////////////////////
70
if ((counter_zu==0)&&(counter_auf==0)) {digitalWrite(K3,HIGH);}
71
      value_FFB=0;
72
  }

von avr (Gast)


Lesenswert?

Mario S. schrieb:
> Hat eventuell noch jemand Verbesserungsvorschläge?

Ja. Formatierung! So wie das da steht, schaue ich mir den Code gar nicht 
erst an und damit bin ich hier sicherlich nicht alleine im Forum. Der 
Code ist alles andere als einfach lesbar. Verwende mal mehr Leerzeichen 
und Zeilen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Mario S. schrieb:
> Hat eventuell noch jemand Verbesserungsvorschläge?

 Ja.
 a) Mach es mit switch..case, so wie ich das sehe,
    sind nur 3 Zustände möglich:
    1. Tor geht auf oder zu
    2. Tor offen
    3. Tor geschlossen
    Dann versucht man sich eine Logiktabelle zu schreiben, mit
    allen möglichen Zuständen und dementsprechend so wenige
    Variablen wie möglich zu deklarieren.

 b) Überflüssige Vergleiche bei Abfragen rausschmeissen z.B.:
1
     if ((value_S1==1)&&(value_S2==0)) {counter_auf=0;    }
    Wenn S1 und S2 Endschalter sind, können die nicht gleichzeitig
    geschlossen sein, bzw. wenn einer geschlossen ist, muss der andere
    offen sein. So etwas fragt man am Anfang ab und meldet einen Fehler
    wenn dies doch nicht der Fall sein sollte.

 c) Den Variablen sinnvolle Namen geben. Was S1 oder K1 ist, weiss ja
    keiner ausser dir. Müssen ja nicht übermässig lang sein.
    sOffen und sZu sind besser als S1 und S2, oder ?
    rTorAuf und rTorZu sind besser als K1 und K2, oder ?
    rStromAn ist besser als K3, oder ?
    Oder so ähnlich...

 d) Was Tor_offen_an_Fhem, Tor_zu_an_Fhem, Fhem_Tor_zu und
    Fhem_Tor_auf ist, ist mir immer noch nicht klar. Wenn schon so
    komische Namen, dann mit Kommentar klären.

 e) Und natürlich die Formatierung (Einrücken).

von Mario S. (mariost)


Lesenswert?

Hallo Zusammen,

sorry hatte wenig zeit zum basteln.

Bin nun ein ganzes Stück weiter gekommen.

Motor für Torantrieb Wird jetzt mit PWM angesteuert und die Zähne von 
dem Zahnrad welches die Kette antreibt werden gezählt.

1. Ist die Formatierung so besser?

2. Die Sache mit switch..case habe ich noch nicht ganz verstanden:-(

3. Ich muss leider mit K1 usw arbeiten, da ich auch arbeitstechnisch mit 
diesen Bezeichnungen umgehe und daher wieder umdenken müsste.

4.  "Tor_offen_an_Fhem, Tor_zu_an_Fhem, Fhem_Tor_zu" Fhem ist die 
Oberfläche meiner Haussteuerung, da mir in dem Fhem Forum leider niemand 
eine Antwort darauf geben kann ob mann einen Arduino Mega mit 
Configurable Firmata und einen Mega, Uno oder Nano mit eigenen Programm 
Seriell verbinden kann muss ich bisher Digital Pin´s schalten um 
Zustände weiter zu geben.













#include <RCSwitch.h>

RCSwitch mySwitch = RCSwitch();


int PWM_AUF = 5; //  IBT2 PIN 1
int PWM_ZU = 6; // IBT2 PIN 2
int K1 = 4;//12v
int S3 = 7;//Schalter Tor auf/zu an HCG
int Initiator_1 = 10; // Initiator am Zahnrad
int S1 = 12;//Tor offen
int S2 = 11;//Tor geschlossen
int Fhem_Tor_auf = 9;
int Fhem_Tor_zu = 3;
int Tor_offen_an_Fhem = 7;
int Tor_zu_an_Fhem = 8;

int value_S1 = 0;
int value_S2 = 0;
int value_S3 = 0;
int value_In1 = 0;
int value_Fhem_Tor_auf = 0;
int value_Fhem_Tor_zu = 0;
int value_Tor_offen_an_Fhem = 0;
int value_Tor_zu_an_Fhem = 0;
int value_FFB = 0;
int counter_auf = 0;
int counter_zu = 0;
int val;
int buttonState;
int buttonPresses = 0;
int vals = 1023;
int vall = 370;



//////////////////////////////////////////////////////////////////////// 
////////////////////////////////////////////
void setup() {
  mySwitch.enableReceive(0);  // Receiver on inerrupt 0 => that is pin 
#2
  pinMode(PWM_AUF, OUTPUT);
  pinMode(PWM_ZU, OUTPUT);
  pinMode(K1, OUTPUT);
  pinMode(S1, INPUT);
  pinMode(S2, INPUT);
  pinMode(S3, INPUT);
  pinMode(Initiator_1, INPUT);
  pinMode(Tor_offen_an_Fhem, OUTPUT);
  pinMode(Tor_zu_an_Fhem, OUTPUT);
  pinMode(Fhem_Tor_auf, INPUT);
  pinMode(Fhem_Tor_zu, INPUT);
  digitalWrite(K1, HIGH);
  Serial.begin(9600);
}

//////////////////////////////////////////////////////////////////////// 
/////////////////////////////////////////////////
void loop() {
  value_S1 = digitalRead(S1);
  value_S2 = digitalRead(S2);
  value_S3 = digitalRead(S3);
  value_In1 = digitalRead(Initiator_1);
  value_Fhem_Tor_auf = digitalRead(Fhem_Tor_auf);
  value_Fhem_Tor_zu = digitalRead(Fhem_Tor_zu);
  val = value_In1;




  if (mySwitch.available())
  { int value = mySwitch.getReceivedValue();
    value_FFB = mySwitch.getReceivedValue();
    mySwitch.resetAvailable();
  }
  Serial.println(buttonPresses);



  //////////////////////////TOR 
AUF////////////////////////////////////////////////////////////////
  if ((buttonPresses == 0) && (value_S1 == 0) && (value_Fhem_Tor_auf == 
1) || (value_S3 == 1) || (value_FFB == 452)) {
    counter_auf = 1;
  }

  if (buttonPresses == 159) {
    counter_auf = 0;
  }

  if (counter_auf == 1) {
    AUF();
    if (val != buttonState)
    {
      if (val == LOW)
      {
        buttonPresses++;
      }
    }
    buttonState = val;
    digitalWrite(K1, LOW);
  }
  else
  {
    analogWrite(PWM_AUF, 0);
  }
  /////////////////////////////TOR 
ZU///////////////////////////////////////////////////////////////

  if ((buttonPresses == 159) && (value_S2 == 0) && (value_Fhem_Tor_zu == 
1) || (value_S3 == 1) || ( value_FFB == 452)) {
    (counter_zu = 1);
  }

  if ((buttonPresses == 0)) {
    counter_zu = 0;
  }

  if (counter_zu == 1) {
    ZU();

    if (val != buttonState)
    {
      if (val == LOW)
      {
        buttonPresses--;
      }
    }
    buttonState = val;

    digitalWrite(K1, LOW);
  }

  else
  {
    analogWrite(PWM_ZU, 0);
  }





  //////////////////////////////////K3//////////////////////////////////// 
//////
  if ((counter_zu == 0) && (counter_auf == 0)) {
    digitalWrite(K1, HIGH);
  }
  value_FFB = 0;
}


//////////////////////////////////////////////////////////////////////// 
//////////////////////////////
void ZU()
{


  if (buttonPresses > 100) {
    analogWrite(PWM_ZU, 400); Serial.print("wwwwwwwww");
  }
  if (buttonPresses < 100) {
    analogWrite(PWM_ZU, 1023); Serial.print("kkkkkkkkkk");
  }
}

//////////////////////////////////////////////////////////////////////// 
///////////////////////
void AUF()
{


  if (buttonPresses < 150) {
    analogWrite(PWM_AUF, 1023);
  }
  if (buttonPresses > 150) {
    analogWrite(PWM_AUF, 390);
  }
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.