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
RCSwitchmySwitch=RCSwitch();
4
5
6
intK1=4;//Tor auf
7
intK2=5;//Tor zu
8
intK3=6;//12v
9
intS1=12;//Tor offen
10
intS2=11;//Tor geschlossen
11
intFhem_Tor_auf=9;
12
intFhem_Tor_zu=10;
13
intTor_offen_an_Fhem=7;
14
intTor_zu_an_Fhem=8;
15
16
intvalue_S1=0;
17
intvalue_S2=0;
18
intvalue_Fhem_Tor_auf=0;
19
intvalue_Fhem_Tor_zu=0;
20
intvalue_Tor_offen_an_Fhem=0;
21
intvalue_Tor_zu_an_Fhem=0;
22
intvalue_FFB=0;
23
24
25
voidsetup(){
26
mySwitch.enableReceive(0);// Receiver on inerrupt 0 => that is pin #2
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.
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.
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.
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.
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
RCSwitchmySwitch=RCSwitch();
4
5
6
intK1=4;//Tor auf
7
intK2=5;//Tor zu
8
intK3=6;//12v
9
intS1=12;//Tor offen
10
intS2=11;//Tor geschlossen
11
intFhem_Tor_auf=9;
12
intFhem_Tor_zu=10;
13
intTor_offen_an_Fhem=7;
14
intTor_zu_an_Fhem=8;
15
16
intvalue_S1=0;
17
intvalue_S2=0;
18
intvalue_Fhem_Tor_auf=0;
19
intvalue_Fhem_Tor_zu=0;
20
intvalue_Tor_offen_an_Fhem=0;
21
intvalue_Tor_zu_an_Fhem=0;
22
intvalue_FFB=0;
23
intcounter_auf=0;
24
intcounter_zu=0;
25
26
voidsetup(){
27
mySwitch.enableReceive(0);// Receiver on inerrupt 0 => that is pin #2
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.
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).
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);
}
}