Arduino Uno , Anfänger sitzt im trockenen

Hallo Leute,
ich bräuchte mal ein paar gute Tipps. Ich tüftle seit Tagen an einem Programm und komme nicht mehr weiter. Ich vermute, dass es sich um einen kleinen Fehler handelt mit den Schleifen, aber wie geschrieben, ich komme nicht dahinter, als quasi Anfänger kein Beinbruch wie ich hoffe. Also ich möchte ein Arduino UNO, der mit einem Bewegungsmelder und einem 8-Kanal-Empfangsmodul verbunden ist, programmieren und zwar wie folgt. Wenn der Bewegungsmelder aktiv wird, soll der Pin Maticpin (oder Maticstate) für eine Sekunde HIGH sein. Ferner soll der Arduino eine definierte Zeit abwarten. Nach Ablauf der Wartezeit soll der MaticPin wieder für eine Sekunde HIGH sein.

Das ist mein Entwurf:

const int buttonPin = 3; // the number of the pushbutton pin
 int MaticPin =  7 ;  // the number of the LED pin
int buttonState = 0; 
int Maticstate = 0;
int x=0;       //anzahl der Sekunden zu warten
int y=0;          //anzahl der Minuten zu warten

void setup() {
  // initialize the LED pin as an output:
  pinMode(MaticPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);

}

void loop() {

   buttonState = digitalRead(buttonPin); // check if the pushbutton is pressed.
   Maticstate = digitalRead(MaticPin);
if (buttonState == HIGH) { //Bewegungsmelder aktiv
  digitalWrite(MaticPin, HIGH); // Taster wird betätigt "Ein"
  delay(500);
  digitalWrite(MaticPin, LOW); // Taster wird betätigt "AUS"
}  

   while (x <= 10) {   //Wartezeit Arduino
  delay (1000);
  x++;
  }
   
     digitalWrite (MaticPin, HIGH); //Taster "EIN"
     delay (500);
     digitalWrite (MaticPin, LOW);  //Taster "AUS"
     
      }

Die while(x <= 10).. -Schleife ergibt nach deiner Beschreibung überhaupt keinen Sinn (dir ist klar das sie nur einmal abläuft, bis du den Arduino wieder resettest? Und warum nicht gleich delay(10*1000)?), die Delays sind auch andere als du schreibst.
Und du versuchst von MaticPin zu lesen obwohl der als Ausgang definiert ist.

Zunächst bedanke ich mich für die hilfe.
Ja die Delaywerte stimmen nicht überein, hab das wohl übersehen, da viel rumprobiert.
Ich hab das Programm auch schon ausschließlich mit Delays realisiert und das klappt auch ganz gut.
Mir stellte sich die Frage, ob das Programm auch mit einer whileschleife oder auch forschleife funktionieren kann.
Mir war nicht klar, daß der Arduino resettet werden muss. Über eine Erklärung oder ein Link wäre ich dankbar.
Und bitte etwas Verständniss aufgrund meiner Unwissentheit. :wink:

Ich hab's jetzt, so funktioniert es

const int buttonPin = 3; // the number of the pushbutton pin
 int MaticPin =  7 ;  // the number of the LED pin
int buttonState = 0; 
int Maticstate = 0;
int x=0;       //anzahl der Sekunden zu warten
int y=0;          //anzahl der Minuten zu warten

void setup() {
  // initialize the LED pin as an output:
  pinMode(MaticPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);

}

void loop() {

   buttonState = digitalRead(buttonPin); // check if the pushbutton is pressed.
   
if (buttonState == HIGH) { //Bewegungsmelder aktiv
  digitalWrite(MaticPin, HIGH); // Taster wird betätigt "Ein"
  delay(1000);
  digitalWrite(MaticPin, LOW); // Taster wird betätigt "AUS"
}  
   while (x <= 10 && buttonState ==  HIGH) {   //Wartezeit Arduino
  delay (400);
  x++;
  
  }

   if ( x >= 10)
    digitalWrite (MaticPin, HIGH); //Taster "EIN"
     delay (2000);
     digitalWrite (MaticPin, LOW);  //Taster "AUS"
     x = 0;
      }

Danke nochmals

Natürlich ist es schön, wenn man als Einsteiger auch Erfolgserlebnisse hat, dabei ist die Verwendung des Befehls delay() auch ganz legitim. Insgesamt hat das mit einer eleganten Programmierung noch wenig zu tun. Das soll keinesfalls abwertend klingen.
Verbesserungen sind immer möglich: klare Strukturierung des Programms nach EVA-Prinzip (Eingabe/Verarbeitung/Ausgabe), Ausbau zu einem endlichen Automaten (Endlicher Automat – Wikipedia), vollständiger Verzicht auf delays... Das nur als Vorschlag, vielleicht für eines der nächsten Projekte.

Hab es auch nicht als abwertend empfunden.
Projekte folgen und danke für den link

Hallo,

nochmal was zu for und while.

for ist etwas unkritischer. Entweder sie funktioniert oder sie macht Mist. Damit eine Endlosschleife zu basteln ist schon schwieriger. Weil man schon bei der Definition mehr Angaben machen muß und dabei überlegt.

Die while aber wird gnadenlos zur Endlosschleife, wenn ihre Gültigkeitsbedingung in ihrer eigenen Schleife nicht geändert wird. Deswegen kam Deine while aus sich selbst nicht mehr raus. Und deswegen hilft dann nur noch ein Reset. While Schleife | C-HowTo

Die loop übrigens ist auch eine while. Nur die muß und soll ja ständig durchlaufen werden.

Hallo,
ich bin's wieder. Das Programm hab ich jetzt erweitert und siehe da, es funktioniert nicht wie es eigentlich sollte.

const int buttonPin = 3; // the number of the pushbutton pin
 int MaticPin =  7 ;  // the number of the LED pin
int bedPin = 9;
int externPin = 12;
int buttonState = 0; 
int maticstate = 0;
int bedstate = 0;
int externstate = 0;
int x=0;       //anzahl der Sekunden zu warten



void setup() {
  // initialize the LED pin as an output:
  pinMode(MaticPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
  pinMode(bedPin, OUTPUT);
pinMode(externPin, OUTPUT);

}

void loop() {

   buttonState = digitalRead(buttonPin); // check if the pushbutton is pressed.
   maticstate = digitalRead(MaticPin);
   bedstate = digitalRead(bedPin);
   externstate = digitalRead(externPin);


 
  
if (buttonState == HIGH)              { //Bewegungsmelder aktiv
 digitalWrite(bedPin, HIGH);
  digitalWrite(MaticPin, HIGH); // Taster wird betätigt "Ein"
  delay(1000);
  digitalWrite(MaticPin, LOW); // Taster wird betätigt "AUS"
                                         }  
                                        
   while (x <= 10 && bedstate == HIGH) {  
  delay (1000);
  if (buttonState == HIGH){               
  x = 0;
  delay(1000);                           
}
  
 x++;
 }
 
 if (x >= 10) {
     digitalWrite (MaticPin, HIGH); //Taster "EIN"
     delay (500);
     digitalWrite (MaticPin, LOW);  //Taster "AUS"
     digitalWrite (bedPin, LOW);
     }
     
     x = 0;
      }

Also, Wenn Bewegungsmelder (ButtonPin) aktiv, bedPin HIGH und Maticpin für eine Sekunde HIGH. Der Arduino soll dann eine definierte Zeit abwarten (while-schleife). Nach Ablauf der Wartezeit soll der MaticPin wieder für eine Sekunde HIGH sein und bedstate LOW. So funktioniert das auch wunderbar, aber nicht mit der Erweiterung in der while-schleife. Wenn während des Schleifumlaufes der Bewegungsmelder wieder aktiv ist, soll die definierte Zeit von Neuem laufen.
if (buttonState == HIGH){
x = 0;
delay(1000);
}
Was mach ich falsch?

Und noch eine andere Frage. Ein weiteres Vorhaben ist, auch Befehle vom 8-Kanal-Empfangsmodul zu geben, diese müssen jedoch wegen dem Open Collector und den dafür nötigen Pull Up-Widerstand negiert werden. "AUS" -> 4,5V, "EIN"-> 0,....V. Wäre dieser Code richtig.
if (!externstate == HIGH)

Du lieferst das beste Beispiel, warum while Schleifen meist Mist sind:

buttonState und bedstate wird innerhalb der Schleife nicht verändert, das Ganze hängt also für immer.

Doc_Arduino:
Die while aber wird gnadenlos zur Endlosschleife, wenn ihre Gültigkeitsbedingung in ihrer eigenen Schleife nicht geändert wird. Deswegen kam Deine while aus sich selbst nicht mehr raus. Und deswegen hilft dann nur noch ein Reset. While Schleife | C-HowTo

Deine Variable x ist Dein Problem in der while.

Da ich nicht so richtig verstehe, was Du eigentlich machen willst, habe ich mal was geschrieben, was Deinen Vorstellungen ja möglicherweise in irgendeiner Weise nahe kommen könnte:

const int buttonPin = 3; // the number of the pushbutton pin
const int MaticPin =  7 ;  // the number of the LED pin
const int bedPin = 9;
int buttonState;
unsigned long prevMillis;
unsigned long intervall;
enum ZUSTAENDE {WARTEN, AUS, PAUSE, EIN};
byte zustand = WARTEN;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);  // initialize the pushbutton pin as an input:
  pinMode(MaticPin, OUTPUT);  // initialize the LED pin as an output:
  pinMode(bedPin, OUTPUT);  // initialize the LED pin as an output:
}

void loop() {
  buttonState = digitalRead(buttonPin); // check if the pushbutton is pressed.
  if (millis() - prevMillis >= intervall) {
    switch (zustand) {
      case WARTEN:
        digitalWrite(MaticPin, LOW);
        digitalWrite(bedPin, LOW);
        if (buttonState == HIGH) {
          digitalWrite(bedPin, HIGH);
          digitalWrite(MaticPin, HIGH);
          prevMillis = millis();
          intervall = 1000;
          zustand = AUS;
        }
        break;
      case AUS:
        digitalWrite(MaticPin, LOW);
        prevMillis = millis();
        intervall = 4000;
        zustand = PAUSE;
        break;
      case PAUSE:
        prevMillis = millis();
        intervall = 1000;
        zustand = EIN;
        break;
      case EIN:
        digitalWrite(MaticPin, HIGH);
        prevMillis = millis();
        intervall = 2000;
        zustand = WARTEN;
        break;
    }
  }
}