Hallo,
ich sitze jetzt schon sehr lange an diesem Code für meine Hühnerstall Klappe(ich bin absoluter Anfänger).
Der Fotosensor ist ein kleines Modul was 0/1 ausgibt.
den Motor habe ich an einem l298n Modul (h-bridge) -> wenn Pin 12 high ist dreht er rechtsrum und wenn Pin 13 high ist dreht er linksrum.
Der Motor zieht eine klappe nach oben, welche, wenn sie oben ist einen Taster betätigt.
Nun möchte ich dass der Motor so lange dreht bis mein Taster HIGH ist.
Dies wollte ich mit einer while-schleife machen, aber es funktioniert einfach nicht.
Hier mein Code:
int fotopin = 7;
int motorl = 13;
int motorr = 12;
int buttonpin = 8;
int fotostate = 0;
int lastfotostate = 0;
int buttonstate = 0;
int lastbuttonstate = 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(motorl,HIGH);
while (buttonstate == HIGH);
{
digitalWrite(motorl,HIGH);
}
digitalWrite(motorl,LOW);
}
if (fotostate < lastfotostate)
{
digitalWrite(motorr,HIGH);
delay(3000);
digitalWrite(motorr,LOW);
}
lastfotostate = fotostate;
}
}
Hi
WHILE und delay() sind denkbar schlechte Möglichkeiten.
Noch schlechter wird Es allerdings, wenn hinter dem WHILE direkt ein ; folgt - damit ist die WHILE-Schleife nämlich schon beendet.
Die Klammer dahinter hat rein gar Nichts mit der While-Schleife zu tun.
STRG+T in der IDE rückt den Code auf Klammer-Ebene ein - try it!
Auch setze ich öffnende Klammern in die zugehörige Zeile - Da wäre Dir Das ; bei der While wohl auch aufgefallen.
Oha - Da ist aber mehr im Argen ...
Wenn Du schon in der While den Taster abfragen willst - dann musst Du Das auch machen!!
NUR die Variable, Der Du den Taster-Zustand irgend wann Mal zugeteilt hast, immer wieder abfragen, bringt Dir immer nur den Tasterzustand von vor drei Wochen ...
MfG
Wenn Dein Motor drehen soll bis der Taster HIGH ist, Darfst Du in der While-Schleife nicht schreiben:
while (buttonstate == HIGH);
denn das bedeutet : 'solange Buttonstate = HIGH > drehe den Motor'
Du willst aber ' drehe den Motor bis Buttonstate = HIGH'
Und am Ende der Whilezeile darf kein ';' stehen, da du danach den Anweisungsblock
{
digitalWrite(motorl,HIGH);
}
hast. den der gehört ja zum while.
Das musst Du so schreiben:
while(buttonstate == LOW)
{
buttonstate = digitalRead(buttonpin); // hier immer wieder den Button abfragen, damit while weiss,
wie der buttonstatus ist
}
digitalWrite(motorl,LOW); // Wenn bei while die Bedinung erfüllt ist (button ist nicht mehr LOW, somit HIGH),
Motor ausschalten.
LG Stefan
Natürlich ist while nicht grad die eleganteste Lösung, aber wenn Du es damit lösen willst. dann geht das durchaus so ,wie ich es Dir vorhin gezeigt habe.
Hi
Ich sagte nicht, daß man Das mit While nicht lösen könnte - nur geht dann nicht viel mehr gleichzeitig.
Warten wir Mal, was für Probleme im nächsten Step dazu kommen ...
MfG
Danke an alle, ihr habt mir seeehhhhrrr geholfen.
Es funktioniert jetzt alles so wie es sein muss.
DANKE
int fotopin = 7;
int motorl = 13;
int motorr = 12;
int buttonpin = 8;
int fotostate = 0;
int lastfotostate = 0;
int buttonstate = 0;
int lastbuttonstate = 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(motorl, HIGH);
while (buttonstate == HIGH)
{
buttonstate = digitalRead(buttonpin);
}
digitalWrite(motorl, LOW);
}
if (fotostate < lastfotostate)
{
digitalWrite(motorr, HIGH);
delay(3000);
digitalWrite(motorr, LOW);
}
lastfotostate = fotostate;
}
}
Hat vlt. noch jemand eine Idee, wie ich überprüfen kann, ob alle 3 hühner drin sind
Hallo,
irgendwie bist Du da auf einem unglücklichen Weg unterwegs. Du hast einen Sensor der 0/1 liefert. Bei dem einen Zustand soll der Motor hoch fahren bis zum End-Schalter. Bei dem anderen Zustand soll der Motor runter fahren. Ich würde da verschiedene if Bedingungen verwenden und mit logischen Verknüfpfungen arbreiten. Du mustt doch nicht erkennen ob der Sensor von Hell nach dunkel wechelt und umgekehrt. Der statische Zustand des Sensor reicht doch .
Wenn sensor hell und nicht Endschalter
Motor heben
wenn Endschalter
heben aus
wenn sensor nicht hell und Fahrzeit nicht um
Motor senken
fahrzeit starten (millis() verwenden)
wenn fahrzeit um
senken aus
Allerdings wird das noch nicht optimal klappen , Je nach Beleuchtung bei Dämmerung wird das Ding eventuell ständig auf und ab fahren. Um das zu vermeiden kann man erst wieder hoch fahren wenn die Klappe für z.B 30 minuten unten war und senken wenn die Klappe mindestens 30 minuten oben war. Wenn du mit den Zeiten abbeiten willst solltest Du Dir ansehen wie eine Schrittkette , Ablaufsteuerung , Zustands-Automat funktioniert. Dann hast Du nämlich nicht nur zwei Zustände sondern mehrere es kommen ja noch minestens zwei Wartezuständer dazu.
Da wäre ein analoges Signal besser das kann man mit einer anständigen Hysterese auf und ab fahren.
Heinz
fleggie:
Hat vlt. noch jemand eine Idee, wie ich überprüfen kann, ob alle 3 hühner drin sind
ich habe weing Ahnung von Hühnern , meine Tochter hat welche. Aber wenn es dunkel ist laufen die eh alle rein , Tochter macht die Klappe zu und geht nicht auf die Suche.
Heinz
Hi
Gleiches hörte ich auch von einem Hühner-Haber - wenn's dunkel ist, gehen die Viecher heim - draußen lauert der Fuchs und so ein Huhn will nun auch nicht gefressen werden.
Da Dein Helligkeits-Sensor nur 0 und 1 liefert, fällt eine Hysterese leiser raus - wäre mein Weg.
Somit würde ich, wenn sich der Zustand des Sensor ändert, Diesen 'entprellen' - also in diesem Fall zwei Minuten warten - wenn sich am Sensor Nichts ändert, ist's halt jetzt hell oder eben dunkel - und wir können den Motor starten.
MfG