Aktion ausführen bis Input kommt

Hallo,
ich arbeite gerade an einer Steuerung für eine automatische Hühner-Tür.
Ich habe das Problem, dass ich nicht die exakte Zeit für das Hochfahren und Runterfahren meiner Tür kenne.Deshalb habe ich einfach einen Endtaster so befestigt, dass ein Signal an den Arduino kommt, wenn die Tür hoch gefahren ist.
Nun weiß ich nicht wie ich das programmieren kann, dass mein Motor solange dreht bis der taster betätigt wird.

Danke schonmal im voraus für die Hilfe. :slight_smile:

while(not endschalter) motor(ein);
motor(aus);

(deleted)

Und du musst den Motor ja auch irgendwie einschalten.
Das darfst du nicht vergessen.

ja ich schalte ihn per lichtsensor ein. also wenn sich der wert ändert geht der motor an...

Hallo,

also wenn es heller wird soll das Toor auf gehen, wenn es dunkel wird soll das Toor zu gehen , jewils mit Endschalter in den Endlagen.

ja dann solltest Du ja im Wesentlichen wissen wie If funktioniert.

fang mit einem Ablaufplan an etwa so:

wenn hell genug und schliessen ist nicht ein dann Motor ein öffnen
wenn ganz oben dann öffnen aus

wenn dunkel genug und öffnen ist nicht ein dann Motor ein schliessen
wenn ganz unten dann schliessen aus

Wenn Du nicht noch dafür Sorge tragen willst das kein Huhn zu Schaden kommen kann sollte das erst mal reichen.

Heinz

fleggie:
ja ich schalte ihn per lichtsensor ein. also wenn sich der wert ändert geht der motor an...

Ja, aber nur wenn er nicht schon zu ist. Also beides als Einschaltbedingung: Helligkeit und Klappenposition.
Außerdem würde ich noch eine Wartezeit einlegen, damit nicht ein Schatten oder ein Licht zB eines Autos die Klappe betätigt: die Helligkeit muß 5 Minuten unterhalb/oberhalb des gesetzten Grenzwerts liegen. Dazu noch eine Hysterese einbauen.
Grüße Uwe

dankeeee

ich habe nur ein schalter und es ist ja nicht so schlimm wenn sich der motor beim runter fahren ein bisschen zu lange dreht, hauptsache die zeitabweichungen summieren sich nicht...

das ist mein code, ich hoffe ihr versteht ihn

const int fotopin = 7;
const int motorl = 12;
const int motorr = 13;
int button = 8;
int fotostate = 0;
int lastfotostate = 0;


void setup()
{
 pinMode(fotopin,INPUT);
 pinMode(button, INPUT_PULLUP);
 pinMode(motorr,OUTPUT);
 pinMode(motorl,OUTPUT);
}

void loop()
{
 fotostate = digitalRead(fotopin);
 
 if (fotostate != lastfotostate)
{ 
 if (fotostate > lastfotostate)
{
 digitalWrite(motorr,HIGH);
 while (button,HIGH);
{
 motorr,HIGH;
}
 digitalWrite(motorr,LOW);
}

 if (fotostate < lastfotostate)
{
 digitalWrite(motorl,HIGH);
 delay(3000);
 digitalWrite(motorl,LOW);
}
 lastfotostate = fotostate;
}
}

Hallo,
ist der Fotopin ein ein Digitaler Ausgang des Sensors, dann sollte der eine vernünftige Hysterese haben, ansonsten fährt die Türe ständig auf und zu.

Die Abfrage ob sich der Zustand geändert hat ist eigendlich überflüssig. Lass die while schleife weg , die fällt Dir irgendwann auf die Füsse.

Heinz

fleggie:
das ist mein code, ich hoffe ihr versteht ihn

void loop()

{
fotostate = digitalRead(fotopin);

if (fotostate != lastfotostate)
{
if (fotostate > lastfotostate)
{
digitalWrite(motorr,HIGH);
while (button,HIGH);
{
motorr,HIGH;
}
digitalWrite(motorr,LOW);
}

}

while (button,HIGH); was soll das sein?
Wann/wo wird button ausgelesen?

ups das mit dem auslesen vom button hab ich vergessen :slight_smile:

const int fotopin = 7;
const int buttonpin = 8;
const int motorl = 12;
const int motorr = 13;
int buttonstate = 0;
int fotostate = 0;
int lastfotostate = 0;


void setup()
{
 pinMode(fotopin,INPUT);
 pinMode(buttonpin, INPUT_PULLUP);
 pinMode(motorr,OUTPUT);
 pinMode(motorl,OUTPUT);
}

void loop()
{
 fotostate = digitalRead(fotopin);
 buttonstate = digitalRead(buttonpin);
 
 if (fotostate != lastfotostate)
{ 
 if (fotostate > lastfotostate)
{
 digitalWrite(motorr,HIGH);
 while (buttonstate,HIGH);
{
 motorr,HIGH;
}
 digitalWrite(motorr,LOW);
}

 if (fotostate < lastfotostate)
{
 digitalWrite(motorl,HIGH);
 delay(3000);
 digitalWrite(motorl,LOW);
}
 lastfotostate = fotostate;
}
}


so??

Und was soll hier passieren ?

motorr,HIGH;

Auch wird (button,HIGH) wohl nicht ganz Das machen, was Du Dir gedacht hast.
Ein (button==HIGH); könnte klappen, wenn man button innerhalb der WHILE einliest (und zuvor auf HIGH gewesen ist).

Was spricht dagegen, per Helligkeit zu entscheiden, zu welchem Endschalter wir kommen wollen und die ganze Zeit NUR zu prüfen, ob wir in die gegebene Richtung nicht schon am Endanschlag sind?

Davon ab ginge Das komplett ohne Arduino

  • Schwellwertschalter sorgt für HIGH/LOW und somit für die Richtung (Polwender, DC-Motor)
  • Endschalter mit Diode über dem Kontakt können somit nur eine Richtung abschalten - die Gegenrichtung ist 'immer frei' - so kann der Motor aus der unteren Endlage nach Oben, aus der Oberen nach Unten starten.

Geht aber auch mit Arduino und dort sogar mit einstellbaren Helligkeitswerten, Zeitverzögerung und gelber Rundum-Flitze, damit der Fuchs auch weiß, wann man besser von der Tür weg bleibt.

MfG

HotSystems:
Und was soll hier passieren ?

motorr,HIGH;

steht doch da: der Motor fährt hoch

sorry, konnte ich mir nicht verkneifen

Moko:
steht doch da: der Motor fährt hoch

sorry, konnte ich mir nicht verkneifen

Hallo,

tut er aber so nicht

sorry konnte ich mir nicht verkneifen

Heinz

Moko:
steht doch da: der Motor fährt hoch

sorry, konnte ich mir nicht verkneifen

Ach so.....hatte ich überlesen.