Hallo zusammen ich bin der Neue;)
Ich will die ganze Sache hier so kurz wie möglich halten!
Nachdem ich mich vor 2 Wochen an mein neues Projekt "Hühnerklappe"
gewagt habe schien alles ganz einfach.....
Projekt: Hühnerklappe soll Abends zu fahren und Morgens auf
(photo-widerstand)! Ich habe einen Arduino UNO mit dem ich dieses
umsetzen will (mehr braucht man für meine Frage nicht zu wissen).
Hardwaretechnisch steht alles und ist auch Funktionstüchtig ( manuel
getestet).
Und jetzt mein Problem {(Programm) dient nur zur Simulation}:
int sensor = 0;
int led1 = 13; //simuliert Rechtslauf
int led2= 12; //simuliert Linklauf
void setup ()
{
pinMode (led1,OUTPUT);
pinMode (led2,OUTPUT);
}
void loop ()
{
sensor = analogRead (0);
int val = analogRead(sensor);
if (val < 550)
{
digitalWrite (led1,HIGH);
delay (1000);
digitalWrite (led1,LOW);
while (val < 550) {} //habe ich eingefügt um das Programm
} zu "Stoppen"
allerdings weiß ich nicht was
ich eintragen muss um das
passend weiterlaufen zu
lassen.....
if (val > 550)
{
digitalWrite (led2,HIGH);
delay (1000);
digitalWrite (led2,LOW);
while (val>550) {}
}
}
(Ich entschuldige mich schonmal für eventuelle Fehler im Programm bin
noch recht neu würde mich über konstruktive Kritik freuen)
Das war so meine Idee. Sobald ich einschalte erkennt der Chip ob es hell
oder dunkel ist und schaltet dann auch für die 1sek den Ausgang auf
High. Allerdings hängt das Programm dann im "While loop" und genau das
ist mein Problem. Habe schon viel gelesen und probiert allerdings bin
ich nie zu einem brauchbaren Ergebnis gekommen.
Jetzt meine Frage:
Wird das so gemacht oder nutzt man für solche Anwendungen eine andere
Syntax?
Wie komme ich bei meiner Aufgabe am sinnvollsten aus dem loop raus ?
Meiner Meinung nach müsste der loop einfach beendet werden, wenn der
Wert des Sensors 550 überschreitet bzw. unterschreitet allerdings weiß
ich nicht wie ich das ausdrücken kann.
Eine ganz wichtige Sache noch ich möchte nicht das mir ein fertiges
Programm um die Ohren gehauen wird, damit kann bzw. will ich nichts
anfangen. Es wäre nett wenn Ihr mir lediglich einen Tipp geben könntet
in Bezug auf die Syntax!!
Danke schonmal im Voraus!!
Gruß, Tobias
Hi danke schonmal für die schnelle Antwort und sry für den User Namen:
"Hühnerklappe" das war ein Versehen!!!
Wie kann ich das verstehen neue einlesen?
Könntest du mir da ein Beispiel zeigen?
Danke
Achja: das hier geht gard nicht:
sensor = analogRead (0);
int val = analogRead(sensor);
die erste der beiden Zeilen ist Müll.
Ja, und was tut die zweite wohl? Die macht doch genau das, was ins While
muss.
Bisschen Syntax anpassen, bevor es doppelte Variablen gibt, und dann
passt es.
Und: statt
int sensor = 0;
lieber
const int sensor = 0;
dann ändert man ihn nicht irrtümlich.
Hm, ich würde dir zu so etwas wie ein Zustandsautomaten raten.
Hier würde der Zustand der Klappe in einer Variable gespeichert, und
dieser Zustand ändert sich (Übergang in einen anderen Zustand), wenn ein
äußeres Ereignis passiert ist.
Also etwa so.
klappe = 0 // Klappe ist geschlossen.
loop
warte 1s // nur alle 1s wird Helligkeit gemessen.
helligkeit = helligkeitMessen();
if klappe == 0 and hellgenug
dann mach die Klappe auf, lass die LED 1s leuchten und den ganzen
Rest.
klappe = 1; // Zustand hat sich geändert
if klappe == 1 and dunkelgenug
dann mach die Klappe zu, andere LED 1s leuchten uws..
klappe = 0;
endloop
ich würde für hellgenug und dunkelgenug nicht den gleichen Wert nehmen,
sonst kann sein dass die Klappe bei diesem Wert ständig auf und zugeht.
>ich würde für hellgenug und dunkelgenug nicht den gleichen Wert nehmen,>sonst kann sein dass die Klappe bei diesem Wert ständig auf und zugeht.
Das sind Dinge, die er im Betrieb merkt, und daraus lernt. Davon sollte
man hier nicht zu viel verraten.
Dazu kommt noch das Sensorrauschen. Und Wolken kommen auch ins Spiel. Da
kommen dann die Hühner nicht mehr bei Gewitter ins Haus, weil es zu
Dunkel wird.
Danke für die schnelle Hilfe hätte ich nicht gedacht ,dass das so
schnell geht=)
Habe mal versucht einen Code zu schreiben wäre nett wenn Ihr den auch
einmal korrigieren könntet;) und dann ist aber auch alles geklärt.
int led1 = 13;
int led2= 12;
const int sensor = 0;
void setup ()
{
Serial.begin (9600);
pinMode (led1,OUTPUT);
pinMode (led2,OUTPUT);
}
void loop ()
{
int val = analogRead (sensor);
static int state = 1;
switch(state)
{case 1:
if (val < 550 && state == 1);
digitalWrite (led2,HIGH);
delay (1000);
digitalWrite (led2,LOW);
state = 0;
break;
case 2:
if (val > 550 && state == 0);
digitalWrite (led1,HIGH);
delay (1000);
digitalWrite (led1,LOW);
state = 1;
break;}
}
Danke;)
ne, sieht eigentlich gar nicht so schlecht aus.
Zwei fiese Fehler sind aber noch drin.
1. 'static int state = 1;' aus der loop Schleife raus. Sonst wird der
Zustand ja IMMER wieder auf 1 zurückinitialisiert.
2. Kein Semikolon nach der if-Abfrage! Dafür den Block klammern, der bei
if() == true kommt.
irgendwie so:
static int state = 1;
...
void loop ()
{
int val = analogRead (sensor);
switch(state)
{
case 1:
if (val < 550 && state == 1)
{
digitalWrite (led2,HIGH);
delay (1000);
digitalWrite (led2,LOW);
state = 0;
}
break;
...
Die Bedingungen "&& state == 1" bzw. "&& state == 0" sind im ersten
Fall unnötig und im zweiten Fall so gewählt das der Ausdruck nie wahr
werden kann.
Die Zuweisung "state = 0", führt dazu, dass bei der nächsten Iteration
kein Fall mehr im Switch-Statement zutrifft und dein System damit hängt.
Vermutlich soll es "state = 1" heißen.
Am besten fügst du noch einen default-case ein, der dir ermöglicht
solche Fälle einfach abzufragen.
Die Lesbarkeit deines Codes kannst du erhöhen indem du den Zuständen
Namen gibt (#define oder const int) oder gleich enum Typen verwendest
(beste Variante).
pansen wrote:> 1. 'static int state = 1;' aus der loop Schleife raus. Sonst wird der> Zustand ja IMMER wieder auf 1 zurückinitialisiert.
Das ist unnötig.
Funktionslokale als "static" deklarierte Variable werden nur einmal (im
Startup-Code) initialisiert.
Grüße
Stefan