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
:
Verschoben durch Admin
In dem While müßte der Sensor erneut eingelesen werden. Denn sonst kann sich der Wert ja nicht ändern.
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;)
Ok das ist Quatsch =D habe das mit dem State falsch verstanden sry
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; ...
Das hat leider auch nicht geklappt hat noch einer von euch einen Ansatz? Danke ;)
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
Hallo zusammen habe es jetzt geschafft falls es einen von euch interessiert stelle ich das Programm mal hier rein;) Danke nochmal für die Hilfe! int sensor = 0; int led1 = 13; int led2 = 12; boolean firstRun = true; boolean oldIsDaylight = false; boolean isDaylight = false; const int motorDauer = 1000; //const int untereGrenze = 400; //const int obereGrenze = 600; void setup () { pinMode (led1,OUTPUT); pinMode (led2,OUTPUT); } void loop () { int state = getState(); isDaylight = (state == 1); if(firstRun) { oldIsDaylight = !isDaylight; firstRun = false; } if(oldIsDaylight != isDaylight) { HandleLeds(state); } oldIsDaylight = isDaylight; //delay (60000); // Zeit zwischen den Messvorgängen } int getState() { int sensorInput = analogRead(sensor); int sensorMap = map (sensorInput, 350, 750, 0, 1); return sensorMap; } void HandleLeds(int state) { switch (state) { case 0: //dunkel Dunkel(); break; case 1: //hell Hell(); break; } } void Hell() { digitalWrite (led1,HIGH); delay (motorDauer); digitalWrite (led1,LOW); } void Dunkel() { digitalWrite (led2,HIGH); delay (motorDauer); digitalWrite (led2,LOW); }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.