Hallo,
bin recht neu hier und möchte gerne als Anfänger infos zu if Anweisungen .
Habe viel ausprobiert und komme da nicht weiter.
Siehe Sketch im Anhang.
Zur Info: Die Lösung sollte ein wenig verständlich ausfallen, gerne auch ein längerer Sketch.
#define SchalterA 2
#define SchalterB 3
#define SchalterC 4
#define LampeA 9
#define LampeB 10
#define LampeC 11
void setup() {
pinMode(SchalterA,OUTPUT);
pinMode(SchalterB,OUTPUT);
pinMode(SchalterC,OUTPUT);
pinMode(LampeA,OUTPUT);
pinMode(LampeB,OUTPUT);
pinMode(LampeC,OUTPUT);
}
void loop()
{
digitalWrite (SchalterA, HIGH);
digitalWrite (SchalterB, HIGH);
digitalWrite (SchalterC, HIGH);
delay (200);
//if ((SchalterA ==HIGH)&&(SchalterB==HIGH)&&(SchalterC==HIGH)){ //Funktioniert auch nicht Lampe C leuchtet. Änderung von High auf LOW bringt auch nichts.
//if (digitalRead(SchalterA ==LOW)&&(SchalterB==LOW)&&(SchalterC==LOW)){ //Funktioniert auch nicht Lampe C leuchtet.
//if (!SchalterA ==HIGH){ //weder HIGH noch LOW ändert am Ergebnis was
//if (digitalRead(SchalterA ==HIGH)){ //weder HIGH noch LOW ändert am Ergebnis was
//if (digitalRead(!SchalterA ==HIGH)){ //weder HIGH noch LOW ändert am Ergebnis was
//Fazit: Es werden keine HIGH und LOW ausgewertet. Lampe A und B leuchten immer
digitalWrite (LampeA,HIGH);
digitalWrite (LampeB,HIGH);
delay (1000); //60 sekunden =SchalterB==HIGH)&& if(SchalterC==HIGH){
digitalWrite (LampeA,LOW);
digitalWrite (LampeB,LOW);
delay (1000); //60 sekunden = 60.000 millisekunden
}
else{
digitalWrite (LampeC,HIGH);
delay (1000);
digitalWrite (LampeA, LOW);
digitalWrite (LampeB, LOW);
digitalWrite (LampeC, LOW);
digitalWrite (SchalterA, LOW);
digitalWrite (SchalterB, LOW);
digitalWrite (SchalterC, LOW);
delay(2000);
}}
Keine Ahnung was du für Infos brauchst.
Du kannst doch alles in den Beispielen der IDE nachlesen.
Schalter sind Eingabegeräte und darum keine Ausgänge sonder Eingänge die gelesen werden müssen und nicht geschrieben werden:
digitalRead(pin);
Außerdem:
if (!SchalterA ==HIGH){
Hier konrollierst Du ob die Pinnummer LOW ist und das ist es nie da es eine Zahl zwischen 2 und 4.
Grüße Uwe
Hallo
Was soll der "Schaltwerk" machen ?
Beschreibe es mit einfachen Worten und dass ganz einfach.
Die Grundidee ist, an einer Anlage die Endschalter abzufragen und bei Bedarf eine weitere Aktion einzuleiten. Sehe da verschiedene Einsatzmöglichkeiten.
Wie: Rolladen geht runter = Endschalter1 betätigt und Licht einschalten.
Rolladen läuft wenn = Endschalter1 nicht betätigt.
Endschalter2 betätigt.
Einfach interessehalber, habe auch eine S7 bei mir . Da geht das ein bischen einfacher (für mich).
Werde die Lösungsansätze ausprobieren und melde mich dann wieder.
Danke für die schnelle Antworten....
Ja.
Dann mach das auch.
Achtung Falle:
void loop()
{
digitalWrite (SchalterA, HIGH);
digitalWrite (SchalterB, HIGH);
digitalWrite (SchalterC, HIGH);
Warum?
loop() wird vermutlich so ca. 100 mal die Sekunde durchlaufen.
Achso Hinweis: Vergiss Dein delay ganz schnell.
Du schreibst mit jedem Durchlauf ein HIGH auf den Pin.
Und später ein LOW.
Bei 1/100 Sekunde soll der Pin sich das aussuchen, was da passieren soll?
Ok. Ja Du bastelst mit delay - das ist aber Mist.
Denn, wenn Du ein delay() am laufen hast, ist der restliche Code in Wartestellung.
Das heisst, Du kannst gar nicht auf irgendwas anderes reagieren.
Ja, sone S7 nimmt einem schon einiges ab.
Trenn Dich inhaltlich davon, wenn Du Arduino willst.
Im Übrigen keine define!
#define SchalterA 2
#define SchalterB 3
#define SchalterC 4
#define LampeA 9
#define LampeB 10
#define LampeC 11
ersetze mal durch:
#define SchalterA 2
#define SchalterB 3
#define SchalterC 4
#define LampeA 9
#define LampeB 10
#define LampeC 11
#define SchalterA 9
#define SchalterB 10
#define SchalterC 11
#define LampeA 2
#define LampeB 3
#define LampeC 4
Was passiert?
//if ((SchalterA ==HIGH)&&(SchalterB==HIGH)&&(SchalterC==HIGH)){ //Funktioniert auch nicht Lampe C leuchtet. Änderung von High auf LOW bringt auch nichts.
//if (digitalRead(SchalterA ==LOW)&&(SchalterB==LOW)&&(SchalterC==LOW)){ //Funktioniert auch nicht Lampe C leuchtet.
//if (!SchalterA ==HIGH){ //weder HIGH noch LOW ändert am Ergebnis was
//if (digitalRead(SchalterA ==HIGH)){ //weder HIGH noch LOW ändert am Ergebnis was
//if (digitalRead(!SchalterA ==HIGH)){ //weder HIGH noch LOW ändert am Ergebnis was
Klammersetzung beachten! Was bei digitalRead() in den Klammern steht ist nur der Pin. Dass == HIGH in der Klammer zu machen ist daher Unsinn. Dadurch fragst du ab ob die Pin-Nummer 1 ist
Natürlich es es auch Unsinn das digitalRead() gleich komplett wegzulassen.
Also z.B. so:
if (digitalRead(PinA) && digitalRead(PinB) && !digitalRead(PinC))
{
}
Oder ausführlich
if ((digitalRead(PinA) == HIGH) ...
Aber vorher musst du wie schon gesagt in setup() erst mal Ausgänge und Eingänge unterscheiden
Moin
Ich habe Deine Grundidee für drei Endschalter umgetzt. Der Sketch enthält ein Objekt mit dem Namen LIMITSWITCH. Dieses Objekt enthält die Information über den Eingangspin und den aktuellen Status. Die Stati der Engangspins werden in der loop() ermittelt und stehen dann, zur Verarbeitung mif IF´s usw., zur Verfügung.
//BLOCK COMMENT
// https://forum.arduino.cc/t/mehere-if-abfragen/896928
#define ProjectName "Mehere if Abfragen"
// CONSTANT DEFINITION
// you may need to change these constants to your hardware
const byte Input_[] {A0, A1, A2};
const byte Output_[] {2, 3, 4};
enum {One, Two, Three};
// VARIABLE DECLARATION
struct LIMITSWITCH {
byte pin;
bool state;
} limitSwitch [] {
{Input_[One], 0},
{Input_[Two], 0},
{Input_[Three], 0},
};
// FUNCTIONS
void setup() {
Serial.begin(9600);
Serial.println(F("."));
Serial.print(F("File : ")), Serial.println(__FILE__);
Serial.print(F("Date : ")), Serial.println(__DATE__);
Serial.print(F("Project: ")), Serial.println(ProjectName);
pinMode (LED_BUILTIN, OUTPUT);
for (auto Input : Input_) pinMode(Input, INPUT_PULLUP);
for (auto Output : Output_) pinMode(Output, OUTPUT);
// check outputs
for (auto Output : Output_) digitalWrite(Output, HIGH);
delay(1000);
for (auto Output : Output_) digitalWrite(Output, LOW);
}
void loop () {
unsigned long currentTime = millis();
digitalWrite(LED_BUILTIN, (currentTime / 500) % 2);
// read limitSwitches first
static unsigned long millisScan;
const unsigned long millisDuration {20};
if (currentTime - millisScan >= millisDuration) {
millisScan = currentTime;
for (auto &limitSwitch_ : limitSwitch) {
bool stateNew = !digitalRead(limitSwitch_.pin);
if (limitSwitch_.state != stateNew) limitSwitch_.state = stateNew;
}
}
// ***** Mehere if Abfragen
if (limitSwitch[One].state && limitSwitch[Two].state) digitalWrite(Output_[One], true); else digitalWrite(Output_[One], false);
if (limitSwitch[Two].state && limitSwitch[Three].state) digitalWrite(Output_[Two], true); else digitalWrite(Output_[Two], false);
if (limitSwitch[Three].state && limitSwitch[One].state) digitalWrite(Output_[Three], true); else digitalWrite(Output_[Three], false);
// ***************
}
Ich wünsche Dir einen geschmeidigen Tag und viel Spass beim Programmieren.
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.