Sensorbefehl nur einmal ausführen

Hallo zusammen,

ich hab da ein Problem: Ich hab ein Programm geschrieben, bei welchem je nach LDR-Wert ein Motor oder eine LED angesteuert wird. Das Problem genau ist, dass der Motor logischerweise immer bei Helligkeit dreht. Er soll allerdings nur die ersten 0,5s lang drehen, ich weiß allerdings nicht, wie man so was programmiert.
Könnte mir daher jemand erklären, was ich am folgenden Skript ändern muss, damit dies der Fall ist?

void setup()
{
  Serial.begin(9600);
  pinMode(Motor1, OUTPUT);
  pinMode(Motor2, OUTPUT);
  pinMode(LED, OUTPUT); 
  }

void loop()
{
 Helligkeit = analogRead(0);
 if(Helligkeit<30)                  //Sobald der Wert kleiner als 30 ist, wird ein Motor eingeschaltet
 {                             
   digitalWrite(Motor2, HIGH); 
   digitalWrite(Motor1, LOW);
   digitalWrite(LED, LOW);
   }
   else                             //wenn nicht, ist der Motor aus und eine LED leuchtet
   {                   
     digitalWrite(Motor2, LOW);
     digitalWrite(Motor1,LOW);
     digitalWrite(LED, HIGH);
     }
     }

Ganz einfach: du packst eine Variable dazu, als "Flag".
Die hat den Startwert 0 und in dem Moment, wo der Motor angeht, setzt du sie auf 1.
Ausserdem fragst du sie immer ab und nur wenn sie 0 ist, wird der Motor einbgeschalten.

Fertig.

die ersten 0,5 Sekunden drehen
Mit millis().
Grüße Uwe

Ganz einfach: du packst eine Variable dazu, als "Flag".
Die hat den Startwert 0 und in dem Moment, wo der Motor angeht, setzt du sie auf 1.
Ausserdem fragst du sie immer ab und nur wenn sie 0 ist, wird der Motor einbgeschalten.

Fertig.

Hab keine Ahnung vom programmieren. Kann so nicht draus schließen wie das geht :sweat_smile: Ich bitte um Erläuterung

Ich hab ein Programm geschrieben

Könnte mir jemand erklären, was ich am folgenden Skript ändern muss

  • Was du uns gezeigt hast, funktioniert nicht, weil du das wichtigste weggelassen hast: Variablendeklarationen.
    z.B. Helligkeit ist nicht deklariert
 [b]int [/b]Helligkeit = analogRead(0);
  • Dann wäre es schön, wenn du nur das einbaust, was in deiner Problembeschreibung vorkommt (was ist Motor2 ? )
    und eventuell das Ganze so vereinfachst, dass nur das Problem behandelt wird ( was für ein Problem hast du mit der Led ? )

  • Du brauchst eine weitere Variable, die dir sagt, wann der Motor eingeschaltet wurde ( damit du weisst wann 0.5 sec rum sind )
    Zeiten werden am besten mit der Funktion millis() erfasst und in Variablen vom Typ
    ** **unsigned long** **
    gespeichert.

  • Da ein ControllerProgramm ewig läuft, bzw. andauernd wieder durch loop kommt, ist auch einen Merker ( "Flag" ), der dir sagt ob der Motor schon gelaufen ist, sinnvoll.

const byte Motor1 = 9; // Der Pin an dem der TransistorBasisWiderstand für den Motor hängt
void setup() { pinMode(Motor1,OUTPUT); }

unsigned long MotorStartZeit;
boolean MotorGestartet = false;

void loop () {
   int Helligkeit = analogRead(A0);
   if ( Helligkeit > 30 && MotorGestartet == false)
   {
        MotorGestartet = true;
        MotorStartZeit = millis(); // Startzeit merken
        digitalWrite( Motor1, HIGH); 
   }
   if ( Helligkeit > 30 && MotorGestartet == true)
   {
        if (  millis() - MotorStartZeit > 500)  
        {
              digitalWrite( Motor1, LOW); // Nach 0.5 sec ausschalten
        }
   }
   if ( Helligkeit < 25 )   // Hysterese, damit bei Helligkeit um die 30 der Motor nicht dauernd anspringt 
   {
      MotorGestartet = false;
      digitalWrite( Motor1, LOW);  // kann sein dass es zu schnell wieder dunkel geworden ist.
   }
}

Reine Neugierde: 0,5 sec ist ziemlich kurz für einen Motor, wofür soll das gut sein?

P.S. Die Led kannst du wohl alleine hinzufügen :wink: