Forum: Mikrocontroller und Digitale Elektronik Probleme mit dem Programm (Arduino)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Hühnerklappe (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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
von PittyJ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
In dem While müßte der Sensor erneut eingelesen werden. Denn sonst kann 
sich der Wert ja nicht ändern.

von Tobias N (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von PittyJ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von pansen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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.

von PittyJ (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>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.

von Tobias N (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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;)

von Tobias N (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ok das ist Quatsch =D habe das mit dem State falsch verstanden sry

von pansen (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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;

...

von Tobias N (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Das hat leider auch nicht geklappt hat noch einer von euch einen Ansatz?

Danke ;)

von Narfie (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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).

von Stefan W. (dl6dx)


Bewertung
0 lesenswert
nicht lesenswert
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

von Tobias N (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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);
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.